Repository: incubator-fineract Updated Branches: refs/heads/develop b7ba92417 -> e338658a4
compounding issues fixed Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/4945040f Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/4945040f Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/4945040f Branch: refs/heads/develop Commit: 4945040fffd9e7d176ac1abef865fa382675d4b0 Parents: a89a43a Author: venkatconflux <venkata.conf...@confluxtechnologies.com> Authored: Mon Jun 20 14:45:39 2016 +0530 Committer: venkatconflux <venkata.conf...@confluxtechnologies.com> Committed: Mon Jun 20 14:45:39 2016 +0530 ---------------------------------------------------------------------- .../domain/AbstractLoanScheduleGenerator.java | 40 ++++++++++++++------ ...anWritePlatformServiceJpaRepositoryImpl.java | 2 +- 2 files changed, 30 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/4945040f/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 080689e..3581558 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 @@ -549,6 +549,12 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener .getPrincipal().minus(scheduleParams.getTotalCumulativePrincipal())); } + scheduleParams.getCompoundingDateVariations().put(periodStartDateApplicableForInterest, + new TreeMap<>(scheduleParams.getCompoundingMap())); + scheduleParams.getCompoundingMap().clear(); + populateCompoundingDatesInPeriod(periodStartDateApplicableForInterest, calculateTill, loanApplicationTerms, holidayDetailDTO, + scheduleParams, loanCharges, totalInterestChargedForFullLoanTerm.getCurrency()); + // this is to make sure we are recalculating using correct interest rate // once calculation is done system will set the actual interest rate BigDecimal currentInterestRate = loanApplicationTerms.getAnnualNominalInterestRate(); @@ -577,7 +583,9 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener Money penaltyDiff = currentPeriodParams.getPenaltyChargesForInstallment().minus(tempPeriod.getPenaltyChargesForInstallment()); Money diff = interestDiff.plus(chargeDiff).plus(penaltyDiff); - if (!scheduleParams.getOutstandingBalance().minus(diff).isGreaterThanZero()) { + if (scheduleParams.getOutstandingBalance().minus(diff).isGreaterThanZero()) { + updateCompoundingDetails(scheduleParams, periodStartDateApplicableForInterest); + } else { scheduleParams.reduceOutstandingBalance(diff); currentPeriodParams.minusInterestForThisPeriod(interestDiff); currentPeriodParams.minusFeeChargesForInstallment(chargeDiff); @@ -593,7 +601,6 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener currentPeriodParams.fetchTotalAmountForPeriod(), false); scheduleParams.setTotalOutstandingInterestPaymentDueToGrace(interestTillDate.interestPaymentDueToGrace()); } - } return modifiedInstallment; } @@ -637,8 +644,9 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener private void updateCompoundingDetails(LoanScheduleParams scheduleParams, LocalDate periodStartDateApplicableForInterest) { if (scheduleParams.getCompoundingDateVariations().containsKey(periodStartDateApplicableForInterest)) { scheduleParams.getCompoundingMap().clear(); - scheduleParams.getCompoundingMap().putAll( - scheduleParams.getCompoundingDateVariations().get(periodStartDateApplicableForInterest)); + scheduleParams.getCompoundingMap() + .putAll(scheduleParams.getCompoundingDateVariations().get(periodStartDateApplicableForInterest)); + scheduleParams.getCompoundingDateVariations().remove(periodStartDateApplicableForInterest); } } @@ -821,7 +829,9 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener if (!scheduleParams.getOutstandingBalance().isGreaterThan(unprocessed) && !loanApplicationTerms.getPreClosureInterestCalculationStrategy() .calculateTillRestFrequencyEnabled()) { - + + scheduleParams.getCompoundingDateVariations().put(periodStartDateApplicableForInterest, + new TreeMap<>(scheduleParams.getCompoundingMap())); LocalDate calculateTill = transactionDate; PrincipalInterest principalInterestForThisPeriod = calculatePrincipalInterestComponentsForPeriod( this.paymentPeriodsInOneYearCalculator, @@ -1177,7 +1187,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener int periodNumberTemp = 1; LocalDate lastRestDate = getNextRestScheduleDate(currentDate.minusDays(1), loanApplicationTerms, holidayDetailDTO); Collection<LoanTermVariationsData> applicableVariations = loanApplicationTerms.getLoanTermVariations().getInterestRateChanges(); - + Money uncompoundedFromLastInstallment = params.getUnCompoundedAmount(); + LocalDate additionalPeriodsStartDate = params.getPeriodStartDate(); do { params.setActualRepaymentDate(this.scheduledDateGenerator.generateNextRepaymentDate(params.getActualRepaymentDate(), @@ -1220,9 +1231,10 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener updateCompoundingMap(loanApplicationTerms, holidayDetailDTO, params, lastRestDate, transactionDate); populateCompoundingDatesInPeriod(installment.periodDueDate(), params.getActualRepaymentDate(), loanApplicationTerms, holidayDetailDTO, params, loanCharges, currency); - params.setCompoundedInLastInstallment(params.getUnCompoundedAmount()); + uncompoundedFromLastInstallment = params.getUnCompoundedAmount(); params.setPeriodStartDate(transactionDate); startDate = transactionDate; + additionalPeriodsStartDate = startDate; } loanRepaymentScheduleTransactionProcessor.handleRepaymentSchedule(currentTransactions, currency, params.getInstallments()); updateLatePaidAmountsToPrincipalMap(detail.getTransaction(), loanApplicationTerms, currency, holidayDetailDTO, @@ -1256,6 +1268,10 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener compounded = compounded.plus(mapEntry.getValue()); } } + if (compounded.isGreaterThanZero() && startDate.isEqual(additionalPeriodsStartDate)) { + params.setCompoundedInLastInstallment(uncompoundedFromLastInstallment);// uncompounded in last installment + additionalPeriodsStartDate = additionalPeriodsStartDate.plusDays(1); + } Money compoundedForThisPeriod = compounded.minus(uncompounded); Money uncompoundedForThisPeriod = interest.minus(compoundedForThisPeriod); params.setUnCompoundedAmount(uncompoundedForThisPeriod); @@ -1506,7 +1522,11 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener final LocalDate restDate = getNextRestScheduleDate(scheduledDueDate.minusDays(1), loanApplicationTerms, holidayDetailDTO); if (!compoundingEffectiveDate.isAfter(loanRepaymentScheduleInstallment.getDueDate())) { - totalCompoundedAmount = totalCompoundedAmount.minus(params.getUnCompoundedAmount()); + Money amountCompoundedFromLastPeriod = params.getCompoundedInLastInstallment(); + if (amountCompoundedFromLastPeriod.isZero()) { + amountCompoundedFromLastPeriod = params.getUnCompoundedAmount(); + } + totalCompoundedAmount = totalCompoundedAmount.minus(amountCompoundedFromLastPeriod); periodHasCompoundingDate = true; } while (!compoundingEffectiveDate.isAfter(loanRepaymentScheduleInstallment.getDueDate())) { @@ -1544,13 +1564,11 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener for (Map.Entry<LocalDate, Money> mapEntry : params.getCompoundingMap().entrySet()) { if (!mapEntry.getKey().isAfter(loanRepaymentScheduleInstallment.getDueDate())) { updateMapWithAmount(params.getPrincipalPortionMap(), mapEntry.getValue().negated(), mapEntry.getKey()); - }else if(params.getUnCompoundedAmount().isEqualTo( mapEntry.getValue())){ - totalCompoundedAmount = totalCompoundedAmount.plus(params.getUnCompoundedAmount()); } } params.minusUnCompoundedAmount(params.getUnCompoundedAmount()); params.getCompoundingMap().clear(); - params.addUnCompoundedAmount(amountCharged.minus(totalCompoundedAmount.minus(params.getCompoundedInLastInstallment()))); + params.addUnCompoundedAmount(amountCharged.minus(totalCompoundedAmount)); } else { params.getCompoundingMap().clear(); params.getCompoundingDateVariations().put(loanRepaymentScheduleInstallment.getFromDate(), http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/4945040f/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- 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 6e35e51..c56e230 100755 --- 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 @@ -1433,7 +1433,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf this.loanTransactionRepository.save(applyLoanChargeTransaction); } boolean isAppliedOnBackDate = false; - if (loanCharge.getDueLocalDate() == null || LocalDate.now().isAfter(loanCharge.getDueLocalDate())) { + if (loanCharge.getDueLocalDate() == null || DateUtils.getLocalDateOfTenant().isAfter(loanCharge.getDueLocalDate())) { isAppliedOnBackDate = true; } return isAppliedOnBackDate;