gnunet-svn
[Top][All Lists]
Advanced

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

[libeufin] branch master updated: amount format


From: gnunet
Subject: [libeufin] branch master updated: amount format
Date: Tue, 07 Jul 2020 10:28:42 +0200

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

dold pushed a commit to branch master
in repository libeufin.

The following commit(s) were added to refs/heads/master by this push:
     new 3e3912b  amount format
3e3912b is described below

commit 3e3912bfc1e7af67756046379bc62ba4e292e374
Author: Florian Dold <florian.dold@gmail.com>
AuthorDate: Tue Jul 7 13:58:36 2020 +0530

    amount format
---
 .../tech/libeufin/nexus/bankaccount/BankAccount.kt |  2 +-
 .../tech/libeufin/nexus/iso20022/Iso20022.kt       | 14 ++++----
 .../main/kotlin/tech/libeufin/nexus/server/JSON.kt | 41 ++++++++++++++++++++--
 nexus/src/test/kotlin/Iso20022Test.kt              |  6 ++--
 4 files changed, 51 insertions(+), 12 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 38c3040..0ee3c80 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
@@ -156,7 +156,7 @@ fun processCamtMessage(
             val rawEntity = NexusBankTransactionEntity.new {
                 bankAccount = acct
                 accountTransactionId = "AcctSvcrRef:$acctSvcrRef"
-                amount = tx.entryAmount.amount
+                amount = tx.entryAmount.value.toPlainString()
                 currency = tx.entryAmount.currency
                 transactionJson = 
jacksonObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(tx)
                 creditDebitIndicator = tx.creditDebitIndicator.name
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 079990e..556bb6b 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt
@@ -27,6 +27,7 @@ import com.fasterxml.jackson.annotation.JsonValue
 import org.w3c.dom.Document
 import tech.libeufin.nexus.server.CurrencyAmount
 import tech.libeufin.util.*
+import java.math.BigDecimal
 import java.time.Instant
 import java.time.ZoneId
 import java.time.ZonedDateTime
@@ -471,7 +472,7 @@ private fun XmlElementDestructor.extractParty(): 
PartyIdentification {
 
 private fun XmlElementDestructor.extractCurrencyAmount(): CurrencyAmount {
     return CurrencyAmount(
-        amount = requireUniqueChildNamed("Amt") { it.textContent },
+        value = BigDecimal(requireUniqueChildNamed("Amt") { it.textContent }),
         currency = requireUniqueChildNamed("Amt") { it.getAttribute("Ccy") }
     )
 }
@@ -479,8 +480,8 @@ private fun XmlElementDestructor.extractCurrencyAmount(): 
CurrencyAmount {
 private fun XmlElementDestructor.maybeExtractCurrencyAmount(): CurrencyAmount? 
{
     return maybeUniqueChildNamed("Amt") {
         CurrencyAmount(
-            it.textContent,
-            it.getAttribute("Ccy")
+            it.getAttribute("Ccy"),
+            BigDecimal(it.textContent)
         )
     }
 }
@@ -624,8 +625,7 @@ private fun XmlElementDestructor.extractInnerBkTxCd(): 
BankTransactionCode {
 private fun XmlElementDestructor.extractInnerTransactions(): CamtReport {
     val account = requireUniqueChildNamed("Acct") { extractAccount() }
     val entries = mapEachChildNamed("Ntry") {
-        val amount = requireUniqueChildNamed("Amt") { it.textContent }
-        val currency = requireUniqueChildNamed("Amt") { it.getAttribute("Ccy") 
}
+        val amount = extractCurrencyAmount()
         val status = requireUniqueChildNamed("Sts") { it.textContent }.let {
             EntryStatus.valueOf(it)
         }
@@ -638,9 +638,9 @@ private fun 
XmlElementDestructor.extractInnerTransactions(): CamtReport {
         val acctSvcrRef = maybeUniqueChildNamed("AcctSvcrRef") { 
it.textContent }
         val entryRef = maybeUniqueChildNamed("NtryRef") { it.textContent }
         // For now, only support account servicer reference as id
-        val transactionInfos = 
extractTransactionInfos(CurrencyAmount(currency, amount), creditDebitIndicator)
+        val transactionInfos = extractTransactionInfos(amount, 
creditDebitIndicator)
         CamtBankAccountEntry(
-            entryAmount = CurrencyAmount(currency, amount),
+            entryAmount = amount,
             status = status,
             creditDebitIndicator = creditDebitIndicator,
             bankTransactionCode = btc,
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt
index 1d1e1ed..4e8e6ab 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt
@@ -23,11 +23,21 @@ import com.fasterxml.jackson.annotation.JsonSubTypes
 import com.fasterxml.jackson.annotation.JsonTypeInfo
 import com.fasterxml.jackson.annotation.JsonTypeName
 import com.fasterxml.jackson.annotation.JsonValue
+import com.fasterxml.jackson.core.JsonGenerator
+import com.fasterxml.jackson.core.JsonParser
+import com.fasterxml.jackson.databind.DeserializationContext
 import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.databind.SerializerProvider
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize
+import com.fasterxml.jackson.databind.annotation.JsonSerialize
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer
+import com.fasterxml.jackson.databind.ser.std.StdSerializer
 import tech.libeufin.nexus.iso20022.CamtBankAccountEntry
 import tech.libeufin.nexus.iso20022.CreditDebitIndicator
 import tech.libeufin.nexus.iso20022.EntryStatus
 import tech.libeufin.util.*
+import java.lang.UnsupportedOperationException
+import java.math.BigDecimal
 import java.time.Instant
 import java.time.ZoneId
 import java.time.ZonedDateTime
@@ -342,12 +352,39 @@ data class ImportBankAccount(
     val nexusBankAccountId: String
 )
 
+
+class CurrencyAmountDeserializer(jc: Class<*> = CurrencyAmount::class.java) : 
StdDeserializer<CurrencyAmount>(jc) {
+    override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): 
CurrencyAmount {
+        if (p == null) {
+            throw UnsupportedOperationException();
+        }
+        val s = p.valueAsString
+        val components = s.split(":")
+        // FIXME: error handling!
+        return CurrencyAmount(components[0], BigDecimal(components[1]))
+    }
+}
+
+class CurrencyAmountSerializer(jc: Class<CurrencyAmount> = 
CurrencyAmount::class.java) : StdSerializer<CurrencyAmount>(jc) {
+    override fun serialize(value: CurrencyAmount?, gen: JsonGenerator?, 
provider: SerializerProvider?) {
+        if (gen == null) {
+            throw UnsupportedOperationException()
+        }
+        if (value == null) {
+            gen.writeNull()
+        } else {
+            gen.writeString("${value.currency}:${value.value.toPlainString()}")
+        }
+    }
+}
+
+@JsonDeserialize(using = CurrencyAmountDeserializer::class)
+@JsonSerialize(using = CurrencyAmountSerializer::class)
 data class CurrencyAmount(
     val currency: String,
-    val amount: String
+    val value: BigDecimal
 )
 
-
 /**
  * Account entry item as returned by the /bank-accounts/{acctId}/transactions 
API.
  */
diff --git a/nexus/src/test/kotlin/Iso20022Test.kt 
b/nexus/src/test/kotlin/Iso20022Test.kt
index e612e38..2477950 100644
--- a/nexus/src/test/kotlin/Iso20022Test.kt
+++ b/nexus/src/test/kotlin/Iso20022Test.kt
@@ -4,7 +4,9 @@ import org.junit.Test
 import org.w3c.dom.Document
 import tech.libeufin.nexus.iso20022.*
 import tech.libeufin.util.XMLUtil
+import java.math.BigDecimal
 import kotlin.test.assertEquals
+import kotlin.test.assertTrue
 
 fun loadXmlResource(name: String): Document {
     val classLoader = ClassLoader.getSystemClassLoader()
@@ -26,7 +28,7 @@ class Iso20022Test {
         assertEquals(1, r.reports.size)
 
         // First Entry
-        assertEquals("100.00", r.reports[0].entries[0].entryAmount.amount)
+        
assertTrue(BigDecimal(100).compareTo(r.reports[0].entries[0].entryAmount.value) 
== 0)
         assertEquals("EUR", r.reports[0].entries[0].entryAmount.currency)
         assertEquals(CreditDebitIndicator.CRDT, 
r.reports[0].entries[0].creditDebitIndicator)
         assertEquals(EntryStatus.BOOK, r.reports[0].entries[0].status)
@@ -39,7 +41,7 @@ class Iso20022Test {
         assertEquals("DK", 
r.reports[0].entries[0].bankTransactionCode.proprietaryIssuer)
         assertEquals(1, r.reports[0].entries[0].transactionInfos.size)
         assertEquals("EUR", 
r.reports[0].entries[0].transactionInfos[0].amount.currency)
-        assertEquals("100.00", 
r.reports[0].entries[0].transactionInfos[0].amount.amount)
+        
assertTrue(BigDecimal(100).compareTo(r.reports[0].entries[0].transactionInfos[0].amount.value)
 == 0)
         assertEquals(CreditDebitIndicator.CRDT, 
r.reports[0].entries[0].transactionInfos[0].creditDebitIndicator)
         assertEquals("unstructured info one", 
r.reports[0].entries[0].transactionInfos[0].unstructuredRemittanceInformation)
 

-- 
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]