Fix Loan Delinquency Classification after Repayment
This commit is contained in:
committed by
Adam Saghy
parent
36a81580be
commit
4f9f71da9b
+65
-31
@@ -18,7 +18,6 @@
|
||||
*/
|
||||
package org.apache.fineract.integrationtests;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
import io.restassured.builder.RequestSpecBuilder;
|
||||
@@ -72,7 +71,7 @@ public class DelinquencyAndChargebackIntegrationTest {
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE);
|
||||
|
||||
final LocalDate todaysDate = Utils.getLocalDateOfTenant();
|
||||
LocalDate businessDate = todaysDate.minusDays(57);
|
||||
LocalDate businessDate = todaysDate.minusMonths(3);
|
||||
log.info("Current Business date {}", businessDate);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
|
||||
|
||||
@@ -88,62 +87,97 @@ public class DelinquencyAndChargebackIntegrationTest {
|
||||
delinquencyBucket.getId());
|
||||
assertNotNull(getLoanProductsProductResponse);
|
||||
|
||||
log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName());
|
||||
assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName());
|
||||
|
||||
// Older date to have more than one overdue installment
|
||||
LocalDate transactionDate = businessDate;
|
||||
String operationDate = Utils.dateFormatter.format(transactionDate);
|
||||
log.info("Operation date {}", transactionDate);
|
||||
String operationDate = Utils.dateFormatter.format(businessDate);
|
||||
log.info("Operation date {}", businessDate);
|
||||
|
||||
// Create Loan Account
|
||||
final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(),
|
||||
getLoanProductsProductResponse.getId().toString(), operationDate);
|
||||
|
||||
// Run first time the Loan COB Job
|
||||
final String jobName = "Loan COB";
|
||||
schedulerJobHelper.executeAndAwaitJob(jobName);
|
||||
|
||||
// Get loan details expecting to have not a delinquency classification
|
||||
GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
validateLoanAccount(getLoansLoanIdResponse, "0.00", principalAmount, 0, doubleZERO);
|
||||
|
||||
// Move the Business date to get older the loan and to have an overdue loan
|
||||
businessDate = businessDate.plusDays(43);
|
||||
// Move the Business date 1 month to apply the first repayment
|
||||
businessDate = businessDate.plusMonths(1);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
|
||||
log.info("Current Business date {}", businessDate);
|
||||
|
||||
String amountVal = "100.00";
|
||||
Float transactionAmount = Float.valueOf(amountVal);
|
||||
operationDate = Utils.dateFormatter.format(businessDate);
|
||||
PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate,
|
||||
transactionAmount, loanId);
|
||||
assertNotNull(loanIdTransactionsResponse);
|
||||
final Long transactionId = loanIdTransactionsResponse.getResourceId();
|
||||
loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0);
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
validateLoanAccount(getLoansLoanIdResponse, "0.00", "1100.00", 0, doubleZERO);
|
||||
Long transactionId = loanIdTransactionsResponse.getResourceId();
|
||||
loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0);
|
||||
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), amountVal,
|
||||
0, responseSpec);
|
||||
loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1);
|
||||
// Move the Business date 1 month more to apply the second repayment
|
||||
businessDate = businessDate.plusMonths(1);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
|
||||
log.info("Current Business date {}", businessDate);
|
||||
|
||||
operationDate = Utils.dateFormatter.format(businessDate);
|
||||
loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId);
|
||||
assertNotNull(loanIdTransactionsResponse);
|
||||
transactionId = loanIdTransactionsResponse.getResourceId();
|
||||
loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0);
|
||||
|
||||
// Get loan details expecting to have not a delinquency classification and 1,000 as Outstanding
|
||||
GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
validateLoanAccount(getLoansLoanIdResponse, "0.00", "1000.00", 0, doubleZERO);
|
||||
|
||||
// Move the Business date n days to apply the chargeback for the previous repayment
|
||||
businessDate = businessDate.plusDays(21);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
|
||||
log.info("Current Business date {}", businessDate);
|
||||
|
||||
// Apply the Chargeback transaction
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, amountVal, 0,
|
||||
responseSpec);
|
||||
loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 1);
|
||||
|
||||
// Validate the account expecting to have an adjustment for 100.00 and Outstanding 1,100
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
// Past Due Days in Zero because the Charge back transaction exists and It was done with the current date
|
||||
validateLoanAccount(getLoansLoanIdResponse, amountVal, principalAmount, 0, Double.valueOf("100.00"));
|
||||
validateLoanAccount(getLoansLoanIdResponse, amountVal, "1100.00", 0, Double.valueOf("0.00"));
|
||||
|
||||
// Move the Business date to get older the loan and to have an overdue loan
|
||||
businessDate = businessDate.plusDays(9);
|
||||
// Move the Business date n days to run the COB
|
||||
businessDate = businessDate.plusDays(14);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
|
||||
log.info("Current Business date {}", businessDate);
|
||||
// Run Second time the Job
|
||||
|
||||
// Run the Loan COB Job
|
||||
final String jobName = "Loan COB";
|
||||
schedulerJobHelper.executeAndAwaitJob(jobName);
|
||||
|
||||
// Get loan details expecting to have a delinquency classification
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
validateLoanAccount(getLoansLoanIdResponse, amountVal, "1100.00", 14, Double.valueOf("200.00"));
|
||||
|
||||
// The value is lower due the 3 grace days
|
||||
validateLoanAccount(getLoansLoanIdResponse, "100.00", principalAmount, 9, Double.valueOf("100.00"));
|
||||
// Move the Business date few days to apply the repayment for Chargeback
|
||||
businessDate = todaysDate.plusDays(4);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
|
||||
log.info("Current Business date {}", businessDate);
|
||||
|
||||
operationDate = Utils.dateFormatter.format(businessDate);
|
||||
loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId);
|
||||
assertNotNull(loanIdTransactionsResponse);
|
||||
transactionId = loanIdTransactionsResponse.getResourceId();
|
||||
loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0);
|
||||
|
||||
// Get loan details expecting to have a delinquency classification
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
validateLoanAccount(getLoansLoanIdResponse, amountVal, "1000.00", 4, Double.valueOf("100.00"));
|
||||
|
||||
// Apply a partial repayment
|
||||
operationDate = Utils.dateFormatter.format(businessDate);
|
||||
transactionAmount = Float.valueOf("50.00");
|
||||
loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId);
|
||||
assertNotNull(loanIdTransactionsResponse);
|
||||
transactionId = loanIdTransactionsResponse.getResourceId();
|
||||
loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0);
|
||||
// Get loan details expecting to have a delinquency classification
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
validateLoanAccount(getLoansLoanIdResponse, amountVal, "950.00", 4, Double.valueOf("50.00"));
|
||||
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
|
||||
}
|
||||
|
||||
+1
-1
@@ -597,7 +597,7 @@ public class DelinquencyBucketsIntegrationTest {
|
||||
|
||||
// Reverse the Previous Loan Repayment
|
||||
PostLoansLoanIdTransactionsResponse loansLoanIdReverseTransactions = loanTransactionHelper.reverseLoanTransaction(loanId,
|
||||
loansLoanIdTransactions.getResourceId().intValue(), operationDate, responseSpec);
|
||||
loansLoanIdTransactions.getResourceId(), operationDate, responseSpec);
|
||||
assertNotNull(loansLoanIdReverseTransactions);
|
||||
log.info("Loan repayment reverse transaction id {}", loansLoanIdReverseTransactions.getResourceId());
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
|
||||
+71
-48
@@ -40,7 +40,10 @@ import org.apache.fineract.client.models.GetLoansLoanIdResponse;
|
||||
import org.apache.fineract.client.models.GetLoansLoanIdTransactions;
|
||||
import org.apache.fineract.client.models.GetLoansLoanIdTransactionsTransactionIdResponse;
|
||||
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsResponse;
|
||||
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
|
||||
import org.apache.fineract.integrationtests.common.BusinessDateHelper;
|
||||
import org.apache.fineract.integrationtests.common.ClientHelper;
|
||||
import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper;
|
||||
import org.apache.fineract.integrationtests.common.Utils;
|
||||
import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
|
||||
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
|
||||
@@ -95,13 +98,13 @@ public class LoanTransactionChargebackTest {
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "1000.00",
|
||||
0, responseSpec);
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "1000.00", 0,
|
||||
responseSpec);
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId.intValue(), 0, Double.valueOf("1000.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("1000.00"));
|
||||
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
@@ -111,11 +114,10 @@ public class LoanTransactionChargebackTest {
|
||||
|
||||
// Try to reverse a Loan Transaction charge back
|
||||
PostLoansLoanIdTransactionsResponse reverseTransactionResponse = loanTransactionHelper.reverseLoanTransaction(loanId,
|
||||
chargebackTransactionId.intValue(), operationDate, responseSpecErr503);
|
||||
chargebackTransactionId, operationDate, responseSpecErr503);
|
||||
|
||||
// Try to reverse a Loan Transaction repayment with linked transactions
|
||||
reverseTransactionResponse = loanTransactionHelper.reverseLoanTransaction(loanId, transactionId.intValue(), operationDate,
|
||||
responseSpecErr503);
|
||||
reverseTransactionResponse = loanTransactionHelper.reverseLoanTransaction(loanId, transactionId, operationDate, responseSpecErr503);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -138,7 +140,7 @@ public class LoanTransactionChargebackTest {
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
||||
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "0.00", 0, responseSpecErr400);
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "0.00", 0, responseSpecErr400);
|
||||
|
||||
}
|
||||
|
||||
@@ -163,12 +165,12 @@ public class LoanTransactionChargebackTest {
|
||||
loanId);
|
||||
assertNotNull(loanIdTransactionsResponse);
|
||||
final Long transactionId = loanIdTransactionsResponse.getResourceId();
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0, Double.valueOf("666.67"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("666.67"));
|
||||
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(),
|
||||
amount.toString(), 0, responseSpec);
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1, Double.valueOf("666.67"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId.intValue(), 0, Double.valueOf("1000.00"));
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, amount.toString(), 0,
|
||||
responseSpec);
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("666.67"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("1000.00"));
|
||||
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
@@ -186,7 +188,7 @@ public class LoanTransactionChargebackTest {
|
||||
}
|
||||
|
||||
loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, Double.valueOf(baseAmount));
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("333.33"));
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -205,11 +207,16 @@ public class LoanTransactionChargebackTest {
|
||||
log.info("Try to apply the Charge back over transaction Id {} with type {}", loanTransaction.getId(),
|
||||
loanTransaction.getType().getCode());
|
||||
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, loanTransaction.getId().intValue(), amountVal, 0, responseSpecErr503);
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, loanTransaction.getId(), amountVal, 0, responseSpecErr503);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void applyLoanTransactionChargebackAfterMature() {
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE);
|
||||
final LocalDate todaysDate = Utils.getLocalDateOfTenant();
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate);
|
||||
log.info("Current Business date {}", todaysDate);
|
||||
|
||||
// Client and Loan account creation
|
||||
final Integer loanId = createAccounts(45, 1);
|
||||
|
||||
@@ -236,13 +243,12 @@ public class LoanTransactionChargebackTest {
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "500.00", 0,
|
||||
responseSpec);
|
||||
Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec);
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId.intValue(), 0, Double.valueOf("500.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("500.00"));
|
||||
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
@@ -264,11 +270,10 @@ public class LoanTransactionChargebackTest {
|
||||
}
|
||||
}
|
||||
|
||||
chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "300.00", 0,
|
||||
responseSpec);
|
||||
chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "300.00", 0, responseSpec);
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 2, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId.intValue(), 0, Double.valueOf("800.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("800.00"));
|
||||
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
@@ -293,6 +298,17 @@ public class LoanTransactionChargebackTest {
|
||||
assertEquals(Double.valueOf("800.00"), period.getPrincipalDue());
|
||||
}
|
||||
}
|
||||
|
||||
// Move the Business date few days to get Collection data
|
||||
LocalDate businessDate = todaysDate.plusDays(4);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
|
||||
log.info("Current Business date {}", businessDate);
|
||||
|
||||
// Get loan details expecting to have a delinquency classification
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 4, Double.valueOf("800.00"));
|
||||
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -315,13 +331,13 @@ public class LoanTransactionChargebackTest {
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "200.00", 0,
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "200.00", 0,
|
||||
responseSpec);
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId.intValue(), 0, Double.valueOf("100.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("100.00"));
|
||||
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
@@ -354,13 +370,13 @@ public class LoanTransactionChargebackTest {
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "100.00", 0,
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "100.00", 0,
|
||||
responseSpec);
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
@@ -389,15 +405,15 @@ public class LoanTransactionChargebackTest {
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
||||
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
GetDelinquencyRangesResponse delinquencyRange = getLoansLoanIdResponse.getDelinquencyRange();
|
||||
assertNull(delinquencyRange);
|
||||
log.info("Loan Delinquency Range is null {}", (delinquencyRange == null));
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "50.00", 0,
|
||||
final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "50.00", 0,
|
||||
responseSpec);
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
assertNotNull(getLoansLoanIdResponse);
|
||||
@@ -412,6 +428,11 @@ public class LoanTransactionChargebackTest {
|
||||
|
||||
@Test
|
||||
public void applyMultipleLoanTransactionChargeback() {
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE);
|
||||
final LocalDate todaysDate = Utils.getLocalDateOfTenant();
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate);
|
||||
log.info("Current Business date {}", todaysDate);
|
||||
|
||||
// Client and Loan account creation
|
||||
final Integer loanId = createAccounts(15, 1);
|
||||
|
||||
@@ -431,9 +452,9 @@ public class LoanTransactionChargebackTest {
|
||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
||||
|
||||
// First round, empty array
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 0, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "200.00", 0, responseSpec);
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
|
||||
|
||||
Double expectedAmount = Double.valueOf("200.00");
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
@@ -441,24 +462,24 @@ public class LoanTransactionChargebackTest {
|
||||
|
||||
loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount);
|
||||
loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse);
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, expectedAmount);
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00"));
|
||||
|
||||
// Second round, array size equal to 1
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 1, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "300.00", 1, responseSpec);
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "300.00", 1, responseSpec);
|
||||
|
||||
expectedAmount = Double.valueOf("500.00");
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, expectedAmount);
|
||||
|
||||
loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount);
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, expectedAmount);
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00"));
|
||||
|
||||
// Third round, array size equal to 2
|
||||
reviewLoanTransactionRelations(loanId, transactionId.intValue(), 2, Double.valueOf("0.00"));
|
||||
reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00"));
|
||||
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId.intValue(), "500.00", 0, responseSpec);
|
||||
loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec);
|
||||
|
||||
expectedAmount = Double.valueOf("1000.00");
|
||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||
@@ -467,7 +488,9 @@ public class LoanTransactionChargebackTest {
|
||||
loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount);
|
||||
loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
|
||||
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, expectedAmount);
|
||||
DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00"));
|
||||
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
|
||||
}
|
||||
|
||||
private Integer createAccounts(final Integer daysToSubtract, final Integer numberOfRepayments) {
|
||||
@@ -515,12 +538,12 @@ public class LoanTransactionChargebackTest {
|
||||
return loanId;
|
||||
}
|
||||
|
||||
private void reviewLoanTransactionRelations(final Integer loanId, final Integer transactionId, final Integer expectedSize,
|
||||
private void reviewLoanTransactionRelations(final Integer loanId, final Long transactionId, final Integer expectedSize,
|
||||
final Double outstandingBalance) {
|
||||
log.info("Loan Transaction Id: {} {}", loanId, transactionId);
|
||||
|
||||
GetLoansLoanIdTransactionsTransactionIdResponse getLoansTransactionResponse = loanTransactionHelper.getLoanTransaction(loanId,
|
||||
transactionId);
|
||||
transactionId.intValue());
|
||||
log.info("Loan with {} Chargeback Transactions and balance {}", getLoansTransactionResponse.getTransactionRelations().size(),
|
||||
getLoansTransactionResponse.getOutstandingLoanBalance());
|
||||
assertNotNull(getLoansTransactionResponse);
|
||||
|
||||
+6
-6
@@ -469,9 +469,9 @@ public class LoanTransactionHelper extends IntegrationTest {
|
||||
return ok(fineract().loanTransactions.executeLoanTransaction(loanId, request, "repayment"));
|
||||
}
|
||||
|
||||
public PostLoansLoanIdTransactionsResponse reverseLoanTransaction(final Integer loanId, final Integer transactionId, String date,
|
||||
public PostLoansLoanIdTransactionsResponse reverseLoanTransaction(final Integer loanId, final Long transactionId, String date,
|
||||
ResponseSpecification responseSpec) {
|
||||
return postLoanTransaction(createLoanTransactionURL(UNDO, loanId, transactionId), getUndoJsonBody(date), responseSpec);
|
||||
return postLoanTransaction(createLoanTransactionURL(UNDO, loanId, transactionId.intValue()), getUndoJsonBody(date), responseSpec);
|
||||
}
|
||||
|
||||
public PostLoansLoanIdTransactionsTransactionIdResponse reverseLoanTransaction(final Long loanId, final Long transactionId,
|
||||
@@ -1229,7 +1229,7 @@ public class LoanTransactionHelper extends IntegrationTest {
|
||||
}
|
||||
}
|
||||
|
||||
public Long applyChargebackTransaction(final Integer loanId, final Integer transactionId, final String amount,
|
||||
public Long applyChargebackTransaction(final Integer loanId, final Long transactionId, final String amount,
|
||||
final Integer paymentTypeIdx, ResponseSpecification responseSpec) {
|
||||
List<GetPaymentTypesResponse> paymentTypeList = PaymentTypeHelper.getSystemPaymentType(this.requestSpec, this.responseSpec);
|
||||
assertTrue(!paymentTypeList.isEmpty());
|
||||
@@ -1237,15 +1237,15 @@ public class LoanTransactionHelper extends IntegrationTest {
|
||||
final String payload = createChargebackPayload(amount, paymentTypeList.get(paymentTypeIdx).getId());
|
||||
log.info("Loan Chargeback: {}", payload);
|
||||
PostLoansLoanIdTransactionsTransactionIdResponse postLoansTransactionCommandResponse = applyLoanTransactionCommand(loanId,
|
||||
transactionId, "chargeback", payload, responseSpec);
|
||||
transactionId.intValue(), "chargeback", payload, responseSpec);
|
||||
assertNotNull(postLoansTransactionCommandResponse);
|
||||
|
||||
log.info("Loan Chargeback Id: {}", postLoansTransactionCommandResponse.getResourceId());
|
||||
return postLoansTransactionCommandResponse.getResourceId();
|
||||
}
|
||||
|
||||
public void reviewLoanTransactionRelations(final Integer loanId, final Integer transactionId, final Integer expectedSize) {
|
||||
GetLoansLoanIdTransactionsTransactionIdResponse getLoansTransactionResponse = getLoanTransaction(loanId, transactionId);
|
||||
public void reviewLoanTransactionRelations(final Integer loanId, final Long transactionId, final Integer expectedSize) {
|
||||
GetLoansLoanIdTransactionsTransactionIdResponse getLoansTransactionResponse = getLoanTransaction(loanId, transactionId.intValue());
|
||||
assertNotNull(getLoansTransactionResponse);
|
||||
assertNotNull(getLoansTransactionResponse.getTransactionRelations());
|
||||
assertEquals(expectedSize, getLoansTransactionResponse.getTransactionRelations().size());
|
||||
|
||||
+4
-4
@@ -125,8 +125,8 @@ public class DelinquencyBucketsHelper {
|
||||
if (getCollectionData != null) {
|
||||
log.info("Loan Delinquency Data in Days {} and Amount {}", getCollectionData.getPastDueDays(),
|
||||
getCollectionData.getDelinquentAmount());
|
||||
assertEquals(pastDueDays, getCollectionData.getPastDueDays());
|
||||
assertEquals(amountExpected, getCollectionData.getDelinquentAmount());
|
||||
assertEquals(pastDueDays, getCollectionData.getPastDueDays(), "Past due days");
|
||||
assertEquals(amountExpected, getCollectionData.getDelinquentAmount(), "Amount expected");
|
||||
} else {
|
||||
log.info("Loan Delinquency Data is null");
|
||||
}
|
||||
@@ -135,8 +135,8 @@ public class DelinquencyBucketsHelper {
|
||||
if (delinquencyRange != null) {
|
||||
log.info("Loan Delinquency Classification is {} : ({} - {}) {}", delinquencyRange.getClassification(),
|
||||
delinquencyRange.getMinimumAgeDays(), delinquencyRange.getMaximumAgeDays(), pastDueDays);
|
||||
assertTrue(delinquencyRange.getMinimumAgeDays() <= pastDueDays);
|
||||
assertTrue(delinquencyRange.getMaximumAgeDays() >= pastDueDays);
|
||||
assertTrue(delinquencyRange.getMinimumAgeDays() <= pastDueDays, "Min Age Days");
|
||||
assertTrue(delinquencyRange.getMaximumAgeDays() >= pastDueDays, "Max Age Days");
|
||||
} else {
|
||||
log.info("Loan Delinquency Classification is null");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user