FINERACT-2390: Fix infinite loop issue

This commit is contained in:
Adam Saghy
2025-10-28 09:25:47 +01:00
parent 1596d09e54
commit b32837e9b4
4 changed files with 107 additions and 4 deletions
@@ -690,6 +690,21 @@ public final class ProgressiveEMICalculator implements EMICalculator {
}
private void calculateLastUnpaidRepaymentPeriodEMI(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate tillDate) {
Money totalDuePaidDiff = scheduleModel.getTotalDuePrincipal().minus(scheduleModel.getTotalPaidPrincipal());
// Remove outstanding principal from EMI in case outstanding principal is greater than total due minus paid
// diff. We need this extra step in case excessive principal was paid with LAST_INSTALLMENT strategy
scheduleModel.repaymentPeriods().forEach(rp -> {
if (rp.getOutstandingPrincipal().isGreaterThan(totalDuePaidDiff)) {
Money delta = rp.getOutstandingPrincipal().minus(totalDuePaidDiff);
rp.setEmi(rp.getEmi().minus(delta));
Money minimumEMI = MathUtil.plus(rp.getPaidInterest(), rp.getPaidPrincipal());
if (rp.getEmi().isLessThan(minimumEMI)) {
rp.setEmi(minimumEMI);
}
}
});
Optional<RepaymentPeriod> findLastUnpaidRepaymentPeriod = scheduleModel.repaymentPeriods().stream().filter(rp -> !rp.isFullyPaid())
.reduce((first, second) -> second);