From 92c4cb9b7f8d9017e6fa9e2d15e66921e212e26b Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Mon, 28 Oct 2024 14:37:37 +1100 Subject: [PATCH] Redeem VINE voucher when creating a new payment Creating a new payment will try to complete the order, so we want to redeem any VINE voucher associated with the order first --- .../spree/admin/payments_controller.rb | 21 ++++++- spec/requests/spree/admin/payments_spec.rb | 56 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/app/controllers/spree/admin/payments_controller.rb b/app/controllers/spree/admin/payments_controller.rb index 0afaa5227c..075209e052 100644 --- a/app/controllers/spree/admin/payments_controller.rb +++ b/app/controllers/spree/admin/payments_controller.rb @@ -24,9 +24,12 @@ module Spree end def create + # Try to redeem VINE voucher first as we don't want to create a payment and complete + # the order if it fails + return redirect_to spree.admin_order_payments_path(@order) unless redeem_vine_voucher + @payment = @order.payments.build(object_params) load_payment_source - begin unless @payment.save redirect_to spree.admin_order_payments_path(@order) @@ -182,6 +185,22 @@ module Spree %w{capture void_transaction credit refund resend_authorization_email capture_and_complete_order} end + + def redeem_vine_voucher + vine_voucher_redeemer = VineVoucherRedeemerService.new(order: @order) + if vine_voucher_redeemer.call == false + # rubocop:disable Rails/DeprecatedActiveModelErrorsMethods + flash[:error] = if vine_voucher_redeemer.errors.keys.include?(:redeeming_failed) + vine_voucher_redeemer.errors[:redeeming_failed] + else + I18n.t('checkout.errors.voucher_redeeming_error') + end + # rubocop:enable Rails/DeprecatedActiveModelErrorsMethods + return false + end + + true + end end end end diff --git a/spec/requests/spree/admin/payments_spec.rb b/spec/requests/spree/admin/payments_spec.rb index 70c9dd752b..c0bd774d07 100644 --- a/spec/requests/spree/admin/payments_spec.rb +++ b/spec/requests/spree/admin/payments_spec.rb @@ -70,6 +70,62 @@ RSpec.describe Spree::Admin::PaymentsController, type: :request do expect(flash[:error]).to eq("Authorization Failure") end end + + context "with a VINE voucher", feature: :connected_apps do + let(:vine_voucher) { + create(:voucher_flat_rate, voucher_type: "VINE", code: 'some_code', + enterprise: order.distributor, amount: 6) + } + let(:vine_voucher_redeemer) { instance_double(VineVoucherRedeemerService) } + + before do + # Adding voucher to the order + vine_voucher.create_adjustment(vine_voucher.code, order) + VoucherAdjustmentsService.new(order).update + order.update_totals_and_states + + allow(VineVoucherRedeemerService).to receive(:new).and_return(vine_voucher_redeemer) + end + + it "completes the order and redirects to payment page" do + expect(vine_voucher_redeemer).to receive(:call).and_return(true) + + post("/admin/orders/#{order.number}/payments.json", params:) + + expect(response).to redirect_to(spree.admin_order_payments_path(order)) + expect(flash[:success]).to eq "Payment has been successfully created!" + + expect(order.reload.state).to eq "complete" + end + + context "when redeeming the voucher fails" do + it "redirect to payments page" do + allow(vine_voucher_redeemer).to receive(:call).and_return(false) + allow(vine_voucher_redeemer).to receive(:errors).and_return( + { redeeming_failed: "Redeeming the voucher failed" } + ) + + post("/admin/orders/#{order.number}/payments.json", params:) + + expect(response).to redirect_to(spree.admin_order_payments_path(order)) + expect(flash[:error]).to match "Redeeming the voucher failed" + end + end + + context "when an other error happens" do + it "redirect to payments page" do + allow(vine_voucher_redeemer).to receive(:call).and_return(false) + allow(vine_voucher_redeemer).to receive(:errors).and_return( + { vine_api: "There was an error communicating with the API" } + ) + + post("/admin/orders/#{order.number}/payments.json", params:) + + expect(response).to redirect_to(spree.admin_order_payments_path(order)) + expect(flash[:error]).to match "There was an error while trying to redeem your voucher" + end + end + end end describe "PUT /admin/orders/:order_number/payments/:id/fire" do