diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 332af710e8..8bb09d4e5d 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -344,7 +344,6 @@ module Spree # update payment and shipment(s) states, and save updater.update_payment_state - cancel_payments_requiring_auth shipments.each do |shipment| shipment.update!(self) shipment.finalize! @@ -612,12 +611,6 @@ module Spree private - def cancel_payments_requiring_auth - return unless payment_state == "paid" - - payments.to_a.select(&:requires_authorization?).each(&:void_transaction!) - end - def fee_handler @fee_handler ||= OrderFeesHandler.new(self) end diff --git a/engines/order_management/app/services/order_management/order/updater.rb b/engines/order_management/app/services/order_management/order/updater.rb index e17a9e3ad6..41d0374047 100644 --- a/engines/order_management/app/services/order_management/order/updater.rb +++ b/engines/order_management/app/services/order_management/order/updater.rb @@ -122,6 +122,7 @@ module OrderManagement last_payment_state = order.payment_state order.payment_state = infer_payment_state + cancel_payments_requiring_auth unless last_payment_state == "paid" track_payment_state_change(last_payment_state) order.payment_state @@ -162,6 +163,12 @@ module OrderManagement private + def cancel_payments_requiring_auth + return unless order.payment_state == "paid" + + payments.to_a.select(&:requires_authorization?).each(&:void_transaction!) + end + def round_money(value) (value * 100).round / 100.0 end diff --git a/engines/order_management/spec/services/order_management/order/updater_spec.rb b/engines/order_management/spec/services/order_management/order/updater_spec.rb index 142c042c81..3c46b8ebc4 100644 --- a/engines/order_management/spec/services/order_management/order/updater_spec.rb +++ b/engines/order_management/spec/services/order_management/order/updater_spec.rb @@ -360,6 +360,22 @@ module OrderManagement end end end + + context "when unused payments records exist which require authorization, but the order is fully paid" do + let!(:cash_payment) { build(:payment, state: "completed", amount: order.new_outstanding_balance) } + let!(:stripe_payment) { build(:payment, state: "requires_authorization") } + before do + order.payments << cash_payment + order.payments << stripe_payment + end + + it "cancels unused payments requiring authorization" do + expect(stripe_payment).to receive(:void_transaction!) + expect(cash_payment).to_not receive(:void_transaction!) + + order.updater.update_payment_state + end + end end end end diff --git a/spec/models/spree/order_spec.rb b/spec/models/spree/order_spec.rb index 633639d137..ecc4d5dae8 100644 --- a/spec/models/spree/order_spec.rb +++ b/spec/models/spree/order_spec.rb @@ -195,21 +195,6 @@ describe Spree::Order do expect(order.updater).to receive(:before_save_hook) order.finalize! end - - context "extra payments exist that require authorization" do - let!(:cash_payment) { build(:payment, state: "completed", amount: order.new_outstanding_balance) } - let!(:stripe_payment) { build(:payment, state: "requires_authorization") } - before do - order.payments << cash_payment - order.payments << stripe_payment - end - - it "cancels payments requiring authorization" do - expect(stripe_payment).to receive(:void_transaction!) - expect(cash_payment).to_not receive(:void_transaction!) - order.finalize! - end - end end context "#process_payments!" do