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..a2baf39251 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 @@ -50,7 +50,7 @@ def add_value_from_node(self, ns, node, xpath_str, obj, attr_name, join_str=None elif join_str is None: attr_value = found_node[0].text else: - attr_value = join_str.join([x.text for x in found_node]) + attr_value = join_str.join([x.text for x in found_node if x.text]) obj[attr_name] = attr_value break @@ -289,6 +289,7 @@ def parse_entry(self, ns, node): "./ns:NtryDtls/ns:RmtInf/ns:Strd/ns:CdtrRefInf/ns:Ref", "./ns:NtryDtls/ns:Btch/ns:PmtInfId", "./ns:NtryDtls/ns:TxDtls/ns:Refs/ns:AcctSvcrRef", + "./ns:AcctSvcrRef", ], transaction, "ref", @@ -337,12 +338,21 @@ def parse_entry(self, ns, node): details_nodes = node.xpath("./ns:NtryDtls/ns:TxDtls", namespaces={"ns": ns}) if len(details_nodes) == 0: + self.add_value_from_node( + ns, node, "./ns:AddtlNtryInf", transaction, "payment_ref" + ) self.generate_narration(transaction) yield transaction return transaction_base = transaction for node in details_nodes: transaction = transaction_base.copy() + transaction["narration"] = transaction_base["narration"].copy() + detail_amount = self.parse_amount(ns, node) + if detail_amount != 0.0: + transaction["amount"] = detail_amount + elif len(details_nodes) == 1 and node.tag.endswith("TxDtls"): + transaction["amount"] = amount self.parse_transaction_details(ns, node, transaction) self.generate_narration(transaction) yield transaction @@ -450,7 +460,7 @@ def parse(self, data): root = None if root is None: raise ValueError("Not a valid xml file, or not an xml file at all.") - ns = root.tag[1 : root.tag.index("}")] + ns = root.tag[1 : root.tag.index("}")] if "}" in root.tag else "" self.check_version(ns, root) statements = [] currency = None diff --git a/account_statement_import_camt/tests/samples/golden-camt053-txdtls.pydata b/account_statement_import_camt/tests/samples/golden-camt053-txdtls.pydata index ed46eb9227..e14f53a8c2 100644 --- a/account_statement_import_camt/tests/samples/golden-camt053-txdtls.pydata +++ b/account_statement_import_camt/tests/samples/golden-camt053-txdtls.pydata @@ -41,4 +41,20 @@ 'partner_name': 'Banque Cantonale Vaudoise', 'payment_ref': '/', 'ref': '302388292000022222222222222', - 'transaction_type': 'PMNT-RCDT-VCOM'}]}]) + 'transaction_type': 'PMNT-RCDT-VCOM'}, + {'account_number': 'CH4444000000123456789', + 'amount': 50.0, + 'date': '2017-03-22', + 'narration': 'Partner Name (RltdPties/Nm): Single Detail Debtor\n' + 'Partner Account Number (RltdPties/Acct): CH4444000000123456789\n' + 'Transaction Date (BookgDt): 2017-03-22\n' + 'Reference: ENTRY-FALLBACK-REF\n' + 'Communication: \n' + 'Transaction Type (BkTxCd): \n' + 'Additional Entry Information (AddtlNtryInf): ENTRY INFO SHOULD STAY IN NARRATION ONLY\n' + 'Unstructured Reference (RmtInf/Ustrd): REM-ONE\n' + 'Postal Address (PstlAdr): Address line 1', + 'partner_name': 'Single Detail Debtor', + 'payment_ref': 'REM-ONE', + 'ref': 'ENTRY-FALLBACK-REF', + 'transaction_type': ''}]}]) diff --git a/account_statement_import_camt/tests/samples/test-camt053-txdtls b/account_statement_import_camt/tests/samples/test-camt053-txdtls index cf7c38f2bd..5101d7b849 100644 --- a/account_statement_import_camt/tests/samples/test-camt053-txdtls +++ b/account_statement_import_camt/tests/samples/test-camt053-txdtls @@ -209,6 +209,37 @@ CRÉDIT GROUPÉ BVR TRAITEMENT DU 22.03.2017 NUMÉRO CLIENT 01-70884-3 PAQUET ID: 123456CHCAFEBABE + + 50.00 + CRDT + +
2017-03-22
+
+ ENTRY-FALLBACK-REF + + + + + Single Detail Debtor + + + Address line 1 + + + + + CH4444000000123456789 + + + + + + REM-ONE + + + + ENTRY INFO SHOULD STAY IN NARRATION ONLY +