FINERACT-2389: loan is not closed with outstanding amount during pay-off loan with reschedule trns

This commit is contained in:
mariiaKraievska
2026-01-23 16:11:11 +01:00
committed by Adam Saghy
parent bf879064af
commit ddc82f1b68
6 changed files with 102 additions and 59 deletions
@@ -1104,7 +1104,12 @@ public final class ProgressiveEMICalculator implements EMICalculator {
Money diff = totalDisbursedAmount.plus(totalCapitalizedIncome, mc).plus(scheduleModel.getTotalCreditedPrincipal(), mc)
.plus(totalDueInterest, mc).minus(totalEMI, mc);
repaymentPeriod.setEmi(repaymentPeriod.getEmi().add(diff, mc));
Money adjustedEmi = repaymentPeriod.getEmi().add(diff, mc);
if (repaymentPeriod.getFixedInterest().isGreaterThanZero()
&& adjustedEmi.isLessThan(repaymentPeriod.getPaidPrincipal().add(repaymentPeriod.getFixedInterest()))) {
adjustedEmi = repaymentPeriod.getPaidPrincipal().add(repaymentPeriod.getFixedInterest());
}
repaymentPeriod.setEmi(adjustedEmi);
if (repaymentPeriod.getEmi()
.isLessThan(repaymentPeriod.getTotalPaidAmount().minus(repaymentPeriod.getTotalCreditedAmount(), mc))) {
repaymentPeriod.setEmi(repaymentPeriod.getTotalPaidAmount().minus(repaymentPeriod.getTotalCreditedAmount(), mc));
@@ -248,7 +248,9 @@ public class ProgressiveLoanInterestScheduleModel {
previousInterestPeriod.addBalanceCorrectionAmount(correctionAmount);
final InterestPeriod interestPeriod = InterestPeriod.withEmptyAmounts(repaymentPeriod, newDueDate, originalDueDate, isPaused);
repaymentPeriod.getInterestPeriods().add(interestPeriod);
final List<InterestPeriod> interestPeriods = repaymentPeriod.getInterestPeriods();
final int previousIndex = interestPeriods.indexOf(previousInterestPeriod);
interestPeriods.add(previousIndex + 1, interestPeriod);
}
private void insertInterestPausePeriods(final RepaymentPeriod repaymentPeriod, final LocalDate pauseStart, final LocalDate pauseEnd) {
@@ -287,13 +289,8 @@ public class ProgressiveLoanInterestScheduleModel {
}
private InterestPeriod findPreviousInterestPeriod(final RepaymentPeriod repaymentPeriod, final LocalDate date) {
if (date.isAfter(repaymentPeriod.getFromDate())) {
return repaymentPeriod.getLastInterestPeriod();
} else {
return repaymentPeriod.getInterestPeriods().stream()
.filter(ip -> date.isAfter(ip.getFromDate()) && !date.isAfter(ip.getDueDate())).reduce((first, second) -> second)
.orElse(repaymentPeriod.getInterestPeriods().getFirst());
}
return repaymentPeriod.getInterestPeriods().stream().filter(ip -> date.isAfter(ip.getFromDate()) && !date.isAfter(ip.getDueDate()))
.reduce((first, second) -> second).orElse(repaymentPeriod.getInterestPeriods().getFirst());
}
/**