libeufin

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

commit eaee0dca7b554c5919414bf7457c7ece75fc65c3
parent 0e9ec0327f8f782fae1925c2a6eb12965d2d59f9
Author: Antoine A <>
Date:   Fri, 24 Jan 2025 11:06:53 +0100

nexus: improve batch and tx failure msg logic

Diffstat:
Mdatabase-versioning/libeufin-nexus-procedures.sql | 9++++-----
Mnexus/src/test/kotlin/DatabaseTest.kt | 10++++++++++
2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/database-versioning/libeufin-nexus-procedures.sql b/database-versioning/libeufin-nexus-procedures.sql @@ -558,11 +558,10 @@ BEGIN WHERE end_to_end_id = in_end_to_end_id; IF FOUND THEN -- Update unsettled transaction status - IF local_status = 'success' AND in_status = 'permanent_failure' THEN - UPDATE initiated_outgoing_transactions - SET status = 'late_failure', status_msg = in_status_msg - WHERE initiated_outgoing_transaction_id = local_tx_id; - ELSIF local_status NOT IN ('success', 'permanent_failure', 'late_failure') THEN + IF in_status = 'permanent_failure' OR local_status NOT IN ('success', 'permanent_failure', 'late_failure') THEN + IF in_status = 'permanent_failure' AND local_status = 'success' THEN + in_status = 'late_failure'; + END IF; UPDATE initiated_outgoing_transactions SET status = in_status, status_msg = in_status_msg WHERE initiated_outgoing_transaction_id = local_tx_id; diff --git a/nexus/src/test/kotlin/DatabaseTest.kt b/nexus/src/test/kotlin/DatabaseTest.kt @@ -521,6 +521,16 @@ class PaymentInitiationsTest { registerOutgoingPayment(db, genOutPay("", endToEndId = "TX", msgId = "BATCH")) checkPart(batchId, SubmissionState.success, null, SubmissionState.success, null, SubmissionState.success, null) } + + // Transaction failure take over batch failures + test { batchId -> + checkBatch(batchId, SubmissionState.unsubmitted, null) + db.initiated.batchStatusUpdate("BATCH", StatusUpdate.permanent_failure, "batch") + checkPart(batchId, SubmissionState.permanent_failure, "batch", SubmissionState.permanent_failure, "batch", SubmissionState.permanent_failure, "batch") + db.initiated.txStatusUpdate("TX", "BATCH", StatusUpdate.permanent_failure, "tx") + db.initiated.batchStatusUpdate("BATCH", StatusUpdate.permanent_failure, "batch2") + checkPart(batchId, SubmissionState.permanent_failure, "batch", SubmissionState.permanent_failure, "tx", SubmissionState.permanent_failure, "batch") + } // Unknown order and batch db.initiated.batchSubmissionSuccess(42, Instant.now(), "ORDER_X")