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 97b77ace28..d0ee5abd59 100644 --- a/engines/order_management/app/services/order_management/order/updater.rb +++ b/engines/order_management/app/services/order_management/order/updater.rb @@ -240,7 +240,24 @@ module OrderManagement return unless order.state.in? ["payment", "confirmation", "complete"] return unless order.pending_payments.any? - order.pending_payments.first.update_attribute :amount, order.total + # Update payment tax fees if needed + payment = order.pending_payments.first + new_amount = payment.payment_method.compute_amount(payment) + if new_amount != payment.adjustment.amount + update_payment_adjustment(payment.adjustment, new_amount) + end + + # Update payment with correct amount + payment.update_attribute :amount, order.total + end + + def update_payment_adjustment(adjustment, amount) + adjustment.update_attribute(:amount, amount) + + # Update order total to take into account updated payment fees + update_adjustment_total + update_order_total + persist_totals end end 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 4b1eb0689e..458bb785ce 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 @@ -121,7 +121,7 @@ module OrderManagement updater.update end - context "whith pending payments" do + context "with pending payments" do let(:order) { create(:completed_order_with_totals) } it "updates pending payments" do @@ -183,6 +183,19 @@ module OrderManagement expect { updater.update }.to change { payment.reload.amount }.from(10).to(20) end + + it "updates pending payments fees" do + calculator = build(:calculator_flat_percent_per_item, preferred_flat_percent: 10) + payment_method = create(:payment_method, name: "Percentage cash", calculator:) + payment = create(:payment, payment_method:, order:, amount: order.total) + + # update order so the order total will change + update_order_quantity(order) + order.payments.reload + + expect { updater.update }.to change { payment.reload.amount }.from(10).to(22) + .and change { payment.reload.adjustment.amount }.from(1).to(2) + end end context "with order in cart" do diff --git a/spec/system/consumer/checkout/summary_spec.rb b/spec/system/consumer/checkout/summary_spec.rb index f1b67ea33a..22d1e7cdbd 100644 --- a/spec/system/consumer/checkout/summary_spec.rb +++ b/spec/system/consumer/checkout/summary_spec.rb @@ -320,12 +320,11 @@ RSpec.describe "As a consumer, I want to checkout my order" do :payment_method, distributors: [distributor], name: "Payment with Fee", description: "Payment with fee", - calculator: Calculator::FlatPercentItemTotal.new(preferred_flat_percent: 0.1) + calculator: Calculator::FlatPercentItemTotal.new(preferred_flat_percent: 10) ) } it "calculated the correct order total" do - pending visit checkout_step_path(:payment) expect(page).to have_checked_field "Payment with Fee" @@ -348,7 +347,8 @@ RSpec.describe "As a consumer, I want to checkout my order" do # Check summary page total expect(page).to have_title "Checkout Summary - Open Food Network" - expect(page).to have_selector("#order_total", text: 20.02) + expect(page).to have_selector("#order_total", text: 22.00) + expect(order.reload.payments.first.amount).to eql(22.00) end end