diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java index f4c5bdda3..958ce5c85 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java @@ -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 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; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java index 8f047f829..e777a8dd1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java @@ -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 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; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java index 16bb22093..1456e85d4 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java @@ -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 holidays, final WorkingDays workingDays); }