mirror of
https://github.com/frappe/erpnext.git
synced 2026-10-29 22:57:42 +00:00
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:
@@ -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()`
|
||||
|
||||
Reference in New Issue
Block a user