diff --git a/app/controllers/line_items_controller.rb b/app/controllers/line_items_controller.rb index 004f511bb5..0459ae9351 100644 --- a/app/controllers/line_items_controller.rb +++ b/app/controllers/line_items_controller.rb @@ -31,6 +31,7 @@ class LineItemsController < BaseController order.with_lock do item.destroy order.update_shipping_fees! + order.update_payment_fees! order.update_distribution_charge! end end diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb index e31745ba83..4a746cd856 100644 --- a/app/models/spree/order_decorator.rb +++ b/app/models/spree/order_decorator.rb @@ -144,14 +144,22 @@ Spree::Order.class_eval do line_items(:reload) shipments.each do |shipment| next if shipment.shipped? - adjustment = shipment.adjustment - locked = adjustment.locked - adjustment.locked = false - adjustment.update! - adjustment.locked = locked - update_totals - save + update_adjustment! shipment.adjustment end + update_totals + save + end + + # After changing line items of a completed order + def update_payment_fees! + payments(:reload) + line_items(:reload) + payments.each do |payment| + next if payment.completed? + update_adjustment! payment.adjustment + end + update_totals + save end def cap_quantity_at_stock! @@ -333,4 +341,11 @@ Spree::Order.class_eval do self.customer = Customer.create(enterprise: distributor, email: email_for_customer, user: user, name: customer_name, bill_address: bill_address.andand.clone, ship_address: ship_address.andand.clone) end end + + def update_adjustment!(adjustment) + locked = adjustment.locked + adjustment.locked = false + adjustment.update! + adjustment.locked = locked + end end diff --git a/spec/controllers/line_items_controller_spec.rb b/spec/controllers/line_items_controller_spec.rb index 5df2131d06..dc566bbafa 100644 --- a/spec/controllers/line_items_controller_spec.rb +++ b/spec/controllers/line_items_controller_spec.rb @@ -68,8 +68,8 @@ describe LineItemsController do # Sanity check fees item_num = order.line_items.length - expected_fees = item_num * (shipping_fee + payment_fee) - expect(order.adjustment_total).to eq expected_fees + initial_fees = item_num * (shipping_fee + payment_fee) + expect(order.adjustment_total).to eq initial_fees # Delete the item item = order.line_items.first @@ -80,6 +80,6 @@ describe LineItemsController do # Check the fees again order.reload - expect(order.adjustment_total).to eq expected_fees - shipping_fee + expect(order.adjustment_total).to eq initial_fees - shipping_fee - payment_fee end end diff --git a/spec/factories.rb b/spec/factories.rb index 5f1a0ae7b9..4c3cc67ebd 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -271,7 +271,7 @@ FactoryGirl.define do order.create_shipment! payment_calculator = build(:calculator_per_item, preferred_amount: evaluator.payment_fee) payment_method = create(:payment_method, calculator: payment_calculator) - create(:payment, order: order, amount: order.total, payment_method: payment_method, state: 'completed') + create(:payment, order: order, amount: order.total, payment_method: payment_method, state: 'checkout') order.finalize! end end diff --git a/spec/models/spree/order_spec.rb b/spec/models/spree/order_spec.rb index 74418c6642..6a005362c1 100644 --- a/spec/models/spree/order_spec.rb +++ b/spec/models/spree/order_spec.rb @@ -674,6 +674,20 @@ describe Spree::Order do expect(order.line_items.length).to eq item_num - 1 expect(order.adjustment_total).to eq expected_fees - shipping_fee end + + it "updates transaction fees" do + item_num = order.line_items.length + initial_fees = item_num * (shipping_fee + payment_fee) + + # Delete the item + order.line_items.first.destroy + order.update_payment_fees! + + # Check if fees got updated + expect(order.adjustments.length).to eq 2 + expect(order.line_items.length).to eq item_num - 1 + expect(order.adjustment_total).to eq initial_fees - payment_fee + end end describe "retrieving previously ordered items" do