summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean <seand7565@gmail.com>2020-12-15 14:43:08 -0600
committerSean <seand7565@gmail.com>2020-12-16 08:33:25 -0600
commit5ad9618cfeaf6e8aa26cb23798cb85c2c20fa22c (patch)
tree25d58b417e59d6bc6c1ea7f1afb1378b0191fb64
parent982e340b73a63089907a3e68ebd7395f16892fa2 (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.rb4
-rw-r--r--lib/solidus_subscriptions/processor.rb2
-rw-r--r--spec/lib/solidus_subscriptions/processor_spec.rb11
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