diff --git a/banking/klarna_kosma_integration/doctype/bank_reconciliation_tool_beta/bank_reconciliation_tool_beta.py b/banking/klarna_kosma_integration/doctype/bank_reconciliation_tool_beta/bank_reconciliation_tool_beta.py index 861771c4..3c1210d7 100644 --- a/banking/klarna_kosma_integration/doctype/bank_reconciliation_tool_beta/bank_reconciliation_tool_beta.py +++ b/banking/klarna_kosma_integration/doctype/bank_reconciliation_tool_beta/bank_reconciliation_tool_beta.py @@ -29,6 +29,13 @@ from banking.overrides.bank_transaction import CustomBankTransaction MAX_QUERY_RESULTS = 150 +# Weights for ranking parameters +REF_RANK_WEIGHT = 3 # Reference field equality match +PARTY_RANK_WEIGHT = 2 # Party match +AMOUNT_RANK_WEIGHT = 2 # Amount match +DATE_RANK_WEIGHT = 1 # Date match +NAME_MATCH_WEIGHT = 3 # Name (Paid From) match +REF_MATCH_WEIGHT = 3 # Reference number found in transaction description class BankReconciliationToolBeta(Document): @@ -607,11 +614,11 @@ def check_matching( # already covered in DB query continue - # higher rank if voucher name is in bank transaction + # higher rank if voucher reference appears in bank transaction description reference_no = voucher["reference_no"] if reference_no and (reference_no.strip() in transaction.description): - voucher["rank"] += 1 voucher["name_in_desc_match"] = 1 + voucher["rank"] += REF_MATCH_WEIGHT return sorted(matching_vouchers, key=lambda x: x["rank"], reverse=True) @@ -774,7 +781,13 @@ def get_bt_matching_query(exact_match: bool, common_filters: frappe._dict, trans ) party_rank = frappe.qb.terms.Case().when(party_filter, 1).else_(0) - rank_expression = ref_rank + amount_rank + party_rank + unallocated_rank + 1 + rank_expression = ( + (ref_rank * REF_RANK_WEIGHT) + + (amount_rank * AMOUNT_RANK_WEIGHT) + + (party_rank * PARTY_RANK_WEIGHT) + + (unallocated_rank * 1) + + 1 + ) query = ( frappe.qb.from_(bt) @@ -824,7 +837,12 @@ def get_ld_matching_query(exact_match: bool, common_filters: frappe._dict): reference_rank = ref_equality_condition(loan_disbursement.reference_number, common_filters.reference_no) party_rank = frappe.qb.terms.Case().when(matching_party, 1).else_(0) - rank_expression = reference_rank + party_rank + date_rank + 1 + rank_expression = ( + (reference_rank * REF_RANK_WEIGHT) + + (party_rank * PARTY_RANK_WEIGHT) + + (date_rank * DATE_RANK_WEIGHT) + + 1 + ) query = ( frappe.qb.from_(loan_disbursement) @@ -873,7 +891,12 @@ def get_lr_matching_query(exact_match: bool, common_filters: frappe._dict): reference_rank = ref_equality_condition(loan_repayment.reference_number, common_filters.reference_no) party_rank = frappe.qb.terms.Case().when(matching_party, 1).else_(0) - rank_expression = reference_rank + party_rank + date_rank + 1 + rank_expression = ( + (reference_rank * REF_RANK_WEIGHT) + + (party_rank * PARTY_RANK_WEIGHT) + + (date_rank * DATE_RANK_WEIGHT) + + 1 + ) query = ( frappe.qb.from_(loan_repayment) @@ -944,7 +967,13 @@ def get_pe_matching_query( date_condition = Coalesce(pe.reference_date, pe.posting_date) == common_filters.date date_rank = frappe.qb.terms.Case().when(date_condition, 1).else_(0) - rank_expression = ref_rank + amount_rank + party_rank + date_rank + 1 + rank_expression = ( + (ref_rank * REF_RANK_WEIGHT) + + (amount_rank * AMOUNT_RANK_WEIGHT) + + (party_rank * PARTY_RANK_WEIGHT) + + (date_rank * DATE_RANK_WEIGHT) + + 1 + ) query = ( frappe.qb.from_(pe) @@ -1047,7 +1076,9 @@ def get_je_matching_query( ) date_condition = subquery.reference_date == common_filters.date date_rank = frappe.qb.terms.Case().when(date_condition, 1).else_(0) - rank_expression = ref_rank + amount_rank + date_rank + 1 + rank_expression = ( + (ref_rank * REF_RANK_WEIGHT) + (amount_rank * AMOUNT_RANK_WEIGHT) + (date_rank * DATE_RANK_WEIGHT) + 1 + ) query = ( frappe.qb.from_(subquery) @@ -1106,7 +1137,15 @@ def get_si_matching_query( else Cast(0, "int") ) - rank_expression = ref_rank + party_rank + amount_rank + date_rank + name_match + ref_match + 1 + rank_expression = ( + (ref_rank * REF_RANK_WEIGHT) + + (party_rank * PARTY_RANK_WEIGHT) + + (amount_rank * AMOUNT_RANK_WEIGHT) + + (date_rank * DATE_RANK_WEIGHT) + + (name_match * NAME_MATCH_WEIGHT) + + (ref_match * REF_MATCH_WEIGHT) + + 1 + ) query = ( frappe.qb.from_(sip) @@ -1209,7 +1248,13 @@ def get_unpaid_si_matching_query( date_rank = frappe.qb.terms.Case().when(date_condition, 1).else_(0) rank_expression = ( - ref_rank + party_rank + currency_match + amount_rank + date_rank + name_match + ref_match + 1 + (ref_rank * REF_RANK_WEIGHT) + + (party_rank * PARTY_RANK_WEIGHT) + + (amount_rank * AMOUNT_RANK_WEIGHT) + + (date_rank * DATE_RANK_WEIGHT) + + (name_match * NAME_MATCH_WEIGHT) + + (ref_match * REF_MATCH_WEIGHT) + + 1 ) query = ( @@ -1302,7 +1347,15 @@ def get_pi_matching_query( else Cast(0, "int") ) - rank_expression = ref_rank + party_rank + amount_rank + date_rank + name_match + ref_match + 1 + rank_expression = ( + (ref_rank * REF_RANK_WEIGHT) + + (party_rank * PARTY_RANK_WEIGHT) + + (amount_rank * AMOUNT_RANK_WEIGHT) + + (date_rank * DATE_RANK_WEIGHT) + + (name_match * NAME_MATCH_WEIGHT) + + (ref_match * REF_MATCH_WEIGHT) + + 1 + ) query = ( frappe.qb.from_(purchase_invoice) @@ -1412,7 +1465,13 @@ def get_unpaid_pi_matching_query( date_rank = frappe.qb.terms.Case().when(date_condition, 1).else_(0) rank_expression = ( - ref_rank + party_match + currency_match + amount_rank + date_rank + name_match + ref_match + 1 + (ref_rank * REF_RANK_WEIGHT) + + (party_match * PARTY_RANK_WEIGHT) + + (amount_rank * AMOUNT_RANK_WEIGHT) + + (date_rank * DATE_RANK_WEIGHT) + + (name_match * NAME_MATCH_WEIGHT) + + (ref_match * REF_MATCH_WEIGHT) + + 1 ) query = ( @@ -1498,7 +1557,14 @@ def get_unpaid_ec_matching_query( else Cast(0, "int") ) - rank_expression = ref_rank + party_match + amount_rank + name_match + ref_match + 1 + rank_expression = ( + (ref_rank * REF_RANK_WEIGHT) + + (party_match * PARTY_RANK_WEIGHT) + + (amount_rank * AMOUNT_RANK_WEIGHT) + + (name_match * NAME_MATCH_WEIGHT) + + (ref_match * REF_MATCH_WEIGHT) + + 1 + ) query = ( frappe.qb.from_(expense_claim)