diff --git a/core/app/models/spree/order_updater.rb b/core/app/models/spree/order_updater.rb index 063968ad22..05b4a28861 100644 --- a/core/app/models/spree/order_updater.rb +++ b/core/app/models/spree/order_updater.rb @@ -148,7 +148,7 @@ def update_shipments end def recalculate_payment_total - order.payment_total = payments.completed.includes(:refunds).sum { |payment| payment.amount - payment.refunds.sum(:amount) } + order.payment_total = payments.completed.includes(:refunds).sum { |payment| payment.amount - payment.refunds.sum(&:amount) } end alias_method :update_payment_total, :recalculate_payment_total deprecate update_payment_total: :recalculate_payment_total, deprecator: Spree.deprecator diff --git a/core/spec/models/spree/order_updater_spec.rb b/core/spec/models/spree/order_updater_spec.rb index 8b64534a69..addd65ae77 100644 --- a/core/spec/models/spree/order_updater_spec.rb +++ b/core/spec/models/spree/order_updater_spec.rb @@ -23,6 +23,17 @@ module Spree end end + context "recalculating payment totals" do + before { create(:payment_with_refund, order:, amount: 33.25, refund_amount: 3) } + + it "sums refunds from a single preload, not once per payment" do + create(:payment_with_refund, order:, amount: 20, refund_amount: 2) + order.payments.reset + + expect { updater.recalculate }.to make_database_queries(matching: /from .spree_refunds./i, count: 1) + end + end + it "update item total" do expect { updater.recalculate