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;
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;
@@ -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;
}
}
@@ -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);
}