FINERACT-2152: Fix interest pause on the 1st day of the 1st period

This commit is contained in:
Oleksii Novikov
2025-06-02 21:24:15 +02:00
committed by Arnold Gálovics
parent c44972043e
commit 42f5de937d
2 changed files with 44 additions and 9 deletions
@@ -161,13 +161,13 @@ public class ProgressiveLoanInterestScheduleModel {
if (repaymentPeriods.isEmpty()) {
return 0;
}
final RepaymentPeriod firstPeriod = repaymentPeriods.get(0);
final RepaymentPeriod firstPeriod = repaymentPeriods.getFirst();
final RepaymentPeriod lastPeriod = repaymentPeriods.size() > 1 ? getLastRepaymentPeriod() : firstPeriod;
return DateUtils.getExactDifferenceInDays(firstPeriod.getFromDate(), lastPeriod.getDueDate());
}
public LocalDate getStartDate() {
return !repaymentPeriods.isEmpty() ? repaymentPeriods.get(0).getFromDate() : null;
return !repaymentPeriods.isEmpty() ? repaymentPeriods.getFirst().getFromDate() : null;
}
public LocalDate getMaturityDate() {
@@ -264,7 +264,9 @@ public class ProgressiveLoanInterestScheduleModel {
}
private void insertInterestPausePeriods(final RepaymentPeriod repaymentPeriod, final LocalDate pauseStart, final LocalDate pauseEnd) {
final LocalDate effectivePauseStart = pauseStart.minusDays(1);
final boolean isPauseStartOnFirstDayOfPeriod = pauseStart.isEqual(repaymentPeriod.getFromDate().plusDays(1));
final LocalDate effectivePauseStart = isPauseStartOnFirstDayOfPeriod ? pauseStart : pauseStart.minusDays(1);
final LocalDate finalPauseStart = effectivePauseStart.isBefore(repaymentPeriod.getFromDate()) ? repaymentPeriod.getFromDate()
: effectivePauseStart;
final LocalDate finalPauseEnd = pauseEnd.isAfter(repaymentPeriod.getDueDate()) ? repaymentPeriod.getDueDate() : pauseEnd;
@@ -302,7 +304,7 @@ public class ProgressiveLoanInterestScheduleModel {
} else {
return repaymentPeriod.getInterestPeriods().stream()
.filter(ip -> date.isAfter(ip.getFromDate()) && !date.isAfter(ip.getDueDate())).reduce((first, second) -> second)
.orElse(repaymentPeriod.getInterestPeriods().get(0));
.orElse(repaymentPeriod.getInterestPeriods().getFirst());
}
}
@@ -357,10 +359,6 @@ public class ProgressiveLoanInterestScheduleModel {
return MathUtil.negativeToZero(getTotalDuePrincipal().minus(getTotalPaidPrincipal()));
}
public Money getTotalOutstandingInterest() {
return MathUtil.negativeToZero(getTotalDueInterest().minus(getTotalPaidInterest()));
}
public Optional<RepaymentPeriod> findRepaymentPeriod(@NotNull LocalDate transactionDate) {
return repaymentPeriods.stream() //
.filter(period -> isInPeriod(transactionDate, period.getFromDate(), period.getDueDate(), period.isFirstRepaymentPeriod()))//
@@ -381,7 +379,7 @@ public class ProgressiveLoanInterestScheduleModel {
@NotNull
public RepaymentPeriod getLastRepaymentPeriod() {
return repaymentPeriods.get(repaymentPeriods.size() - 1);
return repaymentPeriods.getLast();
}
public boolean isLastRepaymentPeriod(@NotNull RepaymentPeriod repaymentPeriod) {