This is an automated email from the ASF dual-hosted git repository.
ptuomola pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git
The following commit(s) were added to refs/heads/develop by this push:
new 5c68e8b Holiday rescheduling feature
5c68e8b is described below
commit 5c68e8b4a5c5560ba5b295ec542f85fbbbd4e260
Author: xurror <[email protected]>
AuthorDate: Thu May 13 06:37:44 2021 +0100
Holiday rescheduling feature
---
.../portfolio/loanaccount/domain/Loan.java | 65 +++++++++++++++++++---
.../LoanWritePlatformServiceJpaRepositoryImpl.java | 2 +-
2 files changed, 58 insertions(+), 9 deletions(-)
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
index 60c9afa..2ea7e17 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
@@ -125,10 +125,12 @@ import
org.apache.fineract.portfolio.loanaccount.exception.MultiDisbursementData
import
org.apache.fineract.portfolio.loanaccount.exception.UndoLastTrancheDisbursementException;
import
org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleDTO;
import
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator;
+import
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator;
import
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
import
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleGenerator;
import
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel;
import
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModelPeriod;
+import org.apache.fineract.portfolio.loanaccount.service.LoanUtilService;
import org.apache.fineract.portfolio.loanproduct.domain.AmortizationMethod;
import
org.apache.fineract.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
import org.apache.fineract.portfolio.loanproduct.domain.InterestMethod;
@@ -4524,12 +4526,61 @@ public class Loan extends AbstractPersistableCustom {
// startDate
}
- public void applyHolidayToRepaymentScheduleDates(final Holiday holiday) {
+ public void applyHolidayToRepaymentScheduleDates(final Holiday holiday,
final LoanUtilService loanUtilService) {
+ final DefaultScheduledDateGenerator scheduledDateGenerator = new
DefaultScheduledDateGenerator();
+ ScheduleGeneratorDTO scheduleGeneratorDTO =
loanUtilService.buildScheduleGeneratorDTO(this, holiday.getFromDateLocalDate());
+ final LoanApplicationTerms loanApplicationTerms =
this.constructLoanApplicationTerms(scheduleGeneratorDTO);
+
+ // LocalDate rescheduleFromDate = holiday.getFromDateLocalDate();
+ LocalDate adjustedRescheduleToDate = null;
+
+ if (holiday.getReScheduleType().isResheduleToNextRepaymentDate()) {
+ final LocalDate rescheduleToDate = holiday.getToDateLocalDate();
+ for (final LoanRepaymentScheduleInstallment
loanRepaymentScheduleInstallment : this.getRepaymentScheduleInstallments()) {
+ if
(rescheduleToDate.isEqual(loanRepaymentScheduleInstallment.getDueDate())) {
+ adjustedRescheduleToDate = rescheduleToDate;
+ break;
+ } else {
+ // Account for a Bimonthly Loan Product
+ // if
(loanApplicationTerms.getRepaymentPeriodFrequencyType().isSemiMonthly()) {
+ // if
(rescheduleToDate.isAfter(loanRepaymentScheduleInstallment.getDueDate())
+ // &&
rescheduleToDate.isBefore(loanRepaymentScheduleInstallment.getDueDate().plusDays(15)))
{
+ // adjustedRescheduleToDate =
loanRepaymentScheduleInstallment.getDueDate();
+ // break;
+ // }
+ // } else {
+ // // Once Bimonthly product implemented, Replace the
`Standard Monthly Loan Holiday check` below
+ // HERE
+ // if
(rescheduleToDate.isAfter(loanRepaymentScheduleInstallment.getDueDate())
+ // &&
rescheduleToDate.isBefore(loanRepaymentScheduleInstallment.getDueDate().plusDays(30)))
{
+ // adjustedRescheduleToDate =
loanRepaymentScheduleInstallment.getDueDate();
+ // break;
+ // }
+ // }
+
+ // Standard Monthly Loan Holiday check
+ if
(rescheduleToDate.isAfter(loanRepaymentScheduleInstallment.getDueDate())
+ &&
rescheduleToDate.isBefore(loanRepaymentScheduleInstallment.getDueDate().plusDays(30)))
{
+ adjustedRescheduleToDate =
loanRepaymentScheduleInstallment.getDueDate();
+ break;
+ }
+ }
+ }
+ } else {
+ adjustedRescheduleToDate =
holiday.getRepaymentsRescheduledToLocalDate();
+ }
+
// first repayment's from date is same as disbursement date.
LocalDate tmpFromDate = getDisbursementDate();
+
// Loop through all loanRepayments
List<LoanRepaymentScheduleInstallment> installments =
getRepaymentScheduleInstallments();
for (final LoanRepaymentScheduleInstallment
loanRepaymentScheduleInstallment : installments) {
+
+ if (adjustedRescheduleToDate == null) {
+ break;
+ }
+
final LocalDate oldDueDate =
loanRepaymentScheduleInstallment.getDueDate();
// update from date if it's not same as previous installament's due
@@ -4537,17 +4588,15 @@ public class Loan extends AbstractPersistableCustom {
if
(!loanRepaymentScheduleInstallment.getFromDate().isEqual(tmpFromDate)) {
loanRepaymentScheduleInstallment.updateFromDate(tmpFromDate);
}
- if (oldDueDate.isAfter(holiday.getToDateLocalDate())) {
- break;
- }
- if (oldDueDate.equals(holiday.getFromDateLocalDate()) ||
oldDueDate.equals(holiday.getToDateLocalDate())
- || (oldDueDate.isAfter(holiday.getFromDateLocalDate()) &&
oldDueDate.isBefore(holiday.getToDateLocalDate()))) {
+ if (oldDueDate.equals(holiday.getFromDateLocalDate()) ||
oldDueDate.isAfter(holiday.getFromDateLocalDate())) {
// FIXME: AA do we need to apply non-working days.
// Assuming holiday's repayment reschedule to date cannot be
// created on a non-working day.
- final LocalDate newRepaymentDate =
holiday.getRepaymentsRescheduledToLocalDate();
-
loanRepaymentScheduleInstallment.updateDueDate(newRepaymentDate);
+
+ adjustedRescheduleToDate =
scheduledDateGenerator.generateNextRepaymentDate(adjustedRescheduleToDate,
loanApplicationTerms,
+ false);
+
loanRepaymentScheduleInstallment.updateDueDate(adjustedRescheduleToDate);
}
tmpFromDate = loanRepaymentScheduleInstallment.getDueDate();
}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index d4bb52b..448cce7 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -2615,7 +2615,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl
implements LoanWritePlatf
for (final Loan loan : loans) {
// apply holiday
- loan.applyHolidayToRepaymentScheduleDates(holiday);
+ loan.applyHolidayToRepaymentScheduleDates(holiday,
this.loanUtilService);
}
this.loanRepositoryWrapper.save(loans);
holiday.processed();