diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py index 5e4c32d82a4..033246941e3 100644 --- a/erpnext/accounts/doctype/subscription/subscription.py +++ b/erpnext/accounts/doctype/subscription/subscription.py @@ -278,6 +278,9 @@ class Subscription(Document): """ Sets the status of the `Subscription` """ + if self.status == STATUS_CANCELLED: + return + self._set_current_invoice_dates() if self.is_trialling(): self.status = STATUS_TRIALING @@ -673,7 +676,7 @@ class Subscription(Document): if self.cancel_at_period_end and ( getdate(posting_date) >= getdate(self.next_billing_period_end) - or getdate(posting_date) >= getdate(self.end_date) + or (self.end_date and getdate(posting_date) >= getdate(self.end_date)) ): self.cancel_subscription() diff --git a/erpnext/accounts/doctype/subscription/test_subscription.py b/erpnext/accounts/doctype/subscription/test_subscription.py index 551bdb69166..ef96f5f150f 100644 --- a/erpnext/accounts/doctype/subscription/test_subscription.py +++ b/erpnext/accounts/doctype/subscription/test_subscription.py @@ -779,6 +779,38 @@ class TestSubscription(ERPNextTestSuite): subscription.reload() self.assertEqual(subscription.status, "Active") + def test_cancelled_subscription_stays_cancelled_after_payment_and_reprocess(self): + # https://github.com/frappe/erpnext/issues/57761 + subscription = create_subscription( + start_date=nowdate(), + generate_invoice_at="Prepaid (bill at period start)", + submit_invoice=1, + cancel_at_period_end=1, + ) + subscription.process(posting_date=nowdate()) + invoice = subscription.get_current_invoice() + self.assertGreater(invoice.outstanding_amount, 0) + + subscription.cancel_subscription() + self.assertEqual(subscription.status, "Cancelled") + cancelation_date = getdate(subscription.cancelation_date) + self.assertIsNotNone(cancelation_date) + + payment_entry = get_payment_entry(invoice.doctype, invoice.name, bank_account="_Test Bank - _TC") + payment_entry.reference_no = "12345" + payment_entry.reference_date = nowdate() + payment_entry.submit() + + subscription.reload() + self.assertEqual(subscription.status, "Cancelled") + self.assertEqual(getdate(subscription.cancelation_date), cancelation_date) + + invoice_count = len(subscription.invoices) + subscription.process() + subscription.reload() + self.assertEqual(subscription.status, "Cancelled") + self.assertEqual(len(subscription.invoices), invoice_count) + def test_first_invoice_generated_on_create_for_prepaid(self): subscription = create_subscription( start_date=nowdate(),