libeufin

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

commit 769d458c8de9e38f77a599f9301290624280bb92
parent d681801e524eb6fdd422c485c509d84153c6d1f1
Author: Antoine A <>
Date:   Mon,  4 Mar 2024 09:56:24 +0100

Parse reversal transaction

Diffstat:
Mnexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt | 37+++++++++++++++++++++++++------------
Mnexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt | 68++++++++++++++++++++++++++++++++++++++++++++------------------------
Dtestbench/sample/QRIBAN_camt.054_SIC_04_088583185407_NN_0885831854071000_20221222_180251_006.xml | 427-------------------------------------------------------------------------------
Dtestbench/sample/QRIBAN_camt.054_SPS_08_088583185407_NN_0885831854071000_20221222_180251_006.xml | 456-------------------------------------------------------------------------------
Dtestbench/sample/camt.054_SIC_04_088583185407_NN_0885831854071000_20221022_170251_005.xml | 313-------------------------------------------------------------------------------
Dtestbench/sample/camt.054_SPS_08_088583185407_NN_0885831854071000_170251_005.xml | 253-------------------------------------------------------------------------------
Mtestbench/src/test/kotlin/Iso20022Test.kt | 4++--
7 files changed, 71 insertions(+), 1487 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt @@ -147,7 +147,7 @@ suspend fun ingestOutgoingPayment( else logger.warn("$payment recovered") } else { - logger.debug("OUT '${payment.messageId}' already seen") + logger.debug("$payment already seen") } } @@ -158,7 +158,6 @@ private val PATTERN = Regex("[a-z0-9A-Z]{52}") * or bounces it, according to the subject. * * @param db database handle. - * @param currency fiat currency of the watched bank account. * @param payment payment to (maybe) ingest. */ suspend fun ingestIncomingPayment( @@ -171,7 +170,7 @@ suspend fun ingestIncomingPayment( if (result.new) { logger.info("$payment") } else { - logger.debug("IN '${payment.bankId}' already seen") + logger.debug("$payment already seen") } }, onFailure = { e -> @@ -183,12 +182,26 @@ suspend fun ingestIncomingPayment( if (result.new) { logger.info("$payment bounced in '${result.bounceId}': ${e.message}") } else { - logger.debug("IN '${payment.bankId}' already seen and bounced in '${result.bounceId}': ${e.message}") + logger.debug("$payment already seen and bounced in '${result.bounceId}': ${e.message}") } } ) } +/** + * Ingests an outgoing payment bounce. + * + * @param db database handle. + * @param reversal reversal ingest. + */ +suspend fun ingestReversal( + db: Database, + reversal: OutgoingReversal +) { + logger.warn("BOUNCE '${reversal.bankId}': ${reversal.reason}") + // TODO store in db= +} + private fun ingestDocument( db: Database, currency: String, @@ -198,16 +211,16 @@ private fun ingestDocument( when (whichDocument) { SupportedDocument.CAMT_054 -> { try { - val incomingPayments = mutableListOf<IncomingPayment>() - val outgoingPayments = mutableListOf<OutgoingPayment>() - parseTxNotif(xml, currency, incomingPayments, outgoingPayments) + val notifications = mutableListOf<TxNotification>() + parseTxNotif(xml, currency, notifications) runBlocking { - incomingPayments.forEach { - ingestIncomingPayment(db, it) - } - outgoingPayments.forEach { - ingestOutgoingPayment(db, it) + notifications.forEach { + when (it) { + is TxNotification.Incoming -> ingestIncomingPayment(db, it.payment) + is TxNotification.Outgoing -> ingestOutgoingPayment(db, it.payment) + is TxNotification.Reversal -> ingestReversal(db, it.reversal) + } } } } catch (e: Exception) { diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt @@ -25,7 +25,6 @@ import java.net.URLEncoder import java.time.* import java.time.format.* - /** * Collects details to define the pain.001 namespace * XML attributes. @@ -247,6 +246,17 @@ fun parseCustomerPaymentStatusReport(xml: InputStream): PaymentStatus { } } +sealed interface TxNotification { + data class Incoming(val payment: IncomingPayment): TxNotification + data class Outgoing(val payment: OutgoingPayment): TxNotification + data class Reversal(val reversal: OutgoingReversal): TxNotification +} + +data class OutgoingReversal( + val bankId: String, + val reason: String? +) + /** * Searches payments in a camt.054 (Detailavisierung) document. * @@ -258,10 +268,9 @@ fun parseCustomerPaymentStatusReport(xml: InputStream): PaymentStatus { fun parseTxNotif( notifXml: InputStream, acceptedCurrency: String, - incoming: MutableList<IncomingPayment>, - outgoing: MutableList<OutgoingPayment> + notifications: MutableList<TxNotification>, ) { - notificationForEachTx(notifXml) { bookDate -> + notificationForEachTx(notifXml) { bookDate, reversal, info -> val kind = one("CdtDbtInd").text() val amount: TalerAmount = one("Amt") { val currency = attr("Ccy") @@ -271,6 +280,19 @@ fun parseTxNotif( if (currency != acceptedCurrency) throw Exception("Currency $currency not supported") TalerAmount("$currency:${text()}") } + if (reversal) { + require("CRDT" == kind) + val msgId = one("Refs").opt("MsgId")?.text() + if (msgId == null) { + logger.debug("Unsupported reversal without message id") + } else { + notifications.add(TxNotification.Reversal(OutgoingReversal( + bankId = msgId, + reason = info + ))) + } + return@notificationForEachTx + } when (kind) { "CRDT" -> { val bankId: String = one("Refs").one("AcctSvcrRef").text() @@ -293,7 +315,7 @@ fun parseTxNotif( debtorPayto.append("?receiver-name=$urlEncName") } } - incoming.add( + notifications.add(TxNotification.Incoming( IncomingPayment( amount = amount, bankId = bankId, @@ -301,17 +323,17 @@ fun parseTxNotif( executionTime = bookDate, wireTransferSubject = subject.toString() ) - ) + )) } "DBIT" -> { val messageId = one("Refs").one("MsgId").text() - outgoing.add( + notifications.add(TxNotification.Outgoing( OutgoingPayment( amount = amount, messageId = messageId, executionTime = bookDate ) - ) + )) } else -> throw Exception("Unknown transaction notification kind '$kind'") } @@ -326,28 +348,26 @@ fun parseTxNotif( */ private fun notificationForEachTx( xml: InputStream, - directionLambda: XmlDestructor.(Instant) -> Unit + directionLambda: XmlDestructor.(Instant, Boolean, String?) -> Unit ) { destructXml(xml, "Document") { opt("BkToCstmrDbtCdtNtfctn")?.each("Ntfctn") { each("Ntry") { - if (opt("RvslInd")?.bool() == true) { - logger.warn("Skip reversal transaction") - } else { - one("Sts") { - if (text() != "BOOK") { - one("Cd") { - if (text() != "BOOK") - throw Exception("Found non booked transaction, " + - "stop parsing. Status was: ${text()}" - ) - } + val reversal = opt("RvslInd")?.bool() ?: false + val info = opt("AddtlNtryInf")?.text() + one("Sts") { + if (text() != "BOOK") { + one("Cd") { + if (text() != "BOOK") + throw Exception("Found non booked transaction, " + + "stop parsing. Status was: ${text()}" + ) } } - val bookDate: Instant = one("BookgDt").one("Dt").date().atStartOfDay().toInstant(ZoneOffset.UTC) - one("NtryDtls").each("TxDtls") { - directionLambda(this, bookDate) - } + } + val bookDate: Instant = one("BookgDt").one("Dt").date().atStartOfDay().toInstant(ZoneOffset.UTC) + one("NtryDtls").each("TxDtls") { + directionLambda(this, bookDate, reversal, info) } } } diff --git a/testbench/sample/QRIBAN_camt.054_SIC_04_088583185407_NN_0885831854071000_20221222_180251_006.xml b/testbench/sample/QRIBAN_camt.054_SIC_04_088583185407_NN_0885831854071000_20221222_180251_006.xml @@ -1,427 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Structure subject to change, do not rely on optional tags --> -<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04"> - <BkToCstmrDbtCdtNtfctn> - <GrpHdr> - <MsgId>CAMT054_20221222_180251119_4Z2WCTQ4</MsgId> - <CreDtTm>2022-12-22T17:02:51.119Z</CreDtTm> - <MsgPgntn> - <PgNb>1</PgNb> - <LastPgInd>true</LastPgInd> - </MsgPgntn> - <AddtlInf>SPS/1.7/PROD</AddtlInf> - </GrpHdr> - <Ntfctn> - <Id>4BA01709118000076</Id> - <CreDtTm>2022-12-22T17:02:51.119Z</CreDtTm> - <FrToDt> - <FrDtTm>2022-12-22T00:00:00.000+01:00</FrDtTm> - <ToDtTm>2022-12-22T23:59:59.999+01:00</ToDtTm> - </FrToDt> - <RptgSrc> - <Prtry>C53F</Prtry> - </RptgSrc> - <Acct> - <Id> - <IBAN>CH5104835831854071000</IBAN> - </Id> - <Svcr> - <FinInstnId> - <BICFI>CRESCHZZ80A</BICFI> - <Nm>CREDIT SUISSE (Switzerland) Ltd.</Nm> - <Othr> - <Id>CHE-116.285.487 MWST</Id> - <Issr>VAT-ID</Issr> - </Othr> - </FinInstnId> - </Svcr> - </Acct> - <Ntry> - <NtryRef>CH4531000831854071000</NtryRef> - <Amt Ccy="CHF">997.25</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2022-12-22</Dt> - </BookgDt> - <ValDt> - <Dt>2010-12-22</Dt> - </ValDt> - <AcctSvcrRef>4BA01709118000076/1</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">997.25</Amt> - </TxAmt> - </AmtDtls> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">2.85</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">2.85</Amt> - <ChrgInclInd>false</ChrgInclInd> - </Rcrd> - </Chrgs> - <NtryDtls> - <Btch> - <MsgId>4BA01709118000076</MsgId> - <NbOfTxs>5</NbOfTxs> - <TtlAmt Ccy="CHF">997.25</TtlAmt> - </Btch> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65113</MsgId> - <AcctSvcrRef>80XI-190418-CS-80256</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65113</PmtInfId> - <EndToEndId>EndToEndId-0000000010</EndToEndId> - </Refs> - <Amt Ccy="CHF">477.25</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">477.25</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Nm>Example SA</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - <AdrLine>Place du Marché 1</AdrLine> - <AdrLine>2222 Village</AdrLine> - </PstlAdr> - </Dbtr> - <UltmtDbtr> - <Nm>Example SA</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - <AdrLine>Place du Marché 1</AdrLine> - <AdrLine>2222 Village</AdrLine> - </PstlAdr> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678028</Ref> - </CdtrRefInf> - <AddtlRmtInf>Déduction faite de 3% d'escompte</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65114</MsgId> - <AcctSvcrRef>80XI-190418-CS-80257</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65114</PmtInfId> - <EndToEndId>EndToEndId-0000000011</EndToEndId> - </Refs> - <Amt Ccy="CHF">140</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">140</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Nm>Hans Meier</Nm> - <PstlAdr> - <StrtNm>Landstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>5555</PstCd> - <TwnNm>Unterdorf</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Dbtr> - <UltmtDbtr> - <Nm>Bäckerei-Konditorei Meier</Nm> - <PstlAdr> - <StrtNm>Landstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>5555</PstCd> - <TwnNm>Unterdorf</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678033</Ref> - </CdtrRefInf> - <AddtlRmtInf>Auftrag vom 15.02.2022</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65115</MsgId> - <AcctSvcrRef>80XI-190418-CS-80258</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65115</PmtInfId> - <EndToEndId>EndToEndId-0000000012</EndToEndId> - </Refs> - <Amt Ccy="CHF">120</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">120</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">2.45</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">2.35</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>2</Id> - </Prtry> - </Tp> - </Rcrd> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Nm>SCHALTEREINZAHLUNG</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - </PstlAdr> - </Dbtr> - <UltmtDbtr> - <Nm>PETER MEIER</Nm> - <PstlAdr> - <StrtNm>SEMPACHERSTRASSE</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>6789</PstCd> - <TwnNm>MITTELDORF</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678049</Ref> - </CdtrRefInf> - <AddtlRmtInf>000000/00000/000000/17.02.2022</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65116</MsgId> - <AcctSvcrRef>80XI-190418-CS-80259</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65116</PmtInfId> - <EndToEndId>EndToEndId-0000000013</EndToEndId> - </Refs> - <Amt Ccy="CHF">110</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">110</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Nm>RUTH MEIER</Nm> - <PstlAdr> - <AdrLine>OBERDORFSTRASSE 1 CH 5678 UNTERDORF</AdrLine> - </PstlAdr> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678057</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65117</MsgId> - <AcctSvcrRef>80XI-190418-CS-80260</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65117</PmtInfId> - <EndToEndId>EndToEndId-0000000014</EndToEndId> - </Refs> - <Amt Ccy="CHF">150</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">150</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Nm>Anna Meier</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - <AdrLine>Nachbardorfstrasse 1</AdrLine> - <AdrLine>9999 Obertal</AdrLine> - </PstlAdr> - </Dbtr> - <UltmtDbtr> - <Nm>Anna Meier</Nm> - <PstlAdr> - <StrtNm>Nachbardorfstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>9999</PstCd> - <TwnNm>Obertal</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678065</Ref> - </CdtrRefInf> - <AddtlRmtInf>Order 1234567</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - </NtryDtls> - </Ntry> - </Ntfctn> - </BkToCstmrDbtCdtNtfctn> -</Document> diff --git a/testbench/sample/QRIBAN_camt.054_SPS_08_088583185407_NN_0885831854071000_20221222_180251_006.xml b/testbench/sample/QRIBAN_camt.054_SPS_08_088583185407_NN_0885831854071000_20221222_180251_006.xml @@ -1,456 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- camt.054 for QR-bills with QR-IBAN, structure subject to change, do not rely on optional tags --> -<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.08"> - <BkToCstmrDbtCdtNtfctn> - <GrpHdr> - <MsgId>CAMT054_20221222_180251119_4Z2WCTQ4</MsgId> - <CreDtTm>2022-12-22T17:02:51.119Z</CreDtTm> - <MsgPgntn> - <PgNb>1</PgNb> - <LastPgInd>true</LastPgInd> - </MsgPgntn> - <AddtlInf>SPS/2.0/PROD</AddtlInf> - </GrpHdr> - <Ntfctn> - <Id>4BA01709118000076</Id> - <CreDtTm>2022-03-22T17:02:51.119Z</CreDtTm> - <FrToDt> - <FrDtTm>2022-12-22T00:00:00.000+01:00</FrDtTm> - <ToDtTm>2022-12-22T23:59:59.999+01:00</ToDtTm> - </FrToDt> - <Acct> - <Id> - <IBAN>CH5104835831854071000</IBAN> - </Id> - <Svcr> - <FinInstnId> - <BICFI>CRESCHZZ80A</BICFI> - <Nm>CREDIT SUISSE (Switzerland) Ltd.</Nm> - <Othr> - <Id>CHE-116.285.487 MWST</Id> - <Issr>VAT-ID</Issr> - </Othr> - </FinInstnId> - </Svcr> - </Acct> - <Ntry> - <NtryRef>CH4531000831854071000</NtryRef> - <Amt Ccy="CHF">997.25</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts> - <Cd>BOOK</Cd> - </Sts> - <BookgDt> - <Dt>2022-12-22</Dt> - </BookgDt> - <ValDt> - <Dt>2010-12-22</Dt> - </ValDt> - <AcctSvcrRef>4BA01709118000076/1</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">997.25</Amt> - </TxAmt> - </AmtDtls> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">2.85</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">2.85</Amt> - <ChrgInclInd>false</ChrgInclInd> - </Rcrd> - </Chrgs> - <NtryDtls> - <Btch> - <MsgId>4BA01709118000076</MsgId> - <NbOfTxs>5</NbOfTxs> - <TtlAmt Ccy="CHF">997.25</TtlAmt> - </Btch> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65113</MsgId> - <AcctSvcrRef>80XI-190418-CS-80256</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65113</PmtInfId> - <EndToEndId>EndToEndId-0000000010</EndToEndId> - <UETR>eb6305c9-1f7f-49de-aed0-16487c27b42d</UETR> - </Refs> - <Amt Ccy="CHF">477.25</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">477.25</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <InitgPty> - <Pty> - <Nm>Example SA</Nm> - </Pty> - </InitgPty> - <Dbtr> - <Pty> - <Nm>Example SA</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - <AdrLine>Place du Marché 1</AdrLine> - <AdrLine>2222 Village</AdrLine> - </PstlAdr> - </Pty> - </Dbtr> - <UltmtDbtr> - <Pty> - <Nm>Example SA</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - <AdrLine>Place du Marché 1</AdrLine> - <AdrLine>2222 Village</AdrLine> - </PstlAdr> - </Pty> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678028</Ref> - </CdtrRefInf> - <AddtlRmtInf>Déduction faite de 3% d'escompte</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65114</MsgId> - <AcctSvcrRef>80XI-190418-CS-80257</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65114</PmtInfId> - <EndToEndId>EndToEndId-0000000011</EndToEndId> - <UETR>eb6305c9-1f7f-49de-aed0-16487c27b42b</UETR> - </Refs> - <Amt Ccy="CHF">140</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">140</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <InitgPty> - <Pty> - <Nm>Hans Meier</Nm> - </Pty> - </InitgPty> - <Dbtr> - <Pty> - <Nm>Hans Meier</Nm> - <PstlAdr> - <StrtNm>Landstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>5555</PstCd> - <TwnNm>Unterdorf</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Pty> - </Dbtr> - <UltmtDbtr> - <Pty> - <Nm>Bäckerei-Konditorei Meier</Nm> - <PstlAdr> - <StrtNm>Landstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>5555</PstCd> - <TwnNm>Unterdorf</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Pty> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678033</Ref> - </CdtrRefInf> - <AddtlRmtInf>Auftrag vom 15.02.2022</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65115</MsgId> - <AcctSvcrRef>80XI-190418-CS-80258</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65115</PmtInfId> - <EndToEndId>EndToEndId-0000000012</EndToEndId> - </Refs> - <Amt Ccy="CHF">120</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">120</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">2.45</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">2.35</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>2</Id> - </Prtry> - </Tp> - </Rcrd> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Pty> - <Nm>SCHALTEREINZAHLUNG</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - </PstlAdr> - </Pty> - </Dbtr> - <UltmtDbtr> - <Pty> - <Nm>PETER MEIER</Nm> - <PstlAdr> - <StrtNm>SEMPACHERSTRASSE</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>6789</PstCd> - <TwnNm>MITTELDORF</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Pty> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678049</Ref> - </CdtrRefInf> - <AddtlRmtInf>000000/00000/000000/17.12.2022</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65116</MsgId> - <AcctSvcrRef>80XI-190418-CS-80259</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65116</PmtInfId> - <EndToEndId>EndToEndId-0000000013</EndToEndId> - </Refs> - <Amt Ccy="CHF">110</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">110</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Pty> - <Nm>RUTH MEIER</Nm> - <PstlAdr> - <AdrLine>OBERDORFSTRASSE 1 CH 5678 UNTERDORF</AdrLine> - </PstlAdr> - </Pty> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678057</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Refs> - <MsgId>13RF-190418-MS-65117</MsgId> - <AcctSvcrRef>80XI-190418-CS-80260</AcctSvcrRef> - <PmtInfId>13RF-190418-MS-65117</PmtInfId> - <EndToEndId>EndToEndId-0000000014</EndToEndId> - </Refs> - <Amt Ccy="CHF">150</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">150</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>VCOM</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <Chrgs> - <TtlChrgsAndTaxAmt Ccy="CHF">0.10</TtlChrgsAndTaxAmt> - <Rcrd> - <Amt Ccy="CHF">0.10</Amt> - <CdtDbtInd>DBIT</CdtDbtInd> - <ChrgInclInd>false</ChrgInclInd> - <Tp> - <Prtry> - <Id>INTERNAL</Id> - </Prtry> - </Tp> - </Rcrd> - </Chrgs> - <RltdPties> - <Dbtr> - <Pty> - <Nm>Anna Meier</Nm> - <PstlAdr> - <Ctry>CH</Ctry> - <AdrLine>Nachbardorfstrasse 1</AdrLine> - <AdrLine>9999 Obertal</AdrLine> - </PstlAdr> - </Pty> - </Dbtr> - <UltmtDbtr> - <Pty> - <Nm>Anna Meier</Nm> - <PstlAdr> - <StrtNm>Nachbardorfstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>9999</PstCd> - <TwnNm>Obertal</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Pty> - </UltmtDbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>QRR</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678065</Ref> - </CdtrRefInf> - <AddtlRmtInf>Order 1234567</AddtlRmtInf> - </Strd> - </RmtInf> - </TxDtls> - </NtryDtls> - </Ntry> - </Ntfctn> - </BkToCstmrDbtCdtNtfctn> -</Document> diff --git a/testbench/sample/camt.054_SIC_04_088583185407_NN_0885831854071000_20221022_170251_005.xml b/testbench/sample/camt.054_SIC_04_088583185407_NN_0885831854071000_20221022_170251_005.xml @@ -1,313 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Structure subject to change, do not rely on optional tags --> -<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04"> - <BkToCstmrDbtCdtNtfctn> - <GrpHdr> - <MsgId>CAMT054_20221022_180251119_4Z2WCTQ4</MsgId> - <CreDtTm>2022-10-22T17:02:51.119Z</CreDtTm> - <MsgPgntn> - <PgNb>1</PgNb> - <LastPgInd>true</LastPgInd> - </MsgPgntn> - </GrpHdr> - <Ntfctn> - <Id>4BA01709118000075</Id> - <CreDtTm>2022-10-22T17:02:51.119Z</CreDtTm> - <FrToDt> - <FrDtTm>2022-10-22T00:00:00.000+01:00</FrDtTm> - <ToDtTm>2022-10-22T23:59:59.999+01:00</ToDtTm> - </FrToDt> - <RptgSrc> - <Prtry>C53F</Prtry> - </RptgSrc> - <Acct> - <Id> - <IBAN>CH7705881831854071000</IBAN> - </Id> - </Acct> - <Ntry> - <NtryRef>010026540</NtryRef> - <Amt Ccy="CHF">7761.35</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2022-10-22</Dt> - </BookgDt> - <ValDt> - <Dt>2022-10-22</Dt> - </ValDt> - <AcctSvcrRef>4BA01709118000075/1</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <NtryDtls> - <Btch> - <NbOfTxs>5</NbOfTxs> - <TtlAmt Ccy="CHF">7761.35</TtlAmt> - </Btch> - <TxDtls> - <Amt Ccy="CHF">2561.35</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">2561.35</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>Example SA</Nm> - <PstlAdr> - <AdrLine>Place du Marché 1</AdrLine> - <AdrLine>2222 Village</AdrLine> - </PstlAdr> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678028</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1400.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1400.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>Bäckerei-Konditorei Meier</Nm> - <PstlAdr> - <StrtNm>Landstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>5555</PstCd> - <TwnNm>Unterdorf</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678033</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1200.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1200.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>NOTPROVIDED</Nm> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678049</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1100.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1100.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>NOTPROVIDED</Nm> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678057</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1500.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1500.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>NOTPROVIDED</Nm> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678065</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - </NtryDtls> - </Ntry> - <Ntry> - <NtryRef>010026540</NtryRef> - <Amt Ccy="CHF">119.45</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts>BOOK</Sts> - <BookgDt> - <Dt>2022-10-22</Dt> - </BookgDt> - <ValDt> - <Dt>2022-10-21</Dt> - </ValDt> - <AcctSvcrRef>4BA02002068000015/1</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <NtryDtls> - <Btch> - <NbOfTxs>1</NbOfTxs> - <TtlAmt Ccy="CHF">119.45</TtlAmt> - </Btch> - <TxDtls> - <Amt Ccy="CHF">119.45</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">119.45</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>Peter Muster</Nm> - <PstlAdr> - <StrtNm>Musterstrasse 5</StrtNm> - <PstCd>8001</PstCd> - <TwnNm>Zuerich</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>901709123456789012345000003</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - </NtryDtls> - </Ntry> - </Ntfctn> - </BkToCstmrDbtCdtNtfctn> -</Document> diff --git a/testbench/sample/camt.054_SPS_08_088583185407_NN_0885831854071000_170251_005.xml b/testbench/sample/camt.054_SPS_08_088583185407_NN_0885831854071000_170251_005.xml @@ -1,253 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- camt.054 for LSV/BDD, structure subject to change, do not rely on optional tags --> -<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.08"> - <BkToCstmrDbtCdtNtfctn> - <GrpHdr> - <MsgId>CAMT054_20221222_180251119_4Z2WCTQ4</MsgId> - <CreDtTm>2022-12-22T17:02:51.119Z</CreDtTm> - <MsgPgntn> - <PgNb>1</PgNb> - <LastPgInd>true</LastPgInd> - </MsgPgntn> - </GrpHdr> - <Ntfctn> - <Id>4BA01709118000075</Id> - <CreDtTm>2022-12-22T17:02:51.119Z</CreDtTm> - <FrToDt> - <FrDtTm>2022-12-22T00:00:00.000+01:00</FrDtTm> - <ToDtTm>2022-12-22T23:59:59.999+01:00</ToDtTm> - </FrToDt> - <Acct> - <Id> - <IBAN>CH7705881831854071000</IBAN> - </Id> - </Acct> - <Ntry> - <NtryRef>010026540</NtryRef> - <Amt Ccy="CHF">7761.35</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <Sts> - <Cd>BOOK</Cd> - </Sts> - <BookgDt> - <Dt>2022-12-22</Dt> - </BookgDt> - <ValDt> - <Dt>2022-12-22</Dt> - </ValDt> - <AcctSvcrRef>4BA01709118000075/1</AcctSvcrRef> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <NtryDtls> - <Btch> - <NbOfTxs>5</NbOfTxs> - <TtlAmt Ccy="CHF">7761.35</TtlAmt> - </Btch> - <TxDtls> - <Amt Ccy="CHF">2561.35</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">2561.35</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Pty> - <Nm>Example SA</Nm> - <PstlAdr> - <AdrLine>Place du Marché 1</AdrLine> - <AdrLine>2222 Village</AdrLine> - </PstlAdr> - </Pty> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678028</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1400.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1400.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Pty> - <Nm>Bäckerei-Konditorei Meier</Nm> - <PstlAdr> - <StrtNm>Landstrasse</StrtNm> - <BldgNb>1</BldgNb> - <PstCd>5555</PstCd> - <TwnNm>Unterdorf</TwnNm> - <Ctry>CH</Ctry> - </PstlAdr> - </Pty> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678033</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1200.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1200.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Pty> - <Nm>NOTPROVIDED</Nm> - </Pty> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678049</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1100.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1100.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Pty> - <Nm>NOTPROVIDED</Nm> - </Pty> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678057</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - <TxDtls> - <Amt Ccy="CHF">1500.00</Amt> - <CdtDbtInd>CRDT</CdtDbtInd> - <AmtDtls> - <TxAmt> - <Amt Ccy="CHF">1500.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>IDDT</Cd> - <SubFmlyCd>PMDD</SubFmlyCd> - </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Pty> - <Nm>NOTPROVIDED</Nm> - </Pty> - </Dbtr> - </RltdPties> - <RmtInf> - <Strd> - <CdtrRefInf> - <Tp> - <CdOrPrtry> - <Prtry>ISR Reference</Prtry> - </CdOrPrtry> - </Tp> - <Ref>999999123456789012345678065</Ref> - </CdtrRefInf> - </Strd> - </RmtInf> - </TxDtls> - </NtryDtls> - </Ntry> - </Ntfctn> - </BkToCstmrDbtCdtNtfctn> -</Document> diff --git a/testbench/src/test/kotlin/Iso20022Test.kt b/testbench/src/test/kotlin/Iso20022Test.kt @@ -34,7 +34,7 @@ class Iso20022Test { } else if (name.contains("pain.002")) { parseCustomerPaymentStatusReport(content) } else { - parseTxNotif(content, "CHF", mutableListOf(), mutableListOf()) + parseTxNotif(content, "CHF", mutableListOf()) } } } @@ -56,7 +56,7 @@ class Iso20022Test { } else if (name.contains("pain.002")) { parseCustomerPaymentStatusReport(content) } else { - parseTxNotif(content, "CHF", mutableListOf(), mutableListOf()) + parseTxNotif(content, "CHF", mutableListOf()) } } }