commit 914fbb6d7ea282d1e012fe1a699dd92e9e79426a
parent 64bccc0eb1b7fcde1c58d2024dd94dc7cade237d
Author: MS <ms@taler.net>
Date: Mon, 23 Aug 2021 02:09:17 -1100
add Sandbox CLI command to wire-transfer
Diffstat:
1 file changed, 83 insertions(+), 4 deletions(-)
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -61,10 +61,7 @@ import com.github.ajalt.clikt.core.context
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.core.subcommands
import com.github.ajalt.clikt.output.CliktHelpFormatter
-import com.github.ajalt.clikt.parameters.options.default
-import com.github.ajalt.clikt.parameters.options.flag
-import com.github.ajalt.clikt.parameters.options.option
-import com.github.ajalt.clikt.parameters.options.versionOption
+import com.github.ajalt.clikt.parameters.options.*
import com.github.ajalt.clikt.parameters.types.int
import com.google.common.io.Resources
import execThrowableOrTerminate
@@ -137,6 +134,88 @@ class Config : CliktCommand("Insert one configuration into the database") {
}
}
+class MakeTransaction : CliktCommand("Wire-transfer money between Sandbox bank accounts") {
+ init {
+ context {
+ helpFormatter = CliktHelpFormatter(showDefaultValues = true)
+ }
+ }
+ private val creditAccount by option(help = "Label of the bank account receiving the payment").required()
+ private val debitAccount by option(help = "Label of the bank account issuing the payment").required()
+ private val amount by argument(help = "Amount, in the \$currency:x.y format")
+ private val subject by argument(help = "Payment's subject")
+
+ override fun run() {
+ // TODO("Not yet implemented")
+ // check accounts exist
+ transaction {
+ val credit = BankAccountEntity.find {
+ BankAccountsTable.label eq creditAccount
+ }.firstOrNull() ?: run {
+ System.err.println("Credit account: $creditAccount, not found")
+ exitProcess(1)
+ }
+ val debit = BankAccountEntity.find {
+ BankAccountsTable.label eq debitAccount
+ }.firstOrNull() ?: run {
+ System.err.println("Debit account: $debitAccount, not found")
+ exitProcess(1)
+ }
+ if (credit.currency != debit.currency) {
+ System.err.println(
+ "Sandbox has inconsistent state: " +
+ "currency of credit (${credit.currency}) and debit (${debit.currency}) account differs.")
+ exitProcess(1)
+ }
+ val amountObj = try {
+ parseAmount(amount)
+ } catch (e: Exception) {
+ System.err.println("Amount given not valid: $amount")
+ exitProcess(1)
+ }
+ if (amountObj.currency != credit.currency || amountObj.currency != debit.currency) {
+ System.err.println("Amount's currency (${amountObj.currency}) can't be accepted")
+ exitProcess(1)
+ }
+ val randId = getRandomString(16)
+ BankAccountTransactionsTable.insert {
+ it[creditorIban] = credit.iban
+ it[creditorBic] = credit.bic
+ it[creditorName] = credit.name
+ it[debtorIban] = debit.iban
+ it[debtorBic] = debit.bic
+ it[debtorName] = debit.name
+ it[subject] = subject
+ it[amount] = amountObj.amount.toString()
+ it[currency] = amountObj.currency
+ it[date] = Instant.now().toEpochMilli()
+ it[accountServicerReference] = "sandbox-$randId"
+ it[account] = debit.id
+ it[direction] = "DBIT"
+ }
+ BankAccountTransactionsTable.insert {
+ it[creditorIban] = credit.iban
+ it[creditorBic] = credit.bic
+ it[creditorName] = credit.name
+ it[debtorIban] = debit.iban
+ it[debtorBic] = debit.bic
+ it[debtorName] = debit.name
+ it[subject] = subject
+ it[amount] = amountObj.amount.toString()
+ it[currency] = amountObj.currency
+ it[date] = Instant.now().toEpochMilli()
+ it[accountServicerReference] = "sandbox-$randId"
+ it[account] = credit.id
+ it[direction] = "CRDT"
+ }
+ }
+
+ // book payment
+
+ }
+
+}
+
class ResetTables : CliktCommand("Drop all the tables from the database") {
init {
context {