libeufin

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

commit 205590d3da19748ad6b2f9067f0c239cd63a5d76
parent b94f2c309e68984f3771dfcc8a97a0b6ebafb1f7
Author: Antoine A <>
Date:   Tue, 24 Mar 2026 11:45:04 +0100

nexus: add raiffeisen samples

Diffstat:
Alibeufin-nexus/sample/platform/raiffeisen_camt053.xml | 270+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alibeufin-nexus/sample/platform/raiffeisen_pain001.xml | 2++
Mlibeufin-nexus/src/test/kotlin/Iso20022Test.kt | 43++++++++++++++++++++++++++++++++++++++++++-
Mtestbench/src/test/kotlin/Iso20022Test.kt | 4+++-
4 files changed, 317 insertions(+), 2 deletions(-)

diff --git a/libeufin-nexus/sample/platform/raiffeisen_camt053.xml b/libeufin-nexus/sample/platform/raiffeisen_camt053.xml @@ -0,0 +1,269 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.08" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.053.001.08 camt.053.001.08.xsd"> + <BkToCstmrStmt> + <GrpHdr> + <MsgId>M/20574741277/CA</MsgId> + <CreDtTm>2025-09-26T00:54:24+02:00</CreDtTm> + <MsgPgntn> + <PgNb>1</PgNb> + <LastPgInd>true</LastPgInd> + </MsgPgntn> + <AddtlInf>SPS/1.7/PROD</AddtlInf> + </GrpHdr> + <Stmt> + <Id>M/20574741277/CA</Id>l <ElctrncSeqNb>268</ElctrncSeqNb> + <CreDtTm>2025-09-26T00:54:24+02:00</CreDtTm> + <FrToDt> + <FrDtTm>2025-09-25T00:00:00+02:00</FrDtTm> + <ToDtTm>2025-09-26T00:00:00+02:00</ToDtTm> + </FrToDt> + <Acct> + <Id> + <IBAN>CH7389144832588726658</IBAN> + </Id> + <Ownr> + <Nm>Taler Operations AG</Nm> + </Ownr> + <Svcr> + <FinInstnId> + <Nm>Raiffeisenbank Seeland</Nm> + </FinInstnId> + </Svcr> + </Acct> + <Bal> + <Tp> + <CdOrPrtry> + <Cd>OPBD</Cd> + </CdOrPrtry> + </Tp> + <Amt Ccy="CHF">458.16</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Dt> + <Dt>2025-09-25</Dt> + </Dt> + </Bal> + <Bal> + <Tp> + <CdOrPrtry> + <Cd>CLBD</Cd> + </CdOrPrtry> + </Tp> + <Amt Ccy="CHF">458.16</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Dt> + <Dt>2025-09-25</Dt> + </Dt> + </Bal> + <Bal> + <Tp> + <CdOrPrtry> + <Cd>CLAV</Cd> + </CdOrPrtry> + </Tp> + <Amt Ccy="CHF">458.16</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Dt> + <Dt>2025-09-25</Dt> + </Dt> + </Bal> + <Ntry> + <Amt Ccy="CHF">20000</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Sts> + <Cd>BOOK</Cd> + </Sts> + <BookgDt> + <Dt>2025-12-23</Dt> + </BookgDt> + <ValDt> + <Dt>2025-12-23</Dt> + </ValDt> + <AcctSvcrRef>A200020494367552</AcctSvcrRef> + <BkTxCd> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>RCDT</Cd> + <SubFmlyCd>DMCT</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>1000</Cd> + </Prtry> + </BkTxCd> + <NtryDtls> + <Btch> + <NbOfTxs>1</NbOfTxs> + </Btch> + <TxDtls> + <Refs> + <AcctSvcrRef>A200020494367552</AcctSvcrRef> + <InstrId>01-470006005102602025</InstrId> + <EndToEndId>430002300186732025</EndToEndId> + </Refs> + <Amt Ccy="CHF">20000</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <RltdPties> + <Dbtr> + <Pty> + <Nm>KANTON BERN</Nm> + <PstlAdr> + <StrtNm>Munsterplatz</StrtNm> + <BldgNb>12</BldgNb> + <PstCd>3011</PstCd> + <TwnNm>Bern</TwnNm> + <Ctry>CH</Ctry> + </PstlAdr> + </Pty> + </Dbtr> + <DbtrAcct> + <Id> + <IBAN>CH7389144832588726658</IBAN> + </Id> + </DbtrAcct> + </RltdPties> + <RltdAgts> + <DbtrAgt> + <FinInstnId> + <BICFI>POFICHBE</BICFI> + <Nm>PostFinance</Nm> + <PstlAdr> + <StrtNm>Nordring 8</StrtNm> + <PstCd>3030</PstCd> + <TwnNm>Bern</TwnNm> + <Ctry>CH</Ctry> + </PstlAdr> + </FinInstnId> + </DbtrAgt> + </RltdAgts> + <RmtInf> + <Ustrd>1. TZ 2025</Ustrd> + </RmtInf> + </TxDtls> + </NtryDtls> + </Ntry> + <Ntry> + <Amt Ccy="CHF">15</Amt> + <CdtDbtInd>DBIT</CdtDbtInd> + <Sts> + <Cd>BOOK</Cd> + </Sts> + <BookgDt> + <Dt>2025-12-30</Dt> + </BookgDt> + <ValDt> + <Dt>2025-12-31</Dt> + </ValDt> + <AcctSvcrRef>19868398389</AcctSvcrRef> + <BkTxCd> + <Domn> + <Cd>ACMT</Cd> + <Fmly> + <Cd>MDOP</Cd> + <SubFmlyCd>FEES</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>8002</Cd> + </Prtry> + </BkTxCd> + <NtryDtls> + <Btch> + <NbOfTxs>1</NbOfTxs> + </Btch> + <TxDtls> + <Refs> + <AcctSvcrRef>19868398389</AcctSvcrRef> + </Refs> + <Amt Ccy="CHF">15</Amt> + <CdtDbtInd>DBIT</CdtDbtInd> + </TxDtls> + </NtryDtls> + <AddtlNtryInf>Gebührenbelastung Kontoführung + 01.10.2025 - 31.12.2025</AddtlNtryInf> + </Ntry> + <Ntry> + <Amt Ccy="CHF">2</Amt> + <CdtDbtInd>DBIT</CdtDbtInd> + <Sts> + <Cd>BOOK</Cd> + </Sts> + <BookgDt> + <Dt>2025-12-31</Dt> + </BookgDt> + <ValDt> + <Dt>2025-12-31</Dt> + </ValDt> + <AcctSvcrRef>19890406743</AcctSvcrRef> + <BkTxCd> + <Domn> + <Cd>ACMT</Cd> + <Fmly> + <Cd>MDOP</Cd> + <SubFmlyCd>FEES</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>8002</Cd> + </Prtry> + </BkTxCd> + <NtryDtls> + <Btch> + <NbOfTxs>1</NbOfTxs> + </Btch> + <TxDtls> + <Refs> + <AcctSvcrRef>19890406743</AcctSvcrRef> + </Refs> + <Amt Ccy="CHF">2</Amt> + <CdtDbtInd>DBIT</CdtDbtInd> + </TxDtls> + </NtryDtls> + <AddtlNtryInf>Gebührenbelastung Belege und Auszüge + 01.10.2025 - 31.12.2025</AddtlNtryInf> + </Ntry> + <Ntry> + <Amt Ccy="CHF">3</Amt> + <CdtDbtInd>DBIT</CdtDbtInd> + <Sts> + <Cd>BOOK</Cd> + </Sts> + <BookgDt> + <Dt>2025-12-31</Dt> + </BookgDt> + <ValDt> + <Dt>2025-12-31</Dt> + </ValDt> + <AcctSvcrRef>19885172770</AcctSvcrRef> + <BkTxCd> + <Domn> + <Cd>ACMT</Cd> + <Fmly> + <Cd>MDOP</Cd> + <SubFmlyCd>FEES</SubFmlyCd> + </Fmly> + </Domn> + <Prtry> + <Cd>8002</Cd> + </Prtry> + </BkTxCd> + <NtryDtls> + <Btch> + <NbOfTxs>1</NbOfTxs> + </Btch> + <TxDtls> + <Refs> + <AcctSvcrRef>19885172770</AcctSvcrRef> + </Refs> + <Amt Ccy="CHF">3</Amt> + <CdtDbtInd>DBIT</CdtDbtInd> + </TxDtls> + </NtryDtls> + <AddtlNtryInf>Gebührenbelastung Versand und Verpackung + 01.10.2025 - 31.12.2025</AddtlNtryInf> + </Ntry> + </Stmt> + </BkToCstmrStmt> +</Document> +\ No newline at end of file diff --git a/libeufin-nexus/sample/platform/raiffeisen_pain001.xml b/libeufin-nexus/sample/platform/raiffeisen_pain001.xml @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09 pain.001.001.09.ch.03.xsd"><CstmrCdtTrfInitn><GrpHdr><MsgId>MESSAGE_ID</MsgId><CreDtTm>2024-09-09T00:00:00Z</CreDtTm><NbOfTxs>3</NbOfTxs><CtrlSum>47.32</CtrlSum><InitgPty><Nm>myname</Nm></InitgPty></GrpHdr><PmtInf><PmtInfId>NOTPROVIDED</PmtInfId><PmtMtd>TRF</PmtMtd><BtchBookg>false</BtchBookg><NbOfTxs>3</NbOfTxs><CtrlSum>47.32</CtrlSum><ReqdExctnDt><Dt>2024-09-09Z</Dt></ReqdExctnDt><Dbtr><Nm>myname</Nm></Dbtr><DbtrAcct><Id><IBAN>CH7789144474425692816</IBAN></Id></DbtrAcct><DbtrAgt><FinInstnId><BICFI>BIC</BICFI></FinInstnId></DbtrAgt><ChrgBr>SLEV</ChrgBr><CdtTrfTxInf><PmtId><InstrId>TX_FIRST</InstrId><EndToEndId>TX_FIRST</EndToEndId></PmtId><Amt><InstdAmt Ccy="CHF">42</InstdAmt></Amt><Cdtr><Nm>Test</Nm></Cdtr><CdtrAcct><Id><IBAN>CH4189144589712575493</IBAN></Id></CdtrAcct><RmtInf><Ustrd>Test 42</Ustrd></RmtInf></CdtTrfTxInf><CdtTrfTxInf><PmtId><InstrId>TX_SECOND</InstrId><EndToEndId>TX_SECOND</EndToEndId></PmtId><Amt><InstdAmt Ccy="CHF">5.11</InstdAmt></Amt><Cdtr><Nm>Test</Nm></Cdtr><CdtrAcct><Id><IBAN>CH4189144589712575493</IBAN></Id></CdtrAcct><RmtInf><Ustrd>Test 5.11</Ustrd></RmtInf></CdtTrfTxInf><CdtTrfTxInf><PmtId><InstrId>TX_THIRD</InstrId><EndToEndId>TX_THIRD</EndToEndId></PmtId><Amt><InstdAmt Ccy="CHF">0.21</InstdAmt></Amt><Cdtr><Nm>Test</Nm></Cdtr><CdtrAcct><Id><IBAN>CH4189144589712575493</IBAN></Id></CdtrAcct><RmtInf><Ustrd>Test 0.21</Ustrd></RmtInf></CdtTrfTxInf></PmtInf></CstmrCdtTrfInitn></Document> +\ No newline at end of file diff --git a/libeufin-nexus/src/test/kotlin/Iso20022Test.kt b/libeufin-nexus/src/test/kotlin/Iso20022Test.kt @@ -1,6 +1,6 @@ /* * This file is part of LibEuFin. - * Copyright (C) 2024-2025 Taler Systems S.A. + * Copyright (C) 2024, 2025, 2026 Taler Systems S.A. * LibEuFin is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as @@ -327,6 +327,47 @@ class Iso20022Test { } @Test + fun raiffeisen_camt053() { + assertContentEquals( + parseTx(Path("sample/platform/raiffeisen_camt053.xml").inputStream()), + listOf(AccountTransactions( + iban = "CH7389144832588726658", + currency = null, + txs = listOf( + IncomingPayment( + id = IncomingId(null, null, "A200020494367552"), + amount = TalerAmount("CHF:20000"), + subject = "1. TZ 2025", + executionTime = dateToInstant("2025-12-23"), + debtor = ibanPayto("CH7389144832588726658", "KANTON BERN") + ), + OutgoingPayment( + id = OutgoingId(null, null, "19868398389"), + amount = TalerAmount("CHF:15"), + executionTime = dateToInstant("2025-12-31"), + subject = null, + creditor = null + ), + OutgoingPayment( + id = OutgoingId(null, null, "19890406743"), + amount = TalerAmount("CHF:2"), + executionTime = dateToInstant("2025-12-31"), + subject = null, + creditor = null + ), + OutgoingPayment( + id = OutgoingId(null, null, "19885172770"), + amount = TalerAmount("CHF:3"), + executionTime = dateToInstant("2025-12-31"), + subject = null, + creditor = null + ), + ) + )) + ) + } + + @Test fun gls_camt052() { assertContentEquals( parseTx(Path("sample/platform/gls_camt052.xml").inputStream()), diff --git a/testbench/src/test/kotlin/Iso20022Test.kt b/testbench/src/test/kotlin/Iso20022Test.kt @@ -1,6 +1,6 @@ /* * This file is part of LibEuFin. - * Copyright (C) 2024-2025 Taler Systems S.A. + * Copyright (C) 2024, 2025, 2026 Taler Systems S.A. * LibEuFin is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as @@ -100,6 +100,8 @@ class Iso20022Test { } // Load config + val path = root.resolve("platform").resolve("${platform.fileName}.conf") + if (!path.exists()) continue val cfg = nexusConfig(root.resolve("platform").resolve("${platform.fileName}.conf")) val currency = cfg.currency val dialect = cfg.ebics.dialect