Merge pull request #1075 from pramodn02/develop

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