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);