feat: Manually Update/Correct Party in Bank Transaction
- On updating bank trans.n party after submit, the corresponding mapper doc will be updated too
- The mapper doc in turn will update all linked bank transactions that do not have this updated value
- Added Bank Party Mapper hidden link in Bank Transaction
- Rename field in BPM to `Party Name` as it does not hold description data
- If a BT matches with a BPM record, link that record in the BT
diff --git a/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.js b/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.js
index d11d804..b13e46a 100644
--- a/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.js
+++ b/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.js
@@ -1,8 +1,10 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
-// frappe.ui.form.on("Bank Party Mapper", {
-// refresh(frm) {
-
-// },
-// });
+frappe.ui.form.on("Bank Party Mapper", {
+ refresh(frm) {
+ if (!frm.is_new()) {
+ frm.set_intro(__("Please avoid editing unless you are absolutely certain."));
+ }
+ },
+});
diff --git a/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.json b/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.json
index 4f5f6bf..ddc79f2 100644
--- a/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.json
+++ b/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.json
@@ -9,7 +9,7 @@
"party_type",
"party",
"column_break_wbna",
- "bank_party_name_desc",
+ "bank_party_name",
"bank_party_account_number",
"bank_party_iban"
],
@@ -47,14 +47,14 @@
"options": "party_type"
},
{
- "fieldname": "bank_party_name_desc",
- "fieldtype": "Small Text",
- "label": "Party Name/Desc (Bank Statement)"
+ "fieldname": "bank_party_name",
+ "fieldtype": "Data",
+ "label": "Party Name (Bank Statement)"
}
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2023-04-03 10:11:31.384383",
+ "modified": "2023-04-04 14:27:23.450456",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Party Mapper",
diff --git a/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.py b/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.py
index d3a9a5e..02e36b0 100644
--- a/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.py
+++ b/erpnext/accounts/doctype/bank_party_mapper/bank_party_mapper.py
@@ -1,9 +1,24 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
-# import frappe
+import frappe
from frappe.model.document import Document
class BankPartyMapper(Document):
- pass
+ def on_update(self):
+ self.update_party_in_linked_transactions()
+
+ def update_party_in_linked_transactions(self):
+ if self.is_new():
+ return
+
+ # Set updated party values in other linked bank transactions
+ bank_transaction = frappe.qb.DocType("Bank Transaction")
+
+ frappe.qb.update(bank_transaction).set("party_type", self.party_type).set(
+ "party", self.party
+ ).where(
+ (bank_transaction.bank_party_mapper == self.name)
+ & ((bank_transaction.party_type != self.party_type) | (bank_transaction.party != self.party))
+ ).run()
diff --git a/erpnext/accounts/doctype/bank_transaction/auto_match_party.py b/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
index 3fbdc5f..9707f79 100644
--- a/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
+++ b/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
@@ -49,11 +49,11 @@
result = frappe.db.get_value(
"Bank Party Mapper",
filters={filter_field: self.get(filter_field)},
- fieldname=["party_type", "party"],
+ fieldname=["party_type", "party", "name"],
)
if result:
- party_type, party = result
- return (party_type, party, None)
+ party_type, party, mapper_name = result
+ return (party_type, party, {"mapper_name": mapper_name})
return result
@@ -89,33 +89,29 @@
def match(self):
# Match by Customer, Supplier or Employee Name
- # search bank party mapper by party and then description
+ # search bank party mapper by party
# fuzzy search by customer/supplier & employee
if not (self.bank_party_name or self.description):
return None
- result = self.match_party_name_desc_in_bank_party_mapper()
+ result = self.match_party_name_in_bank_party_mapper()
if not result:
result = self.match_party_name_desc_in_party()
return result
- def match_party_name_desc_in_bank_party_mapper(self):
- """Check if match exists for party name or description in Bank Party Mapper"""
+ def match_party_name_in_bank_party_mapper(self):
+ """Check if match exists for party name in Bank Party Mapper"""
result = None
- or_filters = []
- if self.bank_party_name:
- or_filters.append({"bank_party_name_desc": self.bank_party_name})
-
- if self.description:
- or_filters.append({"bank_party_name_desc": self.description})
+ if not self.bank_party_name:
+ return
mapper_res = frappe.get_all(
"Bank Party Mapper",
- or_filters=or_filters,
- fields=["party_type", "party"],
+ filters={"bank_party_name": self.bank_party_name},
+ fields=["party_type", "party", "name"],
limit_page_length=1,
)
if mapper_res:
@@ -123,7 +119,7 @@
result = (
mapper_res["party_type"],
mapper_res["party"],
- None,
+ {"mapper_name": mapper_res["name"]},
)
return result
@@ -157,7 +153,7 @@
party_name, score, index = result
if score > 75:
# Dont set description as a key in Bank Party Mapper due to its volatility
- mapper = {"bank_party_name_desc": self.get(field)} if field == "bank_party_name" else None
+ mapper = {"bank_party_name": self.get(field)} if field == "bank_party_name" else None
return (
party,
party_name,
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.json b/erpnext/accounts/doctype/bank_transaction/bank_transaction.json
index 4139a9f..d3dc5b5 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.json
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.json
@@ -37,7 +37,8 @@
"column_break_3czf",
"bank_party_name",
"bank_party_account_number",
- "bank_party_iban"
+ "bank_party_iban",
+ "bank_party_mapper"
],
"fields": [
{
@@ -214,7 +215,7 @@
{
"fieldname": "bank_party_name",
"fieldtype": "Data",
- "label": "Party Name (Bank Statement)"
+ "label": "Party Name/Account Holder (Bank Statement)"
},
{
"fieldname": "bank_party_iban",
@@ -225,11 +226,19 @@
"fieldname": "bank_party_account_number",
"fieldtype": "Data",
"label": "Party Account No. (Bank Statement)"
+ },
+ {
+ "fieldname": "bank_party_mapper",
+ "fieldtype": "Link",
+ "hidden": 1,
+ "label": "Bank Party Mapper",
+ "options": "Bank Party Mapper",
+ "read_only": 1
}
],
"is_submittable": 1,
"links": [],
- "modified": "2023-03-31 10:45:30.671309",
+ "modified": "2023-04-04 15:47:20.620006",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction",
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
index 118705d..a93882a 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
@@ -35,6 +35,8 @@
self.update_allocations()
self._saving_flag = False
+ self.set_in_bank_party_mapper()
+
def on_cancel(self):
self.clear_linked_payment_entries(for_cancel=True)
self.set_status(update=True)
@@ -176,11 +178,28 @@
if not mapper:
return
+ if mapper.get("mapper_name"):
+ # Transaction matched with a Bank party Mapper record
+ self.bank_party_mapper = mapper.get("mapper_name") # Link mapper to Bank Transaction
+ return
+
mapper_doc = frappe.get_doc(
{"doctype": "Bank Party Mapper", "party_type": self.party_type, "party": self.party}
)
mapper_doc.update(mapper)
mapper_doc.insert()
+ self.bank_party_mapper = mapper_doc.name # Link mapper to Bank Transaction
+
+ def set_in_bank_party_mapper(self):
+ """Set in Bank Party Mapper if Party Type & Party are manually changed after submit."""
+ doc_before_update = self.get_doc_before_save()
+ party_type_changed = self.party_type and (doc_before_update.party_type != self.party_type)
+ party_changed = self.party and (doc_before_update.party != self.party)
+
+ if (party_type_changed or party_changed) and self.bank_party_mapper:
+ mapper_doc = frappe.get_doc("Bank Party Mapper", self.bank_party_mapper)
+ mapper_doc.update({"party_type": self.party_type, "party": self.party})
+ mapper_doc.save()
@frappe.whitelist()