From a7ec01bf219dc1a682487a698cd6a1fa83ca8c53 Mon Sep 17 00:00:00 2001 From: Pandiyan P Date: Wed, 24 Sep 2025 11:37:16 +0530 Subject: [PATCH] fix(accounting): ensure proper removal of advance references during unreconcillation --- erpnext/accounts/utils.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index f34af14c922..6e43de63ec6 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -964,19 +964,28 @@ def update_accounting_ledgers_after_reference_removal( adv_ple.run() -def remove_ref_from_advance_section(ref_doc: object = None): +def remove_ref_from_advance_section(ref_doc: object = None, payment_name: str | None = None): # TODO: this might need some testing if ref_doc.doctype in ("Sales Invoice", "Purchase Invoice"): - ref_doc.set("advances", []) - adv_type = qb.DocType(f"{ref_doc.doctype} Advance") - qb.from_(adv_type).delete().where(adv_type.parent == ref_doc.name).run() + row_names = [] + for adv in ref_doc.get("advances") or []: + if adv.get("reference_name", None) == payment_name: + row_names.append(adv.name) + + if not row_names: + return + + child_table = ( + "Sales Invoice Advance" if ref_doc.doctype == "Sales Invoice" else "Purchase Invoice Advance" + ) + frappe.db.delete(child_table, {"name": ("in", row_names)}) def unlink_ref_doc_from_payment_entries(ref_doc: object = None, payment_name: str | None = None): remove_ref_doc_link_from_jv(ref_doc.doctype, ref_doc.name, payment_name) remove_ref_doc_link_from_pe(ref_doc.doctype, ref_doc.name, payment_name) update_accounting_ledgers_after_reference_removal(ref_doc.doctype, ref_doc.name, payment_name) - remove_ref_from_advance_section(ref_doc) + remove_ref_from_advance_section(ref_doc, payment_name) def remove_ref_doc_link_from_jv( @@ -1043,7 +1052,6 @@ def remove_ref_doc_link_from_pe( query = query.where(per.parent == payment_name) reference_rows = query.run(as_dict=True) - if not reference_rows: return