From 2d3081b10e6070f27dbc5923924e698c8ab75d71 Mon Sep 17 00:00:00 2001 From: Ikraam Ghoor Date: Fri, 26 Jun 2026 05:27:22 +0200 Subject: [PATCH] Sum payment refunds in memory during recalculation Recalculating the payment total preloaded each payment's refunds but then summed them with a column-level sum, issuing one extra query per payment. Summing the already-loaded refunds keeps it to the single preload. --- core/app/models/spree/order_updater.rb | 2 +- core/spec/models/spree/order_updater_spec.rb | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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