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