diff --git a/app/services/checkout/params.rb b/app/services/checkout/params.rb index e9491344ff..a14a04656f 100644 --- a/app/services/checkout/params.rb +++ b/app/services/checkout/params.rb @@ -61,7 +61,7 @@ module Checkout def set_payment_amount return unless @order_params[:payments_attributes] - @order_params[:payments_attributes].first[:amount] = order.total + @order_params[:payments_attributes].first[:amount] = order.outstanding_balance.amount end def set_existing_card 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 5fb1d59461..3e40c6b1e1 100644 --- a/engines/order_management/app/services/order_management/order/updater.rb +++ b/engines/order_management/app/services/order_management/order/updater.rb @@ -259,7 +259,7 @@ module OrderManagement def update_payment # Update payment with correct amount - @payment.update_attribute :amount, order.total + @payment.update_attribute :amount, order.outstanding_balance.amount end def update_payment_adjustment(amount) 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 fb5867c71d..f275c91641 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 @@ -155,11 +155,10 @@ RSpec.describe OrderManagement::Order::Updater do end context "with pending payments" do + let(:order) { create(:order_with_totals, state: "payment") } let!(:payment) { create(:payment, order:, amount: order.total) } context "with order in payment state" do - let(:order) { create(:order_with_totals, state: "payment") } - it "updates pending payments" do # update order so the order total will change update_order_quantity(order) @@ -167,6 +166,16 @@ RSpec.describe OrderManagement::Order::Updater do expect { updater.update }.to change { payment.reload.amount }.from(10).to(20) end + + context "with mutiple payments" do + it "updates pending payments" do + create(:payment, order:, amount: 5.00, state: "completed") + last_payment = create(:payment, order:, amount: 10.00) + order.payments.reload + + expect { updater.update }.to change { last_payment.reload.amount }.from(10).to(5) + end + end end context "with order in confirmation state" do diff --git a/spec/controllers/checkout_controller_spec.rb b/spec/controllers/checkout_controller_spec.rb index 2c79faf1ef..8198bd2ed9 100644 --- a/spec/controllers/checkout_controller_spec.rb +++ b/spec/controllers/checkout_controller_spec.rb @@ -503,6 +503,37 @@ RSpec.describe CheckoutController do end end + describe "with customer credit" do + let(:credit_payment_method) { + order.distributor.payment_methods.customer_credit + } + + before do + order.customer = create(:customer, enterprise: distributor) + order.save! + end + + it "adds payment to cover the remaining balance" do + # Add credit + create( + :customer_account_transaction, + amount: 100.00, + customer: order.customer, + payment_method: credit_payment_method + ) + # Create credit payment + payment = order.payments.create!(payment_method: credit_payment_method, amount: 3.00) + payment.internal_purchase! + + put(:update, params:) + + expect(response).to redirect_to checkout_step_path(:summary) + last_payment = order.payments.last + expect(last_payment.amount).to eq(7.00) + expect(last_payment.payment_method.id).to eq(payment_method.id) + end + end + context "with insufficient stock" do it "redirects to details page" do allow(order).to receive_message_chain(:insufficient_stock_lines, diff --git a/spec/system/consumer/checkout/summary_spec.rb b/spec/system/consumer/checkout/summary_spec.rb index 668dbbc135..84c9445d4c 100644 --- a/spec/system/consumer/checkout/summary_spec.rb +++ b/spec/system/consumer/checkout/summary_spec.rb @@ -453,10 +453,13 @@ RSpec.describe "As a consumer, I want to checkout my order" do # actual order total is 10.00 expect(page).to have_selector("#order_total", text: with_currency(8.00)) end + + last_payment = order.payments.last + expect(last_payment.amount).to eq(8.00) # it is the balance due end context "when completing order" do - it "displays part of the order whas paid with credit" do + it "displays part of the order that was paid with credit" do # Move to ready for confirmation order.next!