From a5492fce3948786122b04674c346101235c8a58f Mon Sep 17 00:00:00 2001 From: Luc De Meyer Date: Fri, 9 Oct 2026 17:45:26 +0200 Subject: [PATCH] [FIX] account_ebics: IndexError in _split_camt for camt.054 Fix IndexError in _split_camt when camt.054 has no currency at statement level. This commit implements the following changes: - discard statements without entries before attempting currency extraction - fall back to Ntry/Amt/@Ccy for camt.054 when Acct/Ccy and Bal/Amt/@Ccy are absent --- README.md | 2 +- account_ebics/__manifest__.py | 2 +- account_ebics/models/ebics_file.py | 42 +++++++++++++++++------------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index f9fb3fe..c9e3a8b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- -[account_ebics](account_ebics/) | 17.0.1.3.0 | | Download bank statements and upload payment files directly from Odoo, using the European EBICS standard +[account_ebics](account_ebics/) | 17.0.1.3.1 | | Download bank statements and upload payment files directly from Odoo, using the European EBICS standard [account_ebics_batch](account_ebics_batch/) | 17.0.1.0.1 | | Download and process your EBICS files automatically, on a schedule [account_ebics_batch_payment](account_ebics_batch_payment/) | 17.0.1.1.0 | | Send an Odoo Enterprise batch payment to the bank over EBICS [account_ebics_oca_statement_import](account_ebics_oca_statement_import/) | 17.0.1.0.1 | | Process EBICS statement files with the OCA bank statement import diff --git a/account_ebics/__manifest__.py b/account_ebics/__manifest__.py index d62a109..e44a5ba 100644 --- a/account_ebics/__manifest__.py +++ b/account_ebics/__manifest__.py @@ -7,7 +7,7 @@ "Download bank statements and upload payment files directly from Odoo, " "using the European EBICS standard" ), - "version": "17.0.1.3.0", + "version": "17.0.1.3.1", "license": "LGPL-3", "author": "Noviat", "website": "https://www.noviat.com/", diff --git a/account_ebics/models/ebics_file.py b/account_ebics/models/ebics_file.py index 4bc82dc..81aae3a 100644 --- a/account_ebics/models/ebics_file.py +++ b/account_ebics/models/ebics_file.py @@ -583,9 +583,21 @@ class EbicsFile(models.Model): message = _("No bank account number found.") res["notifications"].append({"type": "error", "message": message}) continue - currency_code = stmt.xpath( + if not stmt.findall("ns:Ntry", ns): + continue + currency_codes = stmt.xpath( "ns:Acct/ns:Ccy/text() | ns:Bal/ns:Amt/@Ccy", namespaces=ns - )[0] + ) + if not currency_codes and camt_variant == "054": + currency_codes = stmt.xpath("ns:Ntry/ns:Amt/@Ccy", namespaces=ns) + if not currency_codes: + message = _( + "No currency found in statement for Account Number %(nbr)s.", + nbr=acc_number, + ) + res["notifications"].append({"type": "error", "message": message}) + continue + currency_code = currency_codes[0] # some banks (e.g. COMMERZBANK) add the currency as the last 3 digits # of the bank account number hence we need to remove this since otherwise # the journal matching logic fails @@ -593,26 +605,20 @@ class EbicsFile(models.Model): acc_number = acc_number[:-3] root_new = deepcopy(root) - entries = False for j, el in enumerate(root_new[0].findall(f"ns:{camt_tag}", ns)): if j != i: el.getparent().remove(el) - else: - entries = el.findall("ns:Ntry", ns) - if not entries: + currency, journal = self._lookup_journal(res, acc_number, currency_code) + if not (currency and journal): continue - else: - currency, journal = self._lookup_journal(res, acc_number, currency_code) - if not (currency and journal): - continue - datas.append( - { - "acc_number": acc_number, - "journal_id": journal.id, - "company_id": journal.company_id.id, - "data": base64.b64encode(etree.tostring(root_new)), - } - ) + datas.append( + { + "acc_number": acc_number, + "journal_id": journal.id, + "company_id": journal.company_id.id, + "data": base64.b64encode(etree.tostring(root_new)), + } + ) return datas