Browse Source
[10.0] Better parse camt groupped transactions (#131)
[10.0] Better parse camt groupped transactions (#131)
* correctly parse entries with multiple transactions Our bank does it. Care has been taken not to break cases where Ntry/NtryDtls/TxDtls isn't used: if any piece of information isn't found on these nodes, the matching information from the Ntry is used. Most often the entry has a sum or a summary and the transaction details are more precise and specific, so it makes sense to use their contents rather than its. * more complete unit tests for camt parser This checks the whole output data of the parser against its expected output. * add a test case that checks TxDtls decoding * special case for Ntrys without TxDtls * CO-12 - Date Import BVR * FIX tests * CO-1232 Fixed issues with CAMT parser testspull/158/head
ecino
7 years ago
committed by
Maxence Groine
5 changed files with 368 additions and 32 deletions
-
58account_bank_statement_import_camt/models/parser.py
-
26account_bank_statement_import_camt/test_files/golden-camt053-txdtls.pydata
-
45account_bank_statement_import_camt/test_files/golden-camt053.pydata
-
214account_bank_statement_import_camt/test_files/test-camt053-txdtls
-
45account_bank_statement_import_camt/tests/test_import_bank_statement.py
@ -0,0 +1,26 @@ |
|||
(None, |
|||
'CH1111000000123456789', |
|||
[{'balance_end_real': 79443.15, |
|||
'balance_start': 75960.15, |
|||
'date': '2017-03-22', |
|||
'name': '20170323123456789012345', |
|||
'transactions': [{'account_number': 'CH2222000000123456789', |
|||
'amount': 2187.0, |
|||
'data': '<TxDtls xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <Refs>\n <AcctSvcrRef>123456CHCAFEBABE</AcctSvcrRef>\n <Prtry>\n <Tp>01</Tp>\n <Ref>123456CHCAFEBABE</Ref>\n </Prtry>\n </Refs>\n <Amt Ccy="CHF">2187.00</Amt>\n <CdtDbtInd>CRDT</CdtDbtInd>\n <BkTxCd>\n <Domn>\n <Cd>PMNT</Cd>\n <Fmly>\n <Cd>RCDT</Cd>\n <SubFmlyCd>AUTT</SubFmlyCd>\n </Fmly>\n </Domn>\n </BkTxCd>\n <RltdPties>\n <Dbtr>\n <Nm>Banque Cantonale Vaudoise</Nm>\n <PstlAdr>\n <StrtNm>Place Saint-François</StrtNm>\n <BldgNb>14</BldgNb>\n <PstCd>1003</PstCd>\n <TwnNm>Lausanne</TwnNm>\n <Ctry>CH1</Ctry>\n </PstlAdr>\n </Dbtr>\n <DbtrAcct>\n <Id>\n <IBAN>CH2222000000123456789</IBAN>\n </Id>\n </DbtrAcct>\n </RltdPties>\n <RltdAgts>\n <DbtrAgt>\n <FinInstnId>\n <BICFI>POFICHBEXXX</BICFI>\n <Nm>POSTFINANCE AG</Nm>\n <PstlAdr>\n <AdrLine>MINGERSTRASSE 20</AdrLine>\n <AdrLine>3030 BERNE</AdrLine>\n </PstlAdr>\n </FinInstnId>\n </DbtrAgt>\n </RltdAgts>\n <RmtInf>\n <Strd>\n <CdtrRefInf>\n <Tp>\n <CdOrPrtry>\n <Prtry>ISR Reference</Prtry>\n </CdOrPrtry>\n </Tp>\n <Ref>302388292000011111111111111</Ref>\n </CdtrRefInf>\n <AddtlRmtInf>?REJECT?0</AddtlRmtInf>\n </Strd>\n </RmtInf>\n <RltdDts>\n <AccptncDtTm>2017-03-22T20:00:00</AccptncDtTm>\n </RltdDts>\n </TxDtls>\n ', |
|||
'date': '2017-03-22', |
|||
'execution_date': '2017-03-22', |
|||
'name': u'CR\xc9DIT GROUP\xc9 BVR TRAITEMENT DU 22.03.2017 NUM\xc9RO CLIENT 01-70884-3 PAQUET ID: 123456CHCAFEBABE', |
|||
'partner_country': 'CH1', |
|||
'partner_name': 'Banque Cantonale Vaudoise', |
|||
'ref': '302388292000011111111111111', |
|||
'value_date': '2017-03-23'}, |
|||
{'account_number': 'CH3333000000123456789', |
|||
'amount': 1296.0, |
|||
'data': '<TxDtls xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <Refs>\n <AcctSvcrRef>123456CHCAFEBABE</AcctSvcrRef>\n <Prtry>\n <Tp>01</Tp>\n <Ref>123456CHCAFEBABE</Ref>\n </Prtry>\n </Refs>\n <Amt Ccy="CHF">1296.00</Amt>\n <CdtDbtInd>CRDT</CdtDbtInd>\n <BkTxCd>\n <Domn>\n <Cd>PMNT</Cd>\n <Fmly>\n <Cd>RCDT</Cd>\n <SubFmlyCd>AUTT</SubFmlyCd>\n </Fmly>\n </Domn>\n </BkTxCd>\n <RltdPties>\n <Dbtr>\n <Nm>Banque Cantonale Vaudoise</Nm>\n <PstlAdr>\n <StrtNm>Place Saint-François</StrtNm>\n <BldgNb>14</BldgNb>\n <PstCd>1003</PstCd>\n <TwnNm>Lausanne</TwnNm>\n <Ctry>CH2</Ctry>\n </PstlAdr>\n </Dbtr>\n <DbtrAcct>\n <Id>\n <IBAN>CH3333000000123456789</IBAN>\n </Id>\n </DbtrAcct>\n </RltdPties>\n <RltdAgts>\n <DbtrAgt>\n <FinInstnId>\n <BICFI>POFICHBEYYY</BICFI>\n <Nm>POSTFINANCE AG</Nm>\n <PstlAdr>\n <AdrLine>MINGERSTRASSE 20</AdrLine>\n <AdrLine>3030 BERNE</AdrLine>\n </PstlAdr>\n </FinInstnId>\n </DbtrAgt>\n </RltdAgts>\n <RmtInf>\n <Strd>\n <CdtrRefInf>\n <Tp>\n <CdOrPrtry>\n <Prtry>ISR Reference</Prtry>\n </CdOrPrtry>\n </Tp>\n <Ref>302388292000022222222222222</Ref>\n </CdtrRefInf>\n <AddtlRmtInf>?REJECT?0</AddtlRmtInf>\n </Strd>\n </RmtInf>\n <RltdDts>\n <AccptncDtTm>2017-03-22T20:00:00</AccptncDtTm>\n </RltdDts>\n </TxDtls>\n ', |
|||
'date': '2017-03-22', |
|||
'execution_date': '2017-03-22', |
|||
'name': u'CR\xc9DIT GROUP\xc9 BVR TRAITEMENT DU 22.03.2017 NUM\xc9RO CLIENT 01-70884-3 PAQUET ID: 123456CHCAFEBABE', |
|||
'partner_country': 'CH2', |
|||
'partner_name': 'Banque Cantonale Vaudoise', |
|||
'ref': '302388292000022222222222222', |
|||
'value_date': '2017-03-23'}]}]) |
@ -0,0 +1,45 @@ |
|||
(None, |
|||
'NL77ABNA0574908765', |
|||
[{'balance_end_real': 15121.12, |
|||
'balance_start': 15568.27, |
|||
'date': '2014-01-05', |
|||
'name': '1234Test/1', |
|||
'transactions': [{'account_bic': 'ABNANL2A', |
|||
'account_number': 'NL46ABNA0499998748', |
|||
'amount': -754.25, |
|||
'data': '<TxDtls xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">\n <Refs>\n <InstrId>INNDNL2U20141231000142300002844</InstrId>\n <EndToEndId>435005714488-ABNO33052620</EndToEndId>\n <MndtId>1880000341866</MndtId>\n </Refs>\n <AmtDtls>\n <TxAmt>\n <Amt Ccy="EUR">754.25</Amt>\n </TxAmt>\n </AmtDtls>\n <RltdPties>\n <Cdtr>\n <Nm>INSURANCE COMPANY TESTX</Nm>\n <PstlAdr>\n <StrtNm>TEST STREET 20</StrtNm>\n <TwnNm>1234 AB TESTCITY</TwnNm>\n <Ctry>NL</Ctry>\n </PstlAdr>\n </Cdtr>\n <CdtrAcct>\n <Id>\n <IBAN>NL46ABNA0499998748</IBAN>\n </Id>\n </CdtrAcct>\n </RltdPties>\n <RltdAgts>\n <CdtrAgt>\n <FinInstnId>\n <BIC>ABNANL2A</BIC>\n </FinInstnId>\n </CdtrAgt>\n </RltdAgts>\n <RmtInf>\n <Ustrd>Insurance policy 857239PERIOD 01.01.2014 - 31.12.2014</Ustrd>\n </RmtInf>\n <AddtlTxInf>MKB Insurance 859239PERIOD 01.01.2014 - 31.12.2014</AddtlTxInf>\n </TxDtls>\n ', |
|||
'date': '2014-01-05', |
|||
'execution_date': '2014-01-05', |
|||
'name': 'MKB Insurance 859239PERIOD 01.01.2014 - 31.12.2014', |
|||
'note': 'Insurance policy 857239PERIOD 01.01.2014 - 31.12.2014', |
|||
'partner_country': 'NL', |
|||
'partner_name': 'INSURANCE COMPANY TESTX', |
|||
'ref': '435005714488-ABNO33052620', |
|||
'transfer_type': 'EI', |
|||
'value_date': '2014-01-05'}, |
|||
{'account_bic': 'ABNANL2A', |
|||
'account_number': 'NL46ABNA0499998748', |
|||
'amount': -594.05, |
|||
'data': '<TxDtls xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">\n <Refs>\n <InstrId>TESTBANK/NL/20141229/01206408</InstrId>\n <EndToEndId>TESTBANK/NL/20141229/01206408</EndToEndId>\n <MndtId>NL22ZZZ524885430000-C0125.1</MndtId>\n </Refs>\n <AmtDtls>\n <TxAmt>\n <Amt Ccy="EUR">564.05</Amt>\n </TxAmt>\n </AmtDtls>\n <RltdPties>\n <Cdtr>\n <Nm>Test Customer</Nm>\n <PstlAdr>\n <Ctry>NL</Ctry>\n </PstlAdr>\n </Cdtr>\n <CdtrAcct>\n <Id>\n <IBAN>NL46ABNA0499998748</IBAN>\n </Id>\n </CdtrAcct>\n </RltdPties>\n <RltdAgts>\n <CdtrAgt>\n <FinInstnId>\n <BIC>ABNANL2A</BIC>\n </FinInstnId>\n </CdtrAgt>\n </RltdAgts>\n <RmtInf>\n <Ustrd>Direct Debit S14 0410</Ustrd>\n </RmtInf>\n <RtrInf>\n <Rsn>\n <Cd>AC06</Cd>\n </Rsn>\n </RtrInf>\n <AddtlTxInf>Direct debit S14 0410 AC07 Rek.nummer blokkade TESTBANK/NL/20141229/01206408</AddtlTxInf>\n </TxDtls>\n ', |
|||
'date': '2014-01-05', |
|||
'execution_date': '2014-01-05', |
|||
'name': 'Direct debit S14 0410 AC07 Rek.nummer blokkade TESTBANK/NL/20141229/01206408', |
|||
'note': 'Direct Debit S14 0410', |
|||
'partner_country': 'NL', |
|||
'partner_name': 'Test Customer', |
|||
'ref': 'TESTBANK/NL/20141229/01206408', |
|||
'transfer_type': 'EIST', |
|||
'value_date': '2014-01-05'}, |
|||
{'account_bic': 'ABNANL2A', |
|||
'account_number': 'NL69ABNA0522123643', |
|||
'amount': 1405.31, |
|||
'data': '<TxDtls xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">\n <Refs>\n <InstrId>INNDNL2U20140105000217200000708</InstrId>\n <EndToEndId>115</EndToEndId>\n </Refs>\n <AmtDtls>\n <TxAmt>\n <Amt Ccy="EUR">1405.31</Amt>\n </TxAmt>\n </AmtDtls>\n <RltdPties>\n <Dbtr>\n <Nm>3rd party Media</Nm>\n <PstlAdr>\n <StrtNm>SOMESTREET 570-A</StrtNm>\n <TwnNm>1276 ML HOUSCITY</TwnNm>\n <Ctry>NL</Ctry>\n </PstlAdr>\n </Dbtr>\n <DbtrAcct>\n <Id>\n <IBAN>NL69ABNA0522123643</IBAN>\n </Id>\n </DbtrAcct>\n </RltdPties>\n <RltdAgts>\n <DbtrAgt>\n <FinInstnId>\n <BIC>ABNANL2A</BIC>\n </FinInstnId>\n </DbtrAgt>\n </RltdAgts>\n <AddtlTxInf>#RD PARTY MEDIA CUSNO 90782 4210773</AddtlTxInf>\n </TxDtls>\n ', |
|||
'date': '2014-01-05', |
|||
'execution_date': '2014-01-05', |
|||
'name': '#RD PARTY MEDIA CUSNO 90782 4210773', |
|||
'note': 'INNDNL2U20140105000217200000708', |
|||
'partner_country': 'NL', |
|||
'partner_name': '3rd party Media', |
|||
'ref': '115', |
|||
'transfer_type': 'ET', |
|||
'value_date': '2014-01-05'}]}]) |
@ -0,0 +1,214 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.053.001.04 camt.053.001.04.xsd"> |
|||
<BkToCstmrStmt> |
|||
<GrpHdr> |
|||
<MsgId>20170323312345678900000</MsgId> |
|||
<CreDtTm>2017-03-23T14:47:00</CreDtTm> |
|||
<MsgPgntn> |
|||
<PgNb>1</PgNb> |
|||
<LastPgInd>true</LastPgInd> |
|||
</MsgPgntn> |
|||
<AddtlInf>Test</AddtlInf> |
|||
</GrpHdr> |
|||
<Stmt> |
|||
<Id>20170323123456789012345</Id> |
|||
<ElctrncSeqNb>58</ElctrncSeqNb> |
|||
<CreDtTm>2017-03-23T14:47:00</CreDtTm> |
|||
<FrToDt> |
|||
<FrDtTm>2017-03-23T00:00:00</FrDtTm> |
|||
<ToDtTm>2017-03-23T23:59:59</ToDtTm> |
|||
</FrToDt> |
|||
<Acct> |
|||
<Id> |
|||
<IBAN>CH1111000000123456789</IBAN> |
|||
</Id> |
|||
<Ownr> |
|||
<Nm>Open Net S. à r.l. Prilly</Nm> |
|||
</Ownr> |
|||
</Acct> |
|||
<Bal> |
|||
<Tp> |
|||
<CdOrPrtry> |
|||
<Cd>OPBD</Cd> |
|||
</CdOrPrtry> |
|||
</Tp> |
|||
<Amt Ccy="CHF">75960.15</Amt> |
|||
<CdtDbtInd>CRDT</CdtDbtInd> |
|||
<Dt> |
|||
<Dt>2017-03-22</Dt> |
|||
</Dt> |
|||
</Bal> |
|||
<Bal> |
|||
<Tp> |
|||
<CdOrPrtry> |
|||
<Cd>CLBD</Cd> |
|||
</CdOrPrtry> |
|||
</Tp> |
|||
<Amt Ccy="CHF">79443.15</Amt> |
|||
<CdtDbtInd>CRDT</CdtDbtInd> |
|||
<Dt> |
|||
<Dt>2017-03-23</Dt> |
|||
</Dt> |
|||
</Bal> |
|||
<Ntry> |
|||
<NtryRef>012345678</NtryRef> |
|||
<Amt Ccy="CHF">3483.00</Amt> |
|||
<CdtDbtInd>CRDT</CdtDbtInd> |
|||
<RvslInd>false</RvslInd> |
|||
<Sts>BOOK</Sts> |
|||
<BookgDt> |
|||
<Dt>2017-03-22</Dt> |
|||
</BookgDt> |
|||
<ValDt> |
|||
<Dt>2017-03-23</Dt> |
|||
</ValDt> |
|||
<AcctSvcrRef>20170323001234567891234567891234</AcctSvcrRef> |
|||
<BkTxCd> |
|||
<Domn> |
|||
<Cd>PMNT</Cd> |
|||
<Fmly> |
|||
<Cd>RCDT</Cd> |
|||
<SubFmlyCd>VCOM</SubFmlyCd> |
|||
</Fmly> |
|||
</Domn> |
|||
</BkTxCd> |
|||
<NtryDtls> |
|||
<Btch> |
|||
<NbOfTxs>2</NbOfTxs> |
|||
</Btch> |
|||
<TxDtls> |
|||
<Refs> |
|||
<AcctSvcrRef>123456CHCAFEBABE</AcctSvcrRef> |
|||
<Prtry> |
|||
<Tp>01</Tp> |
|||
<Ref>123456CHCAFEBABE</Ref> |
|||
</Prtry> |
|||
</Refs> |
|||
<Amt Ccy="CHF">2187.00</Amt> |
|||
<CdtDbtInd>CRDT</CdtDbtInd> |
|||
<BkTxCd> |
|||
<Domn> |
|||
<Cd>PMNT</Cd> |
|||
<Fmly> |
|||
<Cd>RCDT</Cd> |
|||
<SubFmlyCd>AUTT</SubFmlyCd> |
|||
</Fmly> |
|||
</Domn> |
|||
</BkTxCd> |
|||
<RltdPties> |
|||
<Dbtr> |
|||
<Nm>Banque Cantonale Vaudoise</Nm> |
|||
<PstlAdr> |
|||
<StrtNm>Place Saint-François</StrtNm> |
|||
<BldgNb>14</BldgNb> |
|||
<PstCd>1003</PstCd> |
|||
<TwnNm>Lausanne</TwnNm> |
|||
<Ctry>CH1</Ctry> |
|||
</PstlAdr> |
|||
</Dbtr> |
|||
<DbtrAcct> |
|||
<Id> |
|||
<IBAN>CH2222000000123456789</IBAN> |
|||
</Id> |
|||
</DbtrAcct> |
|||
</RltdPties> |
|||
<RltdAgts> |
|||
<DbtrAgt> |
|||
<FinInstnId> |
|||
<BICFI>POFICHBEXXX</BICFI> |
|||
<Nm>POSTFINANCE AG</Nm> |
|||
<PstlAdr> |
|||
<AdrLine>MINGERSTRASSE 20</AdrLine> |
|||
<AdrLine>3030 BERNE</AdrLine> |
|||
</PstlAdr> |
|||
</FinInstnId> |
|||
</DbtrAgt> |
|||
</RltdAgts> |
|||
<RmtInf> |
|||
<Strd> |
|||
<CdtrRefInf> |
|||
<Tp> |
|||
<CdOrPrtry> |
|||
<Prtry>ISR Reference</Prtry> |
|||
</CdOrPrtry> |
|||
</Tp> |
|||
<Ref>302388292000011111111111111</Ref> |
|||
</CdtrRefInf> |
|||
<AddtlRmtInf>?REJECT?0</AddtlRmtInf> |
|||
</Strd> |
|||
</RmtInf> |
|||
<RltdDts> |
|||
<AccptncDtTm>2017-03-22T20:00:00</AccptncDtTm> |
|||
</RltdDts> |
|||
</TxDtls> |
|||
<TxDtls> |
|||
<Refs> |
|||
<AcctSvcrRef>123456CHCAFEBABE</AcctSvcrRef> |
|||
<Prtry> |
|||
<Tp>01</Tp> |
|||
<Ref>123456CHCAFEBABE</Ref> |
|||
</Prtry> |
|||
</Refs> |
|||
<Amt Ccy="CHF">1296.00</Amt> |
|||
<CdtDbtInd>CRDT</CdtDbtInd> |
|||
<BkTxCd> |
|||
<Domn> |
|||
<Cd>PMNT</Cd> |
|||
<Fmly> |
|||
<Cd>RCDT</Cd> |
|||
<SubFmlyCd>AUTT</SubFmlyCd> |
|||
</Fmly> |
|||
</Domn> |
|||
</BkTxCd> |
|||
<RltdPties> |
|||
<Dbtr> |
|||
<Nm>Banque Cantonale Vaudoise</Nm> |
|||
<PstlAdr> |
|||
<StrtNm>Place Saint-François</StrtNm> |
|||
<BldgNb>14</BldgNb> |
|||
<PstCd>1003</PstCd> |
|||
<TwnNm>Lausanne</TwnNm> |
|||
<Ctry>CH2</Ctry> |
|||
</PstlAdr> |
|||
</Dbtr> |
|||
<DbtrAcct> |
|||
<Id> |
|||
<IBAN>CH3333000000123456789</IBAN> |
|||
</Id> |
|||
</DbtrAcct> |
|||
</RltdPties> |
|||
<RltdAgts> |
|||
<DbtrAgt> |
|||
<FinInstnId> |
|||
<BICFI>POFICHBEYYY</BICFI> |
|||
<Nm>POSTFINANCE AG</Nm> |
|||
<PstlAdr> |
|||
<AdrLine>MINGERSTRASSE 20</AdrLine> |
|||
<AdrLine>3030 BERNE</AdrLine> |
|||
</PstlAdr> |
|||
</FinInstnId> |
|||
</DbtrAgt> |
|||
</RltdAgts> |
|||
<RmtInf> |
|||
<Strd> |
|||
<CdtrRefInf> |
|||
<Tp> |
|||
<CdOrPrtry> |
|||
<Prtry>ISR Reference</Prtry> |
|||
</CdOrPrtry> |
|||
</Tp> |
|||
<Ref>302388292000022222222222222</Ref> |
|||
</CdtrRefInf> |
|||
<AddtlRmtInf>?REJECT?0</AddtlRmtInf> |
|||
</Strd> |
|||
</RmtInf> |
|||
<RltdDts> |
|||
<AccptncDtTm>2017-03-22T20:00:00</AccptncDtTm> |
|||
</RltdDts> |
|||
</TxDtls> |
|||
</NtryDtls> |
|||
<AddtlNtryInf>CRÉDIT GROUPÉ BVR TRAITEMENT DU 22.03.2017 NUMÉRO CLIENT 01-70884-3 PAQUET ID: 123456CHCAFEBABE</AddtlNtryInf> |
|||
</Ntry> |
|||
</Stmt> |
|||
</BkToCstmrStmt> |
|||
</Document> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue