Skip to content

Commit 0d7b7e2

Browse files
logoutdhavalvidakovic
authored andcommitted
FINERACT-1786: Repayment schedule is wrong with late repayment (#2703)
1 parent 7b66505 commit 0d7b7e2

2 files changed

Lines changed: 86 additions & 6 deletions

File tree

fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2199,7 +2199,7 @@ private LoanScheduleDTO rescheduleNextInstallments(final MathContext mc, final L
21992199
}
22002200
isFirstRepayment = false;
22012201
LocalDate prevLastInstDate = lastInstallmentDate;
2202-
originalRepaymentDate = actualRepaymentDate.plusMonths(1);
2202+
originalRepaymentDate = actualRepaymentDate;
22032203
lastInstallmentDate = this.scheduledDateGenerator
22042204
.adjustRepaymentDate(actualRepaymentDate, loanApplicationTerms, holidayDetailDTO).getChangedScheduleDate();
22052205
LocalDate modifiedLastInstDate = null;

integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java

Lines changed: 85 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
6565
import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
6666
import org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker;
67+
import org.junit.jupiter.api.AfterEach;
6768
import org.junit.jupiter.api.Assertions;
6869
import org.junit.jupiter.api.BeforeEach;
6970
import org.junit.jupiter.api.Test;
@@ -5904,7 +5905,7 @@ public void testLoanScheduleWithInterestRecalculationAfterLatePayment() {
59045905
DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
59055906
dateFormat.setTimeZone(Utils.getTimeZoneOfTenant());
59065907
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(this.requestSpec, this.responseSpec, "42", true);
5907-
5908+
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(this.requestSpec, this.responseSpec, "43", true);
59085909
final String loanDisbursementDate = "28 January 2021";
59095910
String firstRepayment = "01 March 2021";
59105911
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
@@ -5952,11 +5953,11 @@ public void testLoanScheduleWithInterestRecalculationAfterLatePayment() {
59525953
addRepaymentValues(expectedvalues, convertStringDateToCalender("03 May 2021"), 0, false, "198.41", "2021.59", "0.0", "0.0");
59535954
this.loanTransactionHelper.makeRepayment("04 May 2021", 2220.0F, loanID);
59545955

5955-
addRepaymentValues(expectedvalues, convertStringDateToCalender("04 May 2021"), 0, false, "0.0", "63.17", "0.0", "0.0");
5956-
this.loanTransactionHelper.makeRepayment("01 June 2021", 2220.0F, loanID);
5956+
addRepaymentValues(expectedvalues, convertStringDateToCalender("04 May 2021"), 0, false, "0.0", "61.88", "0.0", "0.0");
5957+
this.loanTransactionHelper.makeRepayment("01 June 2021", 61.88F, loanID);
59575958

5958-
addRepaymentValues(expectedvalues, convertStringDateToCalender("01 June 2021"), 0, false, "424.28", "1732.55", "0.0", "0.0");
5959-
addRepaymentValues(expectedvalues, convertStringDateToCalender("01 July 2021"), 0, false, "446.97", "1773.03", "0.0", "0.0");
5959+
addRepaymentValues(expectedvalues, convertStringDateToCalender("01 June 2021"), 0, false, "487.45", "1732.55", "0.0", "0.0");
5960+
addRepaymentValues(expectedvalues, convertStringDateToCalender("01 July 2021"), 0, false, "459.37", "1760.63", "0.0", "0.0");
59605961
loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID);
59615962
Assertions.assertNotNull(loanSchedule);
59625963
verifyLoanRepaymentSchedule(loanSchedule, expectedvalues);
@@ -6018,6 +6019,78 @@ public void testInterestForFirstInstallmentWithInterestRecalculation() {
60186019
WorkingDaysHelper.updateWorkingDays(this.requestSpec, this.responseSpec);
60196020
}
60206021

6022+
@Test
6023+
public void testLoanScheduleWithInterestRecalculationForLateRepaymentOfLateRepaymentInstallments() {
6024+
this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
6025+
WorkingDaysHelper.updateWorkingDaysWeekDays(this.requestSpec, this.responseSpec);
6026+
DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
6027+
dateFormat.setTimeZone(Utils.getTimeZoneOfTenant());
6028+
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(this.requestSpec, this.responseSpec, "42", true);
6029+
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(this.requestSpec, this.responseSpec, "43", true);
6030+
final String loanDisbursementDate = "06 May 2022";
6031+
String firstRepayment = "27 May 2022";
6032+
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
6033+
ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
6034+
String principalAmount = "7800.00";
6035+
String rateOfInterest = "8.9";
6036+
String numberOfRepayments = "12";
6037+
final Integer loanProductID = createLoanProductWithInterestRecalculationAndCompoundingDetails(
6038+
LoanProductTestBuilder.INTEREST_PRINCIPAL_PENALTIES_FEES_ORDER_STRATEGY,
6039+
LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE,
6040+
LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_NUMBER_OF_INSTALLMENTS,
6041+
LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD,
6042+
LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, "12", numberOfRepayments, principalAmount,
6043+
rateOfInterest);
6044+
6045+
final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, loanDisbursementDate,
6046+
LoanApplicationTestBuilder.INTEREST_PRINCIPAL_PENALTIES_FEES_ORDER_STRATEGY, firstRepayment, numberOfRepayments,
6047+
principalAmount, rateOfInterest);
6048+
6049+
Assertions.assertNotNull(loanID);
6050+
HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
6051+
LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
6052+
6053+
LOG.info("-----------------------------------APPROVE LOAN-----------------------------------------");
6054+
loanStatusHashMap = this.loanTransactionHelper.approveLoan(loanDisbursementDate, loanID);
6055+
LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
6056+
LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
6057+
6058+
LOG.info("-------------------------------DISBURSE LOAN-------------------------------------------");
6059+
String loanDetails = this.loanTransactionHelper.getLoanDetails(this.requestSpec, this.responseSpec, loanID);
6060+
loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount(loanDisbursementDate, loanID,
6061+
JsonPath.from(loanDetails).get("netDisbursalAmount").toString());
6062+
LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
6063+
6064+
ArrayList<HashMap> loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID);
6065+
Assertions.assertNotNull(loanSchedule);
6066+
6067+
List<Map<String, Object>> expectedvalues = new ArrayList<>();
6068+
addRepaymentValues(expectedvalues, convertStringDateToCalender("27 May 2022"), 0, false, "600.72", "479.28", "0.0", "0.0");
6069+
this.loanTransactionHelper.makeRepayment("27 May 2022", 1080.0F, loanID);
6070+
6071+
addRepaymentValues(expectedvalues, convertStringDateToCalender("27 June 2022"), 0, false, "426.98", "653.02", "0.0", "0.0");
6072+
this.loanTransactionHelper.makeRepayment("27 June 2022", 1080.0F, loanID);
6073+
6074+
addRepaymentValues(expectedvalues, convertStringDateToCalender("27 July 2022"), 0, false, "485.52", "594.48", "0.0", "0.0");
6075+
this.loanTransactionHelper.makeRepayment("27 July 2022", 1080.0F, loanID);
6076+
6077+
addRepaymentValues(expectedvalues, convertStringDateToCalender("29 August 2022"), 0, false, "472.96", "607.04", "0.0", "0.0");
6078+
this.loanTransactionHelper.makeRepayment("30 August 2022", 1080.0F, loanID);
6079+
6080+
addRepaymentValues(expectedvalues, convertStringDateToCalender("30 August 2022"), 0, false, "0.0", "17.01", "0.0", "0.0");
6081+
this.loanTransactionHelper.makeRepayment("01 September 2022", 17.01F, loanID);
6082+
6083+
addRepaymentValues(expectedvalues, convertStringDateToCalender("01 September 2022"), 0, false, "0.0", "34.02", "0.0", "0.0");
6084+
this.loanTransactionHelper.makeRepayment("01 September 2022", 34.02F, loanID);
6085+
addRepaymentValues(expectedvalues, convertStringDateToCalender("27 September 2022"), 0, false, "637.7", "442.3", "0.0", "0.0");
6086+
this.loanTransactionHelper.makeRepayment("27 September 2022", 1080.0F, loanID);
6087+
6088+
loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID);
6089+
Assertions.assertNotNull(loanSchedule);
6090+
verifyLoanRepaymentSchedule(loanSchedule, expectedvalues);
6091+
WorkingDaysHelper.updateWorkingDays(this.requestSpec, this.responseSpec);
6092+
}
6093+
60216094
private Calendar convertStringDateToCalender(final String stringDate) {
60226095
DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
60236096
Calendar date = Calendar.getInstance();
@@ -6138,4 +6211,11 @@ private Integer getDayOfMonth(Calendar date) {
61386211

61396212
return dayOfMonth;
61406213
}
6214+
6215+
@AfterEach
6216+
public void tearDown() {
6217+
GlobalConfigurationHelper.resetAllDefaultGlobalConfigurations(this.requestSpec, this.responseSpec);
6218+
GlobalConfigurationHelper.verifyAllDefaultGlobalConfigurations(this.requestSpec, this.responseSpec);
6219+
}
6220+
61416221
}

0 commit comments

Comments
 (0)