Repository: incubator-fineract Updated Branches: refs/heads/develop f9746718f -> ded0c7b84
MIFOSX-2497 : fixed schedule generator for waivers Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/1cd226d4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/1cd226d4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/1cd226d4 Branch: refs/heads/develop Commit: 1cd226d4c634db5bbad9bf7ff5e021ff3b0858e4 Parents: fe6e1e8 Author: pramod <[email protected]> Authored: Mon Apr 18 13:23:43 2016 +0530 Committer: pramod <[email protected]> Committed: Mon Apr 18 13:23:43 2016 +0530 ---------------------------------------------------------------------- ...anRepaymentScheduleTransactionProcessor.java | 6 ++- .../domain/AbstractLoanScheduleGenerator.java | 40 +++++++++++++------- 2 files changed, 32 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/1cd226d4/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java index b06275b..78cd9d7 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java @@ -497,7 +497,11 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen if (loanTransaction.isRepayment() || loanTransaction.isInterestWaiver() || loanTransaction.isRecoveryRepayment()) { 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; } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/1cd226d4/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java index 8024652..2f8b728 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java @@ -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.LoanRescheduleModelRepaymentPeriod; 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.joda.time.Days; import org.joda.time.LocalDate; @@ -186,8 +185,9 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener // calculated interest start date for the period LocalDate periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms, - scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, - loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), loanApplicationTerms.getExpectedDisbursementDate()); + scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, + loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), + loanApplicationTerms.getExpectedDisbursementDate()); // Loan Schedule Exceptions that need to be applied for Loan Account LoanTermVariationParams termVariationParams = applyLoanTermVariations(loanApplicationTerms, scheduleParams, @@ -251,8 +251,9 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener continue; } periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms, - scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, - loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), loanApplicationTerms.getExpectedDisbursementDate()); + scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, + loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), + loanApplicationTerms.getExpectedDisbursementDate()); // backup for pre-close transaction updateCompoundingDetails(scheduleParams, periodStartDateApplicableForInterest); @@ -616,6 +617,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener final Collection<LoanTermVariationsData> interestRates = loanApplicationTerms.getLoanTermVariations().getInterestRateChanges(); boolean checkForOutstanding = true; List<RecalculationDetail> unprocessedTransactions = new ArrayList<>(); + List<RecalculationDetail> processTransactions = new ArrayList<>(); LoanScheduleModelPeriod installment = null; LocalDate periodStartDateApplicableForInterest = periodStartDateForInterest; for (RecalculationDetail detail : applicableTransactions) { @@ -628,7 +630,17 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener if (scheduleParams.getLoanRepaymentScheduleTransactionProcessor() != null && scheduleParams.getLoanRepaymentScheduleTransactionProcessor() .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) { int periodDays = Days.daysBetween(scheduleParams.getPeriodStartDate(), transactionDate).getDays(); @@ -636,7 +648,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener // calculation as per the configuration periodStartDateApplicableForInterest = calculateInterestStartDateForPeriod(loanApplicationTerms, scheduleParams.getPeriodStartDate(), idealDisbursementDate, firstRepaymentdate, - loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), loanApplicationTerms.getExpectedDisbursementDate()); + loanApplicationTerms.isInterestChargedFromDateSameAsDisbursalDateEnabled(), + loanApplicationTerms.getExpectedDisbursementDate()); int daysInPeriodApplicable = Days.daysBetween(periodStartDateApplicableForInterest, transactionDate).getDays(); Money interestForThisinstallment = Money.zero(currency); @@ -1538,12 +1551,12 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener * * @param firstRepaymentdate * TODO - * @param boolean1 - * @param localDate + * @param boolean1 + * @param localDate */ private LocalDate calculateInterestStartDateForPeriod(final LoanApplicationTerms loanApplicationTerms, LocalDate periodStartDate, - final LocalDate idealDisbursementDate, final LocalDate firstRepaymentdate, final Boolean isInterestChargedFromDateSameAsDisbursalDateEnabled, - final LocalDate expectedDisbursementDate) { + final LocalDate idealDisbursementDate, final LocalDate firstRepaymentdate, + final Boolean isInterestChargedFromDateSameAsDisbursalDateEnabled, final LocalDate expectedDisbursementDate) { LocalDate periodStartDateApplicableForInterest = periodStartDate; if (periodStartDate.isBefore(idealDisbursementDate) || firstRepaymentdate.isAfter(periodStartDate)) { if (loanApplicationTerms.getInterestChargedFromLocalDate() != null) { @@ -1551,11 +1564,12 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener || loanApplicationTerms.getInterestChargedFromLocalDate().isAfter(periodStartDate)) { periodStartDateApplicableForInterest = loanApplicationTerms.getInterestChargedFromLocalDate(); } - } else if(loanApplicationTerms.getInterestChargedFromLocalDate() == null && isInterestChargedFromDateSameAsDisbursalDateEnabled) { + } else if (loanApplicationTerms.getInterestChargedFromLocalDate() == null + && isInterestChargedFromDateSameAsDisbursalDateEnabled) { periodStartDateApplicableForInterest = expectedDisbursementDate; } else if (periodStartDate.isEqual(loanApplicationTerms.getExpectedDisbursementDate())) { periodStartDateApplicableForInterest = idealDisbursementDate; - } + } } return periodStartDateApplicableForInterest; }
