diff options
author | MS <ms@taler.net> | 2023-08-31 21:05:56 +0200 |
---|---|---|
committer | MS <ms@taler.net> | 2023-08-31 21:05:56 +0200 |
commit | e9d4790da895a92adbb525f4c02bbdde90af5d6f (patch) | |
tree | f7af1dcb5c1303e65805233e1c7ef72512e5fbfc /sandbox | |
parent | f3cd4938fcb503823afd2eabf13012c774638320 (diff) | |
download | libeufin-e9d4790da895a92adbb525f4c02bbdde90af5d6f.tar.gz libeufin-e9d4790da895a92adbb525f4c02bbdde90af5d6f.tar.bz2 libeufin-e9d4790da895a92adbb525f4c02bbdde90af5d6f.zip |
progress on bank DB refactoring
Diffstat (limited to 'sandbox')
-rw-r--r-- | sandbox/src/main/kotlin/tech/libeufin/sandbox/Database.kt | 66 | ||||
-rw-r--r-- | sandbox/src/test/kotlin/DatabaseTest.kt | 48 |
2 files changed, 92 insertions, 22 deletions
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Database.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Database.kt index 76b99b8a..e7ca959a 100644 --- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Database.kt +++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Database.kt @@ -40,6 +40,17 @@ enum class TransactionDirection { Credit, Debit } +data class BankInternalTransaction( + val creditorAccountId: Long, + val debtorAccountId: Long, + val subject: String, + val amount: TalerAmount, + val transactionDate: Long, + val accountServicerReference: String, + val endToEndId: String, + val paymentInformationId: String +) + data class BankAccountTransaction( val creditorIban: String, val creditorBic: String, @@ -216,6 +227,22 @@ class Database(private val dbConfig: String) { return myExecute(stmt) } + fun bankAccountSetMaxDebt( + bankAccountLabel: String, + maxDebt: TalerAmount + ): Boolean { + reconnect() + val stmt = prepare(""" + UPDATE bank_accounts + SET max_debt=(?,?)::taler_amount + WHERE bank_account_label=? + """) + stmt.setLong(1, maxDebt.value) + stmt.setInt(2, maxDebt.frac) + stmt.setString(3, bankAccountLabel) + return myExecute(stmt) + } + fun bankAccountGetFromLabel(bankAccountLabel: String): BankAccount? { reconnect() val stmt = prepare(""" @@ -250,7 +277,6 @@ class Database(private val dbConfig: String) { } // More bankAccountGetFrom*() to come, on a needed basis. - /* // BANK ACCOUNT TRANSACTIONS enum class BankTransactionResult { NO_CREDITOR, @@ -259,30 +285,34 @@ class Database(private val dbConfig: String) { CONFLICT } fun bankTransactionCreate( - // tx: BankInternalTransaction - creditTx: BankAccountTransaction, - debitTx: BankAccountTransaction + tx: BankInternalTransaction ): BankTransactionResult { reconnect() val stmt = prepare(""" SELECT out_nx_creditor, out_nx_debtor, out_balance_insufficient - FROM bank_wire_transfer(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) - """ // FIXME: adjust balances. + FROM bank_wire_transfer(?,?,TEXT(?),(?,?)::taler_amount,?,TEXT(?),TEXT(?),TEXT(?)) + """ ) - // FIXME: implement this operation with a stored procedure. - // Credit side - stmt.setString(1, tx.creditorAccountId) - stmt.setString(1, tx.debitorAccountId) - stmt.setString(7, tx.subject) - stmt.setObject(8, tx.amount) - stmt.setLong(9, tx.transactionDate) - stmt.setString(10, tx.accountServicerReference) - stmt.setString(11, tx.paymentInformationId) - stmt.setString(12, tx.endToEndId) - - stmt.execute() + stmt.setLong(1, tx.creditorAccountId) + stmt.setLong(2, tx.debtorAccountId) + stmt.setString(3, tx.subject) + stmt.setLong(4, tx.amount.value) + stmt.setInt(5, tx.amount.frac) + stmt.setLong(6, tx.transactionDate) + stmt.setString(7, tx.accountServicerReference) + stmt.setString(8, tx.paymentInformationId) + stmt.setString(9, tx.endToEndId) + val rs = stmt.executeQuery() + rs.use { + if (!rs.next()) throw internalServerError("Bank transaction didn't properly return") + if (rs.getBoolean("out_nx_debtor")) return BankTransactionResult.NO_DEBTOR + if (rs.getBoolean("out_nx_creditor")) return BankTransactionResult.NO_CREDITOR + if (rs.getBoolean("out_balance_insufficient")) return BankTransactionResult.CONFLICT + return BankTransactionResult.SUCCESS + } } + /* fun bankTransactionGetForHistoryPage( upperBound: Long, bankAccountId: Long, diff --git a/sandbox/src/test/kotlin/DatabaseTest.kt b/sandbox/src/test/kotlin/DatabaseTest.kt index ead97a33..5c43698c 100644 --- a/sandbox/src/test/kotlin/DatabaseTest.kt +++ b/sandbox/src/test/kotlin/DatabaseTest.kt @@ -1,8 +1,5 @@ import org.junit.Test -import tech.libeufin.sandbox.BankAccount -import tech.libeufin.sandbox.Customer -import tech.libeufin.sandbox.Database -import tech.libeufin.sandbox.TalerAmount +import tech.libeufin.sandbox.* import tech.libeufin.util.execCommand class DatabaseTest { @@ -15,6 +12,15 @@ class DatabaseTest { cashoutPayto = "payto://external-IBAN", cashoutCurrency = "KUDOS" ) + private val c1 = Customer( + login = "bar", + passwordHash = "hash", + name = "Bar", + phone = "+00", + email = "foo@b.ar", + cashoutPayto = "payto://external-IBAN", + cashoutCurrency = "KUDOS" + ) fun initDb(): Database { execCommand( listOf( @@ -27,6 +33,40 @@ class DatabaseTest { ) return Database("jdbc:postgresql:///libeufincheck") } + + @Test + fun bankTransactionTest() { + val db = initDb() + // Need accounts first. + db.customerCreate(c) + db.customerCreate(c1) + db.bankAccountCreate(BankAccount( + iban = "XYZ", + bic = "not used", + bankAccountLabel = "foo", + lastNexusFetchRowId = 1L, + owningCustomerId = 1L + )) + db.bankAccountCreate(BankAccount( + iban = "ABC", + bic = "not used", + bankAccountLabel = "bar", + lastNexusFetchRowId = 1L, + owningCustomerId = 2L + )) + db.bankAccountSetMaxDebt("foo", TalerAmount(100, 0)) + val res = db.bankTransactionCreate(BankInternalTransaction( + creditorAccountId = 2, + debtorAccountId = 1, + subject = "test", + amount = TalerAmount(3, 333), + accountServicerReference = "acct-svcr-ref", + endToEndId = "end-to-end-id", + paymentInformationId = "pmtinfid", + transactionDate = 100000L + )) + assert(res == Database.BankTransactionResult.SUCCESS) + } @Test fun customerCreationTest() { val db = initDb() |