diff options
author | Sean <seand7565@gmail.com> | 2020-12-15 14:43:08 -0600 |
---|---|---|
committer | Sean <seand7565@gmail.com> | 2020-12-16 08:33:25 -0600 |
commit | 5ad9618cfeaf6e8aa26cb23798cb85c2c20fa22c (patch) | |
tree | 25d58b417e59d6bc6c1ea7f1afb1378b0191fb64 | |
parent | 982e340b73a63089907a3e68ebd7395f16892fa2 (diff) |
Avoid processing installments with cancelled subscriptions
Anyone who cancels their subscription with a failed installment will
still have an order created the next time installments are created.
This is because installments don't check the status of their associated
subscriptions before being processed.
This update will ensure that only installments with active subscriptions
are processed.
-rw-r--r-- | app/models/solidus_subscriptions/installment.rb | 4 | ||||
-rw-r--r-- | lib/solidus_subscriptions/processor.rb | 2 | ||||
-rw-r--r-- | spec/lib/solidus_subscriptions/processor_spec.rb | 11 |
3 files changed, 16 insertions, 1 deletions
diff --git a/app/models/solidus_subscriptions/installment.rb b/app/models/solidus_subscriptions/installment.rb index 9185743..6d6baaa 100644 --- a/app/models/solidus_subscriptions/installment.rb +++ b/app/models/solidus_subscriptions/installment.rb @@ -23,6 +23,10 @@ module SolidusSubscriptions where.not(id: fulfilled_ids).distinct end) + scope :with_active_subscription, (lambda do + joins(:subscription).where.not(Subscription.table_name => {state: "canceled"}) + end) + scope :actionable, (lambda do unfulfilled.where("#{table_name}.actionable_date <= ?", Time.zone.today) end) diff --git a/lib/solidus_subscriptions/processor.rb b/lib/solidus_subscriptions/processor.rb index 4946b5a..d56816a 100644 --- a/lib/solidus_subscriptions/processor.rb +++ b/lib/solidus_subscriptions/processor.rb @@ -34,7 +34,7 @@ module SolidusSubscriptions ). where( SolidusSubscriptions::Subscription.actionable.arel.constraints.reduce(:and). - or(SolidusSubscriptions::Installment.actionable.arel.constraints.reduce(:and)) + or(SolidusSubscriptions::Installment.actionable.with_active_subscription.arel.constraints.reduce(:and)) ). distinct. find_in_batches diff --git a/spec/lib/solidus_subscriptions/processor_spec.rb b/spec/lib/solidus_subscriptions/processor_spec.rb index 1c94565..3ef9aa2 100644 --- a/spec/lib/solidus_subscriptions/processor_spec.rb +++ b/spec/lib/solidus_subscriptions/processor_spec.rb @@ -129,6 +129,17 @@ RSpec.describe SolidusSubscriptions::Processor, :checkout do expect { subject }.to change { Spree::Order.complete.count }.by 2 end end + + context 'the subscription is cancelled with pending installments' do + let!(:cancelled_installment) do + installment = create(:installment, actionable_date: Date.today) + installment.subscription.cancel! + end + + it 'does not process the installment' do + expect { subject }.to change { Spree::Order.complete.count }.by expected_orders + end + end end describe '.run' do |