libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 19241961a197530ab219ac194c02abac295b8953
parent 1bbf0419eb957881cebc19e5ae854a04116c7c10
Author: Florian Dold <florian.dold@gmail.com>
Date:   Fri,  3 Jul 2020 13:31:16 +0530

use our own test data, iban generator tool

Diffstat:
Acontrib/ibangen.py | 33+++++++++++++++++++++++++++++++++
Mnexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
Mnexus/src/test/kotlin/Iso20022Test.kt | 8++++----
Dnexus/src/test/resources/iso20022-samples/FI_camt_052_sample.xml | 2--
Dnexus/src/test/resources/iso20022-samples/camt.053.001.02.gesamtbeispiel.xml | 701-------------------------------------------------------------------------------
Anexus/src/test/resources/iso20022-samples/camt.053/de.camt.053.001.02.xml | 196+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 296 insertions(+), 721 deletions(-)

diff --git a/contrib/ibangen.py b/contrib/ibangen.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2020 Taler Systems S.A. +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +import click +import random + +def complete_iban(s): + n = int("".join([str(int(x, 26)) for x in (s[4:] + s[0:2] + "00")])) + c = 98 - (n % 97) + return (s[:2] + str(c).ljust(2, "0") + s[4:]).upper() + + +@click.command() +def geniban(): + bban = "12345678" + accno = "".join((str(random.randint(0, 9)) for _ in range(10))) + iban = complete_iban("DE00" + bban + accno) + print(iban) + +if __name__ == '__main__': + geniban() diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt @@ -131,8 +131,8 @@ data class TransactionInfo( val paymentInformationId: String? = null, val messageId: String? = null, - val amount: CurrencyAmount?, - val creditDebitIndicator: CreditDebitIndicator?, + val amount: CurrencyAmount, + val creditDebitIndicator: CreditDebitIndicator, val instructedAmount: CurrencyAmount?, val transactionAmount: CurrencyAmount?, @@ -230,7 +230,10 @@ fun createPain001document(paymentData: NexusPaymentInitiationData): String { root("Document") { attribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03") attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance") - attribute("xsi:schemaLocation", "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd") + attribute( + "xsi:schemaLocation", + "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd" + ) element("CstmrCdtTrfInitn") { element("GrpHdr") { element("MsgId") { @@ -408,21 +411,67 @@ private fun XmlElementDestructor.extractMaybeCurrencyExchange(): CurrencyExchang } -private fun XmlElementDestructor.extractTransactionInfos(): List<TransactionInfo> { +private fun XmlElementDestructor.extractTransactionInfos( + outerAmount: CurrencyAmount, + outerCreditDebitIndicator: CreditDebitIndicator +): List<TransactionInfo> { + + val numTxDtls = requireUniqueChildNamed("NtryDtls") { + mapEachChildNamed("TxDtls") { Unit } + }.count() + return requireUniqueChildNamed("NtryDtls") { mapEachChildNamed("TxDtls") { + + val instructedAmount = maybeUniqueChildNamed("AmtDtls") { + maybeUniqueChildNamed("InstrAmt") { extractCurrencyAmount() } + } + + val transactionAmount = maybeUniqueChildNamed("AmtDtls") { + maybeUniqueChildNamed("TxAmt") { extractCurrencyAmount() } + } + + var amount = maybeExtractCurrencyAmount() + var creditDebitIndicator = maybeUniqueChildNamed("CdtDbtInd") { it.textContent }?.let { + CreditDebitIndicator.valueOf(it) + } + if (amount == null) { + when { + numTxDtls == 1 -> { + amount = outerAmount + creditDebitIndicator = outerCreditDebitIndicator + } + transactionAmount?.currency == outerAmount.currency -> { + amount = transactionAmount + creditDebitIndicator = outerCreditDebitIndicator + } + instructedAmount?.currency == outerAmount.currency -> { + amount = instructedAmount + creditDebitIndicator = outerCreditDebitIndicator + } + else -> { + throw Error("invalid camt, no amount for transaction details of entry details") + } + } + } + + if (creditDebitIndicator == null) { + throw Error("invalid camt, no credit/debit indicator for transaction details of entry details") + } + TransactionInfo( batchMessageId = null, batchPaymentInformationId = null, - amount = maybeExtractCurrencyAmount(), - creditDebitIndicator = maybeUniqueChildNamed("CdtDbtInd") { it.textContent }?.let { - CreditDebitIndicator.valueOf(it) + amount = amount, + creditDebitIndicator = creditDebitIndicator, + instructedAmount = instructedAmount, + instructedAmountCurrencyExchange = maybeUniqueChildNamed("AmtDtls") { + maybeUniqueChildNamed("InstrAmt") { extractMaybeCurrencyExchange() } + }, + transactionAmount = transactionAmount, + transactionAmountCurrencyExchange = maybeUniqueChildNamed("AmtDtls") { + maybeUniqueChildNamed("TxAmt") { extractMaybeCurrencyExchange() } }, - instructedAmount = maybeUniqueChildNamed("AmtDtls") { maybeUniqueChildNamed("InstrAmt") { extractCurrencyAmount() } }, - instructedAmountCurrencyExchange = maybeUniqueChildNamed("AmtDtls") { maybeUniqueChildNamed("InstrAmt") { extractMaybeCurrencyExchange() } }, - transactionAmount = maybeUniqueChildNamed("AmtDtls") { maybeUniqueChildNamed("TxAmt") { extractCurrencyAmount() } }, - transactionAmountCurrencyExchange = maybeUniqueChildNamed("AmtDtls") { maybeUniqueChildNamed("TxAmt") { extractMaybeCurrencyExchange() } }, - endToEndId = maybeUniqueChildNamed("Refs") { maybeUniqueChildNamed("EndToEndId") { it.textContent } }, @@ -434,7 +483,7 @@ private fun XmlElementDestructor.extractTransactionInfos(): List<TransactionInfo }, unstructuredRemittanceInformation = maybeUniqueChildNamed("RmtInf") { val chunks = mapEachChildNamed("Ustrd", { it.textContent }) - if (chunks.size == 0) { + if (chunks.isEmpty()) { null } else { chunks.joinToString() @@ -486,7 +535,7 @@ private fun XmlElementDestructor.extractInnerTransactions(): CamtReport { val acctSvcrRef = maybeUniqueChildNamed("AcctSvcrRef") { it.textContent } val entryRef = maybeUniqueChildNamed("NtryRef") { it.textContent } // For now, only support account servicer reference as id - val transactionInfos = extractTransactionInfos() + val transactionInfos = extractTransactionInfos(CurrencyAmount(currency, amount), creditDebitIndicator) CamtBankAccountEntry( entryAmount = CurrencyAmount(currency, amount), status = status, diff --git a/nexus/src/test/kotlin/Iso20022Test.kt b/nexus/src/test/kotlin/Iso20022Test.kt @@ -17,17 +17,17 @@ fun loadXmlResource(name: String): Document { class Iso20022Test { @Test fun testTransactionsImport() { - val camt53 = loadXmlResource("iso20022-samples/camt.053.001.02.gesamtbeispiel.xml") + val camt53 = loadXmlResource("iso20022-samples/camt.053/de.camt.053.001.02.xml") val r = parseCamtMessage(camt53) - assertEquals(r.messageId, "27632364572") - assertEquals(r.creationDateTime, "2016-05-11T19:30:47.0+01:00") + assertEquals(r.messageId, "msg-001") + assertEquals(r.creationDateTime, "2020-07-03T12:44:40+05:30") assertEquals(r.messageType, CashManagementResponseType.Statement) assertEquals(r.reports.size, 1) assertEquals(r.reports[0].entries[0].entryAmount.amount, "100.00") assertEquals(r.reports[0].entries[0].entryAmount.currency, "EUR") assertEquals(r.reports[0].entries[0].status, EntryStatus.BOOK) assertEquals(r.reports[0].entries[0].entryRef, null) - assertEquals(r.reports[0].entries[0].accountServicerRef, "Bankreferenz") + assertEquals(r.reports[0].entries[0].accountServicerRef, "acctsvcrref-001") assertEquals(r.reports[0].entries[0].bankTransactionCode.domain, "PMNT") assertEquals(r.reports[0].entries[0].bankTransactionCode.family, "RCDT") assertEquals(r.reports[0].entries[0].bankTransactionCode.subfamily, "ESCT") diff --git a/nexus/src/test/resources/iso20022-samples/FI_camt_052_sample.xml b/nexus/src/test/resources/iso20022-samples/FI_camt_052_sample.xml @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><!-- Sample XML file generated by FFFS (www.fkl.fi) B2C project for FInnish Account Report, 2009-11-02, for different Entry instance for --><!-- MT210 / Prenotice of incoming inter national transaction (without balances) and one simple intra day balance report with one transaction--><Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.052.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.052.001.02camt.052.001.02.xsd"> <BkToCstmrAcctRpt> <GrpHdr> <MsgId>BANKFILEID219073</MsgId> <CreDtTm>2009-10-30T12:01:45+02:00</CreDtTm> <MsgRcpt> <Id> <OrgId> <Othr> <Id>123456789</Id> <SchmeNm> <Cd>BANK</Cd> </SchmeNm> </Othr> </OrgId> </Id> </MsgRcpt> <AddtlInf>Some additional message-specific info can be delivered from bank to customer here</AddtlInf> </GrpHdr> <!-- First Report with prenotice of incoming transaction separately in its onw report with no balances--> <Rpt> <Id>BANKFILEID00001NTR00001</Id> <!-- Electronic Sequence Number is optional per bank --> <ElctrncSeqNb>196</ElctrncSeqNb> <CreDtTm>2009-10-30T12:01:45+02:00</CreDtTm> <Acct> <Id> <IBAN>FI7433010001222090</IBAN> </Id> <Tp> <Cd>CACC</Cd> </Tp> <Ccy>EUR</Ccy> <Nm>Account name</Nm> <Ownr> <Nm>BANK ACCOUNT OWNER</Nm> <Id> <OrgId> <Othr> <Id>123456789</Id> <SchmeNm> <Cd>CUST</Cd> </SchmeNm> </Othr> </OrgId> </Id> </Ownr> <Svcr> <FinInstnId> <BIC>ESSEFIHX</BIC> </FinInstnId> </Svcr> </Acct> <!-- --> <TxsSummry> <TtlNtries> <NbOfNtries>1</NbOfNtries> <Sum>2120.00</Sum> <TtlNetNtryAmt>2120.00</TtlNetNtryAmt> <CdtDbtInd>CRDT</CdtDbtInd> </TtlNtries> </TxsSummry> <Ntry> <!-- As Account Servicer Reference is not yet available, NtryRef refers to prenotice SWIFT message --> <NtryRef>21892819</NtryRef> <Amt Ccy="EUR">2120.00</Amt> <CdtDbtInd>CRDT</CdtDbtInd> <Sts>PDNG</Sts> <BookgDt> <Dt>2009-11-02</Dt> </BookgDt> <ValDt> <Dt>2009-11-03</Dt> </ValDt> <BkTxCd> <Domn> <Cd>PMNT</Cd> <Fmly> <Cd>RCDT</Cd> <SubFmlyCd>XBCT</SubFmlyCd> </Fmly> </Domn> </BkTxCd> <NtryDtls> <TxDtls> <Refs> <!-- Reference used by the Debtor banks--> <InstrId>ISSRBKREF12345678</InstrId> <TxId>21892819</TxId> </Refs> <AmtDtls> <InstdAmt> <Amt Ccy="USD">3200.00</Amt> <CcyXchg> <SrcCcy>USD</SrcCcy> <TrgtCcy>EUR</TrgtCcy> <UnitCcy>EUR</UnitCcy> <XchgRate>0.666667</XchgRate> <!-- May differ in final booking --> <QtnDt>2009-10-30T10:00:00+02:00</QtnDt> </CcyXchg> </InstdAmt> <TxAmt> <Amt Ccy="EUR">2120.00</Amt> </TxAmt> <!-- Optional <CntrValAmt> <Amt Ccy="USD">3200.00</Amt> <CcyXchg> <SrcCcy>USD</SrcCcy> <TrgtCcy>EUR</TrgtCcy> <UnitCcy>EUR</UnitCcy> <XchgRate>0.666667</XchgRate> <QtnDt>2009-10-30T10:00:00+02:00</QtnDt> </CcyXchg> </CntrValAmt> --> </AmtDtls> <RltdPties> <Dbtr> <Nm>DEBTOR NAME</Nm> <Id> <OrgId> <Othr> <Id>123456789</Id> <SchmeNm> <Cd>DUNS</Cd> </SchmeNm> </Othr> </OrgId> </Id> </Dbtr> </RltdPties> <RltdAgts> <DbtrAgt> <FinInstnId> <BIC>BOFAUS6H</BIC> </FinInstnId> </DbtrAgt> </RltdAgts> <RmtInf> <Ustrd>INVOICE US20291092</Ustrd> </RmtInf> </TxDtls> </NtryDtls> </Ntry> </Rpt> <!-- Second Report with one booked intra-day transaction with inter --> <Rpt> <Id>BANKRPTID1972009</Id> <ElctrncSeqNb>197</ElctrncSeqNb> <CreDtTm>2009-10-30T12:00:00+02:00</CreDtTm> <FrToDt> <!-- Times also sepcified to indicate transaction report time limits within day --> <FrDtTm>2009-10-30T10:00:00+02:00</FrDtTm> <ToDtTm>2009-10-30T12:00:00+02:00</ToDtTm> </FrToDt> <Acct> <Id> <IBAN>FI7433010001222090</IBAN> </Id> <Tp> <Cd>CACC</Cd> </Tp> <Ccy>EUR</Ccy> <Ownr> <Nm>BANK ACCOUNT OWNER</Nm> <PstlAdr> <StrtNm>HELSINGINKATU</StrtNm> <BldgNb>31</BldgNb> <PstCd>00100</PstCd> <TwnNm>HELSINKI</TwnNm> <Ctry>FI</Ctry> </PstlAdr> <Id> <OrgId> <Othr> <Id>12345678901</Id> <SchmeNm> <Cd>BANK</Cd> </SchmeNm> </Othr> </OrgId> </Id> </Ownr> <Svcr> <FinInstnId> <BIC>ESSEFIHX</BIC> </FinInstnId> </Svcr> </Acct> <RltdAcct> <Id> <IBAN>FI1533010001911270</IBAN> </Id> <Ccy>EUR</Ccy> </RltdAcct> <Bal> <!-- "Opening balance" as interim booked on specific time of intra-day. May be also OPBD if it is really Opening Booked Balance for the reporting day --> <Tp> <CdOrPrtry> <Cd>ITBD</Cd> </CdOrPrtry> </Tp> <CdtLine> <Incl>false</Incl> <Amt Ccy="EUR">1000.00</Amt> </CdtLine> <Amt Ccy="EUR">1000.00</Amt> <CdtDbtInd>CRDT</CdtDbtInd> <Dt> <DtTm>2009-10-30T10:00:00+02:00</DtTm> </Dt> </Bal> <Bal> <!-- "Closing balance" as interim booked on specific time of intra-day. --> <Tp> <CdOrPrtry> <Cd>ITBD</Cd> </CdOrPrtry> </Tp> <CdtLine> <Incl>false</Incl> <Amt Ccy="EUR">1100.00</Amt> </CdtLine> <Amt Ccy="EUR">1100.00</Amt> <CdtDbtInd>CRDT</CdtDbtInd> <Dt> <DtTm>2009-10-30T12:00:00+02:00</DtTm> </Dt> </Bal> <TxsSummry> <TtlNtries> <NbOfNtries>1</NbOfNtries> </TtlNtries> <TtlCdtNtries> <NbOfNtries>1</NbOfNtries> <Sum>100.00</Sum> </TtlCdtNtries> </TxsSummry> <!--Transaction 1/ Single incoming SCT--> <Ntry> <Amt Ccy="EUR">100.00</Amt> <CdtDbtInd>CRDT</CdtDbtInd> <Sts>BOOK</Sts> <!-- Time with Booking Date to give info of booking event on bank ledger --> <BookgDt> <DtTm>2009-10-30T11:00:00+02:00</DtTm> </BookgDt> <ValDt> <Dt>2009-10-30</Dt> </ValDt> <AcctSvcrRef>091029ACCTSTMTARCH08</AcctSvcrRef> <BkTxCd> <Domn> <Cd>PMNT</Cd> <Fmly> <Cd>RCDT</Cd> <SubFmlyCd>ESCT</SubFmlyCd> </Fmly> </Domn> </BkTxCd> <NtryDtls> <TxDtls> <Refs> <EndToEndId>EndToEndIdSCT01</EndToEndId> </Refs> <AmtDtls> <TxAmt> <Amt Ccy="EUR">100.00</Amt> </TxAmt> </AmtDtls> <RltdPties> <Dbtr> <Nm>DEBTOR</Nm> </Dbtr> <UltmtDbtr> <Nm>ULTIMATE DEBTOR</Nm> <Id> <OrgId> <Othr> <Id>987654321</Id> <SchmeNm> <Cd>TXID</Cd> </SchmeNm> </Othr> </OrgId> </Id> </UltmtDbtr> </RltdPties> <RltdAgts> <DbtrAgt> <FinInstnId> <BIC>NDEAFIHH</BIC> </FinInstnId> </DbtrAgt> </RltdAgts> <Purp> <Cd>TREA</Cd> </Purp> <RmtInf> <Strd> <CdtrRefInf> <Tp> <CdOrPrtry> <Cd>SCOR</Cd> </CdOrPrtry> <Issr>ISO</Issr> </Tp> <Ref>RF98123456789012</Ref> </CdtrRefInf> </Strd> </RmtInf> <RltdDts> <AccptncDtTm>2009-10-28T03:00:00+02:00</AccptncDtTm> </RltdDts> </TxDtls> </NtryDtls> </Ntry> </Rpt> </BkToCstmrAcctRpt></Document> -\ No newline at end of file diff --git a/nexus/src/test/resources/iso20022-samples/camt.053.001.02.gesamtbeispiel.xml b/nexus/src/test/resources/iso20022-samples/camt.053.001.02.gesamtbeispiel.xml @@ -1,701 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Mit XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) im Mai 2016 von der SIZ GmbH (Wenzel) angepasst hinsichtlich Anlage 3, Version 3.0: --> -<!-- 1. BkTxCd Pflicht auf Entryebene, 2. Issuer nun "DK" (Statt "ZKA"), 3. Mapping GVC auf Domn, 4. Nichtdrehen bei R-Transaktionen illustriert 5. Schluss-Saldo angepasst (Löschung der DTAUS-Umsätze)--> -<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02 camt.053.001.02.xsd"> - <BkToCstmrStmt> - <GrpHdr> - <MsgId>27632364572</MsgId> - <CreDtTm>2016-05-11T19:30:47.0+01:00</CreDtTm> - <MsgRcpt> - <Id> - <OrgId> - <Othr> - <Id>BCS45678</Id> - </Othr> - </OrgId> - </Id> - </MsgRcpt> - <MsgPgntn> - <PgNb>1</PgNb> - <LastPgInd>true</LastPgInd> - </MsgPgntn> - </GrpHdr> - <Stmt> - <Id>2736482736482</Id> - <ElctrncSeqNb>101</ElctrncSeqNb> - <!--Folgendes Feld ist optional und könnte die Papier-KAZ enthalten--> - <LglSeqNb>32</LglSeqNb> - <CreDtTm>2016-05-11T17:30:47.0+01:00</CreDtTm> - <Acct> - <Id> - <IBAN>DE62210500001234567890</IBAN> - </Id> - <Ccy>EUR</Ccy> - <Ownr> - <Nm>Name Kontoinhaber</Nm> - </Ownr> - <Svcr> - <FinInstnId> - <BIC>BANKDEFFXXX</BIC> - <Othr> - <Id>DE123456789</Id> - <Issr>UmsStId</Issr> - </Othr> - </FinInstnId> - </Svcr> - </Acct> - <Bal> - <Tp> - <CdOrPrtry> - <Cd>PRCD</Cd> - </CdOrPrtry> - </Tp> - <Amt Ccy="EUR">112.72</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Dt> - <Dt>2016-05-11</Dt> - </Dt> - </Bal> - <Bal> - <Tp> - <CdOrPrtry> - <Cd>CLBD</Cd> - </CdOrPrtry> - </Tp> - <Amt Ccy="EUR">158530.32</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Dt> - <Dt>2016-05-11</Dt> - </Dt> - </Bal> - <!-- Beispiel 1: SEPA-Zahlungen (Ueberweisung, Lastschrift, R-Nachricht --> - <!--Gutschrift aufgrund eines SEPA-Ueberweisungseinganges--> - <Ntry> - <Amt Ccy="EUR">100.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2016-05-11</Dt> - </BookgDt> - <ValDt> - <Dt>2016-05-11</Dt> - </ValDt> - <AcctSvcrRef>Bankreferenz</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>ESCT</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>166</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <NtryDtls> - <TxDtls> - <Refs> - <EndToEndId>Ende-zu-Ende-Id des Ueberweisenden</EndToEndId> - </Refs> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>ESCT</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NTRF+166</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>Herr Ueberweisender</Nm> - </Dbtr> - <DbtrAcct> - <Id> - <IBAN>DE21500500001234567897</IBAN> - </Id> - </DbtrAcct> - <UltmtDbtr> - <Nm>Herr Debtor Reference Party</Nm> - </UltmtDbtr> - <Cdtr> - <Nm>Herr Kontoinhaber</Nm> - </Cdtr> - <UltmtCdtr> - <Nm>Herr Creditor Reference Party</Nm> - </UltmtCdtr> - </RltdPties> - <Purp> - <Cd>GDDS</Cd> - </Purp> - <RmtInf> - <Ustrd>Rechnungsnr. 4711 vom 20.04.2016</Ustrd> - </RmtInf> - </TxDtls> - </NtryDtls> - <AddtlNtryInf>SEPA GUTSCHRIFT</AddtlNtryInf> - </Ntry> - <!--Gutschrift aufgrund einer zurueckgekommenen SEPA-Ueberweisung--> - <Ntry> - <Amt Ccy="EUR">200.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2016-05-11</Dt> - </BookgDt> - <ValDt> - <Dt>2016-05-11</Dt> - </ValDt> - <AcctSvcrRef>Bankreferenz</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>ICDT</Cd> - <SubFmlyCd>RRTN</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>159</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <NtryDtls> - <TxDtls> - <Refs> - <EndToEndId>Urspr. E2E-Id der Hintransaktion</EndToEndId> - </Refs> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>ICDT</Cd> - <SubFmlyCd>RRTN</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NRTI+159++901</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <RmtInf> - <Ustrd>Angabe des urspruenglichen Verwendungszweckes</Ustrd> - </RmtInf> - <!--Informationen zur Originaltransaktion. Da die Belegung von Domain optional ist, kann auch nur Prtry (GVC) vorhanden sein--> - <RtrInf> - <OrgnlBkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>ICDT</Cd> - <SubFmlyCd>ESCT</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NTRF+116</Cd> - <Issr>DK</Issr> - </Prtry> - </OrgnlBkTxCd> - <Orgtr> - <Id> - <OrgId> - <BICOrBEI>BANKDEHH</BICOrBEI> - </OrgId> - </Id> - </Orgtr> - <Rsn> - <Cd>AC01</Cd> - </Rsn> - <AddtlInf>IBAN FEHLERHAFT</AddtlInf> - </RtrInf> - </TxDtls> - </NtryDtls> - <AddtlNtryInf>SEPA RUECKBUCHUNG</AddtlNtryInf> - </Ntry> - <!--Belastung aufgrund einer SEPA-Lastschrift--> - <Ntry> - <Amt Ccy="EUR">50.00</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2016-05-11</Dt> - </BookgDt> - <ValDt> - <Dt>2016-05-11</Dt> - </ValDt> - <AcctSvcrRef>Bankreferenz</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>RDDT</Cd> - <SubFmlyCd>ESDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>105</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <NtryDtls> - <TxDtls> - <Refs> - <EndToEndId>E2E-Id vergeben vom Glaeubiger</EndToEndId> - <MndtId>Ref. des SEPA-Lastschriftmandats</MndtId> - </Refs> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>RDDT</Cd> - <SubFmlyCd>ESDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NDDT+105</Cd> - <Issr>DKA</Issr> - </Prtry> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>Herr Zahlungspflichtiger</Nm> - </Dbtr> - <UltmtDbtr> - <Nm>Herr Debtor Reference Party</Nm> - </UltmtDbtr> - <Cdtr> - <Nm>Glaeubigerfirma</Nm> - <Id> - <PrvtId> - <Othr> - <Id>Cdtr-Id des Glaeubigers</Id> - </Othr> - </PrvtId> - </Id> - </Cdtr> - </RltdPties> - <Purp> - <Cd>PHON</Cd> - </Purp> - <RmtInf> - <Ustrd>Telefonrechnung April 2016, Vertragsnummer 3536456345</Ustrd> - </RmtInf> - </TxDtls> - </NtryDtls> - <AddtlNtryInf>SEPA LASTSCHRIFT</AddtlNtryInf> - </Ntry> - <!-- Beispiel 2: DTAUS-Zahlungen (Ueberweisung, Lastschrift, Rueckgabe) BEISPIEL ENTFERNT --> - <!-- Beispiel 3a: Sammlerdarstellung mit Aufloesung innerhalb der Nachricht --> - <!--Belastung aufgrund von SEPA-Lastschriftrueckgaben (Sammelbuchung) mit Sammleraufloesung unter Transaction Details--> - <Ntry> - <Amt Ccy="EUR">276</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2016-05-11</Dt> - </BookgDt> - <ValDt> - <Dt>2016-05-11</Dt> - </ValDt> - <AcctSvcrRef>Bankreferenz</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>UPDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>109</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <NtryDtls> - <Btch> - <NbOfTxs>3</NbOfTxs> - </Btch> - <TxDtls> - <!-- Ab hier Aufloesung des Sammlers bestehend aus 3 Einzelumsaetzen --> - <Refs> - <EndToEndId>79892</EndToEndId> - <MndtId>10001</MndtId> - </Refs> - <AmtDtls> - <TxAmt> - <Amt Ccy="EUR">76</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>UPDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NRTI+109++901</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <!--Weil bei R-Transaktionen nicht gedreht wird, stehen hier die Originals--> - <RltdPties> - <Dbtr> - <Nm>Herr Zahlungspflichtiger 1</Nm> - </Dbtr> - <DbtrAcct> - <Id> - <IBAN>DE83700202707777777777</IBAN> - </Id> - </DbtrAcct> - <Cdtr> - <Nm>Telefongesellschaft ABC</Nm> - <Id> - <PrvtId> - <Othr> - <Id>CdtrId des SEPA-Lastschrifteinr.</Id> - </Othr> - </PrvtId> - </Id> - </Cdtr> - <CdtrAcct> - <Id> - <IBAN>DE62210500001234567890</IBAN> - </Id> - </CdtrAcct> - </RltdPties> - <Purp> - <Cd>PHON</Cd> - </Purp> - <RmtInf> - <Ustrd>Telefonrechnung April 2016, Vertragsnummer 3536456345</Ustrd> - </RmtInf> - <RtrInf> - <Rsn> - <Cd>AC01</Cd> - </Rsn> - <AddtlInf>RUECKLASTSCHRIFT IBAN FEHLERHAFT</AddtlInf> - </RtrInf> - </TxDtls> - <TxDtls> - <Refs> - <EndToEndId>768768</EndToEndId> - <MndtId>10002</MndtId> - </Refs> - <AmtDtls> - <TxAmt> - <Amt Ccy="EUR">80</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>UPDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NRTI+109++901</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>Herr Zahlungspflichtiger 2</Nm> - </Dbtr> - <DbtrAcct> - <Id> - <IBAN>DE83700202704444444444</IBAN> - </Id> - </DbtrAcct> - <Cdtr> - <Nm>Telefongesellschaft ABC</Nm> - <Id> - <PrvtId> - <Othr> - <Id>CdtrId des SEPA-Lastschrifteinr.</Id> - </Othr> - </PrvtId> - </Id> - </Cdtr> - <CdtrAcct> - <Id> - <IBAN>DE62210500001234567890</IBAN> - </Id> - </CdtrAcct> - </RltdPties> - <Purp> - <Cd>PHON</Cd> - </Purp> - <RmtInf> - <Ustrd>Telefonrechnung April 2016, Vertragsnummer 3536456888</Ustrd> - </RmtInf> - <RtrInf> - <Rsn> - <Cd>AC01</Cd> - </Rsn> - <AddtlInf>RUECKLASTSCHRIFT IBAN FEHLERHAFT</AddtlInf> - </RtrInf> - </TxDtls> - <TxDtls> - <Refs> - <EndToEndId>45456465</EndToEndId> - <MndtId>10003</MndtId> - </Refs> - <AmtDtls> - <TxAmt> - <Amt Ccy="EUR">120</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>UPDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NRTI+109++901</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>Herr Zahlungspflichtiger 3</Nm> - </Dbtr> - <DbtrAcct> - <Id> - <IBAN>DE83700202703333333333</IBAN> - </Id> - </DbtrAcct> - <Cdtr> - <Nm>Telefongesellschaft ABC</Nm> - <Id> - <PrvtId> - <Othr> - <Id>CdtrId des SEPA-Lastschrifteinr.</Id> - </Othr> - </PrvtId> - </Id> - </Cdtr> - <CdtrAcct> - <Id> - <IBAN>DE62210500001234567890</IBAN> - </Id> - </CdtrAcct> - </RltdPties> - <Purp> - <Cd>PHON</Cd> - </Purp> - <RmtInf> - <Ustrd>Telefonrechnung April 2016, Vertragsnummer 3536456345</Ustrd> - </RmtInf> - <RtrInf> - <Rsn> - <Cd>AC01</Cd> - </Rsn> - <AddtlInf>RUECKLASTSCHRIFT IBAN FEHLERHAFT</AddtlInf> - </RtrInf> - </TxDtls> - </NtryDtls> - </Ntry> - <!-- Beispiel 3b: Sammlerdarstellung mit Verweis auf pain-Nachricht und separate camt.054.001.01-Nachricht --> - <!--Belastung aufgrund einer SEPA-Ueberweisung (Sammler) mit Verweis auf Original pain-Nachricht--> - <Ntry> - <Amt Ccy="EUR">100876.00</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2016-05-11</Dt> - </BookgDt> - <ValDt> - <Dt>2016-05-11</Dt> - </ValDt> - <AcctSvcrRef>Bankreferenz</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>ICDT</Cd> - <SubFmlyCd>ESCT</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>191</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <NtryDtls> - <Btch> - <MsgId>MsgId der pain-Nachricht</MsgId> - <PmtInfId>Sammler-Id dieser pain-Nachricht</PmtInfId> - </Btch> - <TxDtls> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>ICDT</Cd> - <SubFmlyCd>ESCT</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NTRF+191</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - </TxDtls> - </NtryDtls> - <AddtlNtryInf>SEPA Credit Transfer (Sammler-Soll)</AddtlNtryInf> - </Ntry> - <!--Belastung aufgrund von SEPA-Lastschriftrueckgaben (Sammelbuchung) mit Verweis auf separate camt.054.001.01-Nachricht--> - <Ntry> - <Amt Ccy="EUR">276.00</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2016-05-11</Dt> - </BookgDt> - <ValDt> - <Dt>2016-05-11</Dt> - </ValDt> - <AcctSvcrRef>Bankreferenz</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>UPDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>109</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <AddtlInfInd> - <MsgNmId>camt.054.001.01</MsgNmId> - <MsgId>054-20160511-00034</MsgId> - <!-- siehe Bsp. camt54 Bsp 3b --> - </AddtlInfInd> - <NtryDtls> - <TxDtls> - <BkTxCd> - <Domn> - <Cd>PNMT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>UPDD</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NRTI+109++901</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - </TxDtls> - </NtryDtls> - </Ntry> - <!-- Beispiel 4: USD-Zahlung mit Gutschrift auf einem EUR-Konto --> - <!-- USD-Zahlung mit Gutschrift auf einem EUR-Konto --> - <Ntry> - <Amt Ccy="EUR">259595.60</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2016-05-11</Dt> - </BookgDt> - <ValDt> - <Dt>2016-05-11</Dt> - </ValDt> - <AcctSvcrRef>Bankreferenz</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>XBCT</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NTRF+202</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <NtryDtls> - <TxDtls> - <AmtDtls> - <InstdAmt> - <Amt Ccy="USD">360873.97</Amt> - </InstdAmt> - <TxAmt> - <Amt Ccy="EUR">259595.60</Amt> - </TxAmt> - <CntrValAmt> - <Amt Ccy="EUR">259621.56</Amt> - <CcyXchg> - <SrcCcy>USD</SrcCcy> - <TrgtCcy>EUR</TrgtCcy> - <XchgRate>1.39</XchgRate> - </CcyXchg> - </CntrValAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>XBCT</SubFmlyCd> - </Fmly> - </Domn> - <Prtry> - <Cd>NTRF+202</Cd> - <Issr>DK</Issr> - </Prtry> - </BkTxCd> - <Chrgs> - <Amt Ccy="EUR">25.96</Amt> - </Chrgs> - <RltdPties> - <Dbtr> - <Nm>West Coast Ltd.</Nm> - <PstlAdr> - <Ctry>US</Ctry> - <AdrLine>52, Main Street</AdrLine> - <AdrLine>3733 San Francisco</AdrLine> - </PstlAdr> - </Dbtr> - <DbtrAcct> - <Id> - <Othr> - <Id>546237687</Id> - </Othr> - </Id> - </DbtrAcct> - </RltdPties> - <RltdAgts> - <DbtrAgt> - <FinInstnId> - <BIC>BANKUSNY</BIC> - </FinInstnId> - </DbtrAgt> - </RltdAgts> - <RmtInf> - <Ustrd>Invoice No. 4545</Ustrd> - </RmtInf> - </TxDtls> - </NtryDtls> - <AddtlNtryInf>AZV-UEBERWEISUNGSGUTSCHRIFT</AddtlNtryInf> - </Ntry> - </Stmt> - </BkToCstmrStmt> -</Document> diff --git a/nexus/src/test/resources/iso20022-samples/camt.053/de.camt.053.001.02.xml b/nexus/src/test/resources/iso20022-samples/camt.053/de.camt.053.001.02.xml @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- This file has been placed in the public domain --> +<!-- Sample camt.053 according to the interpretation of the German DK rules --> +<!-- IBANs have been randomly generated with a BBAN of 12345678 --> +<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02 camt.053.001.02.xsd"> + <BkToCstmrStmt> + <GrpHdr> + <MsgId>msg-001</MsgId> + <CreDtTm>2020-07-03T12:44:40+05:30</CreDtTm> + </GrpHdr> + <Stmt> + <Id>stmt-001</Id> + <CreDtTm>2020-07-03T11:00:40+05:30</CreDtTm> + <Acct> + <Id> + <IBAN>DE54123456784713474163</IBAN> + </Id> + </Acct> + <Bal> + <Tp> + <CdOrPrtry> + <Cd>PRCD</Cd> + </CdOrPrtry> + </Tp> + <Amt Ccy="EUR">500</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Dt> + <Dt>2020-07-03</Dt> + </Dt> + </Bal> + <Ntry> + <Amt Ccy="EUR">100.00</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Sts>BOOK</Sts> + <BookgDt> + <Dt>2020-07-02</Dt> + </BookgDt> + <ValDt> + <Dt>2020-07-04</Dt> + </ValDt> + <AcctSvcrRef>acctsvcrref-001</AcctSvcrRef> + <BkTxCd> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>RCDT</Cd> + <SubFmlyCd>ESCT</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>166</Cd> + <Issr>DK</Issr> + </Prtry> + </BkTxCd> + <!-- Credit due to incoming SCT --> + <NtryDtls> + <TxDtls> + <Refs> + <EndToEndId>e2e-001</EndToEndId> + </Refs> + <BkTxCd> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>RCDT</Cd> + <SubFmlyCd>ESCT</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>NTRF+166</Cd> + <Issr>DK</Issr> + </Prtry> + </BkTxCd> + <RltdPties> + <Dbtr> + <Nm>Debtor One</Nm> + </Dbtr> + <DbtrAcct> + <Id> + <IBAN>DE52123456789473323175</IBAN> + </Id> + </DbtrAcct> + <UltmtDbtr> + <Nm>Ultimate Debtor One</Nm> + </UltmtDbtr> + <Cdtr> + <Nm>Creditor One</Nm> + </Cdtr> + <UltmtCdtr> + <Nm>Ultimate Creditor One</Nm> + </UltmtCdtr> + </RltdPties> + <Purp> + <Cd>GDDS</Cd> + </Purp> + <RmtInf> + <Ustrd>unstructured info one</Ustrd> + </RmtInf> + </TxDtls> + </NtryDtls> + <AddtlNtryInf>SEPA GUTSCHRIFT</AddtlNtryInf> + </Ntry> + <!-- Credit due to incoming USD transfer --> + <Ntry> + <Amt Ccy="EUR">1000</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Sts>BOOK</Sts> + <BookgDt> + <Dt>2020-07-03</Dt> + </BookgDt> + <ValDt> + <Dt>2020-07-04</Dt> + </ValDt> + <AcctSvcrRef>acctsvcrref-002</AcctSvcrRef> + <BkTxCd> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>RCDT</Cd> + <SubFmlyCd>XBCT</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>NTRF+202</Cd> + <Issr>DK</Issr> + </Prtry> + </BkTxCd> + <NtryDtls> + <TxDtls> + <AmtDtls> + <InstdAmt> + <Amt Ccy="USD">1500</Amt> + </InstdAmt> + <TxAmt> + <Amt Ccy="EUR">1000</Amt> + </TxAmt> + <CntrValAmt> + <Amt Ccy="EUR">1250.0</Amt> + <CcyXchg> + <SrcCcy>USD</SrcCcy> + <TrgtCcy>EUR</TrgtCcy> + <XchgRate>1.20</XchgRate> + </CcyXchg> + </CntrValAmt> + </AmtDtls> + <BkTxCd> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>RCDT</Cd> + <SubFmlyCd>XBCT</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>NTRF+202</Cd> + <Issr>DK</Issr> + </Prtry> + </BkTxCd> + <Chrgs> + <Amt Ccy="EUR">250.00</Amt> + </Chrgs> + <RltdPties> + <Dbtr> + <Nm>Some US Bank</Nm> + <PstlAdr> + <Ctry>US</Ctry> + <AdrLine>42 Some Street</AdrLine> + <AdrLine>4242 Somewhere</AdrLine> + </PstlAdr> + </Dbtr> + <DbtrAcct> + <Id> + <Othr> + <Id>9876543</Id> + </Othr> + </Id> + </DbtrAcct> + </RltdPties> + <RltdAgts> + <DbtrAgt> + <FinInstnId> + <BIC>BANKUSNY</BIC> + </FinInstnId> + </DbtrAgt> + </RltdAgts> + <RmtInf> + <Ustrd>Invoice No. 4242</Ustrd> + </RmtInf> + </TxDtls> + </NtryDtls> + <AddtlNtryInf>AZV-UEBERWEISUNGSGUTSCHRIFT</AddtlNtryInf> + </Ntry> + </Stmt> + </BkToCstmrStmt> +</Document> +\ No newline at end of file