commit 545bce3b826a9980cb1991b9f07964f3707b5413
parent 7a0acd6112a00c25b809ad5a23b3724dc753fbcf
Author: MS <ms@taler.net>
Date: Wed, 22 Nov 2023 08:08:37 +0100
nexus fetch, bouncing low amounts
fixing the refund initiator by passing an explicit refund amount
Diffstat:
3 files changed, 62 insertions(+), 8 deletions(-)
diff --git a/database-versioning/libeufin-nexus-procedures.sql b/database-versioning/libeufin-nexus-procedures.sql
@@ -9,6 +9,7 @@ CREATE OR REPLACE FUNCTION create_incoming_and_bounce(
,IN in_bank_transfer_id TEXT
,IN in_timestamp BIGINT
,IN in_request_uid TEXT
+ ,IN in_refund_amount taler_amount
,OUT out_ok BOOLEAN
) RETURNS BOOLEAN
LANGUAGE plpgsql AS $$
@@ -39,7 +40,7 @@ INSERT INTO initiated_outgoing_transactions (
,initiation_time
,request_uid
) VALUES (
- in_amount
+ in_refund_amount
,'refund: ' || in_wire_transfer_subject
,in_debit_payto_uri
,in_timestamp
@@ -56,7 +57,7 @@ INSERT INTO bounced_transactions (
out_ok = TRUE;
END $$;
-COMMENT ON FUNCTION create_incoming_and_bounce(taler_amount, TEXT, BIGINT, TEXT, TEXT, BIGINT, TEXT)
+COMMENT ON FUNCTION create_incoming_and_bounce(taler_amount, TEXT, BIGINT, TEXT, TEXT, BIGINT, TEXT, taler_amount)
IS 'creates one incoming transaction with a bounced state and initiates its related refund.';
CREATE OR REPLACE FUNCTION create_outgoing_payment(
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Database.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Database.kt
@@ -309,19 +309,19 @@ class Database(dbConfig: String): java.io.Closeable {
,?
,?
,?
+ ,(?,?)::taler_amount
)""")
-
- var finalAmount = paymentData.amount
- if (refundAmount != null) finalAmount = refundAmount
-
- stmt.setLong(1, finalAmount.value)
- stmt.setInt(2, finalAmount.fraction)
+ stmt.setLong(1, paymentData.amount.value)
+ stmt.setInt(2, paymentData.amount.fraction)
stmt.setString(3, paymentData.wireTransferSubject)
stmt.setLong(4, executionTime)
stmt.setString(5, paymentData.debitPaytoUri)
stmt.setString(6, paymentData.bankTransferId)
stmt.setLong(7, refundTimestamp)
stmt.setString(8, requestUid)
+ val finalRefundAmount: TalerAmount = refundAmount ?: paymentData.amount
+ stmt.setLong(9, finalRefundAmount.value)
+ stmt.setInt(10, finalRefundAmount.fraction)
val res = stmt.executeQuery()
res.use {
if (!it.next()) return@runConn false
diff --git a/nexus/src/test/kotlin/DatabaseTest.kt b/nexus/src/test/kotlin/DatabaseTest.kt
@@ -45,6 +45,59 @@ class OutgoingPaymentsTest {
// @Ignore // enable after having modified the bouncing logic in Kotlin
class IncomingPaymentsTest {
+ @Test
+ fun bounceWithCustomRefund() {
+ val db = prepDb(TalerConfig(NEXUS_CONFIG_SOURCE))
+ runBlocking {
+ // creating and bouncing one incoming transaction.
+ assertTrue(
+ db.incomingPaymentCreateBounced(
+ genIncPay("incoming and bounced"),
+ "UID",
+ TalerAmount(2, 53000000, "KUDOS")
+ )
+ )
+ db.runConn {
+ // check incoming shows up.
+ val checkIncoming = it.prepareStatement("""
+ SELECT
+ (amount).val as amount_value
+ ,(amount).frac as amount_frac
+ FROM incoming_transactions
+ WHERE incoming_transaction_id = 1;
+ """).executeQuery()
+ assertTrue(checkIncoming.next())
+ assertEquals(44, checkIncoming.getLong("amount_value"))
+ assertEquals(0, checkIncoming.getLong("amount_frac"))
+ // check bounced has the custom value
+ val findBounced = it.prepareStatement("""
+ SELECT
+ initiated_outgoing_transaction_id
+ FROM bounced_transactions
+ WHERE incoming_transaction_id = 1;
+ """).executeQuery()
+ assertTrue(findBounced.next())
+ val initiatedId = findBounced.getLong("initiated_outgoing_transaction_id")
+ assertEquals(1, initiatedId)
+ val findInitiatedAmount = it.prepareStatement("""
+ SELECT
+ (amount).val as amount_value
+ ,(amount).frac as amount_frac
+ FROM initiated_outgoing_transactions
+ WHERE initiated_outgoing_transaction_id = 1;
+ """).executeQuery()
+ assertTrue(findInitiatedAmount.next())
+ assertEquals(
+ 53000000,
+ findInitiatedAmount.getInt("amount_frac")
+ )
+ assertEquals(
+ 2,
+ findInitiatedAmount.getInt("amount_value")
+ )
+ }
+ }
+ }
// Tests creating and bouncing incoming payments in one DB transaction.
@Test
fun incomingAndBounce() {