From f4b790eefa2a89f00d6cc1935ea14e60e15cc904 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Tue, 22 Jan 2019 13:22:43 +0100 Subject: [PATCH] Restore adjustments state after updating We don't know exactly if all adjustments are closed in all circumstances, so it's better to be conservative until we figure out. Chances are that non-completed orders have them open. --- .../spree/orders_controller_decorator.rb | 12 ++++++++-- .../spree/orders_controller_spec.rb | 23 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) 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