FINERACT-2081: Fix ProgressiveEMICalculator caused infinite loop on AdvancedPaymentScheduleTransactionProcessor

This commit is contained in:
Soma Sörös
2025-02-26 12:25:21 +01:00
committed by Adam Saghy
parent a72d3ff423
commit 3dd62803e6
2 changed files with 76 additions and 4 deletions
@@ -257,10 +257,23 @@ public final class ProgressiveEMICalculator implements EMICalculator {
ProgressiveLoanInterestScheduleModel recalculatedScheduleModelTillDate = recalculateScheduleModelTillDate(scheduleModel,
periodDueDate, targetDate);
RepaymentPeriod repaymentPeriod = recalculatedScheduleModelTillDate.findRepaymentPeriodByDueDate(periodDueDate).orElseThrow();
boolean multiplePeriodIsUnpaid = recalculatedScheduleModelTillDate.repaymentPeriods().stream().filter(rp -> !rp.isFullyPaid())
.count() > 1L;
if (multiplePeriodIsUnpaid && !targetDate.isAfter(repaymentPeriod.getFromDate())) {
repaymentPeriod.setEmi(repaymentPeriod.getOriginalEmi());
long notFullyRepaidRepaymentPeriodCount = recalculatedScheduleModelTillDate.repaymentPeriods().stream()
.filter(rp -> !rp.isFullyPaid()).count();
boolean multiplePeriodIsUnpaid = notFullyRepaidRepaymentPeriodCount > 1L;
boolean onePeriodIsUnpaid = notFullyRepaidRepaymentPeriodCount == 1L;
if (!targetDate.isAfter(repaymentPeriod.getFromDate())) {
if (multiplePeriodIsUnpaid) {
repaymentPeriod.setEmi(repaymentPeriod.getOriginalEmi());
} else if (repaymentPeriod.isFullyPaid() && onePeriodIsUnpaid) {
repaymentPeriod.setEmi(MathUtil.min(repaymentPeriod.getOriginalEmi(), //
recalculatedScheduleModelTillDate.getTotalDuePrincipal() //
.minus(recalculatedScheduleModelTillDate.getTotalPaidPrincipal()) //
.add(recalculatedScheduleModelTillDate.getTotalDueInterest()) //
.minus(recalculatedScheduleModelTillDate.getTotalPaidInterest()) //
.add(repaymentPeriod.getPaidPrincipal()) //
.add(repaymentPeriod.getPaidInterest()),
false)); //
}
}
return new PeriodDueDetails(repaymentPeriod.getEmi(), //