You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by na...@apache.org on 2016/06/22 11:37:22 UTC

[1/2] incubator-fineract git commit: compounding issues fixed

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 <ve...@confluxtechnologies.com>
Authored: Mon Jun 20 14:45:39 2016 +0530
Committer: venkatconflux <ve...@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;


[2/2] incubator-fineract git commit: Merge branch 'compoundingissue' into develop

Posted by na...@apache.org.
Merge branch 'compoundingissue' into develop


Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/e338658a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/e338658a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/e338658a

Branch: refs/heads/develop
Commit: e338658a48d3dec1caba0d4cce4efd0f67a89e62
Parents: b7ba924 4945040
Author: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Authored: Wed Jun 22 11:30:37 2016 +0530
Committer: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Committed: Wed Jun 22 11:30:37 2016 +0530

----------------------------------------------------------------------
 .../domain/AbstractLoanScheduleGenerator.java   | 40 ++++++++++++++------
 ...anWritePlatformServiceJpaRepositoryImpl.java |  2 +-
 2 files changed, 30 insertions(+), 12 deletions(-)
----------------------------------------------------------------------