From 8c8b9d1b23bd5f35d75204ba944b5848d6865f0e Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 16 Feb 2022 09:20:38 +0000 Subject: [PATCH 1/6] Sync subscriptions on newly-cloned order cycles --- app/models/order_cycle.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index 7b7d1044d5..86e76ba7b9 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -159,6 +159,7 @@ class OrderCycle < ApplicationRecord oc.schedule_ids = schedule_ids oc.save! exchanges.each { |e| e.clone!(oc) } + sync_subscriptions oc.reload end @@ -273,6 +274,14 @@ class OrderCycle < ApplicationRecord private + def sync_subscriptions + return unless schedule_ids.any? + + subscriptions = Subscription.where(schedule_id: schedule_ids) + syncer = OrderManagement::Subscriptions::ProxyOrderSyncer.new(subscriptions) + syncer.sync! + end + def orders_close_at_after_orders_open_at? return if orders_open_at.blank? || orders_close_at.blank? return if orders_close_at > orders_open_at From d4488fdb3f6f7494ceac3ab7f58b01351377fe9c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 16 Feb 2022 12:53:22 +0000 Subject: [PATCH 2/6] Return early if OC is closed --- app/models/order_cycle.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index 86e76ba7b9..a17676306e 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -275,7 +275,7 @@ class OrderCycle < ApplicationRecord private def sync_subscriptions - return unless schedule_ids.any? + return unless open? && schedule_ids.any? subscriptions = Subscription.where(schedule_id: schedule_ids) syncer = OrderManagement::Subscriptions::ProxyOrderSyncer.new(subscriptions) From 4260422ea798461e648a8a9d8a8c21ec0b77ffcc Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 16 Feb 2022 12:55:19 +0000 Subject: [PATCH 3/6] Remove a couple of unnecessary memory assignments --- app/models/order_cycle.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index a17676306e..2370d7c01b 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -277,9 +277,9 @@ class OrderCycle < ApplicationRecord def sync_subscriptions return unless open? && schedule_ids.any? - subscriptions = Subscription.where(schedule_id: schedule_ids) - syncer = OrderManagement::Subscriptions::ProxyOrderSyncer.new(subscriptions) - syncer.sync! + OrderManagement::Subscriptions::ProxyOrderSyncer.new( + Subscription.where(schedule_id: schedule_ids) + ).sync! end def orders_close_at_after_orders_open_at? From 459282726186a0846e39b0064a25da858bdfd1df Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 16 Feb 2022 13:03:27 +0000 Subject: [PATCH 4/6] Sync OC subscriptions if transitioning from closed to open --- app/models/order_cycle.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index 2370d7c01b..79f04589f5 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -29,6 +29,7 @@ class OrderCycle < ApplicationRecord attr_accessor :incoming_exchanges, :outgoing_exchanges before_update :reset_processed_at, if: :will_save_change_to_orders_close_at? + after_save :sync_subscriptions, if: :opening? validates :name, :coordinator_id, presence: true validate :orders_close_at_after_orders_open_at? @@ -274,6 +275,14 @@ class OrderCycle < ApplicationRecord private + def opening? + open? && orders_close_at_changed? && was_closed? + end + + def was_closed? + orders_close_at_was && Time.zone.now > orders_close_at_was + end + def sync_subscriptions return unless open? && schedule_ids.any? From 5913720c85310119e291ea982162f881e358b76b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 16 Feb 2022 17:25:14 +0000 Subject: [PATCH 5/6] Sync for both open and upcoming OCs when switching from closed --- app/models/order_cycle.rb | 6 +++--- spec/models/order_cycle_spec.rb | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index 79f04589f5..e880083316 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -276,15 +276,15 @@ class OrderCycle < ApplicationRecord private def opening? - open? && orders_close_at_changed? && was_closed? + (open? || upcoming?) && saved_change_to_orders_close_at? && was_closed? end def was_closed? - orders_close_at_was && Time.zone.now > orders_close_at_was + orders_close_at_previously_was && Time.zone.now > orders_close_at_previously_was end def sync_subscriptions - return unless open? && schedule_ids.any? + return unless schedule_ids.any? OrderManagement::Subscriptions::ProxyOrderSyncer.new( Subscription.where(schedule_id: schedule_ids) diff --git a/spec/models/order_cycle_spec.rb b/spec/models/order_cycle_spec.rb index ba89bf282a..652eecafdd 100644 --- a/spec/models/order_cycle_spec.rb +++ b/spec/models/order_cycle_spec.rb @@ -550,6 +550,30 @@ describe OrderCycle do end end + describe "syncing subscriptions" do + let!(:oc) { + create(:simple_order_cycle, orders_open_at: 1.week.ago, orders_close_at: 1.day.ago) + } + let(:schedule) { create(:schedule, order_cycles: [oc]) } + let!(:subscription) { create(:subscription, schedule: schedule, with_items: true) } + + it "syncs subscriptions when transitioning from closed to open" do + expect(OrderManagement::Subscriptions::ProxyOrderSyncer).to receive(:new).and_call_original + + expect{ + oc.update(orders_close_at: 1.week.from_now) + }.to change{ ProxyOrder.count } + end + + it "syncs subscriptions when transitioning from closed to upcoming" do + expect(OrderManagement::Subscriptions::ProxyOrderSyncer).to receive(:new).and_call_original + + expect { + oc.update(orders_open_at: 1.day.from_now, orders_close_at: 1.week.from_now) + }.to change{ ProxyOrder.count } + end + end + describe "processed_at " do let!(:oc) { create(:simple_order_cycle, orders_open_at: 1.week.ago, orders_close_at: 1.day.ago, processed_at: 1.hour.ago) From 00fa84e3b510b48cba967ea2c33595ad5f43e2cb Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 16 Feb 2022 21:45:43 +0000 Subject: [PATCH 6/6] Sync when switching from nil dates to open --- app/models/order_cycle.rb | 2 +- spec/models/order_cycle_spec.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index e880083316..c6e2d4a0aa 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -280,7 +280,7 @@ class OrderCycle < ApplicationRecord end def was_closed? - orders_close_at_previously_was && Time.zone.now > orders_close_at_previously_was + orders_close_at_previously_was.blank? || Time.zone.now > orders_close_at_previously_was end def sync_subscriptions diff --git a/spec/models/order_cycle_spec.rb b/spec/models/order_cycle_spec.rb index 652eecafdd..4ebb79a9a1 100644 --- a/spec/models/order_cycle_spec.rb +++ b/spec/models/order_cycle_spec.rb @@ -572,6 +572,18 @@ describe OrderCycle do oc.update(orders_open_at: 1.day.from_now, orders_close_at: 1.week.from_now) }.to change{ ProxyOrder.count } end + + context "when the current dates are nil" do + before { oc.update(orders_open_at: nil, orders_close_at: nil) } + + it "syncs subscriptions when transitioning from closed to open" do + expect(OrderManagement::Subscriptions::ProxyOrderSyncer).to receive(:new).and_call_original + + expect{ + oc.update(orders_open_at: 1.day.ago, orders_close_at: 1.week.from_now) + }.to change{ ProxyOrder.count } + end + end end describe "processed_at " do