From 6f5852eabf60c9fe19f0b58871d2117314b8f90c Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Thu, 28 May 2026 01:27:05 +0530 Subject: [PATCH 1/2] fix: block cancellation if reconciled with a Bank Transaction --- .../doctype/payment_entry/payment_entry.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 357df56c5e9..8bface5db11 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -292,6 +292,30 @@ class PaymentEntry(AccountsController): alert=True, ) + def before_cancel(self): + from erpnext.accounts.doctype.bank_transaction.bank_transaction import ( + get_reconciled_bank_transactions, + ) + + linked_bank_transactions = get_reconciled_bank_transactions(self.doctype, self.name) + + active_bank_transactions = [] + if linked_bank_transactions: + active_bank_transactions = frappe.get_all( + "Bank Transaction", + filters={"name": ("in", linked_bank_transactions), "docstatus": 1}, + pluck="name", + ) + if active_bank_transactions: + frappe.throw( + _( + "Payment Entry {0} is reconciled with Bank Transaction(s): {1}. Please unreconcile it before cancelling." + ).format( + frappe.bold(self.name), + ", ".join(frappe.bold(bt) for bt in active_bank_transactions), + ) + ) + def on_cancel(self): self.ignore_linked_doctypes = ( "GL Entry", From 63ff92cb7c1994cfa5ecfa5ef98001ecf572afbe Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Thu, 28 May 2026 01:49:56 +0530 Subject: [PATCH 2/2] fix: test case --- .../doctype/bank_transaction/test_bank_transaction.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py index c7668a5a592..c2aeda697df 100644 --- a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py +++ b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py @@ -97,12 +97,14 @@ class TestBankTransaction(ERPNextTestSuite): ] ) reconcile_vouchers(bank_transaction.name, vouchers) - payment.reload() - payment.cancel() bank_transaction.reload() - self.assertEqual(bank_transaction.docstatus, DocStatus.submitted()) + bank_transaction.remove_payment_entries() + bank_transaction.reload() self.assertEqual(bank_transaction.unallocated_amount, 1700) self.assertEqual(bank_transaction.payment_entries, []) + payment.reload() + payment.cancel() + self.assertEqual(bank_transaction.docstatus, DocStatus.submitted()) # Check if ERPNext can correctly filter a linked payments based on the debit/credit amount def test_debit_credit_output(self):