From da7caddd4692c851b4bbb256644903c66bcec508 Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Tue, 5 Mar 2013 17:13:56 +0000 Subject: [PATCH] Fix up issue with fee charges not been summed up correctly for preview loan schedule. --- ...entsAmortizationLoanScheduleGenerator.java | 7 ++- ...ipalAmortizationLoanScheduleGenerator.java | 44 ++++++++++++++++--- .../FlatMethodLoanScheduleGenerator.java | 9 ++-- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java index 03ff228c8..2114147fd 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java @@ -62,8 +62,6 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort } } - BigDecimal cumulativeChargesToDate = chargesDueAtTimeOfDisbursement; - // create entries of disbursement period on loan schedule final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursementOnlyPeriod(disbursementDate, principalDisbursed.getAmount(), chargesDueAtTimeOfDisbursement, false); @@ -74,7 +72,7 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort BigDecimal totalPrincipalExpected = BigDecimal.ZERO; BigDecimal totalPrincipalPaid = BigDecimal.ZERO; BigDecimal totalInterestCharged = BigDecimal.ZERO; - BigDecimal totalFeeChargesCharged = BigDecimal.ZERO; + BigDecimal totalFeeChargesCharged = chargesDueAtTimeOfDisbursement; BigDecimal totalPenaltyChargesCharged = BigDecimal.ZERO; BigDecimal totalWaived = BigDecimal.ZERO; BigDecimal totalWrittenOff = BigDecimal.ZERO; @@ -135,7 +133,6 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort monetaryCurrency); final Money totalInstallmentDue = principalForInstallment.plus(interestForInstallment).plus(feeChargesForInstallment) .plus(penaltyChargesForInstallment); - cumulativeChargesToDate = cumulativeChargesToDate.add(feeChargesForInstallment.getAmount()); LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber, startDate, scheduledDueDate, principalForInstallment.getAmount(), outstandingBalance.getAmount(), interestForInstallment.getAmount(), @@ -147,6 +144,8 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort loanTermInDays += daysInPeriod; totalPrincipalExpected = totalPrincipalExpected.add(principalForInstallment.getAmount()); totalInterestCharged = totalInterestCharged.add(interestForInstallment.getAmount()); + totalFeeChargesCharged = totalFeeChargesCharged.add(feeChargesForInstallment.getAmount()); + totalPenaltyChargesCharged = totalPenaltyChargesCharged.add(penaltyChargesForInstallment.getAmount()); totalRepaymentExpected = totalRepaymentExpected.add(totalInstallmentDue.getAmount()); startDate = scheduledDueDate; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java index 7bd9270cf..6766ce2f3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java @@ -57,8 +57,6 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza } } - BigDecimal cumulativeChargesToDate = chargesDueAtTimeOfDisbursement; - // create entries of disbursement period on loan schedule final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursementOnlyPeriod(disbursementDate, principalDisbursed.getAmount(), chargesDueAtTimeOfDisbursement, false); @@ -69,7 +67,7 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza BigDecimal totalPrincipalExpected = BigDecimal.ZERO; BigDecimal totalPrincipalPaid = BigDecimal.ZERO; BigDecimal totalInterestCharged = BigDecimal.ZERO; - BigDecimal totalFeeChargesCharged = BigDecimal.ZERO; + BigDecimal totalFeeChargesCharged = chargesDueAtTimeOfDisbursement; BigDecimal totalPenaltyChargesCharged = BigDecimal.ZERO; BigDecimal totalWaived = BigDecimal.ZERO; BigDecimal totalWrittenOff = BigDecimal.ZERO; @@ -117,10 +115,12 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza outstandingBalance = outstandingBalance.minus(principalForInstallment); - Money feeChargesForInstallment = Money.zero(monetaryCurrency); - Money penaltyChargesForInstallment = Money.zero(monetaryCurrency); - Money totalInstallmentDue = principalForInstallment.plus(interestForInstallment).plus(feeChargesForInstallment); - cumulativeChargesToDate = cumulativeChargesToDate.add(feeChargesForInstallment.getAmount()); + final Money feeChargesForInstallment = cumulativeFeeChargesDueWithin(startDate, scheduledDueDate, loanCharges, monetaryCurrency); + final Money penaltyChargesForInstallment = cumulativePenaltyChargesDueWithin(startDate, scheduledDueDate, loanCharges, + monetaryCurrency); + + final Money totalInstallmentDue = principalForInstallment.plus(interestForInstallment).plus(feeChargesForInstallment) + .plus(penaltyChargesForInstallment); LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber, startDate, scheduledDueDate, principalForInstallment.getAmount(), outstandingBalance.getAmount(), interestForInstallment.getAmount(), @@ -132,6 +132,8 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza loanTermInDays += daysInPeriod; totalPrincipalExpected = totalPrincipalExpected.add(principalForInstallment.getAmount()); totalInterestCharged = totalInterestCharged.add(interestForInstallment.getAmount()); + totalFeeChargesCharged = totalFeeChargesCharged.add(feeChargesForInstallment.getAmount()); + totalPenaltyChargesCharged = totalPenaltyChargesCharged.add(penaltyChargesForInstallment.getAmount()); totalRepaymentExpected = totalRepaymentExpected.add(totalInstallmentDue.getAmount()); startDate = scheduledDueDate; @@ -145,4 +147,32 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza totalPrincipalPaid, totalInterestCharged, totalFeeChargesCharged, totalPenaltyChargesCharged, totalWaived, totalWrittenOff, totalRepaymentExpected, totalRepayment, totalOutstanding); } + + private Money cumulativeFeeChargesDueWithin(final LocalDate periodStart, final LocalDate periodEnd, final Set loanCharges, + final MonetaryCurrency monetaryCurrency) { + + Money cumulative = Money.zero(monetaryCurrency); + + for (LoanCharge loanCharge : loanCharges) { + if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd) && loanCharge.isFeeCharge()) { + cumulative = cumulative.plus(loanCharge.amount()); + } + } + + return cumulative; + } + + private Money cumulativePenaltyChargesDueWithin(final LocalDate periodStart, final LocalDate periodEnd, + final Set loanCharges, final MonetaryCurrency monetaryCurrency) { + + Money cumulative = Money.zero(monetaryCurrency); + + for (LoanCharge loanCharge : loanCharges) { + if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd) && loanCharge.isPenaltyCharge()) { + cumulative = cumulative.plus(loanCharge.amount()); + } + } + + return cumulative; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/FlatMethodLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/FlatMethodLoanScheduleGenerator.java index 851aa507b..9244aea8c 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/FlatMethodLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/FlatMethodLoanScheduleGenerator.java @@ -67,8 +67,6 @@ public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator { } } - BigDecimal cumulativeChargesToDate = chargesDueAtTimeOfDisbursement; - // create entries of disbursement period on loan schedule final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursementOnlyPeriod(disbursementDate, principalDisbursed.getAmount(), chargesDueAtTimeOfDisbursement, false); @@ -79,7 +77,7 @@ public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator { BigDecimal totalPrincipalExpected = BigDecimal.ZERO; BigDecimal totalPrincipalPaid = BigDecimal.ZERO; BigDecimal totalInterestCharged = BigDecimal.ZERO; - BigDecimal totalFeeChargesCharged = BigDecimal.ZERO; + BigDecimal totalFeeChargesCharged = chargesDueAtTimeOfDisbursement; BigDecimal totalPenaltyChargesCharged = BigDecimal.ZERO; BigDecimal totalWaived = BigDecimal.ZERO; BigDecimal totalWrittenOff = BigDecimal.ZERO; @@ -124,9 +122,6 @@ public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator { .plus(feeChargesForInstallment) // .plus(penaltyChargesForInstallment); - cumulativeChargesToDate = cumulativeChargesToDate.add(feeChargesForInstallment.getAmount()).add( - penaltyChargesForInstallment.getAmount()); - LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber, startDate, scheduledDueDate, principalPerInstallment.getAmount(), outstandingBalance.getAmount(), interestPerInstallment.getAmount(), feeChargesForInstallment.getAmount(), penaltyChargesForInstallment.getAmount(), totalInstallmentDue.getAmount()); @@ -137,6 +132,8 @@ public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator { loanTermInDays += daysInPeriod; totalPrincipalExpected = totalPrincipalExpected.add(principalPerInstallment.getAmount()); totalInterestCharged = totalInterestCharged.add(interestPerInstallment.getAmount()); + totalFeeChargesCharged = totalFeeChargesCharged.add(feeChargesForInstallment.getAmount()); + totalPenaltyChargesCharged = totalPenaltyChargesCharged.add(penaltyChargesForInstallment.getAmount()); totalRepaymentExpected = totalRepaymentExpected.add(totalInstallmentDue.getAmount()); startDate = scheduledDueDate;