libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit d8f3f8cb91965f0942de7e208bcfbadf25347651
parent bcc4b8aa276ecdfa382fb9ce27fad2d9bb9eb9bd
Author: Antoine A <>
Date:   Wed, 25 Mar 2026 18:14:47 +0100

common: fix recurrent transfer finalisation

Diffstat:
Mdatabase-versioning/libeufin-bank-procedures.sql | 1+
Mdatabase-versioning/libeufin-nexus-procedures.sql | 1+
Mlibeufin-nexus/src/test/kotlin/DatabaseTest.kt | 50++++++++++++++++++++++++++++++++++++++++++++++----
3 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/database-versioning/libeufin-bank-procedures.sql b/database-versioning/libeufin-bank-procedures.sql @@ -2357,6 +2357,7 @@ IF in_recurrent THEN SELECT bank_transaction_id FROM pending_recurrent_incoming_transactions JOIN bank_account_transactions USING (bank_transaction_id) + WHERE authorization_pub = in_authorization_pub ORDER BY transaction_date ASC LIMIT 1 ) diff --git a/database-versioning/libeufin-nexus-procedures.sql b/database-versioning/libeufin-nexus-procedures.sql @@ -716,6 +716,7 @@ IF in_recurrent THEN SELECT incoming_transaction_id FROM pending_recurrent_incoming_transactions JOIN incoming_transactions USING (incoming_transaction_id) + WHERE authorization_pub = in_authorization_pub ORDER BY execution_time ASC LIMIT 1 ) diff --git a/libeufin-nexus/src/test/kotlin/DatabaseTest.kt b/libeufin-nexus/src/test/kotlin/DatabaseTest.kt @@ -1157,14 +1157,53 @@ class TransferTest { ) // Switching to non recurrent cancel pending + val lastAccountPub = EddsaPublicKey.randEdsaKey() + val lastAuthPub = EddsaPublicKey.randEdsaKey() + val lastReferenceNumber = subjectFmtQrBill(lastAuthPub) + assertEquals( + RegistrationResult.Success, + db.transfer.register( + type = TransferType.reserve, + accountPub = lastAccountPub, + authPub = lastAuthPub, + authSig = sig, + referenceNumber = lastReferenceNumber, + timestamp = now, + recurrent = true + ) + ) + assertEquals( + IncomingRegistrationResult.Success(8, true, false, null, false), + db.mapTx(lastAuthPub) + ) + assertEquals( + IncomingRegistrationResult.Success(9, true, false, null, true), + db.mapTx(lastAuthPub) + ) + assertEquals( + IncomingRegistrationResult.Success(10, true, false, null, true), + db.mapTx(lastAuthPub) + ) + db.checkIn( + Status.Reserve(accountPub), + Status.Reserve(newKey), + Status.Kyc(kycKey), + Status.Reserve(kycKey), + Status.Pending, + Status.Pending, + Status.Kyc(kycKey), + Status.Reserve(lastAccountPub), + Status.Pending, + Status.Pending, + ) assertEquals( RegistrationResult.Success, db.transfer.register( type = TransferType.kyc, - accountPub = kycKey, - authPub = authPub, + accountPub = lastAccountPub, + authPub = lastAuthPub, authSig = sig, - referenceNumber = referenceNumber, + referenceNumber = lastReferenceNumber, timestamp = now, recurrent = false ) @@ -1174,9 +1213,12 @@ class TransferTest { Status.Reserve(newKey), Status.Kyc(kycKey), Status.Reserve(kycKey), + Status.Pending, + Status.Pending, + Status.Kyc(kycKey), + Status.Reserve(lastAccountPub), Status.Bounced, Status.Bounced, - Status.Kyc(kycKey) ) }