From 9a984963a7bf75697601fe38d13aa65469ea2265 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Thu, 8 Dec 2016 13:47:52 +1100 Subject: [PATCH] Ensuring that only active standing orders are processed when order cycle opens --- app/jobs/standing_order_placement_job.rb | 3 +- app/models/standing_order.rb | 2 ++ .../jobs/standing_order_placement_job_spec.rb | 29 +++++++++++++------ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/app/jobs/standing_order_placement_job.rb b/app/jobs/standing_order_placement_job.rb index 9555e65581..91ac2a87ec 100644 --- a/app/jobs/standing_order_placement_job.rb +++ b/app/jobs/standing_order_placement_job.rb @@ -14,7 +14,8 @@ class StandingOrderPlacementJob private def orders - Spree::Order.incomplete.where(order_cycle_id: order_cycle).joins(:standing_order).readonly(false) + Spree::Order.incomplete.where(order_cycle_id: order_cycle) + .merge(StandingOrder.active).joins(:standing_order).readonly(false) end def process(order) diff --git a/app/models/standing_order.rb b/app/models/standing_order.rb index 89ddc91a7c..bec04b520a 100644 --- a/app/models/standing_order.rb +++ b/app/models/standing_order.rb @@ -23,6 +23,8 @@ class StandingOrder < ActiveRecord::Base validate :standing_line_items_available validate :check_associations + scope :active, where('standing_orders.paused_at IS NULL AND standing_orders.canceled_at IS NULL AND standing_orders.begins_at <= (?) AND (standing_orders.ends_at > (?) OR standing_orders.ends_at IS NULL)', Time.zone.now, Time.zone.now) + def closed_standing_order_orders standing_order_orders.closed end diff --git a/spec/jobs/standing_order_placement_job_spec.rb b/spec/jobs/standing_order_placement_job_spec.rb index 6f7676b0a9..6bba533a3e 100644 --- a/spec/jobs/standing_order_placement_job_spec.rb +++ b/spec/jobs/standing_order_placement_job_spec.rb @@ -4,29 +4,40 @@ describe StandingOrderPlacementJob do let(:shop) { create(:distributor_enterprise) } let(:order_cycle1) { create(:simple_order_cycle, coordinator: shop) } let(:order_cycle2) { create(:simple_order_cycle, coordinator: shop) } - let(:schedule1) { create(:schedule, order_cycles: [order_cycle1]) } - let(:schedule2) { create(:schedule, order_cycles: [order_cycle1, order_cycle2]) } + let(:schedule1) { create(:schedule, order_cycles: [order_cycle1, order_cycle2]) } let(:standing_order1) { create(:standing_order_with_items, shop: shop, schedule: schedule1) } - let(:standing_order2) { create(:standing_order_with_items, shop: shop, schedule: schedule2) } + let(:standing_order2) { create(:standing_order_with_items, shop: shop, schedule: schedule1, paused_at: 1.minute.ago) } + let(:standing_order3) { create(:standing_order_with_items, shop: shop, schedule: schedule1, canceled_at: 1.minute.ago) } + let(:standing_order4) { create(:standing_order_with_items, shop: shop, schedule: schedule1, begins_at: 1.minute.from_now) } + let(:standing_order5) { create(:standing_order_with_items, shop: shop, schedule: schedule1, ends_at: 1.minute.ago) } let!(:job) { StandingOrderPlacementJob.new(order_cycle1) } describe "finding standing_order orders for the specified order cycle" do let(:order1) { create(:order, order_cycle: order_cycle1, completed_at: 5.minutes.ago) } # Complete + Linked + OC Matches - let(:order2) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches - let(:order3) { create(:order, order_cycle: order_cycle1) } # Incomplete + Not-Linked + OC Matches - let(:order4) { create(:order, order_cycle: order_cycle2) } # Incomplete + Linked + OC Mismatch + let(:order2) { create(:order, order_cycle: order_cycle1) } # Incomplete + Not-Linked + OC Matches + let(:order3) { create(:order, order_cycle: order_cycle2) } # Incomplete + Linked + OC Mismatch + let(:order4) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Paused + let(:order5) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Cancelled + let(:order6) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Yet To Begin + let(:order7) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Ended + let(:order8) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches before do - standing_order1.orders = [order1,order2] + standing_order1.orders = [order1, order3, order8] standing_order2.orders = [order4] + standing_order3.orders = [order5] + standing_order4.orders = [order6] + standing_order5.orders = [order7] end it "only returns incomplete orders in the relevant order cycle that are linked to a standing order" do orders = job.send(:orders) - expect(orders).to include order2 - expect(orders).to_not include order1, order3, order4 + expect(orders).to include order8 + expect(orders).to_not include order1, order2, order3, order4, order5, order6, order7 end + + end describe "processing an order containing items with insufficient stock" do