From 9f31e49ef2a9683e4bb56b1f460d11d2a751f75a Mon Sep 17 00:00:00 2001 From: Jordan Brough Date: Thu, 21 May 2015 13:15:53 -0600 Subject: [PATCH] Fix payment cancellation for pending store credits This fixes store credit payment cancellation when auto-capture is turned off. When auto-capture is turned off an order can be canceled with its store credit payments "authorized" but not "captured". The old code was marking the payments as voided but not actually voiding them and releasing the authorization. --- core/app/models/spree/order.rb | 2 +- core/spec/models/spree/order_spec.rb | 41 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/core/app/models/spree/order.rb b/core/app/models/spree/order.rb index 47ef977ddf3..948d24dbead 100644 --- a/core/app/models/spree/order.rb +++ b/core/app/models/spree/order.rb @@ -766,7 +766,7 @@ def ensure_available_shipping_rates def after_cancel shipments.each { |shipment| shipment.cancel! } payments.completed.each { |payment| payment.cancel! } - payments.store_credits.pending.each { |payment| payment.void! } + payments.store_credits.pending.each { |payment| payment.void_transaction! } send_cancel_email self.update! diff --git a/core/spec/models/spree/order_spec.rb b/core/spec/models/spree/order_spec.rb index 38c5ff08012..9841905eee8 100644 --- a/core/spec/models/spree/order_spec.rb +++ b/core/spec/models/spree/order_spec.rb @@ -1337,5 +1337,46 @@ def compute(computable) expect(subject.display_store_credit_remaining_after_capture.money.cents).to eq (amount_remaining * 100.0) end end + + context 'when not capturing at order completion' do + let!(:store_credit_payment_method) do + create( + :store_credit_payment_method, + auto_capture: false, # not capturing at completion time + ) + end + + describe '#after_cancel' do + let(:user) { create(:user) } + let!(:store_credit) do + create(:store_credit, amount: 100, user: user) + end + let(:order) do + create( + :order_with_line_items, + user: user, + line_items_count: 1, + # order will be $20 total: + line_items_price: 10, + shipment_cost: 10, + ) + end + + before do + order.contents.advance + order.complete! + end + + it 'releases the pending store credit authorization' do + expect { + order.cancel! + }.to change { + store_credit.reload.amount_authorized + }.from(20).to(0) + + expect(store_credit.amount_remaining).to eq 100 + end + end + end end end