fix(accounts): validate payment request bank account ownership

(cherry picked from commit 3419a7c410)

# Conflicts:
#	erpnext/accounts/doctype/payment_request/payment_request.py
This commit is contained in:
nareshkannasln
2026-10-23 12:18:14 +05:30
committed by pandiyan
parent 2d4a360cc2
commit c44d05ad24
2 changed files with 78 additions and 0 deletions
@@ -17,6 +17,17 @@ frappe.ui.form.on("Payment Request", {
},
};
});
frm.set_query("bank_account", function () {
return {
query: "erpnext.accounts.doctype.payment_request.payment_request.get_bank_account_query",
filters: {
company: frm.doc.company,
party_type: frm.doc.party_type,
party: frm.doc.party,
},
};
});
},
});
@@ -110,11 +110,44 @@ class PaymentRequest(Document):
ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
ref_doc.check_permission("read")
self.validate_reference_company(ref_doc)
self.validate_bank_account()
self.validate_print_format()
self.validate_payment_request_amount(ref_doc)
# self.validate_currency()
self.validate_subscription_details()
def validate_bank_account(self):
if not self.bank_account:
return
bank_account = frappe.get_cached_value(
"Bank Account",
self.bank_account,
["disabled", "is_company_account", "company", "party_type", "party"],
as_dict=True,
)
if not bank_account or bank_account.disabled:
frappe.throw(_("Bank Account {0} is missing or disabled").format(self.bank_account))
if bank_account.is_company_account:
if not self.company or bank_account.company != self.company:
frappe.throw(
_("Bank Account {0} does not belong to Company {1}").format(
self.bank_account, self.company
)
)
elif (
not self.party_type
or not self.party
or bank_account.party_type != self.party_type
or bank_account.party != self.party
):
frappe.throw(
_("Bank Account {0} does not belong to {1} {2}").format(
self.bank_account, self.party_type, self.party
)
)
def validate_reference_document(self):
if not self.reference_doctype or not self.reference_name:
frappe.throw(_("To create a Payment Request reference document is required"))
@@ -1050,6 +1083,40 @@ def validate_payment(doc, method=None):
)
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def get_bank_account_query(
doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict
):
filters = frappe._dict(filters or {})
if not filters.company and not (filters.party_type and filters.party):
return []
owners = []
if filters.company:
owners.append({"is_company_account": 1, "company": filters.company})
if filters.party_type and filters.party:
owners.append({"is_company_account": 0, "party_type": filters.party_type, "party": filters.party})
accounts = []
for owner in owners:
accounts.extend(
frappe.get_list(
"Bank Account",
fields=["name", "bank", "account"],
filters=[
*[[key, "=", value] for key, value in owner.items()],
["disabled", "=", 0],
[searchfield, "like", f"%{txt}%"],
],
order_by="name",
limit_page_length=start + page_len,
as_list=True,
)
)
return sorted(accounts, key=lambda account: account[0])[start : start + page_len]
@frappe.whitelist()
def get_open_payment_requests_query(doctype, txt, searchfield, start, page_len, filters):
# permission checks in `get_list()`