diff --git a/app/jobs/amend_backorder_job.rb b/app/jobs/amend_backorder_job.rb index 02429b6ef2..b4d2bf0506 100644 --- a/app/jobs/amend_backorder_job.rb +++ b/app/jobs/amend_backorder_job.rb @@ -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) diff --git a/app/services/orders/bulk_cancel_service.rb b/app/services/orders/bulk_cancel_service.rb index 6eed24c7d9..86e7637b8e 100644 --- a/app/services/orders/bulk_cancel_service.rb +++ b/app/services/orders/bulk_cancel_service.rb @@ -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 diff --git a/spec/jobs/amend_backorder_job_spec.rb b/spec/jobs/amend_backorder_job_spec.rb index 9229db6d6c..bde82b0741 100644 --- a/spec/jobs/amend_backorder_job_spec.rb +++ b/spec/jobs/amend_backorder_job_spec.rb @@ -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)