FINERACT-2065: Fix schedule handling with higher fixed length value than Loan term

This commit is contained in:
Jose Alberto Hernandez
2024-04-11 15:35:21 +02:00
committed by Adam Saghy
parent 5ad63752c9
commit 35bdbccd2e
5 changed files with 225 additions and 10 deletions
@@ -91,8 +91,8 @@ public abstract class AbstractProgressiveLoanScheduleGenerator implements LoanSc
boolean isNextRepaymentAvailable = true;
while (!scheduleParams.getOutstandingBalance().isZero()) {
scheduleParams.setActualRepaymentDate(getScheduledDateGenerator()
.generateNextRepaymentDate(scheduleParams.getActualRepaymentDate(), loanApplicationTerms, isFirstRepayment));
scheduleParams.setActualRepaymentDate(getScheduledDateGenerator().generateNextRepaymentDate(
scheduleParams.getActualRepaymentDate(), loanApplicationTerms, isFirstRepayment, scheduleParams.getPeriodNumber()));
AdjustedDateDetailsDTO adjustedDateDetailsDTO = getScheduledDateGenerator()
.adjustRepaymentDate(scheduleParams.getActualRepaymentDate(), loanApplicationTerms, holidayDetailDTO);
scheduleParams.setActualRepaymentDate(adjustedDateDetailsDTO.getChangedActualRepaymentDate());
@@ -601,6 +601,7 @@ public abstract class AbstractProgressiveLoanScheduleGenerator implements LoanSc
LoanTermVariationsData loanTermVariationsData = loanApplicationTerms.getLoanTermVariations().nextDueDateVariation();
if (DateUtils.isEqual(modifiedScheduledDueDate, loanTermVariationsData.getTermVariationApplicableFrom())) {
modifiedScheduledDueDate = loanTermVariationsData.getDateValue();
loanApplicationTerms.updateVariationDays(DateUtils.getDifferenceInDays(scheduledDueDate, modifiedScheduledDueDate));
if (!loanTermVariationsData.isSpecificToInstallment()) {
scheduleParams.setActualRepaymentDate(modifiedScheduledDueDate);
loanApplicationTerms.setNewScheduledDueDateStart(modifiedScheduledDueDate);
@@ -103,10 +103,20 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator {
}
}
final LocalDate maxDateForFixedLength = loanApplicationTerms.calculateMaxDateForFixedLength();
// Fixed Length validation
if (maxDateForFixedLength != null && DateUtils.isAfter(dueRepaymentPeriodDate, maxDateForFixedLength)) {
dueRepaymentPeriodDate = maxDateForFixedLength;
return dueRepaymentPeriodDate;
}
@Override
public LocalDate generateNextRepaymentDate(LocalDate lastRepaymentDate, LoanApplicationTerms loanApplicationTerms,
final boolean isFirstRepayment, final Integer periodNumber) {
LocalDate dueRepaymentPeriodDate = generateNextRepaymentDate(lastRepaymentDate, loanApplicationTerms, isFirstRepayment);
// Fixed Length validation only for Last Installment
if (loanApplicationTerms.isLastPeriod(periodNumber)) {
final LocalDate maxDateForFixedLength = loanApplicationTerms.calculateMaxDateForFixedLength();
if (maxDateForFixedLength != null && dueRepaymentPeriodDate.compareTo(maxDateForFixedLength) != 0) {
dueRepaymentPeriodDate = maxDateForFixedLength;
}
}
return dueRepaymentPeriodDate;
@@ -34,6 +34,9 @@ public interface ScheduledDateGenerator {
LocalDate generateNextRepaymentDate(LocalDate lastRepaymentDate, LoanApplicationTerms loanApplicationTerms, boolean isFirstRepayment);
LocalDate generateNextRepaymentDate(LocalDate lastRepaymentDate, LoanApplicationTerms loanApplicationTerms, boolean isFirstRepayment,
Integer periodNumber);
AdjustedDateDetailsDTO adjustRepaymentDate(LocalDate dueRepaymentPeriodDate, LoanApplicationTerms loanApplicationTerms,
HolidayDetailDTO holidayDetailDTO);