hide same operations

This commit is contained in:
Ali 2026-03-11 21:24:23 +04:00
parent c674fed28b
commit 2f05dfe8d3
3 changed files with 31 additions and 3 deletions

View File

@ -1264,8 +1264,17 @@ def get_statement_transactions(from_date, to_date, account_iban, login_name=None
.get("statementList", []) .get("statementList", [])
) )
# Get currency of current account for cross-account filtering
account_currency = frappe.db.get_value("Kapital Bank Account", account_iban, "currency") or ""
# Build IBAN → currency map for all local accounts (for cross-currency filtering)
local_account_currencies = dict(
frappe.db.get_all("Kapital Bank Account", fields=["name", "currency"], as_list=True)
)
transactions = [] transactions = []
skipped_duplicates = 0 skipped_duplicates = 0
skipped_cross_currency = 0
for txn in statement_list: for txn in statement_list:
trn_ref = (txn.get("trnRefNo") or "").strip() trn_ref = (txn.get("trnRefNo") or "").strip()
@ -1288,7 +1297,19 @@ def get_statement_transactions(from_date, to_date, account_iban, login_name=None
dr_cr = (txn.get("drcrInd") or "").upper() dr_cr = (txn.get("drcrInd") or "").upper()
# Counterparty # Counterparty
contr_name, contr_voen = _parse_counterparty(txn.get("contrAccount")) contr_raw = txn.get("contrAccount") or ""
contr_parts = [p.strip() for p in contr_raw.split(" / ")]
contr_iban = contr_parts[0] if contr_parts else ""
contr_name = contr_parts[1] if len(contr_parts) > 1 else ""
contr_voen = contr_parts[2] if len(contr_parts) > 2 else ""
# Skip if counterparty account exists locally with a different currency
# (that transaction belongs to the counterparty account's currency view)
if contr_iban and contr_iban in local_account_currencies:
contr_account_currency = local_account_currencies[contr_iban]
if contr_account_currency and contr_account_currency != account_currency:
skipped_cross_currency += 1
continue
# Purpose # Purpose
purpose = (txn.get("purpose") or "").strip() purpose = (txn.get("purpose") or "").strip()
@ -1311,6 +1332,7 @@ def get_statement_transactions(from_date, to_date, account_iban, login_name=None
"transactions": transactions, "transactions": transactions,
"total_fetched": len(statement_list), "total_fetched": len(statement_list),
"skipped_duplicates": skipped_duplicates, "skipped_duplicates": skipped_duplicates,
"skipped_cross_currency": skipped_cross_currency,
} }
except Exception as e: except Exception as e:

View File

@ -429,6 +429,7 @@ KBBTImport.import = {
let totalSkipped = 0; let totalSkipped = 0;
let seenRefNos = new Set(); let seenRefNos = new Set();
let crossAccountDuplicates = 0; let crossAccountDuplicates = 0;
let skippedCrossCurrency = 0;
function fetchNext() { function fetchNext() {
if (currentSourceIdx >= totalSources) { if (currentSourceIdx >= totalSources) {
@ -447,10 +448,11 @@ KBBTImport.import = {
return; return;
} }
if (totalSkipped > 0 || crossAccountDuplicates > 0) { if (totalSkipped > 0 || crossAccountDuplicates > 0 || skippedCrossCurrency > 0) {
let parts = []; let parts = [];
if (totalSkipped > 0) parts.push(__('already imported: {0}', [totalSkipped])); if (totalSkipped > 0) parts.push(__('already imported: {0}', [totalSkipped]));
if (crossAccountDuplicates > 0) parts.push(__('cross-account duplicates: {0}', [crossAccountDuplicates])); if (crossAccountDuplicates > 0) parts.push(__('cross-account duplicates: {0}', [crossAccountDuplicates]));
if (skippedCrossCurrency > 0) parts.push(__('other currency account: {0}', [skippedCrossCurrency]));
frappe.show_alert({ frappe.show_alert({
message: __('Skipped: {0}', [parts.join(', ')]), message: __('Skipped: {0}', [parts.join(', ')]),
indicator: 'blue' indicator: 'blue'
@ -500,6 +502,7 @@ KBBTImport.import = {
} }
}); });
totalSkipped += (r.message.skipped_duplicates || 0); totalSkipped += (r.message.skipped_duplicates || 0);
skippedCrossCurrency += (r.message.skipped_cross_currency || 0);
} else { } else {
frappe.show_alert({ frappe.show_alert({
message: __('Error fetching {0}: {1}', [sourceLabel, r.message ? r.message.message : 'unknown']), message: __('Error fetching {0}: {1}', [sourceLabel, r.message ? r.message.message : 'unknown']),

View File

@ -390,6 +390,7 @@ KBImport.import = {
let totalSkipped = 0; let totalSkipped = 0;
let seenRefNos = new Set(); let seenRefNos = new Set();
let crossAccountDuplicates = 0; let crossAccountDuplicates = 0;
let skippedCrossCurrency = 0;
function fetchNext() { function fetchNext() {
if (currentSourceIdx >= totalSources) { if (currentSourceIdx >= totalSources) {
@ -408,10 +409,11 @@ KBImport.import = {
return; return;
} }
if (totalSkipped > 0 || crossAccountDuplicates > 0) { if (totalSkipped > 0 || crossAccountDuplicates > 0 || skippedCrossCurrency > 0) {
let parts = []; let parts = [];
if (totalSkipped > 0) parts.push(__('already imported: {0}', [totalSkipped])); if (totalSkipped > 0) parts.push(__('already imported: {0}', [totalSkipped]));
if (crossAccountDuplicates > 0) parts.push(__('cross-account duplicates: {0}', [crossAccountDuplicates])); if (crossAccountDuplicates > 0) parts.push(__('cross-account duplicates: {0}', [crossAccountDuplicates]));
if (skippedCrossCurrency > 0) parts.push(__('other currency account: {0}', [skippedCrossCurrency]));
frappe.show_alert({ frappe.show_alert({
message: __('Skipped: {0}', [parts.join(', ')]), message: __('Skipped: {0}', [parts.join(', ')]),
indicator: 'blue' indicator: 'blue'
@ -458,6 +460,7 @@ KBImport.import = {
} }
}); });
totalSkipped += (r.message.skipped_duplicates || 0); totalSkipped += (r.message.skipped_duplicates || 0);
skippedCrossCurrency += (r.message.skipped_cross_currency || 0);
} else { } else {
frappe.show_alert({ frappe.show_alert({
message: __('Error fetching {0}: {1}', [sourceLabel, r.message ? r.message.message : 'unknown']), message: __('Error fetching {0}: {1}', [sourceLabel, r.message ? r.message.message : 'unknown']),