diff options
author | Antoine A <> | 2024-04-24 10:47:09 +0900 |
---|---|---|
committer | Antoine A <> | 2024-04-24 10:47:09 +0900 |
commit | b0632588119f3fac8cebb9a30a0b5f8e09989022 (patch) | |
tree | 5311ef4e8c49231d7516cfe88fdff0c55f695f44 | |
parent | af63e4b282afe28b222b00c6b44292d8b65bf528 (diff) | |
download | libeufin-b0632588119f3fac8cebb9a30a0b5f8e09989022.tar.gz libeufin-b0632588119f3fac8cebb9a30a0b5f8e09989022.tar.bz2 libeufin-b0632588119f3fac8cebb9a30a0b5f8e09989022.zip |
Parse GLS return transaction
-rw-r--r-- | nexus/sample/platform/gls.xml | 193 | ||||
-rw-r--r-- | nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt | 2 | ||||
-rw-r--r-- | nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt | 1 | ||||
-rw-r--r-- | nexus/src/test/kotlin/Iso20022Test.kt | 6 |
4 files changed, 146 insertions, 56 deletions
diff --git a/nexus/sample/platform/gls.xml b/nexus/sample/platform/gls.xml index 28dc691c..ec40c54a 100644 --- a/nexus/sample/platform/gls.xml +++ b/nexus/sample/platform/gls.xml @@ -166,70 +166,155 @@ <CdtDbtInd>CRDT</CdtDbtInd> <Sts>BOOK</Sts> <BookgDt> - <Dt>2024-04-12</Dt> + <Dt>2024-04-12</Dt> </BookgDt> <AcctSvcrRef>2024041210041357000</AcctSvcrRef> <BkTxCd> - <Domn> - <Cd>PMNT</Cd> - <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>ESCT</SubFmlyCd> - </Fmly> - </Domn> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>RCDT</Cd> + <SubFmlyCd>ESCT</SubFmlyCd> + </Fmly> + </Domn> </BkTxCd> <NtryDtls> - <TxDtls> - <Refs> - <EndToEndId>NOTPROVIDED</EndToEndId> - <TxId>BYLADEM1WOR-G2910276709458A2</TxId> - </Refs> - <AmtDtls> - <TxAmt> - <Amt Ccy="EUR">3.00</Amt> - </TxAmt> - </AmtDtls> - <BkTxCd> - <Domn> + <TxDtls> + <Refs> + <EndToEndId>NOTPROVIDED</EndToEndId> + <TxId>BYLADEM1WOR-G2910276709458A2</TxId> + </Refs> + <AmtDtls> + <TxAmt> + <Amt Ccy="EUR">3.00</Amt> + </TxAmt> + </AmtDtls> + <BkTxCd> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>RCDT</Cd> + <SubFmlyCd>ESCT</SubFmlyCd> + </Fmly> + </Domn> + </BkTxCd> + <RltdPties> + <Dbtr> + <Nm>John Smith</Nm> + </Dbtr> + <DbtrAcct> + <Id> + <IBAN>DE84500105177118117964</IBAN> + </Id> + </DbtrAcct> + <Cdtr> + <Nm>Mr Test</Nm> + </Cdtr> + <CdtrAcct> + <Id> + <IBAN>DE20500105172419259181</IBAN> + </Id> + </CdtrAcct> + </RltdPties> + <RltdAgts> + <DbtrAgt> + <FinInstnId> + <BIC>BYLADEM1WOR</BIC> + </FinInstnId> + </DbtrAgt> + </RltdAgts> + <RmtInf> + <Ustrd>Taler FJDQ7W6G7NWX4H9M1MKA12090FRC9K7DA6N0FANDZZFXTR6QHX5G Test.,-</Ustrd> + </RmtInf> + </TxDtls> + </NtryDtls> + <AddtlNtryInf>Überweisungsgutschr.</AddtlNtryInf> + </Ntry> + <Ntry> + <Amt Ccy="EUR">1.10</Amt> + <CdtDbtInd>CRDT</CdtDbtInd> + <Sts>BOOK</Sts> + <BookgDt> + <Dt>2024-04-12</Dt> + </BookgDt> + <AcctSvcrRef>2024041210041357000</AcctSvcrRef> + <BkTxCd> + <Domn> <Cd>PMNT</Cd> <Fmly> - <Cd>RCDT</Cd> - <SubFmlyCd>ESCT</SubFmlyCd> + <Cd>ICDT</Cd> + <SubFmlyCd>RRTN</SubFmlyCd> </Fmly> - </Domn> - </BkTxCd> - <RltdPties> - <Dbtr> - <Nm>John Smith</Nm> - </Dbtr> - <DbtrAcct> - <Id> - <IBAN>DE84500105177118117964</IBAN> - </Id> - </DbtrAcct> - <Cdtr> - <Nm>Mr Test</Nm> - </Cdtr> - <CdtrAcct> - <Id> - <IBAN>DE20500105172419259181</IBAN> - </Id> - </CdtrAcct> - </RltdPties> - <RltdAgts> - <DbtrAgt> - <FinInstnId> - <BIC>BYLADEM1WOR</BIC> - </FinInstnId> - </DbtrAgt> - </RltdAgts> - <RmtInf> - <Ustrd>Taler FJDQ7W6G7NWX4H9M1MKA12090FRC9K7DA6N0FANDZZFXTR6QHX5G Test.,-</Ustrd> - </RmtInf> - </TxDtls> + </Domn> + </BkTxCd> + <NtryDtls> + <TxDtls> + <Refs> + <EndToEndId>G27KNKZAR5DV7HRB085YMA9GB4</EndToEndId> + <TxId>2024042288942205090200000010000001</TxId> + </Refs> + <AmtDtls> + <TxAmt> + <Amt Ccy="EUR">1.10</Amt> + </TxAmt> + </AmtDtls> + <BkTxCd> + <Domn> + <Cd>PMNT</Cd> + <Fmly> + <Cd>ICDT</Cd> + <SubFmlyCd>RRTN</SubFmlyCd> + </Fmly> + </Domn> + </BkTxCd> + <RltdPties> + <Dbtr> + <Nm>John Smith</Nm> + </Dbtr> + <DbtrAcct> + <Id> + <IBAN>DE84500105177118117964</IBAN> + </Id> + </DbtrAcct> + <Cdtr> + <Nm>Mr Test</Nm> + </Cdtr> + <CdtrAcct> + <Id> + <IBAN>DE20500105172419259181</IBAN> + </Id> + </CdtrAcct> + </RltdPties> + <RltdAgts> + <DbtrAgt> + <FinInstnId> + <BIC>BYLADEM1WOR</BIC> + </FinInstnId> + </DbtrAgt> + </RltdAgts> + <RtrInf> + <OrgnlBkTxCd> + <Prtry> + <Cd>116</Cd> + <Issr>DK</Issr> + </Prtry> + </OrgnlBkTxCd> + <Orgtr> + <Id> + <OrgId> + <BICOrBEI>GENODEM1GLS</BICOrBEI> + </OrgId> + </Id> + </Orgtr> + <Rsn> + <Cd>AC01</Cd> + </Rsn> + <AddtlInf>IBAN ...</AddtlInf> + </RtrInf> + </TxDtls> </NtryDtls> <AddtlNtryInf>Überweisungsgutschr.</AddtlNtryInf> - </Ntry> + </Ntry> </Stmt> </BkToCstmrStmt> </Document> diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt index f2e466f5..369df133 100644 --- a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt +++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt @@ -382,7 +382,7 @@ fun parseTx( one("NtryDtls").one("TxDtls") { val txRef = opt("Refs")?.opt("AcctSvcrRef")?.text() val reversal = isReversalCode() - val nexusId = opt("Refs")?.opt("MsgId")?.text() // TODO and end-to-end ID + val nexusId = opt("Refs") { opt("EndToEndId")?.textProvided() ?: opt("MsgId")?.text() } if (reversal) { if (kind == Kind.CRDT) { val reason = one("RtrInf") { diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt index a836e6ad..ed85558f 100644 --- a/nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt +++ b/nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt @@ -178,6 +178,7 @@ class XmlDestructor internal constructor(private val el: Element) { fun <T> opt(path: String, f: XmlDestructor.() -> T): T? = opt(path)?.run(f) fun text(): String = el.textContent + fun textProvided(): String? = if (el.textContent != "NOTPROVIDED") el.textContent else null fun bool(): Boolean = el.textContent.toBoolean() fun date(): LocalDate = LocalDate.parse(text(), DateTimeFormatter.ISO_DATE) fun dateTime(): LocalDateTime = LocalDateTime.parse(text(), DateTimeFormatter.ISO_DATE_TIME) diff --git a/nexus/src/test/kotlin/Iso20022Test.kt b/nexus/src/test/kotlin/Iso20022Test.kt index 11835ca2..8ac022a8 100644 --- a/nexus/src/test/kotlin/Iso20022Test.kt +++ b/nexus/src/test/kotlin/Iso20022Test.kt @@ -117,7 +117,11 @@ class Iso20022Test { executionTime = instant("2024-04-12"), debitPaytoUri = "payto://iban/DE84500105177118117964" ), - // TODO add reversal + Reversal( + msgId = "G27KNKZAR5DV7HRB085YMA9GB4", + reason = "IncorrectAccountNumber 'Format of the account number specified is not correct' - 'IBAN ...'", + executionTime = instant("2024-04-12") + ) ), txs ) |