[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] branch master updated: Implement C52 handler.
From: |
gnunet |
Subject: |
[libeufin] branch master updated: Implement C52 handler. |
Date: |
Tue, 31 Aug 2021 22:49:12 +0200 |
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 d0004fd Implement C52 handler.
d0004fd is described below
commit d0004fd1fb51b30cc45074f3a5685296022a8342
Author: MS <ms@taler.net>
AuthorDate: Tue Aug 31 09:48:35 2021 -1100
Implement C52 handler.
It reports all/only the fresh payments for the querying subscriber.
---
.../src/main/kotlin/tech/libeufin/sandbox/DB.kt | 1 -
.../tech/libeufin/sandbox/EbicsProtocolBackend.kt | 88 +++++++++++++++++++++-
.../src/main/kotlin/tech/libeufin/sandbox/Main.kt | 27 +------
3 files changed, 87 insertions(+), 29 deletions(-)
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
index a350c81..d09f898 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
@@ -175,7 +175,6 @@ object EbicsSubscribersTable : IntIdTable() {
class EbicsSubscriberEntity(id: EntityID<Int>) : IntEntity(id) {
companion object :
IntEntityClass<EbicsSubscriberEntity>(EbicsSubscribersTable)
-
var userId by EbicsSubscribersTable.userId
var partnerId by EbicsSubscribersTable.partnerId
var systemId by EbicsSubscribersTable.systemId
diff --git
a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
index ac3a388..34c56b8 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
@@ -457,6 +457,38 @@ fun buildCamtString(
)
}
+fun getHistoryElementFromDbRow(
+ dbRow: BankAccountFreshTransactionEntity
+): RawPayment {
+ return RawPayment(
+ subject = dbRow.transactionRef.subject,
+ creditorIban = dbRow.transactionRef.creditorIban,
+ creditorBic = dbRow.transactionRef.creditorBic,
+ creditorName = dbRow.transactionRef.creditorName,
+ debtorIban = dbRow.transactionRef.debtorIban,
+ debtorBic = dbRow.transactionRef.debtorBic,
+ debtorName = dbRow.transactionRef.debtorName,
+ date = importDateFromMillis(dbRow.transactionRef.date).toDashedDate(),
+ amount = dbRow.transactionRef.amount,
+ currency = dbRow.transactionRef.currency,
+ // The line below produces a value too long (>35 chars),
+ // and dbRow makes the document invalid!
+ // uid = "${dbRow.pmtInfId}-${it.msgId}"
+ uid = dbRow.transactionRef.accountServicerReference,
+ direction = dbRow.transactionRef.direction,
+ pmtInfId = dbRow.transactionRef.pmtInfId
+ )
+}
+
+fun getLastBalance(bankAccount: BankAccountEntity): BigDecimal {
+ val lastStatement = BankAccountStatementEntity.find {
+ BankAccountStatementsTable.bankAccount eq bankAccount.id
+ }.firstOrNull()
+ val lastBalance = if (lastStatement == null) {
+ BigDecimal.ZERO } else { BigDecimal(lastStatement.balanceClbd) }
+ return lastBalance
+}
+
/**
* Builds CAMT response.
*
@@ -468,14 +500,46 @@ private fun constructCamtResponse(
// fixes #6243
dateRange: Pair<Long, Long>?): List<String> {
- if (type != 53) throw EbicsUnsupportedOrderType()
+ if (type != 53 && type != 52) throw EbicsUnsupportedOrderType()
+ val bankAccount = getBankAccountFromSubscriber(subscriber)
+ if (type == 52) {
+ val history = mutableListOf<RawPayment>()
+
+ /**
+ * This block adds all the fresh transactions to the intermediate
+ * history list and returns the last balance that was reported in a
+ * C53 document. This latter will be the base balance to calculate
+ * the final balance after the fresh transactions.
+ */
+ val lastBalance = transaction {
+ BankAccountFreshTransactionEntity.all().forEach {
+ if (it.transactionRef.account.label == bankAccount.label) {
+ history.add(getHistoryElementFromDbRow(it))
+ }
+ }
+ getLastBalance(bankAccount) // last reported balance
+ }
+ val freshBalance = balanceForAccount(
+ history = history,
+ baseBalance = lastBalance
+ )
+ return listOf(
+ buildCamtString(
+ type,
+ bankAccount.iban,
+ history,
+ balancePrcd = lastBalance,
+ balanceClbd = freshBalance
+ ).camtMessage
+ )
+ }
+
/**
* FIXME: when this function throws an exception, it makes a JSON response
being responded.
* That is bad, because here we're inside a Ebics handler and only XML
should
* be returned to the requester. This problem makes the (unhelpful) "bank
didn't
* return XML" message appear in the Nexus logs.
*/
- val bankAccount = getBankAccountFromSubscriber(subscriber)
val ret = mutableListOf<String>()
/**
* Retrieve all the records whose creation date lies into the
@@ -656,6 +720,24 @@ private fun handleCct(paymentRequest: String) {
}
}
+/**
+ * This handler reports all the fresh transactions, belonging
+ * to the querying subscriber.
+ */
+private fun handleEbicsC52(requestContext: RequestContext): ByteArray {
+ logger.debug("Handling C52 request")
+ // Ignoring any dateRange parameter. (FIXME: clarify whether that is fine.)
+ val report = constructCamtResponse(52, requestContext.subscriber,
dateRange = null)
+ SandboxAssert(
+ report.size == 1,
+ "C52 response does not contain one Camt.052 document"
+ )
+ if (!XMLUtil.validateFromString(report[0])) throw EbicsProcessingError(
+ "One statement was found invalid."
+ )
+ return report.map { it.toByteArray() }.zip()
+}
+
private fun handleEbicsC53(requestContext: RequestContext): ByteArray {
logger.debug("Handling C53 request")
@@ -1016,7 +1098,7 @@ private fun
handleEbicsDownloadTransactionInitialization(requestContext: Request
"HTD" -> handleEbicsHtd(requestContext)
"HKD" -> handleEbicsHkd(requestContext)
"C53" -> handleEbicsC53(requestContext)
- "C52" -> throw EbicsUnsupportedOrderType() // TBD
+ "C52" -> handleEbicsC52(requestContext)
"TSD" -> handleEbicsTSD()
"PTK" -> handleEbicsPTK()
else -> throw EbicsInvalidXmlError()
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
index 43af9fe..4af0d34 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -148,36 +148,13 @@ class Camt053Tick : CliktCommand(
val bankAccountLabel = it.transactionRef.account.label
histories.putIfAbsent(bankAccountLabel, mutableListOf())
val historyIter = histories[bankAccountLabel]
- historyIter?.add(
- RawPayment(
- subject = it.transactionRef.subject,
- creditorIban = it.transactionRef.creditorIban,
- creditorBic = it.transactionRef.creditorBic,
- creditorName = it.transactionRef.creditorName,
- debtorIban = it.transactionRef.debtorIban,
- debtorBic = it.transactionRef.debtorBic,
- debtorName = it.transactionRef.debtorName,
- date =
importDateFromMillis(it.transactionRef.date).toDashedDate(),
- amount = it.transactionRef.amount,
- currency = it.transactionRef.currency,
- // The line below produces a value too long (>35
chars),
- // and it makes the document invalid!
- // uid = "${it.pmtInfId}-${it.msgId}"
- uid = it.transactionRef.accountServicerReference,
- direction = it.transactionRef.direction,
- pmtInfId = it.transactionRef.pmtInfId
- )
- )
+ historyIter?.add(getHistoryElementFromDbRow(it))
}
/**
* Resorting the closing (CLBD) balance of the last statement;
will
* become the PRCD balance of the _new_ one.
*/
- val lastStatement = BankAccountStatementEntity.find {
- BankAccountStatementsTable.bankAccount eq accountIter.id
- }.firstOrNull()
- val lastBalance = if (lastStatement == null) {
- BigDecimal.ZERO } else {
BigDecimal(lastStatement.balanceClbd) }
+ val lastBalance = getLastBalance(accountIter)
val balanceClbd = balanceForAccount(
history = histories[accountIter.label] ?: mutableListOf(),
baseBalance = lastBalance
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [libeufin] branch master updated: Implement C52 handler.,
gnunet <=