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 <[email protected]>
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);