diff options
author | ms <ms@taler.net> | 2021-09-18 09:12:28 +0200 |
---|---|---|
committer | ms <ms@taler.net> | 2021-09-18 09:12:28 +0200 |
commit | f629b3a17e94f1de1ea70bf59b25c71cdcd72b4f (patch) | |
tree | 5efcd98d4ee00f096647dd0bac0f6805eaf0d1b5 /sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt | |
parent | 94740f4989096a12298e89c23c7253a157238da8 (diff) | |
download | libeufin-f629b3a17e94f1de1ea70bf59b25c71cdcd72b4f.tar.gz libeufin-f629b3a17e94f1de1ea70bf59b25c71cdcd72b4f.tar.bz2 libeufin-f629b3a17e94f1de1ea70bf59b25c71cdcd72b4f.zip |
Implement /withdrawal-operation.
Diffstat (limited to 'sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt')
-rw-r--r-- | sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt index 70c86df9..e42cc251 100644 --- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt +++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt @@ -7,6 +7,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import tech.libeufin.util.* import java.math.BigDecimal +import kotlin.system.exitProcess private val logger: Logger = LoggerFactory.getLogger("tech.libeufin.sandbox") @@ -114,3 +115,67 @@ fun historyForAccount(bankAccount: BankAccountEntity): MutableList<RawPayment> { } return history } + +fun wireTransfer( + debitAccount: String, creditAccount: String, + amount: String, subjectArg: String +) { + // check accounts exist + transaction { + val credit = BankAccountEntity.find { + BankAccountsTable.label eq creditAccount + }.firstOrNull() ?: run { + throw SandboxError(HttpStatusCode.NotFound, "Credit account: $creditAccount, not found") + } + val debit = BankAccountEntity.find { + BankAccountsTable.label eq debitAccount + }.firstOrNull() ?: run { + throw SandboxError(HttpStatusCode.NotFound, "Debit account: $debitAccount, not found") + } + if (credit.currency != debit.currency) { + throw SandboxError(HttpStatusCode.InternalServerError, + "Sandbox has inconsistent state: " + + "currency of credit (${credit.currency}) and debit (${debit.currency}) account differs." + ) + } + val amountObj = try { + parseAmount(amount) + } catch (e: Exception) { + throw SandboxError(HttpStatusCode.BadRequest, "Amount given not valid: $amount") + } + if (amountObj.currency != credit.currency || amountObj.currency != debit.currency) { + throw SandboxError(HttpStatusCode.BadRequest, "currency (${amountObj.currency}) can't be accepted") + } + val randId = getRandomString(16) + BankAccountTransactionEntity.new { + creditorIban = credit.iban + creditorBic = credit.bic + creditorName = credit.name + debtorIban = debit.iban + debtorBic = debit.bic + debtorName = debit.name + subject = subjectArg + this.amount = amountObj.amount.toString() + currency = amountObj.currency + date = getUTCnow().toInstant().toEpochMilli() + accountServicerReference = "sandbox-$randId" + account = debit + direction = "DBIT" + } + BankAccountTransactionEntity.new { + creditorIban = credit.iban + creditorBic = credit.bic + creditorName = credit.name + debtorIban = debit.iban + debtorBic = debit.bic + debtorName = debit.name + subject = subjectArg + this.amount = amountObj.amount.toString() + currency = amountObj.currency + date = getUTCnow().toInstant().toEpochMilli() + accountServicerReference = "sandbox-$randId" + account = credit + direction = "CRDT" + } + } +} |