Update each backorder only once in bulk cancel

This commit is contained in:
Maikel Linke
2024-12-06 11:57:18 +11:00
parent 9ca1b48d2e
commit fcbaefb2c8
3 changed files with 33 additions and 2 deletions

View File

@@ -5,6 +5,15 @@
class AmendBackorderJob < ApplicationJob
sidekiq_options retry: 0
def self.schedule_bulk_update_for(orders)
# We can have one backorder per order cycle and distributor.
groups = orders.group_by { |order| [order.order_cycle, order.distributor] }
groups.each_value do |orders_with_same_backorder|
# We need to trigger only one update per backorder.
perform_later(orders_with_same_backorder.first)
end
end
def perform(order)
OrderLocker.lock_order_and_variants(order) do
amend_backorder(order)

View File

@@ -15,8 +15,7 @@ module Orders
order.send_cancellation_email = @send_cancellation_email
order.restock_items = @restock_items
order.cancel
AmendBackorderJob.perform_later(order)
end
end.tap { |orders| AmendBackorderJob.schedule_bulk_update_for(orders) }
# rubocop:enable Rails/FindEach
end

View File

@@ -50,6 +50,29 @@ RSpec.describe AmendBackorderJob do
chia_seed.on_hand = 7
end
describe ".schedule_bulk_update_for" do
let(:order_same_oc) {
create(
:completed_order_with_totals,
distributor: order.distributor,
order_cycle: order.order_cycle,
)
}
let(:order_other_oc) { create(:completed_order_with_totals) }
it "enqueues only one job per backorder" do
expect {
AmendBackorderJob.schedule_bulk_update_for([order, order_same_oc])
}.to enqueue_job(AmendBackorderJob).exactly(:once)
end
it "enqueues a job for each backorder" do
expect {
AmendBackorderJob.schedule_bulk_update_for([order, order_other_oc])
}.to enqueue_job(AmendBackorderJob).exactly(:twice)
end
end
describe "#amend_backorder" do
it "updates an order" do
stub_request(:get, catalog_url).to_return(body: catalog_json)