From 14b47e81ce8dadb4a053dde1d0361615e4164d97 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 4 Aug 2025 14:39:50 +0530 Subject: [PATCH] fix: failing subcontracting patch --- erpnext/patches.txt | 2 +- ..._entries_with_no_account_subcontracting.py | 39 +++++++++++-------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index f8e82f01085..977864feca7 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -427,7 +427,7 @@ erpnext.patches.v15_0.set_status_cancelled_on_cancelled_pos_opening_entry_and_po erpnext.patches.v15_0.set_company_on_pos_inv_merge_log erpnext.patches.v15_0.update_payment_ledger_entries_against_advance_doctypes erpnext.patches.v15_0.rename_price_list_to_buying_price_list -erpnext.patches.v15_0.repost_gl_entries_with_no_account_subcontracting #2025-07-31 +erpnext.patches.v15_0.repost_gl_entries_with_no_account_subcontracting #2025-08-04 erpnext.patches.v15_0.patch_missing_buying_price_list_in_material_request erpnext.patches.v15_0.remove_sales_partner_from_consolidated_sales_invoice erpnext.patches.v15_0.add_company_payment_gateway_account diff --git a/erpnext/patches/v15_0/repost_gl_entries_with_no_account_subcontracting.py b/erpnext/patches/v15_0/repost_gl_entries_with_no_account_subcontracting.py index e7394f1071c..0bb47973194 100644 --- a/erpnext/patches/v15_0/repost_gl_entries_with_no_account_subcontracting.py +++ b/erpnext/patches/v15_0/repost_gl_entries_with_no_account_subcontracting.py @@ -2,24 +2,31 @@ import frappe def execute(): + def cancel_incorrect_gl_entries(gl_entries): + table = frappe.qb.DocType("GL Entry") + frappe.qb.update(table).set(table.is_cancelled, 1).where(table.name.isin(gl_entries)).run() + + def recreate_gl_entries(voucher_nos): + for doc in voucher_nos: + doc = frappe.get_doc("Subcontracting Receipt", doc) + for item in doc.supplied_items: + account, cost_center = frappe.db.get_values( + "Subcontracting Receipt Item", item.reference_name, ["expense_account", "cost_center"] + )[0] + + if not item.expense_account: + item.db_set("expense_account", account) + if not item.cost_center: + item.db_set("cost_center", cost_center) + + doc.make_gl_entries() + docs = frappe.get_all( "GL Entry", + fields=["name", "voucher_no"], filters={"voucher_type": "Subcontracting Receipt", "account": ["is", "not set"], "is_cancelled": 0}, - pluck="voucher_no", ) - for doc in docs: - doc = frappe.get_doc("Subcontracting Receipt", doc) - for item in doc.supplied_items: - account, cost_center = frappe.db.get_values( - "Subcontracting Receipt Item", item.reference_name, ["expense_account", "cost_center"] - )[0] - if not item.expense_account: - item.db_set("expense_account", account) - if not item.cost_center: - item.db_set("cost_center", cost_center) - - doc.docstatus = 2 - doc.make_gl_entries_on_cancel() - doc.docstatus = 1 - doc.make_gl_entries() + if docs: + cancel_incorrect_gl_entries([d.name for d in docs]) + recreate_gl_entries([d.voucher_no for d in docs])