From bf27f2d869417789a1c4d74c30c6ff3bc5a3d06e Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 20 May 2026 10:40:15 +0530 Subject: [PATCH 1/2] fix: faster range calculation on process period closing voucher (cherry picked from commit ee33574a6d0a8d6b639a55f85dfc1504c086ff7a) --- .../process_period_closing_voucher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 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 c63c5652cb3..af9faeb396f 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 @@ -69,8 +69,8 @@ class ProcessPeriodClosingVoucher(Document): pcv = frappe.get_doc("Period Closing Voucher", self.parent_pcv) if pcv.is_first_period_closing_voucher(): gl = qb.DocType("GL Entry") - min = qb.from_(gl).select(Min(gl.posting_date)).where(gl.company.eq(pcv.company)).run()[0][0] - max = qb.from_(gl).select(Max(gl.posting_date)).where(gl.company.eq(pcv.company)).run()[0][0] + min = qb.from_(gl).select(Min(gl.posting_date)).run()[0][0] + max = qb.from_(gl).select(Max(gl.posting_date)).run()[0][0] dates = self.get_dates(get_datetime(min), get_datetime(max)) for x in dates: From d81b6ab5dc0ba7b68ac015742f4d8b6c1cf8cd64 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 20 May 2026 11:19:00 +0530 Subject: [PATCH 2/2] refactor: ppcv select with for update and skip locked (cherry picked from commit eba58b28372721e2c8c7563a19e10afa7d8bc5ca) --- .../process_period_closing_voucher.py | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 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 af9faeb396f..2269c4e3194 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 @@ -90,12 +90,16 @@ class ProcessPeriodClosingVoucher(Document): def start_pcv_processing(docname: str): if frappe.db.get_value("Process Period Closing Voucher", docname, "status") in ["Queued", "Running"]: frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Running") - if normal_balances := frappe.db.get_all( - "Process Period Closing Voucher Detail", - filters={"parent": docname, "status": "Queued"}, - fields=["processing_date", "report_type", "parentfield"], - order_by="parentfield, idx, processing_date", - limit=4, + + ppcvd = qb.DocType("Process Period Closing Voucher Detail") + if normal_balances := ( + qb.from_(ppcvd) + .select(ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) + .where(ppcvd.parent.eq(docname) & ppcvd.status.eq("Queued")) + .orderby(ppcvd.parentfield, ppcvd.idx, ppcvd.processing_date) + .limit(4) + .for_update(skip_locked=True) + .run(as_dict=True) ): if not is_scheduler_inactive(): for x in normal_balances: @@ -235,12 +239,15 @@ def get_gle_for_closing_account(pcv, dimension_balance, dimensions): @frappe.whitelist() def schedule_next_date(docname: str): - if to_process := frappe.db.get_all( - "Process Period Closing Voucher Detail", - filters={"parent": docname, "status": "Queued"}, - fields=["processing_date", "report_type", "parentfield"], - order_by="parentfield, idx, processing_date", - limit=1, + ppcvd = qb.DocType("Process Period Closing Voucher Detail") + if to_process := ( + qb.from_(ppcvd) + .select(ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) + .where(ppcvd.parent.eq(docname) & ppcvd.status.eq("Queued")) + .orderby(ppcvd.parentfield, ppcvd.idx, ppcvd.processing_date) + .limit(1) + .for_update(skip_locked=True) + .run(as_dict=True) ): if not is_scheduler_inactive(): frappe.db.set_value(