added bulk edit

This commit is contained in:
Ali 2026-03-05 22:41:19 +04:00
parent 6779cf89ec
commit 7be2112e2a
2 changed files with 32 additions and 10 deletions

View File

@ -1447,6 +1447,7 @@ def _build_import_lookups(settings):
cp_name,
cp_voen,
getattr(row, "document_type", None) or "Payment Entry",
getattr(row, "cost_center", None) or "",
))
voen_to_party = {}
@ -1498,7 +1499,7 @@ def _import_one_transaction(txn_data, settings, purpose_rules, purpose_threshold
purpose_only_rules = []
counterparty_only_rules = []
for rule in purpose_rules:
keyword, pf, pt, rule_pt, cp_name, cp_voen, doc_type = rule
keyword, pf, pt, rule_pt, cp_name, cp_voen, doc_type, rule_cc = rule
has_keyword = bool(keyword)
has_cp = bool(cp_name or cp_voen)
if has_keyword and has_cp:
@ -1517,41 +1518,45 @@ def _import_one_transaction(txn_data, settings, purpose_rules, purpose_threshold
def _match_purpose_rules(rules, check_counterparty):
best_score = 0
best_pf = best_pt = best_doc_type = None
for keyword, pf, pt, rule_pt, cp_name, cp_voen, doc_type in rules:
best_pf = best_pt = best_doc_type = best_cc = None
for keyword, pf, pt, rule_pt, cp_name, cp_voen, doc_type, rule_cc in rules:
if rule_pt and rule_pt != payment_type:
continue
if check_counterparty and not _counterparty_matches(cp_name, cp_voen):
continue
if keyword:
if keyword in purpose_lower:
return pf, pt, doc_type
return pf, pt, doc_type, rule_cc
score = SequenceMatcher(None, purpose_lower, keyword).ratio()
if score > best_score and score >= purpose_threshold:
best_score = score
best_pf, best_pt, best_doc_type = pf, pt, doc_type
best_pf, best_pt, best_doc_type, best_cc = pf, pt, doc_type, rule_cc
else:
return pf, pt, doc_type
return best_pf, best_pt, best_doc_type
return pf, pt, doc_type, rule_cc
return best_pf, best_pt, best_doc_type, best_cc
doc_type = "Payment Entry"
cost_center = ""
# Phase 1: rules with BOTH purpose keyword AND counterparty
paid_from, paid_to, matched_doc_type = _match_purpose_rules(both_rules, check_counterparty=True)
paid_from, paid_to, matched_doc_type, matched_cc = _match_purpose_rules(both_rules, check_counterparty=True)
if matched_doc_type:
doc_type = matched_doc_type
cost_center = matched_cc or ""
# Phase 2: rules with only purpose keyword
if not paid_from or not paid_to:
paid_from, paid_to, matched_doc_type = _match_purpose_rules(purpose_only_rules, check_counterparty=False)
paid_from, paid_to, matched_doc_type, matched_cc = _match_purpose_rules(purpose_only_rules, check_counterparty=False)
if matched_doc_type:
doc_type = matched_doc_type
cost_center = matched_cc or ""
# Phase 3: rules with only counterparty
if not paid_from or not paid_to:
paid_from, paid_to, matched_doc_type = _match_purpose_rules(counterparty_only_rules, check_counterparty=True)
paid_from, paid_to, matched_doc_type, matched_cc = _match_purpose_rules(counterparty_only_rules, check_counterparty=True)
if matched_doc_type:
doc_type = matched_doc_type
cost_center = matched_cc or ""
if not paid_from or not paid_to:
return {
@ -1606,18 +1611,24 @@ def _import_one_transaction(txn_data, settings, purpose_rules, purpose_threshold
pf_party = (party_type, erp_party) if pf_type in party_accounts else (None, None)
pt_party = (party_type, erp_party) if pt_type in party_accounts else (None, None)
je_row_extra = {}
if cost_center:
je_row_extra["cost_center"] = cost_center
if payment_type == "Pay":
je.append("accounts", {
"account": paid_from,
"credit_in_account_currency": amount,
"party_type": pf_party[0],
"party": pf_party[1],
**je_row_extra,
})
je.append("accounts", {
"account": paid_to,
"debit_in_account_currency": amount,
"party_type": pt_party[0],
"party": pt_party[1],
**je_row_extra,
})
else:
je.append("accounts", {
@ -1625,12 +1636,14 @@ def _import_one_transaction(txn_data, settings, purpose_rules, purpose_threshold
"debit_in_account_currency": amount,
"party_type": pf_party[0],
"party": pf_party[1],
**je_row_extra,
})
je.append("accounts", {
"account": paid_to,
"credit_in_account_currency": amount,
"party_type": pt_party[0],
"party": pt_party[1],
**je_row_extra,
})
try:
@ -1680,6 +1693,8 @@ def _import_one_transaction(txn_data, settings, purpose_rules, purpose_threshold
pe.remarks = purpose
pe.party_type = party_type
pe.party = erp_party
if cost_center:
pe.cost_center = cost_center
try:
pe.insert(ignore_permissions=True)

View File

@ -12,6 +12,7 @@
"column_break_1",
"paid_from",
"paid_to",
"cost_center",
"notes"
],
"fields": [
@ -69,6 +70,12 @@
"label": "Paid To (Account)",
"options": "Account"
},
{
"fieldname": "cost_center",
"fieldtype": "Link",
"label": "Cost Center",
"options": "Cost Center"
},
{
"fieldname": "notes",
"fieldtype": "Data",