libeufin

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

commit 6b21f20211cc174aee8c7bb2d14ef42309e9a802
parent ae7897d8bd68640e2bb327bbb8448b3b443fed3a
Author: MS <ms@taler.net>
Date:   Fri,  4 Dec 2020 16:18:01 +0100

Require BIC from Pain.01.

Diffstat:
Mintegration-tests/tests.py | 1-
Msandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
2 files changed, 54 insertions(+), 27 deletions(-)

diff --git a/integration-tests/tests.py b/integration-tests/tests.py @@ -361,7 +361,6 @@ def test_ingestion_camt53(): def test_sandbox_camt(): payment_instruction = dict( - # NOTE: this format is very outdated in the docs repo. creditorIban="GB33BUKB20201555555555", creditorBic="BUKBGB22", creditorName="Oliver Smith", diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt @@ -65,8 +65,10 @@ val EbicsHostIdAttribute = AttributeKey<String>("RequestedEbicsHostID") data class PainParseResult( val creditorIban: String, val creditorName: String, + val creditorBic: String, val debitorIban: String, val debitorName: String, + val debitorBic: String, val subject: String, val amount: Amount, val currency: String, @@ -482,41 +484,65 @@ private fun parsePain001(paymentRequest: String, initiatorName: String): PainPar requireUniqueChildNamed("MsgId") { focusElement.textContent } } requireUniqueChildNamed("PmtInf") { - val pmtInfId = requireUniqueChildNamed("PmtInfId") { focusElement.textContent } - val creditorIban = requireUniqueChildNamed("CdtTrfTxInf") { - requireUniqueChildNamed("CdtrAcct") { - requireUniqueChildNamed("Id") { - requireUniqueChildNamed("IBAN") { focusElement.textContent } - } + val debtorName = requireUniqueChildNamed("Dbtr"){ + requireUniqueChildNamed("Nm") { + focusElement.textContent } } - val txInf = requireUniqueChildNamed("CdtTrfTxInf") { - val amt = requireUniqueChildNamed("Amt") { - requireOnlyChild { - focusElement + val debtorIban = requireUniqueChildNamed("DbtrAcct"){ + requireUniqueChildNamed("Type") { + requireUniqueChildNamed("IBAN") { + focusElement.textContent } } - val creditorName = requireUniqueChildNamed("Cdtr") { - requireUniqueChildNamed("Nm") { focusElement.textContent } - } - val subject = requireUniqueChildNamed("RmtInf") { - requireUniqueChildNamed("Ustrd") { focusElement.textContent } + } + val debtorBic = requireUniqueChildNamed("DbtrAgt"){ + requireUniqueChildNamed("FinInstnId") { + requireUniqueChildNamed("BICFI") { + focusElement.textContent + } } - object {val amt = amt; val subject = subject; val creditorName = creditorName} } - val debitorIban = requireUniqueChildNamed("DbtrAcct") { - requireOnlyChild { - requireOnlyChild { focusElement.textContent } + val pmtInfId = requireUniqueChildNamed("PmtInfId") { focusElement.textContent } + val txDetails = requireUniqueChildNamed("CdtTrfTxInf") { + object { + val creditorIban = requireUniqueChildNamed("CdtrAcct") { + requireUniqueChildNamed("Id") { + requireUniqueChildNamed("IBAN") { focusElement.textContent } + } + } + val creditorName = requireUniqueChildNamed("Cdtr") { + requireUniqueChildNamed("Nm") { + focusElement.textContent + } + } + val creditorBic = requireUniqueChildNamed("CdtrAgt") { + requireUniqueChildNamed("InstnId") { + requireUniqueChildNamed("BICFI") { + focusElement.textContent + } + } + + } + val amt = requireUniqueChildNamed("Amt") { + requireOnlyChild { focusElement } + } + val subject = requireUniqueChildNamed("RmtInf") { + requireUniqueChildNamed("Ustrd") { focusElement.textContent } + } + } } PainParseResult( - currency = txInf.amt.getAttribute("Ccy"), - amount = Amount(txInf.amt.textContent), - subject = txInf.subject, - debitorIban = debitorIban, - debitorName = initiatorName, - creditorName = txInf.creditorName, - creditorIban = creditorIban, + currency = txDetails.amt.getAttribute("Ccy"), + amount = Amount(txDetails.amt.textContent), + subject = txDetails.subject, + debitorIban = debtorIban, + debitorName = debtorName, + debitorBic = debtorBic, + creditorName = txDetails.creditorName, + creditorIban = txDetails.creditorIban, + creditorBic = txDetails.creditorBic, pmtInfId = pmtInfId, msgId = msgId ) @@ -537,8 +563,10 @@ private fun handleCct(paymentRequest: String, initiatorName: String, ctx: Reques it[account] = getBankAccountFromIban(parseResult.debitorIban).id it[creditorIban] = parseResult.creditorIban it[creditorName] = parseResult.creditorName + it[creditorBic] = parseResult.creditorBic it[debitorIban] = parseResult.debitorIban it[debitorName] = parseResult.debitorName + it[debitorBic] = parseResult.debitorBic it[subject] = parseResult.subject it[amount] = parseResult.amount.toString() it[currency] = parseResult.currency