From 43acfdff82c291e9d7b99d3605441cecf885f237 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 10 Oct 2025 10:50:03 +0530 Subject: [PATCH] refactor: stable start, pause, resume and completion stages (cherry picked from commit c839ebf593082cf44820e92fa6397f633bc011a7) --- .../process_period_closing_voucher.js | 20 +++++++- .../process_period_closing_voucher.py | 48 ++++++++++++++++++- ...process_period_closing_voucher_detail.json | 4 +- .../process_period_closing_voucher_detail.py | 2 +- 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.js b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.js index fcd6ee11b80..3b797476128 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.js +++ b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.js @@ -3,7 +3,7 @@ frappe.ui.form.on("Process Period Closing Voucher", { refresh(frm) { - if (frm.doc.docstatus == 1 && ["Queued"].find((x) => x == frm.doc.status)) { + if (frm.doc.docstatus == 1 && ["Queued", "Paused"].find((x) => x == frm.doc.status)) { let execute_btn = __("Start"); frm.add_custom_button(execute_btn, () => { @@ -20,5 +20,23 @@ frappe.ui.form.on("Process Period Closing Voucher", { }); }); } + + if (frm.doc.docstatus == 1 && ["Running"].find((x) => x == frm.doc.status)) { + let execute_btn = __("Pause"); + + frm.add_custom_button(execute_btn, () => { + frm.call({ + method: "erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.pause_pcv_processing", + args: { + docname: frm.doc.name, + }, + }).then((r) => { + if (!r.exc) { + frappe.show_alert(__("Job Started")); + frm.reload_doc(); + } + }); + }); + } }, }); diff --git a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py index 39d6b1b0874..8a72dca2245 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py @@ -6,6 +6,7 @@ from datetime import timedelta import frappe from frappe.model.document import Document from frappe.utils import add_days, get_datetime +from frappe.utils.scheduler import is_scheduler_inactive class ProcessPeriodClosingVoucher(Document): @@ -43,11 +44,54 @@ class ProcessPeriodClosingVoucher(Document): @frappe.whitelist() def start_pcv_processing(docname: str): - if frappe.db.get_value("Process Period Closing Voucher", docname, "status") == "Queued": - dates_to_process = frappe.db.get_all( + if frappe.db.get_value("Process Period Closing Voucher", docname, "status") in ["Queued", "Paused"]: + frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Running") + if dates_to_process := frappe.db.get_all( "Process Period Closing Voucher Detail", filters={"parent": docname, "status": "Queued"}, fields=["processing_date"], order_by="processing_date", limit=4, + ): + if not is_scheduler_inactive(): + for x in dates_to_process: + frappe.enqueue( + method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.process_individual_date", + queue="long", + is_async=True, + enqueue_after_commit=True, + docname=docname, + date=x.processing_date, + ) + else: + frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") + + +@frappe.whitelist() +def pause_pcv_processing(docname: str): + frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Paused") + + +def process_individual_date(docname: str, date: str): + if frappe.db.get_value("Process Period Closing Voucher", docname, "status") == "Running": + frappe.db.set_value( + "Process Period Closing Voucher Detail", {"processing_date": date}, "status", "Completed" ) + if next_date_to_process := frappe.db.get_all( + "Process Period Closing Voucher Detail", + filters={"parent": docname, "status": "Queued"}, + fields=["processing_date"], + order_by="processing_date", + limit=1, + ): + if not is_scheduler_inactive(): + frappe.enqueue( + method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.process_individual_date", + queue="long", + is_async=True, + enqueue_after_commit=True, + docname=docname, + date=next_date_to_process[0].processing_date, + ) + else: + frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") diff --git a/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json b/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json index ab0963417c0..6d452c18fc0 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json +++ b/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json @@ -22,7 +22,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Status", - "options": "Queued\nRunning\nCompleted" + "options": "Queued\nRunning\nPaused\nCompleted" }, { "fieldname": "closing_balance", @@ -35,7 +35,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-10-08 10:47:50.050341", + "modified": "2025-10-09 16:46:37.778199", "modified_by": "Administrator", "module": "Accounts", "name": "Process Period Closing Voucher Detail", diff --git a/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py b/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py index 3ec46f1b181..f15d917a295 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py @@ -19,7 +19,7 @@ class ProcessPeriodClosingVoucherDetail(Document): parentfield: DF.Data parenttype: DF.Data processing_date: DF.Date | None - status: DF.Literal["Queued", "Running", "Completed"] + status: DF.Literal["Queued", "Running", "Paused", "Completed"] # end: auto-generated types pass