MIFOSX-1549 : corrected first repayment date
This commit is contained in:
+9
-7
@@ -122,7 +122,6 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
||||
int daysCalcForInstallmentNumber = 0;
|
||||
LocalDate scheduleStartDateAsPerFrequency = periodStartDate;
|
||||
while (!outstandingBalance.isZero()) {
|
||||
isFirstRepayment = false;
|
||||
// to insert a new schedule between actual schedule to collect
|
||||
// interest(till the transaction date) first on a payment
|
||||
boolean recalculatedInterestComponent = false;
|
||||
@@ -143,6 +142,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
||||
if (interestonlyPeriodDetail == null) {
|
||||
actualRepaymentDate = this.scheduledDateGenerator.generateNextRepaymentDate(actualRepaymentDate, loanApplicationTerms,
|
||||
isFirstRepayment);
|
||||
isFirstRepayment = false;
|
||||
scheduledDueDate = this.scheduledDateGenerator.adjustRepaymentDate(actualRepaymentDate, loanApplicationTerms,
|
||||
isHolidayEnabled, holidays, workingDays);
|
||||
scheduledDueDateAsPerFrequency = scheduledDueDate;
|
||||
@@ -1135,9 +1135,9 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
||||
if (scheduleInstallments.size() == 1) {
|
||||
LoanRepaymentScheduleInstallment installment = scheduleInstallments.get(0);
|
||||
if (installment.getInstallmentNumber() == 1
|
||||
&& (installment.getDueDate().isAfter(loanTransaction.getTransactionDate()) || (installment
|
||||
&& (installment.getDueDate().isAfter(processTransactionsForInterestCompound) || (installment
|
||||
.isRecalculatedInterestComponent() && installment.getDueDate()
|
||||
.isEqual(loanTransaction.getTransactionDate())))) {
|
||||
.isEqual(processTransactionsForInterestCompound)))) {
|
||||
isBeforeFirstInstallment = true;
|
||||
}
|
||||
}
|
||||
@@ -1395,11 +1395,13 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
||||
|
||||
private LocalDate getNextRestScheduleDate(LocalDate startDate, LoanApplicationTerms loanApplicationTerms,
|
||||
final boolean isHolidayEnabled, final List<Holiday> holidays, final WorkingDays workingDays) {
|
||||
CalendarInstance calendarInstance = loanApplicationTerms.getRestCalendarInstance();
|
||||
LocalDate nextScheduleDate = CalendarUtils.getNextScheduleDate(calendarInstance.getCalendar(), startDate);
|
||||
LocalDate nextScheduleDate = null;
|
||||
if (loanApplicationTerms.getRecalculationFrequencyType().isSameAsRepayment()) {
|
||||
nextScheduleDate = this.scheduledDateGenerator.adjustRepaymentDate(nextScheduleDate, loanApplicationTerms, isHolidayEnabled,
|
||||
holidays, workingDays);
|
||||
nextScheduleDate = this.scheduledDateGenerator.generateNextScheduleDateStartingFromDisburseDate(startDate,
|
||||
loanApplicationTerms, isHolidayEnabled, holidays, workingDays);
|
||||
} else {
|
||||
CalendarInstance calendarInstance = loanApplicationTerms.getRestCalendarInstance();
|
||||
nextScheduleDate = CalendarUtils.getNextScheduleDate(calendarInstance.getCalendar(), startDate);
|
||||
}
|
||||
|
||||
return nextScheduleDate;
|
||||
|
||||
+20
-6
@@ -104,25 +104,25 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator {
|
||||
isScheduledDate = (diff % repaidEvery) == 0;
|
||||
break;
|
||||
case WEEKS:
|
||||
int weekDiff =Weeks.weeksBetween(startDate, date).getWeeks();
|
||||
int weekDiff = Weeks.weeksBetween(startDate, date).getWeeks();
|
||||
isScheduledDate = (weekDiff % repaidEvery) == 0;
|
||||
if(isScheduledDate){
|
||||
if (isScheduledDate) {
|
||||
LocalDate modifiedDate = startDate.plusWeeks(weekDiff);
|
||||
isScheduledDate = modifiedDate.isEqual(date);
|
||||
}
|
||||
break;
|
||||
case MONTHS:
|
||||
int monthDiff =Months.monthsBetween(startDate, date).getMonths();
|
||||
int monthDiff = Months.monthsBetween(startDate, date).getMonths();
|
||||
isScheduledDate = (monthDiff % repaidEvery) == 0;
|
||||
if(isScheduledDate){
|
||||
if (isScheduledDate) {
|
||||
LocalDate modifiedDate = startDate.plusMonths(monthDiff);
|
||||
isScheduledDate = modifiedDate.isEqual(date);
|
||||
}
|
||||
break;
|
||||
case YEARS:
|
||||
int yearDiff =Years.yearsBetween(startDate, date).getYears();
|
||||
int yearDiff = Years.yearsBetween(startDate, date).getYears();
|
||||
isScheduledDate = (yearDiff % repaidEvery) == 0;
|
||||
if(isScheduledDate){
|
||||
if (isScheduledDate) {
|
||||
LocalDate modifiedDate = startDate.plusYears(yearDiff);
|
||||
isScheduledDate = modifiedDate.isEqual(date);
|
||||
}
|
||||
@@ -158,4 +158,18 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator {
|
||||
|
||||
return idealDisbursementDate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalDate generateNextScheduleDateStartingFromDisburseDate(LocalDate lastRepaymentDate,
|
||||
LoanApplicationTerms loanApplicationTerms, boolean isHolidayEnabled, List<Holiday> holidays, WorkingDays workingDays) {
|
||||
|
||||
LocalDate generatedDate = loanApplicationTerms.getExpectedDisbursementDate();
|
||||
boolean isFirstRepayment = true;
|
||||
while (!generatedDate.isAfter(lastRepaymentDate)) {
|
||||
generatedDate = generateNextRepaymentDate(generatedDate, loanApplicationTerms, isFirstRepayment);
|
||||
isFirstRepayment = false;
|
||||
}
|
||||
generatedDate = adjustRepaymentDate(generatedDate, loanApplicationTerms, isHolidayEnabled, holidays, workingDays);
|
||||
return generatedDate;
|
||||
}
|
||||
}
|
||||
+2
@@ -29,4 +29,6 @@ public interface ScheduledDateGenerator {
|
||||
|
||||
Boolean isDateFallsInSchedule(PeriodFrequencyType frequency, int repaidEvery, LocalDate startDate, LocalDate date);
|
||||
|
||||
LocalDate generateNextScheduleDateStartingFromDisburseDate(LocalDate lastRepaymentDate, LoanApplicationTerms loanApplicationTerms,
|
||||
boolean isHolidayEnabled, List<Holiday> holidays, final WorkingDays workingDays);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user