From 6755101654b752747b0cf099be7d162aa11264b1 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 May 2026 14:11:46 +0530 Subject: [PATCH 1/3] refactor: summarize in background (cherry picked from commit 1c3a9f7dd9aab3ea0ea97ba478366edcaf0d9437) --- .../process_period_closing_voucher.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 cf10d3152d5..805d639cdae 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 @@ -288,7 +288,14 @@ def schedule_next_date(docname: str): ) # Ensure both normal and opening balances are processed for all dates if total_no_of_dates == completed: - summarize_and_post_ledger_entries(docname) + frappe.enqueue( + method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.summarize_and_post_ledger_entries", + queue="long", + timeout="3600", + is_async=True, + enqueue_after_commit=True, + docname=docname, + ) def make_dict_json_compliant(dimension_wise_balance) -> dict: From a19611a2e966a5577dc67d7832db0a26c33cca72 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 May 2026 16:02:09 +0530 Subject: [PATCH 2/3] refactor: handle processes stuck in running state in process pcv (cherry picked from commit f414778486e7526e8d4b07eccc627fb858acd6e3) --- .../process_period_closing_voucher.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 805d639cdae..51450334406 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 @@ -137,9 +137,10 @@ def pause_pcv_processing(docname: str): ppcv = qb.DocType("Process Period Closing Voucher") qb.update(ppcv).set(ppcv.status, "Paused").where(ppcv.name.eq(docname)).run() + # If a date is stuck in 'Running' state, this will allow it to procced. if queued_dates := frappe.db.get_all( "Process Period Closing Voucher Detail", - filters={"parent": docname, "status": "Queued"}, + filters={"parent": docname, "status": ["in", ["Queued", "Running"]]}, pluck="name", ): ppcvd = qb.DocType("Process Period Closing Voucher Detail") @@ -173,6 +174,9 @@ def resume_pcv_processing(docname: str): ppcvd = qb.DocType("Process Period Closing Voucher Detail") qb.update(ppcvd).set(ppcvd.status, "Queued").where(ppcvd.name.isin(paused_dates)).run() start_pcv_processing(docname) + else: + # If a parent doc is stuck in 'Running' state, will allow it to proceed. + schedule_next_date(docname) def update_default_dimensions(dimension_fields, gl_entry, dimension_values): From 5dc37b1130c2aa86a9da708b5130f5b9c22a8868 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 26 May 2026 09:51:40 +0530 Subject: [PATCH 3/3] refactor: atomic summarization step for process pcv (cherry picked from commit 6cb7971342b6425894e4b3b040d4a5b2ed0faa08) --- .../process_period_closing_voucher.py | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) 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 51450334406..24b9fabd998 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 @@ -292,15 +292,22 @@ def schedule_next_date(docname: str): ) # Ensure both normal and opening balances are processed for all dates if total_no_of_dates == completed: - frappe.enqueue( - method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.summarize_and_post_ledger_entries", - queue="long", - timeout="3600", - is_async=True, - enqueue_after_commit=True, - docname=docname, + from erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation import ( + is_job_running, ) + job_name = f"summarize_{docname}" + if not is_job_running(job_name): + frappe.enqueue( + method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.summarize_and_post_ledger_entries", + queue="long", + timeout="3600", + is_async=True, + job_name=job_name, + enqueue_after_commit=True, + docname=docname, + ) + def make_dict_json_compliant(dimension_wise_balance) -> dict: """