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()