gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] branch master updated: Camt ingestion.


From: gnunet
Subject: [libeufin] branch master updated: Camt ingestion.
Date: Mon, 07 Dec 2020 18:07:36 +0100

This is an automated email from the git hooks/post-receive script.

ms pushed a commit to branch master
in repository libeufin.

The following commit(s) were added to refs/heads/master by this push:
     new e83b5f6  Camt ingestion.
e83b5f6 is described below

commit e83b5f62a30a794e8bcb993141648db7e28a8ca9
Author: MS <ms@taler.net>
AuthorDate: Mon Dec 7 18:00:50 2020 +0100

    Camt ingestion.
    
    Whenever the parser isn't able to ingest one Camt document,
    Nexus throws an exception and flags the document as "undigested".
    This way, every ingested message can only have one transaction.
    
    Before this change, invalid documents were allowed to *look*
    like ingested but having acutally no sub-transactions.  In practice,
    that was a *unstructured* way of classifying undigested messages.
---
 .../tech/libeufin/nexus/bankaccount/BankAccount.kt |  8 ++--
 .../tech/libeufin/nexus/iso20022/Iso20022.kt       | 48 +++-------------------
 .../tech/libeufin/nexus/server/NexusServer.kt      |  4 +-
 3 files changed, 12 insertions(+), 48 deletions(-)

diff --git 
a/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
index 3168929..f75d9ac 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
@@ -106,7 +106,6 @@ suspend fun submitAllPaymentInitiations(httpClient: 
HttpClient, accountid: Strin
     }
 }
 
-
 /**
  * Check if the transaction is already found in the database.
  */
@@ -130,7 +129,7 @@ fun processCamtMessage(bankAccountId: String, camtDoc: 
Document, code: String):
         val res = try {
             parseCamtMessage(camtDoc)
         } catch (e: CamtParsingError) {
-            logger.warn("Invalid CAMT received from bank")
+            logger.warn("Invalid CAMT received from bank: $e")
             return@transaction false
         }
         val stamp = ZonedDateTime.parse(res.creationDateTime, 
DateTimeFormatter.ISO_DATE_TIME).toInstant().toEpochMilli()
@@ -148,7 +147,6 @@ fun processCamtMessage(bankAccountId: String, camtDoc: 
Document, code: String):
                 }
             }
         }
-
         val entries = res.reports.map { it.entries }.flatten()
         logger.info("found ${entries.size} transactions")
         txloop@ for (tx in entries) {
@@ -164,7 +162,6 @@ fun processCamtMessage(bankAccountId: String, camtDoc: 
Document, code: String):
                 // https://bugs.gnunet.org/view.php?id=6381
                 break
             }
-
             val rawEntity = NexusBankTransactionEntity.new {
                 bankAccount = acct
                 accountTransactionId = "AcctSvcrRef:$acctSvcrRef"
@@ -190,7 +187,8 @@ fun processCamtMessage(bankAccountId: String, camtDoc: 
Document, code: String):
                         paymentInitiation.confirmationTransaction = rawEntity
                     }
                 }
-                // FIXME: find matching PaymentInitiation by 
PaymentInformationID, message ID or whatever is present
+                // FIXME: find matching PaymentInitiation
+                //  by PaymentInformationID, message ID or whatever is present
             }
         }
         return@transaction true
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt
index 0b5a39d..d5c64be 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt
@@ -633,18 +633,6 @@ private fun XmlElementDestructor.extractCurrencyAmount(): 
CurrencyAmount {
     )
 }
 
-private fun XmlElementDestructor.maybeExtractTxCurrencyAmount(): 
CurrencyAmount? {
-    NexusAssert(
-        this.focusElement.tagName == "TxDtls",
-        "Wrong place to fetch a detailed amount"
-    )
-    return maybeUniqueChildNamed("AmtDtls") {
-        requireUniqueChildNamed("TxAmt") {
-            maybeExtractCurrencyAmount()
-        }
-    }
-}
-
 private fun XmlElementDestructor.maybeExtractCurrencyAmount(): CurrencyAmount? 
{
     return maybeUniqueChildNamed("Amt") {
         CurrencyAmount(
@@ -667,26 +655,14 @@ private fun 
XmlElementDestructor.extractMaybeCurrencyExchange(): CurrencyExchang
     }
 }
 
-// FIXME: move to util module.
-private fun currencyAmountSum(amount1: CurrencyAmount?, amount2: 
CurrencyAmount?): CurrencyAmount? {
-    if (amount1 == null) return amount2
-    if (amount2 == null) return amount1
-
-    if (amount1.currency != amount2.currency) throw NexusError(
-        HttpStatusCode.InternalServerError,
-        "Trying to sum two amount with different currencies"
-    )
-    return CurrencyAmount(currency = amount1.currency, value = amount1.value + 
amount2.value)
-}
-
 private fun XmlElementDestructor.extractBatches(
     inheritableAmount: CurrencyAmount?,
     outerCreditDebitIndicator: CreditDebitIndicator
 ): List<Batch> {
-    if (mapEachChildNamed("NtryDtls") {}.size != 1) return mutableListOf()
+    if (mapEachChildNamed("NtryDtls") {}.size != 1) throw 
CamtParsingError("This money movement is not a singleton #0")
     var txs = requireUniqueChildNamed("NtryDtls") {
         if (mapEachChildNamed("TxDtls") {}.size != 1) {
-            return@requireUniqueChildNamed mutableListOf<BatchTransaction>()
+            throw CamtParsingError("This money movement is not a singleton #1")
         }
          requireUniqueChildNamed("TxDtls") {
             val details = extractTransactionDetails(outerCreditDebitIndicator)
@@ -779,17 +755,6 @@ private fun XmlElementDestructor.extractTransactionDetails(
     )
 }
 
-private fun XmlElementDestructor.extractSingleDetails(
-    outerAmount: CurrencyAmount,
-    outerCreditDebitIndicator: CreditDebitIndicator
-): TransactionDetails {
-    return requireUniqueChildNamed("NtryDtls") {
-        requireUniqueChildNamed("TxDtls") {
-            extractTransactionDetails(outerCreditDebitIndicator)
-        }
-    }
-}
-
 private fun XmlElementDestructor.extractInnerBkTxCd(creditDebitIndicator: 
CreditDebitIndicator): String {
 
     val domain = maybeUniqueChildNamed("Domn") { maybeUniqueChildNamed("Cd") { 
focusElement.textContent } }
@@ -853,7 +818,8 @@ private fun 
XmlElementDestructor.extractInnerTransactions(): CamtReport {
             amount = extractCurrencyAmount()
         )
     }
-
+    // Note: multiple Ntry's *are* allowed.  What is not allowed is
+    // multiple money transactions *within* one Ntry element.
     val entries = mapEachChildNamed("Ntry") {
         val amount = extractCurrencyAmount()
         val status = requireUniqueChildNamed("Sts") { focusElement.textContent 
}.let {
@@ -883,8 +849,6 @@ private fun 
XmlElementDestructor.extractInnerTransactions(): CamtReport {
             maybeUniqueChildNamed("InstdAmt") { extractCurrencyAmount() }
         }
 
-        // For now, only support account servicer reference as id
-
         CamtBankAccountEntry(
             amount = amount,
             status = status,
@@ -916,7 +880,8 @@ private fun 
XmlElementDestructor.extractInnerTransactions(): CamtReport {
 }
 
 /**
- * Extract a list of transactions from an ISO20022 camt.052 / camt.053 message.
+ * Extract a list of transactions from
+ * an ISO20022 camt.052 / camt.053 message.
  */
 fun parseCamtMessage(doc: Document): CamtParseResult {
     return destructXml(doc) {
@@ -939,7 +904,6 @@ fun parseCamtMessage(doc: Document): CamtParseResult {
                     }
                 }
             }
-
             val messageId = requireOnlyChild {
                 requireUniqueChildNamed("GrpHdr") {
                     requireUniqueChildNamed("MsgId") { 
focusElement.textContent }
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt
index 64e6640..5719472 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt
@@ -688,7 +688,9 @@ fun serverMain(dbName: String, host: String) {
                 transaction {
                     authenticateRequest(call.request).id.value
                     NexusBankTransactionEntity.all().map {
-                        val tx = 
jacksonObjectMapper().readValue(it.transactionJson, 
CamtBankAccountEntry::class.java)
+                        val tx = jacksonObjectMapper().readValue(
+                            it.transactionJson, 
CamtBankAccountEntry::class.java
+                        )
                         ret.transactions.add(tx)
                     }
                 }

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]