From 1ef890db732caff9fc77716fd3932ae9c4055b4f Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 12 Aug 2024 17:37:48 +0530 Subject: [PATCH 1/4] fix: force fetch updates for subcription --- .../doctype/subscription/subscription.js | 13 +++++++++++++ .../doctype/subscription/subscription.py | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/erpnext/accounts/doctype/subscription/subscription.js b/erpnext/accounts/doctype/subscription/subscription.js index b3e21abcaae..306b049220d 100644 --- a/erpnext/accounts/doctype/subscription/subscription.js +++ b/erpnext/accounts/doctype/subscription/subscription.js @@ -38,6 +38,12 @@ frappe.ui.form.on("Subscription", { __("Actions") ); + frm.add_custom_button( + __("Force Fetch Subscription Updates"), + () => frm.trigger("force_fetch_subscription_updates"), + __("Actions") + ); + frm.add_custom_button( __("Cancel Subscription"), () => frm.trigger("cancel_this_subscription"), @@ -82,4 +88,11 @@ frappe.ui.form.on("Subscription", { } }); }, + force_fetch_subscription_updates: function (frm) { + frm.call("force_fetch_subscription_updates").then((r) => { + if (!r.exec) { + frm.reload_doc(); + } + }); + }, }); diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py index 3b1e594638b..7d3d7321c62 100644 --- a/erpnext/accounts/doctype/subscription/subscription.py +++ b/erpnext/accounts/doctype/subscription/subscription.py @@ -717,6 +717,25 @@ class Subscription(Document): self.update_subscription_period(posting_date or nowdate()) self.save() + @frappe.whitelist() + def force_fetch_subscription_updates(self): + """ + Process Subscription and create Invoices even if current date doesn't lie between current_invoice_start and currenct_invoice_end + It makes use of 'Proces Subscription' to force processing in a specific 'posting_date' + """ + processing_date = None + if self.generate_invoice_at == "Beginning of the current subscription period": + processing_date = self.current_invoice_start + elif self.generate_invoice_at == "End of the current subscription period": + processing_date = self.current_invoice_end + elif self.generate_invoice_at == "Days before the current subscription period": + processing_date = add_days(self.current_invoice_start, -self.number_of_days) + + process_subscription = frappe.new_doc("Process Subscription") + process_subscription.posting_date = processing_date + process_subscription.subscription = self.name + process_subscription.save().submit() + def is_prorate() -> int: return cint(frappe.db.get_single_value("Subscription Settings", "prorate")) From 3a115774114a1986435739936c195a17a0b65af3 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 13 Aug 2024 12:34:10 +0530 Subject: [PATCH 2/4] refactor: don't process future subscriptions --- erpnext/accounts/doctype/subscription/subscription.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py index 7d3d7321c62..2358e55025e 100644 --- a/erpnext/accounts/doctype/subscription/subscription.py +++ b/erpnext/accounts/doctype/subscription/subscription.py @@ -723,6 +723,12 @@ class Subscription(Document): Process Subscription and create Invoices even if current date doesn't lie between current_invoice_start and currenct_invoice_end It makes use of 'Proces Subscription' to force processing in a specific 'posting_date' """ + + # Don't process future subscriptions + if nowdate() < self.current_invoice_start: + frappe.msgprint(_("Subscription for Future dates cannot be processed.")) + return + processing_date = None if self.generate_invoice_at == "Beginning of the current subscription period": processing_date = self.current_invoice_start From d8b6767697afe6e59b33e62466ffcb8653b23b96 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 13 Aug 2024 12:35:16 +0530 Subject: [PATCH 3/4] chore: minor naming change --- erpnext/accounts/doctype/subscription/subscription.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/subscription/subscription.js b/erpnext/accounts/doctype/subscription/subscription.js index 306b049220d..629d118080a 100644 --- a/erpnext/accounts/doctype/subscription/subscription.js +++ b/erpnext/accounts/doctype/subscription/subscription.js @@ -39,7 +39,7 @@ frappe.ui.form.on("Subscription", { ); frm.add_custom_button( - __("Force Fetch Subscription Updates"), + __("Force-Fetch Subscription Updates"), () => frm.trigger("force_fetch_subscription_updates"), __("Actions") ); From fd680380bbb93313a0d0853eaf9144726c44551c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 13 Aug 2024 16:05:06 +0530 Subject: [PATCH 4/4] refactor: test for force-fetch on future subscription --- .../doctype/subscription/test_subscription.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/erpnext/accounts/doctype/subscription/test_subscription.py b/erpnext/accounts/doctype/subscription/test_subscription.py index 8957fb90de6..75626933ace 100644 --- a/erpnext/accounts/doctype/subscription/test_subscription.py +++ b/erpnext/accounts/doctype/subscription/test_subscription.py @@ -521,6 +521,18 @@ class TestSubscription(FrappeTestCase): subscription.process(posting_date="2023-01-22") self.assertEqual(len(subscription.invoices), 2) + def test_future_subscription(self): + """Force-Fetch should not process future subscriptions""" + subscription = create_subscription( + start_date=add_months(nowdate(), 1), + submit_invoice=0, + generate_new_invoices_past_due_date=1, + party="_Test Subscription Customer John Doe", + ) + subscription.force_fetch_subscription_updates() + subscription.reload() + self.assertEqual(len(subscription.invoices), 0) + def make_plans(): create_plan(plan_name="_Test Plan Name", cost=900, currency="INR")