summaryrefslogtreecommitdiff
path: root/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt
diff options
context:
space:
mode:
authorms <ms@taler.net>2021-09-18 09:12:28 +0200
committerms <ms@taler.net>2021-09-18 09:12:28 +0200
commitf629b3a17e94f1de1ea70bf59b25c71cdcd72b4f (patch)
tree5efcd98d4ee00f096647dd0bac0f6805eaf0d1b5 /sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt
parent94740f4989096a12298e89c23c7253a157238da8 (diff)
downloadlibeufin-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.kt65
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"
+ }
+ }
+}