From 31756c78d46853cd072b4bf16d75531945bc9cd3 Mon Sep 17 00:00:00 2001 From: Julien Guenat Date: Mon, 20 Jul 2026 13:34:15 +0200 Subject: [PATCH] [FIX] account_statement_import_camt: TxDtls amounts not equals to Ntry amount --- .../account_statement_import_camt_parser.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/account_statement_import_camt/models/account_statement_import_camt_parser.py b/account_statement_import_camt/models/account_statement_import_camt_parser.py index 9d3ab9e682..7146fb2223 100644 --- a/account_statement_import_camt/models/account_statement_import_camt_parser.py +++ b/account_statement_import_camt/models/account_statement_import_camt_parser.py @@ -166,6 +166,13 @@ def parse_transaction_details(self, ns, node, transaction): transaction["narration"], f"{_('Cheque Number')} (Refs/ChqNb)", ) + self.add_value_from_node( + ns, + node, + ["./ns:Chrgs/ns:Rcrd/ns:Amt", "./ns:Chrgs/ns:TtlChrgsAndTaxAmt"], + transaction["narration"], + f"{_('Charges Amount')} (Chrgs/Amt)", + ) self.add_value_from_node( ns, node, ["./ns:AddtlTxInf"], transaction, "payment_ref", join_str="\n" @@ -341,9 +348,26 @@ def parse_entry(self, ns, node): yield transaction return transaction_base = transaction + # Make sure the sum of TxDtls amounts equals the Ntry amount. + # Any difference is added to the largest TxDtls amount. + # (might be transaction fees ...) + entry_amount = transaction_base["amount"] + details_sum = 0.0 + largest_transaction = None + parsed_transactions = [] for node in details_nodes: transaction = transaction_base.copy() + transaction["narration"] = dict(transaction_base["narration"]) self.parse_transaction_details(ns, node, transaction) + if largest_transaction is None or abs(transaction["amount"]) >= abs( + largest_transaction["amount"] + ): + largest_transaction = transaction + details_sum += transaction["amount"] + parsed_transactions.append(transaction) + if largest_transaction is not None: + largest_transaction["amount"] += entry_amount - details_sum + for transaction in parsed_transactions: self.generate_narration(transaction) yield transaction