From 61d6d2f344de72fda4fcc3027914bead647c1c9c Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Tue, 2 Jun 2026 14:47:39 +0530 Subject: [PATCH] feat(payment-entry): warn user before cancelling reconciled payment entry (cherry picked from commit f0ba54d9572da26f4b7983faf1ea8ddd2530b9e0) --- .../doctype/payment_entry/payment_entry.js | 29 +++++++++++++++++++ .../doctype/payment_entry/payment_entry.py | 13 +++++++++ 2 files changed, 42 insertions(+) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 33f0dee0702..8d5e6436d89 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -1726,6 +1726,35 @@ frappe.ui.form.on("Payment Entry", { }, }); }, + + before_cancel: function (frm) { + return new Promise((resolve, reject) => { + frappe.call({ + method: "erpnext.accounts.doctype.payment_entry.payment_entry.get_linked_bank_transactions", + args: { payment_entry: frm.doc.name }, + callback: function (r) { + const linked = r.message || []; + if (!linked.length) { + resolve(); + return; + } + const bt_links = linked + .map((name) => frappe.utils.get_form_link("Bank Transaction", name, true)) + .join(", "); + frappe.confirm( + __( + "This Payment Entry is reconciled with {0}. Cancelling will automatically unreconcile it. Do you want to proceed?", + [bt_links] + ), + () => resolve(), + () => reject(), + __("Yes"), + __("No") + ); + }, + }); + }); + }, }); frappe.ui.form.on("Payment Entry Reference", { diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index c48a3d6c09d..4b35ed9fa0e 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -3568,3 +3568,16 @@ def make_payment_order(source_name, target_doc=None): @erpnext.allow_regional def add_regional_gl_entries(gl_entries, doc): return + + +@frappe.whitelist() +def get_linked_bank_transactions(payment_entry: str) -> list: + frappe.has_permission("Payment Entry", ptype="read", doc=payment_entry, throw=True) + return frappe.get_all( + "Bank Transaction Payments", + filters={ + "payment_document": "Payment Entry", + "payment_entry": payment_entry, + }, + pluck="parent", + )