commit bde5eeee12ece275e824d2959f2591144c3d9da5
parent 2e2c199d9141ceda36dd2b27ae48ec363046ccfb
Author: Florian Dold <florian@dold.me>
Date: Sun, 17 Jan 2021 00:22:20 +0100
make BIC optional, fix typo
Diffstat:
11 files changed, 61 insertions(+), 70 deletions(-)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
@@ -177,7 +177,7 @@ object PaymentInitiationsTable : LongIdTable() {
val instructionId = text("instructionId")
val subject = text("subject")
val creditorIban = text("creditorIban")
- val creditorBic = text("creditorBic")
+ val creditorBic = text("creditorBic").nullable()
val creditorName = text("creditorName")
val submitted = bool("submitted").default(false)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Taler.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Taler.kt
@@ -117,14 +117,6 @@ data class TalerAddIncomingResponse(
val row_id: Long
)
-/**
- * Helper data structures.
- */
-data class Payto(
- val name: String = "NOTGIVEN",
- val iban: String,
- val bic: String = "NOTGIVEN"
-)
/** Sort query results in descending order for negative deltas, and ascending otherwise. */
fun <T : Entity<Long>> SizedIterable<T>.orderTaler(delta: Int): List<T> {
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/iso20022/Iso20022.kt
@@ -346,7 +346,7 @@ data class NexusPaymentInitiationData(
val preparationTimestamp: Long,
val creditorName: String,
val creditorIban: String,
- val creditorBic: String,
+ val creditorBic: String?,
val instructionId: String?
)
@@ -446,8 +446,11 @@ fun createPain001document(paymentData: NexusPaymentInitiationData): String {
attribute("Ccy", paymentData.currency)
text(paymentData.amount)
}
- element("CdtrAgt/FinInstnId/BIC") {
- text(paymentData.creditorBic)
+ val creditorBic = paymentData.creditorBic
+ if (creditorBic != null) {
+ element("CdtrAgt/FinInstnId/BIC") {
+ text(creditorBic)
+ }
}
element("Cdtr/Nm") {
text(paymentData.creditorName)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt
@@ -345,7 +345,7 @@ data class TalerWireGatewayFacadeConfig(
data class Pain001Data(
val creditorIban: String,
- val creditorBic: String,
+ val creditorBic: String?,
val creditorName: String,
val sum: Amount,
val currency: String,
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
@@ -248,11 +248,11 @@ class EbicsUploadTransactionChunkEntity(id: EntityID<String>) : Entity<String>(i
*/
object BankAccountTransactionsTable : Table() {
val creditorIban = text("creditorIban")
- val creditorBic = text("creditorBic")
+ val creditorBic = text("creditorBic").nullable()
val creditorName = text("creditorName")
- val debitorIban = text("debitorIban")
- val debitorBic = text("debitorBic")
- val debitorName = text("debitorName")
+ val debtorIban = text("debtorIban")
+ val debtorBic = text("debtorBic").nullable()
+ val debtorName = text("debtorName")
val subject = text("subject")
val amount = text("amount")
val currency = text("currency")
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
@@ -35,18 +35,6 @@ import org.jetbrains.exposed.sql.transactions.transaction
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.w3c.dom.Document
-import tech.libeufin.sandbox.BankAccountTransactionsTable.amount
-import tech.libeufin.sandbox.BankAccountTransactionsTable.creditorBic
-import tech.libeufin.sandbox.BankAccountTransactionsTable.creditorIban
-import tech.libeufin.sandbox.BankAccountTransactionsTable.creditorName
-import tech.libeufin.sandbox.BankAccountTransactionsTable.currency
-import tech.libeufin.sandbox.BankAccountTransactionsTable.date
-import tech.libeufin.sandbox.BankAccountTransactionsTable.debitorBic
-import tech.libeufin.sandbox.BankAccountTransactionsTable.debitorIban
-import tech.libeufin.sandbox.BankAccountTransactionsTable.debitorName
-import tech.libeufin.sandbox.BankAccountTransactionsTable.direction
-import tech.libeufin.sandbox.BankAccountTransactionsTable.pmtInfId
-import tech.libeufin.sandbox.BankAccountTransactionsTable.subject
import tech.libeufin.util.*
import tech.libeufin.util.XMLUtil.Companion.signEbicsResponse
import tech.libeufin.util.ebics_h004.*
@@ -197,9 +185,12 @@ private fun getRelatedParty(branch: XmlElementBuilder, payment: RawPayment) {
text(otherParty.iban)
}
}
- branch.element("RltdAgts") {
- element(otherParty.bicPath) {
- text(otherParty.bic)
+ val otherPartyBic = otherParty.bic
+ if (otherPartyBic != null) {
+ branch.element("RltdAgts") {
+ element(otherParty.bicPath) {
+ text(otherPartyBic)
+ }
}
}
}
@@ -563,9 +554,9 @@ private fun handleCct(paymentRequest: String, initiatorName: String, ctx: Reques
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[debtorIban] = parseResult.debitorIban
+ it[debtorName] = parseResult.debitorName
+ it[debtorBic] = parseResult.debitorBic
it[subject] = parseResult.subject
it[amount] = parseResult.amount.toString()
it[currency] = parseResult.currency
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -70,9 +70,9 @@ import tech.libeufin.sandbox.BankAccountTransactionsTable.creditorIban
import tech.libeufin.sandbox.BankAccountTransactionsTable.creditorName
import tech.libeufin.sandbox.BankAccountTransactionsTable.currency
import tech.libeufin.sandbox.BankAccountTransactionsTable.date
-import tech.libeufin.sandbox.BankAccountTransactionsTable.debitorBic
-import tech.libeufin.sandbox.BankAccountTransactionsTable.debitorIban
-import tech.libeufin.sandbox.BankAccountTransactionsTable.debitorName
+import tech.libeufin.sandbox.BankAccountTransactionsTable.debtorBic
+import tech.libeufin.sandbox.BankAccountTransactionsTable.debtorIban
+import tech.libeufin.sandbox.BankAccountTransactionsTable.debtorName
import tech.libeufin.sandbox.BankAccountTransactionsTable.direction
import tech.libeufin.util.*
import tech.libeufin.util.ebics_h004.EbicsResponse
@@ -305,14 +305,14 @@ fun serverMain(dbName: String, port: Int) {
ret.payments.add(
RawPayment(
creditorIban = it[creditorIban],
- debitorIban = it[debitorIban],
+ debitorIban = it[debtorIban],
subject = it[BankAccountTransactionsTable.subject],
date = it[date].toHttpDateString(),
amount = it[amount],
creditorBic = it[creditorBic],
creditorName = it[creditorName],
- debitorBic = it[debitorBic],
- debitorName = it[debitorName],
+ debitorBic = it[debtorBic],
+ debitorName = it[debtorName],
currency = it[currency],
direction = it[direction]
)
@@ -339,9 +339,9 @@ fun serverMain(dbName: String, port: Int) {
it[creditorIban] = body.creditorIban
it[creditorBic] = body.creditorBic
it[creditorName] = body.creditorName
- it[debitorIban] = body.debitorIban
- it[debitorBic] = body.debitorBic
- it[debitorName] = body.debitorName
+ it[debtorIban] = body.debitorIban
+ it[debtorBic] = body.debitorBic
+ it[debtorName] = body.debitorName
it[subject] = body.subject
it[amount] = body.amount
it[currency] = body.currency
@@ -367,9 +367,9 @@ fun serverMain(dbName: String, port: Int) {
it[creditorIban] = account.iban
it[creditorBic] = account.bic
it[creditorName] = account.name
- it[debitorIban] = body.debtorIban
- it[debitorBic] = body.debtorBic
- it[debitorName] = body.debtorName
+ it[debtorIban] = body.debtorIban
+ it[debtorBic] = body.debtorBic
+ it[debtorName] = body.debtorName
it[subject] = body.subject
it[amount] = body.amount
it[currency] = account.currency
@@ -435,14 +435,14 @@ fun serverMain(dbName: String, port: Int) {
ret.payments.add(
RawPayment(
creditorIban = it[creditorIban],
- debitorIban = it[debitorIban],
+ debitorIban = it[debtorIban],
subject = it[BankAccountTransactionsTable.subject],
date = it[date].toHttpDateString(),
amount = it[amount],
creditorBic = it[creditorBic],
creditorName = it[creditorName],
- debitorBic = it[debitorBic],
- debitorName = it[debitorName],
+ debitorBic = it[debtorBic],
+ debitorName = it[debtorName],
currency = it[currency],
direction = it[direction]
)
@@ -469,9 +469,9 @@ fun serverMain(dbName: String, port: Int) {
it[creditorIban] = account.iban
it[creditorBic] = account.bic
it[creditorName] = account.name
- it[debitorIban] = "DE64500105178797276788"
- it[debitorBic] = "DEUTDEBB101"
- it[debitorName] = "Max Mustermann"
+ it[debtorIban] = "DE64500105178797276788"
+ it[debtorBic] = "DEUTDEBB101"
+ it[debtorName] = "Max Mustermann"
it[subject] = "sample transaction $random"
it[BankAccountTransactionsTable.amount] = amount.toString()
it[currency] = account.currency
@@ -488,9 +488,9 @@ fun serverMain(dbName: String, port: Int) {
val amount = Random.nextLong(5, 25)
BankAccountTransactionsTable.insert {
- it[debitorIban] = account.iban
- it[debitorBic] = account.bic
- it[debitorName] = account.name
+ it[debtorIban] = account.iban
+ it[debtorBic] = account.bic
+ it[debtorName] = account.name
it[creditorIban] = "DE64500105178797276788"
it[creditorBic] = "DEUTDEBB101"
it[creditorName] = "Max Mustermann"
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt
@@ -17,7 +17,7 @@ fun historyForAccount(iban: String): List<RawPayment> {
logger.debug("Querying transactions involving: ${iban}")
BankAccountTransactionsTable.select {
BankAccountTransactionsTable.creditorIban eq iban or
- (BankAccountTransactionsTable.debitorIban eq iban)
+ (BankAccountTransactionsTable.debtorIban eq iban)
/**
FIXME: add the following condition too:
and (BankAccountTransactionsTable.date.between(start.millis, end.millis))
@@ -34,9 +34,9 @@ fun historyForAccount(iban: String): List<RawPayment> {
creditorIban = it[BankAccountTransactionsTable.creditorIban],
creditorBic = it[BankAccountTransactionsTable.creditorBic],
creditorName = it[BankAccountTransactionsTable.creditorName],
- debitorIban = it[BankAccountTransactionsTable.debitorIban],
- debitorBic = it[BankAccountTransactionsTable.debitorBic],
- debitorName = it[BankAccountTransactionsTable.debitorName],
+ debitorIban = it[BankAccountTransactionsTable.debtorIban],
+ debitorBic = it[BankAccountTransactionsTable.debtorBic],
+ debitorName = it[BankAccountTransactionsTable.debtorName],
date = importDateFromMillis(it[BankAccountTransactionsTable.date]).toDashedDate(),
amount = it[BankAccountTransactionsTable.amount],
currency = it[BankAccountTransactionsTable.currency],
diff --git a/sandbox/src/test/kotlin/DBTest.kt b/sandbox/src/test/kotlin/DBTest.kt
@@ -70,9 +70,9 @@ class DBTest {
it[creditorIban] = "earns"
it[creditorBic] = "BIC"
it[creditorName] = "Creditor Name"
- it[debitorIban] = "spends"
- it[debitorBic] = "BIC"
- it[debitorName] = "Debitor Name"
+ it[debtorIban] = "spends"
+ it[debtorBic] = "BIC"
+ it[debtorName] = "Debitor Name"
it[subject] = "deal"
it[amount] = "EUR:1"
it[date] = LocalDateTime.now().millis()
diff --git a/util/src/main/kotlin/JSON.kt b/util/src/main/kotlin/JSON.kt
@@ -26,10 +26,10 @@ package tech.libeufin.util
*/
data class RawPayment(
val creditorIban: String,
- val creditorBic: String,
+ val creditorBic: String?,
val creditorName: String,
val debitorIban: String,
- val debitorBic: String,
+ val debitorBic: String?,
val debitorName: String,
val amount: String,
val currency: String,
@@ -47,7 +47,7 @@ data class RawPayment(
data class IncomingPaymentInfo(
val debtorIban: String,
- val debtorBic: String,
+ val debtorBic: String?,
val debtorName: String,
val amount: String,
val currency: String,
diff --git a/util/src/main/kotlin/Payto.kt b/util/src/main/kotlin/Payto.kt
@@ -8,7 +8,7 @@ import java.net.URI
data class Payto(
val name: String,
val iban: String,
- val bic: String
+ val bic: String?
)
class InvalidPaytoError(msg: String) : Exception(msg)
@@ -32,7 +32,12 @@ fun parsePayto(paytoLine: String): Payto {
throw InvalidPaytoError("'${paytoLine}' has unsupported query string")
}
val receiverName = splitParameter.last()
- val split_path = javaParsedUri.path.split("/").filter { it.isNotEmpty() }
- if (split_path.size != 2) throw InvalidPaytoError("BIC and IBAN are both mandatory ($split_path)")
- return Payto(iban = split_path[1], bic = split_path[0], name = receiverName)
+ val splitPath = javaParsedUri.path.split("/").filter { it.isNotEmpty() }
+ if (splitPath.size > 2) {
+ throw InvalidPaytoError("too many path segments in iban payto URI")
+ }
+ if (splitPath.size < 2) {
+ return Payto(iban = splitPath[0], name = receiverName, bic = null)
+ }
+ return Payto(iban = splitPath[1], bic = splitPath[0], name = receiverName)
}
\ No newline at end of file