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,