Fixed the case in which the calculated payment comes up a few cents short on the last payment.
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java b/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
index 2da9a4a..67bc6ce 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
@@ -391,7 +391,7 @@
final Collection<ScheduledCharge> scheduledCharges,
final BigDecimal maximumBalance,
final BigDecimal runningBalance,
- final BigDecimal loanPaymentSize,
+ final BigDecimal entryAccountAdjustment, //disbursement or payment size.
final int minorCurrencyUnitDigits,
final boolean accrualAccounting) {
final Map<String, BigDecimal> balanceAdjustments = new HashMap<>();
@@ -419,7 +419,7 @@
scheduledCharge,
maximumBalance,
runningBalance,
- loanPaymentSize,
+ entryAccountAdjustment,
balanceAdjustments);
//TODO: getAmountProportionalTo is programmed under the assumption of non-accrual accounting.
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
index e2d25f6..e7423fb 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
@@ -141,11 +141,17 @@
BigDecimal balance = initialBalance.setScale(minorCurrencyUnitDigits, BigDecimal.ROUND_HALF_EVEN);
final List<PlannedPayment> plannedPayments = new ArrayList<>();
- for (final Period repaymentPeriod : sortedRepaymentPeriods)
+ for (int i = 0; i < sortedRepaymentPeriods.size(); i++)
{
+ final Period repaymentPeriod = sortedRepaymentPeriods.get(i);
final BigDecimal currentLoanPaymentSize;
if (repaymentPeriod.isDefined()) {
- currentLoanPaymentSize = loanPaymentSize;
+ // last repayment period: Force the proposed payment to "overhang". Cost component calculation
+ // corrects last loan payment downwards but not upwards.
+ if (i == sortedRepaymentPeriods.size() - 1)
+ currentLoanPaymentSize = loanPaymentSize.add(BigDecimal.valueOf(sortedRepaymentPeriods.size()));
+ else
+ currentLoanPaymentSize = loanPaymentSize;
}
else
currentLoanPaymentSize = BigDecimal.ZERO;
@@ -155,7 +161,7 @@
CostComponentService.getCostComponentsForScheduledCharges(
Collections.emptyMap(),
scheduledChargesInPeriod,
- balance,
+ initialBalance,
balance,
currentLoanPaymentSize,
minorCurrencyUnitDigits,