Merge pull request #1075 from pramodn02/develop
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;
|
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;
|
||||||
|
|||||||
+20
-6
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+2
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user