diff --git a/app/controllers/spree/orders_controller_decorator.rb b/app/controllers/spree/orders_controller_decorator.rb index a76e76becd..206a598c33 100644 --- a/app/controllers/spree/orders_controller_decorator.rb +++ b/app/controllers/spree/orders_controller_decorator.rb @@ -138,11 +138,19 @@ Spree::OrdersController.class_eval do @order.shipment.ensure_correct_adjustment_with_included_tax if @order.shipment end - # Sets the adjustments to open to perform the block's action and closes them back again + # Sets the adjustments to open to perform the block's action and restores + # their state to whatever the they had. def with_open_adjustments + previous_states = @order.adjustments.each_with_object({}) do |adjustment, hash| + hash[adjustment.id] = adjustment.state + end @order.adjustments.each(&:open) + yield - @order.adjustments.each(&:close) + + @order.adjustments.each_with_index do |adjustment, index| + adjustment.update_attribute(:state, previous_states[adjustment.id]) + end end def discard_empty_line_items diff --git a/spec/controllers/spree/orders_controller_spec.rb b/spec/controllers/spree/orders_controller_spec.rb index 49262fe5cb..75f26c67b6 100644 --- a/spec/controllers/spree/orders_controller_spec.rb +++ b/spec/controllers/spree/orders_controller_spec.rb @@ -164,6 +164,18 @@ describe Spree::OrdersController, type: :controller do "1" => {quantity: "99", id: li.id} }) end + + it "keeps the adjustments' previous state" do + order = subject.current_order(true) + line_item = order.add_variant(create(:simple_product, on_hand: 110).variants.first) + adjustment = create(:adjustment, adjustable: order) + + spree_get :update, order: { line_items_attributes: { + "1" => { quantity: "99", id: line_item.id } + }} + + expect(adjustment.state).to eq('open') + end end describe "removing items from a completed order" do @@ -203,6 +215,17 @@ describe Spree::OrdersController, type: :controller do expect(order.adjustment_total).to eq((item_num - 1) * (shipping_fee + payment_fee)) expect(order.shipment.adjustment.included_tax).to eq 0.6 end + + it "keeps the adjustments' previous state" do + spree_post :update, { + order: { line_items_attributes: { + "0" => { id: line_item1.id, quantity: 1 }, + "1" => { id: line_item2.id, quantity: 0 } + } } + } + + expect(order.adjustments.map(&:state)).to eq(['closed', 'closed', 'closed']) + end end context "with enterprise fees" do