FINERACT-2412: full term tranche- interest pause handling

This commit is contained in:
Soma Sörös
2026-02-02 18:53:48 +01:00
committed by Adam Saghy
parent 7b322481b8
commit 9884025bd9
3 changed files with 81 additions and 51 deletions
@@ -69,7 +69,8 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
@Getter
private final MathContext mc;
private final boolean isPaused;
@Setter
private boolean isPaused;
public static InterestPeriod copy(@NotNull RepaymentPeriod repaymentPeriod, @NotNull InterestPeriod interestPeriod, MathContext mc) {
return new InterestPeriod(repaymentPeriod, interestPeriod.getFromDate(), interestPeriod.getDueDate(),
@@ -104,13 +105,6 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
zero.getMc(), isPaused);
}
public static InterestPeriod withPausedAndEmptyAmounts(@NotNull RepaymentPeriod repaymentPeriod, @NotNull LocalDate fromDate,
LocalDate dueDate) {
final Money zero = repaymentPeriod.getZero();
return new InterestPeriod(repaymentPeriod, fromDate, dueDate, BigDecimal.ZERO, BigDecimal.ZERO, zero, zero, zero, zero, zero, zero,
zero.getMc(), true);
}
@Override
public int compareTo(@NotNull InterestPeriod o) {
return getDueDate().compareTo(o.getDueDate());
@@ -29,7 +29,6 @@ import java.math.MathContext;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -253,39 +252,33 @@ public class ProgressiveLoanInterestScheduleModel {
interestPeriods.add(previousIndex + 1, interestPeriod);
}
private void insertInterestPausePeriodsByAdjustedDates(final RepaymentPeriod repaymentPeriod, final LocalDate pauseStart,
final LocalDate pauseEnd) {
boolean hasStartInterestPeriod = repaymentPeriod.getInterestPeriods().stream().filter(ip -> ip.getFromDate().isEqual(pauseStart))
.findFirst().isPresent();
if (!hasStartInterestPeriod) {
insertInterestPeriod(repaymentPeriod, pauseStart, repaymentPeriod.getZero(), repaymentPeriod.getZero(),
repaymentPeriod.getZero());
}
boolean hasEndInterestPeriod = repaymentPeriod.getInterestPeriods().stream().filter(ip -> ip.getDueDate().isEqual(pauseEnd))
.findFirst().isPresent();
if (!hasEndInterestPeriod) {
insertInterestPeriod(repaymentPeriod, pauseEnd, repaymentPeriod.getZero(), repaymentPeriod.getZero(),
repaymentPeriod.getZero());
}
repaymentPeriod.getInterestPeriods().stream()
.filter(ip -> !ip.getFromDate().isBefore(pauseStart) && !ip.getDueDate().isAfter(pauseEnd))
.forEach(ip -> ip.setPaused(true));
}
private void insertInterestPausePeriods(final RepaymentPeriod repaymentPeriod, final LocalDate pauseStart, final LocalDate pauseEnd) {
final boolean isPauseStartOnFirstDayOfPeriod = pauseStart.isEqual(repaymentPeriod.getFromDate().plusDays(1));
final LocalDate effectivePauseStart = isPauseStartOnFirstDayOfPeriod ? pauseStart : pauseStart.minusDays(1);
final LocalDate effectivePauseStart = pauseStart.minusDays(1);
final LocalDate finalPauseStart = effectivePauseStart.isBefore(repaymentPeriod.getFromDate()) ? repaymentPeriod.getFromDate()
: effectivePauseStart;
final LocalDate finalPauseEnd = pauseEnd.isAfter(repaymentPeriod.getDueDate()) ? repaymentPeriod.getDueDate() : pauseEnd;
final List<InterestPeriod> newInterestPeriods = new ArrayList<>();
for (final InterestPeriod interestPeriod : repaymentPeriod.getInterestPeriods()) {
if (interestPeriod.getDueDate().isBefore(finalPauseStart) || !interestPeriod.getFromDate().isBefore(finalPauseEnd)) {
newInterestPeriods.add(interestPeriod);
} else {
if (interestPeriod.getFromDate().isBefore(finalPauseStart)) {
final InterestPeriod leftSlice = InterestPeriod.copy(repaymentPeriod, interestPeriod);
leftSlice.setDueDate(finalPauseStart);
newInterestPeriods.add(leftSlice);
}
if (interestPeriod.getDueDate().isAfter(finalPauseEnd)) {
final InterestPeriod rightSlice = InterestPeriod.copy(repaymentPeriod, interestPeriod);
rightSlice.setFromDate(finalPauseEnd);
newInterestPeriods.add(rightSlice);
}
}
}
final InterestPeriod pausedSlice = InterestPeriod.withPausedAndEmptyAmounts(repaymentPeriod, finalPauseStart, finalPauseEnd);
newInterestPeriods.add(pausedSlice);
newInterestPeriods.sort(Comparator.comparing(InterestPeriod::getFromDate));
repaymentPeriod.setInterestPeriods(newInterestPeriods);
insertInterestPausePeriodsByAdjustedDates(repaymentPeriod, finalPauseStart, finalPauseEnd);
}
private InterestPeriod findPreviousInterestPeriod(final RepaymentPeriod repaymentPeriod, final LocalDate date) {