MIFOSX-2497 : fixed schedule generator for waivers

This commit is contained in:
pramod
2016-04-18 13:23:43 +05:30
parent fe6e1e88fe
commit 1cd226d4c6
2 changed files with 32 additions and 14 deletions
@@ -497,7 +497,11 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
if (loanTransaction.isRepayment() || loanTransaction.isInterestWaiver() || loanTransaction.isRecoveryRepayment()) { if (loanTransaction.isRepayment() || loanTransaction.isInterestWaiver() || loanTransaction.isRecoveryRepayment()) {
loanTransaction.resetDerivedComponents(); loanTransaction.resetDerivedComponents();
} }
unProcessed = processTransaction(loanTransaction, currency, installments, amountToProcess); if (loanTransaction.isInterestWaiver()) {
processTransaction(loanTransaction, currency, installments, amountToProcess);
} else {
unProcessed = processTransaction(loanTransaction, currency, installments, amountToProcess);
}
} }
return unProcessed; return unProcessed;
} }
@@ -57,7 +57,6 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.exception.Schedule
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleModel; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleModel;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleModelRepaymentPeriod; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleModelRepaymentPeriod;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest;
import org.apache.fineract.portfolio.loanaccount.service.LoanUtilService;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductMinimumRepaymentScheduleRelatedDetail; import org.apache.fineract.portfolio.loanproduct.domain.LoanProductMinimumRepaymentScheduleRelatedDetail;
import org.joda.time.Days; import org.joda.time.Days;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
@@ -187,7 +186,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
// calculated interest start date for the period // calculated interest start date for the period
LocalDate periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms, LocalDate periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms,
scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate,
loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), loanApplicationTerms.getExpectedDisbursementDate()); loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(),
loanApplicationTerms.getExpectedDisbursementDate());
// Loan Schedule Exceptions that need to be applied for Loan Account // Loan Schedule Exceptions that need to be applied for Loan Account
LoanTermVariationParams termVariationParams = applyLoanTermVariations(loanApplicationTerms, scheduleParams, LoanTermVariationParams termVariationParams = applyLoanTermVariations(loanApplicationTerms, scheduleParams,
@@ -252,7 +252,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
} }
periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms, periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms,
scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate,
loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), loanApplicationTerms.getExpectedDisbursementDate()); loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(),
loanApplicationTerms.getExpectedDisbursementDate());
// backup for pre-close transaction // backup for pre-close transaction
updateCompoundingDetails(scheduleParams, periodStartDateApplicableForInterest); updateCompoundingDetails(scheduleParams, periodStartDateApplicableForInterest);
@@ -616,6 +617,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
final Collection<LoanTermVariationsData> interestRates = loanApplicationTerms.getLoanTermVariations().getInterestRateChanges(); final Collection<LoanTermVariationsData> interestRates = loanApplicationTerms.getLoanTermVariations().getInterestRateChanges();
boolean checkForOutstanding = true; boolean checkForOutstanding = true;
List<RecalculationDetail> unprocessedTransactions = new ArrayList<>(); List<RecalculationDetail> unprocessedTransactions = new ArrayList<>();
List<RecalculationDetail> processTransactions = new ArrayList<>();
LoanScheduleModelPeriod installment = null; LoanScheduleModelPeriod installment = null;
LocalDate periodStartDateApplicableForInterest = periodStartDateForInterest; LocalDate periodStartDateApplicableForInterest = periodStartDateForInterest;
for (RecalculationDetail detail : applicableTransactions) { for (RecalculationDetail detail : applicableTransactions) {
@@ -628,7 +630,17 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
if (scheduleParams.getLoanRepaymentScheduleTransactionProcessor() != null if (scheduleParams.getLoanRepaymentScheduleTransactionProcessor() != null
&& scheduleParams.getLoanRepaymentScheduleTransactionProcessor() && scheduleParams.getLoanRepaymentScheduleTransactionProcessor()
.isInterestFirstRepaymentScheduleTransactionProcessor()) { .isInterestFirstRepaymentScheduleTransactionProcessor()) {
List<LoanTransaction> currentTransactions = createCurrentTransactionList(detail); if (detail.getTransaction().isWaiver()) {
processTransactions.add(detail);
continue;
}
List<LoanTransaction> currentTransactions = new ArrayList<>();
for (RecalculationDetail processDetail : processTransactions) {
currentTransactions.addAll(createCurrentTransactionList(processDetail));
}
processTransactions.clear();
currentTransactions.addAll(createCurrentTransactionList(detail));
if (!transactionDate.isEqual(scheduleParams.getPeriodStartDate()) || scheduleParams.getInstalmentNumber() == 1) { if (!transactionDate.isEqual(scheduleParams.getPeriodStartDate()) || scheduleParams.getInstalmentNumber() == 1) {
int periodDays = Days.daysBetween(scheduleParams.getPeriodStartDate(), transactionDate).getDays(); int periodDays = Days.daysBetween(scheduleParams.getPeriodStartDate(), transactionDate).getDays();
@@ -636,7 +648,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
// calculation as per the configuration // calculation as per the configuration
periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms, periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms,
scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate,
loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), loanApplicationTerms.getExpectedDisbursementDate()); loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(),
loanApplicationTerms.getExpectedDisbursementDate());
int daysInPeriodApplicable = Days.daysBetween(periodStartDateApplicableForInterest, transactionDate).getDays(); int daysInPeriodApplicable = Days.daysBetween(periodStartDateApplicableForInterest, transactionDate).getDays();
Money interestForThisinstallment = Money.zero(currency); Money interestForThisinstallment = Money.zero(currency);
@@ -1542,8 +1555,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
* @param localDate * @param localDate
*/ */
private LocalDate calculateInterestStartDateForPeriod(final LoanApplicationTerms loanApplicationTerms, LocalDate periodStartDate, private LocalDate calculateInterestStartDateForPeriod(final LoanApplicationTerms loanApplicationTerms, LocalDate periodStartDate,
final LocalDate idealDisbursementDate, final LocalDate firstRepaymentdate, final Boolean isInterestChargedFromDateSameAsDisbursalDateEnabled, final LocalDate idealDisbursementDate, final LocalDate firstRepaymentdate,
final LocalDate expectedDisbursementDate) { final Boolean isInterestChargedFromDateSameAsDisbursalDateEnabled, final LocalDate expectedDisbursementDate) {
LocalDate periodStartDateApplicableForInterest = periodStartDate; LocalDate periodStartDateApplicableForInterest = periodStartDate;
if (periodStartDate.isBefore(idealDisbursementDate) || firstRepaymentdate.isAfter(periodStartDate)) { if (periodStartDate.isBefore(idealDisbursementDate) || firstRepaymentdate.isAfter(periodStartDate)) {
if (loanApplicationTerms.getInterestChargedFromLocalDate() != null) { if (loanApplicationTerms.getInterestChargedFromLocalDate() != null) {
@@ -1551,7 +1564,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|| loanApplicationTerms.getInterestChargedFromLocalDate().isAfter(periodStartDate)) { || loanApplicationTerms.getInterestChargedFromLocalDate().isAfter(periodStartDate)) {
periodStartDateApplicableForInterest = loanApplicationTerms.getInterestChargedFromLocalDate(); periodStartDateApplicableForInterest = loanApplicationTerms.getInterestChargedFromLocalDate();
} }
} else if(loanApplicationTerms.getInterestChargedFromLocalDate() == null && isInterestChargedFromDateSameAsDisbursalDateEnabled) { } else if (loanApplicationTerms.getInterestChargedFromLocalDate() == null
&& isInterestChargedFromDateSameAsDisbursalDateEnabled) {
periodStartDateApplicableForInterest = expectedDisbursementDate; periodStartDateApplicableForInterest = expectedDisbursementDate;
} else if (periodStartDate.isEqual(loanApplicationTerms.getExpectedDisbursementDate())) { } else if (periodStartDate.isEqual(loanApplicationTerms.getExpectedDisbursementDate())) {
periodStartDateApplicableForInterest = idealDisbursementDate; periodStartDateApplicableForInterest = idealDisbursementDate;