summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine A <>2024-04-24 10:47:09 +0900
committerAntoine A <>2024-04-24 10:47:09 +0900
commitb0632588119f3fac8cebb9a30a0b5f8e09989022 (patch)
tree5311ef4e8c49231d7516cfe88fdff0c55f695f44
parentaf63e4b282afe28b222b00c6b44292d8b65bf528 (diff)
downloadlibeufin-b0632588119f3fac8cebb9a30a0b5f8e09989022.tar.gz
libeufin-b0632588119f3fac8cebb9a30a0b5f8e09989022.tar.bz2
libeufin-b0632588119f3fac8cebb9a30a0b5f8e09989022.zip
Parse GLS return transaction
-rw-r--r--nexus/sample/platform/gls.xml193
-rw-r--r--nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt2
-rw-r--r--nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt1
-rw-r--r--nexus/src/test/kotlin/Iso20022Test.kt6
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
)