fix: Use `process.extract` to get the corresponding party doc name of the result
- rapidfuzz accepts an iterable or a dict. dict input gives the dict key and value in the result
diff --git a/erpnext/accounts/doctype/bank_transaction/auto_match_party.py b/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
index 671cde5..04dab4c 100644
--- a/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
+++ b/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
@@ -1,7 +1,6 @@
from typing import Tuple, Union
import frappe
-from frappe.core.utils import find
from frappe.utils import flt
from rapidfuzz import fuzz, process
@@ -135,7 +134,7 @@
skip = False
result = process.extract(
query=self.get(field),
- choices=[name.get("party_name") for name in names],
+ choices={row.get("name"): row.get("party_name") for row in names},
scorer=fuzz.token_set_ratio,
)
party_name, skip = self.process_fuzzy_result(result)
@@ -143,8 +142,6 @@
if not party_name:
return None, skip
- # Get Party Docname from the list of dicts
- party_name = find(names, lambda x: x["party_name"] == party_name).get("name")
return (
party,
party_name,
@@ -157,14 +154,14 @@
Returns: Result, Skip (whether or not to discontinue matching)
"""
- PARTY, SCORE, CUTOFF = 0, 1, 80
+ SCORE, PARTY_ID, CUTOFF = 1, 2, 80
if not result or not len(result):
return None, False
first_result = result[0]
if len(result) == 1:
- return (first_result[PARTY] if first_result[SCORE] > CUTOFF else None), True
+ return (first_result[PARTY_ID] if first_result[SCORE] > CUTOFF else None), True
second_result = result[1]
if first_result[SCORE] > CUTOFF:
@@ -173,7 +170,7 @@
if first_result[SCORE] == second_result[SCORE]:
return None, True
- return first_result[PARTY], True
+ return first_result[PARTY_ID], True
else:
return None, False