@@ -14,13 +14,16 @@ def index
1414 . select { |item | item . enabled_in_region? ( @user_region ) }
1515 . first
1616 end
17- @shop_items = ShopItem . all . includes ( :image_attachment )
17+ @shop_items = ShopItem . buyable_standalone . includes ( :image_attachment )
1818 @shop_items = @shop_items . where . not ( type : "ShopItem::FreeStickers" ) if user_ordered_free_stickers?
1919 @user_balance = current_user . balance
2020 end
2121
2222 def my_orders
23- @orders = current_user . shop_orders . includes ( shop_item : { image_attachment : :blob } ) . order ( id : :desc )
23+ @orders = current_user . shop_orders
24+ . where ( parent_order_id : nil )
25+ . includes ( :accessory_orders , shop_item : { image_attachment : :blob } )
26+ . order ( id : :desc )
2427 end
2528
2629 def cancel_order
@@ -35,6 +38,7 @@ def cancel_order
3538
3639 def order
3740 @shop_item = ShopItem . find ( params [ :shop_item_id ] )
41+ @accessories = @shop_item . available_accessories . includes ( :image_attachment )
3842 end
3943
4044 def update_region
@@ -43,7 +47,7 @@ def update_region
4347 current_user . update! ( region : region )
4448
4549 @user_region = region
46- @shop_items = ShopItem . all . includes ( :image_attachment )
50+ @shop_items = ShopItem . buyable_standalone . includes ( :image_attachment )
4751 @shop_items = @shop_items . where . not ( type : "ShopItem::FreeStickers" ) if user_ordered_free_stickers?
4852 @user_balance = current_user . balance
4953 @featured_item = unless user_ordered_free_stickers?
@@ -65,12 +69,20 @@ def update_region
6569 def create_order
6670 @shop_item = ShopItem . find ( params [ :shop_item_id ] )
6771 quantity = params [ :quantity ] . to_i
72+ accessory_ids = Array ( params [ :accessory_ids ] ) . map ( &:to_i ) . reject ( &:zero? )
6873
6974 if quantity <= 0
7075 redirect_to shop_order_path ( shop_item_id : @shop_item . id ) , alert : "Quantity must be greater than 0"
7176 return
7277 end
7378
79+ # Validate accessories belong to this item
80+ @accessories = if accessory_ids . any?
81+ @shop_item . available_accessories . where ( id : accessory_ids )
82+ else
83+ [ ]
84+ end
85+
7486 # Create the order
7587 # This is a simplified version. In a real app, you'd want to:
7688 # 1. Check stock
@@ -81,12 +93,29 @@ def create_order
8193 @order = current_user . shop_orders . new (
8294 shop_item : @shop_item ,
8395 quantity : quantity ,
84- frozen_address : selected_address
96+ frozen_address : selected_address ,
97+ accessory_ids : @accessories . pluck ( :id )
8598 )
8699
87100 @order . aasm_state = "pending" if @order . respond_to? ( :aasm_state= )
88101
89- if @order . save
102+ begin
103+ ActiveRecord ::Base . transaction do
104+ @order . save!
105+
106+ # Create orders for each accessory
107+ @accessories . each do |accessory |
108+ accessory_order = current_user . shop_orders . new (
109+ shop_item : accessory ,
110+ quantity : 1 ,
111+ frozen_address : selected_address ,
112+ parent_order_id : @order . id
113+ )
114+ accessory_order . aasm_state = "pending" if accessory_order . respond_to? ( :aasm_state= )
115+ accessory_order . save!
116+ end
117+ end
118+
90119 if @shop_item . is_a? ( ShopItem ::FreeStickers )
91120 begin
92121 @shop_item . fulfill! ( @order )
@@ -99,8 +128,8 @@ def create_order
99128 end
100129 end
101130 redirect_to shop_my_orders_path , notice : "Order placed successfully!"
102- else
103- redirect_to shop_order_path ( shop_item_id : @shop_item . id ) , alert : "Failed to place order: #{ @order . errors . full_messages . join ( ', ' ) } "
131+ rescue ActiveRecord :: RecordInvalid => e
132+ redirect_to shop_order_path ( shop_item_id : @shop_item . id ) , alert : "Failed to place order: #{ e . record . errors . full_messages . join ( ', ' ) } "
104133 end
105134 end
106135
0 commit comments