You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ar...@apache.org on 2023/01/30 16:33:17 UTC

[fineract] branch develop updated: FINERACT-1724: Test enhancement

This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new c1def3708 FINERACT-1724: Test enhancement
c1def3708 is described below

commit c1def370881aebdb1f7dded954d11d6661472dae
Author: Adam Saghy <ad...@gmail.com>
AuthorDate: Mon Jan 30 14:16:12 2023 +0100

    FINERACT-1724: Test enhancement
---
 .../loanaccount/api/LoansApiResourceSwagger.java   |  21 ++
 .../ClientLoanIntegrationTest.java                 | 318 +++++++++++----------
 .../integrationtests/SchedulerJobsTestResults.java |  18 +-
 3 files changed, 185 insertions(+), 172 deletions(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
index 6cc236614..f792fc278 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
@@ -759,6 +759,25 @@ final class LoansApiResourceSwagger {
                 public BigDecimal amount;
             }
 
+            static final class GetLoansLoanIdLoanTransactionRelation {
+
+                private GetLoansLoanIdLoanTransactionRelation() {}
+
+                @Schema(example = "1")
+                public Long fromLoanTransaction;
+                @Schema(example = "10")
+                public Long toLoanTransaction;
+                @Schema(example = "10")
+                public Long toLoanCharge;
+                @Schema(example = "CHARGEBACK")
+                public String relationType;
+                @Schema(example = "100.00")
+                public Double amount;
+                @Schema(example = "Repayment Adjustment Chargeback")
+                public String paymentType;
+
+            }
+
             @Schema(example = "1")
             public Long id;
             @Schema(example = "1")
@@ -838,6 +857,8 @@ final class LoansApiResourceSwagger {
             public String reversalExternalId;
             @Schema(example = "[2022, 9, 19]")
             public LocalDate reversedOnDate;
+            @Schema(description = "List of GetLoansLoanIdLoanTransactionRelationData")
+            public Set<GetLoansLoanIdLoanTransactionRelation> transactionRelations;
         }
 
         static final class GetLoansLoanIdLoanChargeData {
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
index 039dde92d..2d1a6ee25 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
@@ -54,6 +54,7 @@ import java.util.UUID;
 import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
 import org.apache.fineract.client.models.BusinessDateRequest;
 import org.apache.fineract.client.models.GetLoanTransactionRelation;
+import org.apache.fineract.client.models.GetLoansLoanIdLoanTransactionRelation;
 import org.apache.fineract.client.models.GetLoansLoanIdRepaymentPeriod;
 import org.apache.fineract.client.models.GetLoansLoanIdResponse;
 import org.apache.fineract.client.models.GetLoansLoanIdSummary;
@@ -6108,164 +6109,169 @@ public class ClientLoanIntegrationTest {
 
     @Test
     public void chargeAdjustmentForUnpaidCharge() {
-        GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE);
-        businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()).date("2022.11.01")
-                .dateFormat("yyyy.MM.dd").locale("en"));
-        final Account assetAccount = this.accountHelper.createAssetAccount();
-        final Account incomeAccount = this.accountHelper.createIncomeAccount();
-        final Account expenseAccount = this.accountHelper.createExpenseAccount();
-        final Account overpaymentAccount = this.accountHelper.createLiabilityAccount();
-
-        Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec,
-                ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", true));
-        final Integer loanProductID = createLoanProductWithPeriodicAccrualAccountingNoInterest(assetAccount, incomeAccount, expenseAccount,
-                overpaymentAccount);
-
-        final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2011");
-
-        final Integer loanID = applyForLoanApplication(clientID, loanProductID);
-
-        HashMap<String, Object> loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("02 September 2022", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("03 September 2022", loanID, "1000");
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        ArrayList<HashMap> loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
-        assertEquals(2, loanSchedule.size());
-        assertEquals(0, loanSchedule.get(1).get("penaltyChargesDue"));
-        assertEquals(0, loanSchedule.get(1).get("penaltyChargesOutstanding"));
-        assertEquals(1000.0f, loanSchedule.get(1).get("totalDueForPeriod"));
-        assertEquals(1000.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
-        LocalDate targetDate = LocalDate.of(2022, 9, 7);
-        final String penaltyCharge1AddedDate = dateFormatter.format(targetDate);
-        Integer penalty1LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanID,
-                LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), penaltyCharge1AddedDate, "10"));
-
-        this.loanTransactionHelper.noAccrualTransactionForRepayment(loanID);
-
-        loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
-        assertEquals(2, loanSchedule.size());
-        assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
-        assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
-        assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
-        assertEquals(1010.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
-        assertEquals(0, loanSchedule.get(1).get("totalWaivedForPeriod"));
-
-        HashMap loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
-        assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
-        assertEquals(10.0f, loanSummary.get("penaltyChargesOutstanding"));
-        assertEquals(0.0f, loanSummary.get("penaltyChargesWaived"));
-        assertEquals(1010.0f, loanSummary.get("totalOutstanding"));
-        assertEquals(0.0f, loanSummary.get("totalWaived"));
-
-        String externalId = UUID.randomUUID().toString();
-        PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID,
-                (long) penalty1LoanChargeId, new PostLoansLoanIdChargesChargeIdRequest().amount(10.0).externalId(externalId));
-
-        loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
-        assertEquals(2, loanSchedule.size());
-        assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
-        assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesPaid"));
-        assertEquals(0.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
-        assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
-        assertEquals(1000.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
-        assertEquals(10.0f, loanSchedule.get(1).get("totalPaidForPeriod"));
-
-        loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
-        assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
-        assertEquals(0.0f, loanSummary.get("penaltyChargesOutstanding"));
-        assertEquals(10.0f, loanSummary.get("penaltyChargesPaid"));
-        assertEquals(1000.0f, loanSummary.get("totalOutstanding"));
-
-        GetLoansLoanIdTransactionsTransactionIdResponse chargeAdjustmentTransaction = this.loanTransactionHelper
-                .getLoanTransactionDetails((long) loanID, chargeAdjustmentResponse.getSubResourceId());
-        assertEquals(10.0, chargeAdjustmentTransaction.getAmount());
-        assertEquals(10.0, chargeAdjustmentTransaction.getPenaltyChargesPortion());
-        assertEquals("loanTransactionType.chargeAdjustment", chargeAdjustmentTransaction.getType().getCode());
-        assertEquals(externalId, chargeAdjustmentTransaction.getExternalId());
-        GetLoanTransactionRelation transactionRelation = chargeAdjustmentTransaction.getTransactionRelations().iterator().next();
-        assertEquals(chargeAdjustmentResponse.getSubResourceId(), transactionRelation.getFromLoanTransaction());
-        assertEquals((long) penalty1LoanChargeId, transactionRelation.getToLoanCharge());
-        assertEquals("CHARGE_ADJUSTMENT", transactionRelation.getRelationType());
-
-        PostLoansLoanIdTransactionsResponse repaymentResult = loanTransactionHelper.makeLoanRepayment((long) loanID,
-                new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
-                        .transactionAmount(5.0));
-
-        loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
-        assertEquals(2, loanSchedule.size());
-        assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
-        assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesPaid"));
-        assertEquals(0.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
-        assertEquals(1000.0f, loanSchedule.get(1).get("principalDue"));
-        assertEquals(5.0f, loanSchedule.get(1).get("principalPaid"));
-        assertEquals(995.0f, loanSchedule.get(1).get("principalOutstanding"));
-        assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
-        assertEquals(995.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
-        assertEquals(15.0f, loanSchedule.get(1).get("totalPaidForPeriod"));
-
-        loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
-        assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
-        assertEquals(0.0f, loanSummary.get("penaltyChargesOutstanding"));
-        assertEquals(10.0f, loanSummary.get("penaltyChargesPaid"));
-        assertEquals(1000.0f, loanSummary.get("principalDisbursed"));
-        assertEquals(995.0f, loanSummary.get("principalOutstanding"));
-        assertEquals(5.0f, loanSummary.get("principalPaid"));
-        assertEquals(995.0f, loanSummary.get("totalOutstanding"));
-
-        Long chargeAdjustmentTxnId = repaymentResult.getResourceId() + 1;
-        chargeAdjustmentTransaction = this.loanTransactionHelper.getLoanTransactionDetails((long) loanID, chargeAdjustmentTxnId);
-        assertEquals(10.0, chargeAdjustmentTransaction.getAmount());
-        assertEquals(5.0, chargeAdjustmentTransaction.getPenaltyChargesPortion());
-        assertEquals(5.0, chargeAdjustmentTransaction.getPrincipalPortion());
-        assertEquals("loanTransactionType.chargeAdjustment", chargeAdjustmentTransaction.getType().getCode());
-        assertEquals(externalId, chargeAdjustmentTransaction.getExternalId());
-
-        Set<GetLoanTransactionRelation> transactionRelations = chargeAdjustmentTransaction.getTransactionRelations();
-        for (GetLoanTransactionRelation loanTransactionRelation : transactionRelations) {
-            if (loanTransactionRelation.getRelationType().equals("CHARGE_ADJUSTMENT")) {
-                assertEquals(chargeAdjustmentTxnId, loanTransactionRelation.getFromLoanTransaction());
-                assertEquals((long) penalty1LoanChargeId, loanTransactionRelation.getToLoanCharge());
+        try {
+            GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE);
+            businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
+                    .date("2022.11.01").dateFormat("yyyy.MM.dd").locale("en"));
+            final Account assetAccount = this.accountHelper.createAssetAccount();
+            final Account incomeAccount = this.accountHelper.createIncomeAccount();
+            final Account expenseAccount = this.accountHelper.createExpenseAccount();
+            final Account overpaymentAccount = this.accountHelper.createLiabilityAccount();
+
+            Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec,
+                    ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", true));
+            final Integer loanProductID = createLoanProductWithPeriodicAccrualAccountingNoInterest(assetAccount, incomeAccount,
+                    expenseAccount, overpaymentAccount);
+
+            final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2011");
+
+            final Integer loanID = applyForLoanApplication(clientID, loanProductID);
+
+            HashMap<String, Object> loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID);
+            LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
+
+            loanStatusHashMap = this.loanTransactionHelper.approveLoan("02 September 2022", loanID);
+            LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
+            LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
+
+            loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("03 September 2022", loanID, "1000");
+            LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
+
+            ArrayList<HashMap> loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
+            assertEquals(2, loanSchedule.size());
+            assertEquals(0, loanSchedule.get(1).get("penaltyChargesDue"));
+            assertEquals(0, loanSchedule.get(1).get("penaltyChargesOutstanding"));
+            assertEquals(1000.0f, loanSchedule.get(1).get("totalDueForPeriod"));
+            assertEquals(1000.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
+            LocalDate targetDate = LocalDate.of(2022, 9, 7);
+            final String penaltyCharge1AddedDate = dateFormatter.format(targetDate);
+            Integer penalty1LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanID,
+                    LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), penaltyCharge1AddedDate, "10"));
+
+            this.loanTransactionHelper.noAccrualTransactionForRepayment(loanID);
+
+            loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
+            assertEquals(2, loanSchedule.size());
+            assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
+            assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
+            assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
+            assertEquals(1010.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
+            assertEquals(0, loanSchedule.get(1).get("totalWaivedForPeriod"));
+
+            HashMap loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
+            assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
+            assertEquals(10.0f, loanSummary.get("penaltyChargesOutstanding"));
+            assertEquals(0.0f, loanSummary.get("penaltyChargesWaived"));
+            assertEquals(1010.0f, loanSummary.get("totalOutstanding"));
+            assertEquals(0.0f, loanSummary.get("totalWaived"));
+
+            String externalId = UUID.randomUUID().toString();
+            PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID,
+                    (long) penalty1LoanChargeId, new PostLoansLoanIdChargesChargeIdRequest().amount(10.0).externalId(externalId));
+
+            loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
+            assertEquals(2, loanSchedule.size());
+            assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
+            assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesPaid"));
+            assertEquals(0.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
+            assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
+            assertEquals(1000.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
+            assertEquals(10.0f, loanSchedule.get(1).get("totalPaidForPeriod"));
+
+            loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
+            assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
+            assertEquals(0.0f, loanSummary.get("penaltyChargesOutstanding"));
+            assertEquals(10.0f, loanSummary.get("penaltyChargesPaid"));
+            assertEquals(1000.0f, loanSummary.get("totalOutstanding"));
+
+            GetLoansLoanIdTransactionsTransactionIdResponse chargeAdjustmentTransaction = this.loanTransactionHelper
+                    .getLoanTransactionDetails((long) loanID, chargeAdjustmentResponse.getSubResourceId());
+            assertEquals(10.0, chargeAdjustmentTransaction.getAmount());
+            assertEquals(10.0, chargeAdjustmentTransaction.getPenaltyChargesPortion());
+            assertEquals("loanTransactionType.chargeAdjustment", chargeAdjustmentTransaction.getType().getCode());
+            assertEquals(externalId, chargeAdjustmentTransaction.getExternalId());
+            GetLoanTransactionRelation transactionRelation = chargeAdjustmentTransaction.getTransactionRelations().iterator().next();
+            assertEquals(chargeAdjustmentResponse.getSubResourceId(), transactionRelation.getFromLoanTransaction());
+            assertEquals((long) penalty1LoanChargeId, transactionRelation.getToLoanCharge());
+            assertEquals("CHARGE_ADJUSTMENT", transactionRelation.getRelationType());
+
+            PostLoansLoanIdTransactionsResponse repaymentResult = loanTransactionHelper.makeLoanRepayment((long) loanID,
+                    new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
+                            .transactionAmount(5.0));
+
+            loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
+            assertEquals(2, loanSchedule.size());
+            assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
+            assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesPaid"));
+            assertEquals(0.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
+            assertEquals(1000.0f, loanSchedule.get(1).get("principalDue"));
+            assertEquals(5.0f, loanSchedule.get(1).get("principalPaid"));
+            assertEquals(995.0f, loanSchedule.get(1).get("principalOutstanding"));
+            assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
+            assertEquals(995.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
+            assertEquals(15.0f, loanSchedule.get(1).get("totalPaidForPeriod"));
+
+            loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
+            assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
+            assertEquals(0.0f, loanSummary.get("penaltyChargesOutstanding"));
+            assertEquals(10.0f, loanSummary.get("penaltyChargesPaid"));
+            assertEquals(1000.0f, loanSummary.get("principalDisbursed"));
+            assertEquals(995.0f, loanSummary.get("principalOutstanding"));
+            assertEquals(5.0f, loanSummary.get("principalPaid"));
+            assertEquals(995.0f, loanSummary.get("totalOutstanding"));
+
+            GetLoansLoanIdResponse loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID);
+            GetLoansLoanIdTransactions replayedTransaction = loanDetails.getTransactions().stream()
+                    .filter(t -> externalId.equals(t.getExternalId())).findFirst().get();
+
+            assertEquals(10.0, replayedTransaction.getAmount());
+            assertEquals(5.0, replayedTransaction.getPenaltyChargesPortion());
+            assertEquals(5.0, replayedTransaction.getPrincipalPortion());
+            assertEquals("loanTransactionType.chargeAdjustment", replayedTransaction.getType().getCode());
+            assertEquals(externalId, replayedTransaction.getExternalId());
+
+            Set<GetLoansLoanIdLoanTransactionRelation> transactionRelations = replayedTransaction.getTransactionRelations();
+            for (GetLoansLoanIdLoanTransactionRelation loanTransactionRelation : transactionRelations) {
+                if ("CHARGE_ADJUSTMENT".equals(loanTransactionRelation.getRelationType())) {
+                    assertEquals(replayedTransaction.getId(), loanTransactionRelation.getFromLoanTransaction());
+                    assertEquals((long) penalty1LoanChargeId, loanTransactionRelation.getToLoanCharge());
+                }
             }
-        }
 
-        String uuid = UUID.randomUUID().toString();
-        this.loanTransactionHelper.reverseLoanTransaction((long) loanID, chargeAdjustmentTxnId,
-                new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat("dd MMMM yyyy").transactionDate("08 September 2022")
-                        .transactionAmount(0.0).locale("en").reversalExternalId(uuid));
-
-        // Should fail due to external id collusion
-        assertThrows(CallFailedRuntimeException.class,
-                () -> this.loanTransactionHelper.reverseLoanTransaction((long) loanID, repaymentResult.getResourceId(),
-                        new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat("dd MMMM yyyy")
-                                .transactionDate("08 September 2022").transactionAmount(0.0).locale("en").reversalExternalId(uuid)));
-
-        loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
-        assertEquals(2, loanSchedule.size());
-        assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
-        assertEquals(5.0f, loanSchedule.get(1).get("penaltyChargesPaid"));
-        assertEquals(5.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
-        assertEquals(1000.0f, loanSchedule.get(1).get("principalDue"));
-        assertEquals(0, loanSchedule.get(1).get("principalPaid"));
-        assertEquals(1000.0f, loanSchedule.get(1).get("principalOutstanding"));
-        assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
-        assertEquals(1005.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
-        assertEquals(5.0f, loanSchedule.get(1).get("totalPaidForPeriod"));
-
-        loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
-        assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
-        assertEquals(5.0f, loanSummary.get("penaltyChargesOutstanding"));
-        assertEquals(5.0f, loanSummary.get("penaltyChargesPaid"));
-        assertEquals(1000.0f, loanSummary.get("principalDisbursed"));
-        assertEquals(1000.0f, loanSummary.get("principalOutstanding"));
-        assertEquals(0.0f, loanSummary.get("principalPaid"));
-        assertEquals(1005.0f, loanSummary.get("totalOutstanding"));
-        GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
+            String uuid = UUID.randomUUID().toString();
+            this.loanTransactionHelper.reverseLoanTransaction((long) loanID, replayedTransaction.getId(),
+                    new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat("dd MMMM yyyy").transactionDate("08 September 2022")
+                            .transactionAmount(0.0).locale("en").reversalExternalId(uuid));
+
+            // Should fail due to external id collusion
+            assertThrows(CallFailedRuntimeException.class,
+                    () -> this.loanTransactionHelper.reverseLoanTransaction((long) loanID, repaymentResult.getResourceId(),
+                            new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat("dd MMMM yyyy")
+                                    .transactionDate("08 September 2022").transactionAmount(0.0).locale("en").reversalExternalId(uuid)));
+
+            loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID);
+            assertEquals(2, loanSchedule.size());
+            assertEquals(10.0f, loanSchedule.get(1).get("penaltyChargesDue"));
+            assertEquals(5.0f, loanSchedule.get(1).get("penaltyChargesPaid"));
+            assertEquals(5.0f, loanSchedule.get(1).get("penaltyChargesOutstanding"));
+            assertEquals(1000.0f, loanSchedule.get(1).get("principalDue"));
+            assertEquals(0, loanSchedule.get(1).get("principalPaid"));
+            assertEquals(1000.0f, loanSchedule.get(1).get("principalOutstanding"));
+            assertEquals(1010.0f, loanSchedule.get(1).get("totalDueForPeriod"));
+            assertEquals(1005.0f, loanSchedule.get(1).get("totalOutstandingForPeriod"));
+            assertEquals(5.0f, loanSchedule.get(1).get("totalPaidForPeriod"));
+
+            loanSummary = this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "summary");
+            assertEquals(10.0f, loanSummary.get("penaltyChargesCharged"));
+            assertEquals(5.0f, loanSummary.get("penaltyChargesOutstanding"));
+            assertEquals(5.0f, loanSummary.get("penaltyChargesPaid"));
+            assertEquals(1000.0f, loanSummary.get("principalDisbursed"));
+            assertEquals(1000.0f, loanSummary.get("principalOutstanding"));
+            assertEquals(0.0f, loanSummary.get("principalPaid"));
+            assertEquals(1005.0f, loanSummary.get("totalOutstanding"));
+        } finally {
+            GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
+        }
     }
 
     @Test
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
index a13f64f2b..f8e89ec39 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
@@ -1001,8 +1001,6 @@ public class SchedulerJobsTestResults {
             this.loanTransactionHelper.approveLoan("02 September 2022", loanId);
             this.loanTransactionHelper.disburseLoan("03 September 2022", loanId, "1000", null);
 
-            this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().cronExpression("0/5 * * * * ?"));
-
             businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
                     .date("2022.09.05").dateFormat("yyyy.MM.dd").locale("en"));
 
@@ -1011,23 +1009,11 @@ public class SchedulerJobsTestResults {
 
             this.loanTransactionHelper.addChargesForLoan(loanId, LoanTransactionHelper
                     .getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), penaltyCharge1AddedDate, "10", null));
+            this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().cronExpression("0/5 * * * * ?"));
 
-            Thread.sleep(6000);
+            Thread.sleep(11000);
             GetLoansLoanIdResponse loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanId);
             assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(1).getDate());
-
-            businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
-                    .date("2022.09.06").dateFormat("yyyy.MM.dd").locale("en"));
-
-            targetDate = LocalDate.of(2022, 9, 6);
-            penaltyCharge1AddedDate = dateFormatter.format(targetDate);
-
-            this.loanTransactionHelper.addChargesForLoan(loanId, LoanTransactionHelper
-                    .getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), penaltyCharge1AddedDate, "10", null));
-
-            Thread.sleep(6000);
-            loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanId);
-            assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(2).getDate());
         } finally {
             this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().cronExpression("0 2 0 1/1 * ? *"));
             GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);