Compound interest to simple interest
diff --git a/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ChargeProportionalDesignator.java b/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ChargeProportionalDesignator.java
index 17903fa..e5d0716 100644
--- a/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ChargeProportionalDesignator.java
+++ b/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ChargeProportionalDesignator.java
@@ -25,7 +25,7 @@
NOT_PROPORTIONAL("{notproportional}", 0),
MAXIMUM_BALANCE_DESIGNATOR("{maximumbalance}", 1),
RUNNING_BALANCE_DESIGNATOR("{runningbalance}", 2),
- PRINCIPAL_AND_INTEREST_DESIGNATOR("{principalandinterest}", 3),
+ PRINCIPAL_DESIGNATOR("{principal}", 3),
REQUESTED_DISBURSEMENT_DESIGNATOR("{requesteddisbursement}", 4),
TO_ACCOUNT_DESIGNATOR("{toAccount}", 5),
FROM_ACCOUNT_DESIGNATOR("{fromAccount}", 6),
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
index 1222029..976d1d3 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
@@ -210,7 +210,7 @@
final BigDecimal customerLoanInterest = payment.getBalanceAdjustments().remove(AccountDesignators.CUSTOMER_LOAN_INTEREST);
Assert.assertEquals("week " + week, interestAccrual.negate(), customerLoanInterest);
Assert.assertEquals("week " + week, interestAccruedBeforePayment, customerLoanInterest);
- //Assert.assertEquals("week " + week, plannedPayments.get(week+1).getPayment(), payment);
+ Assert.assertEquals("week " + week, plannedPayments.get(week+1).getPayment(), payment);
week++;
}
@@ -535,7 +535,6 @@
.divide(Fixture.ACCRUAL_PERIODS, 8, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal calculatedInterest = expectedCurrentPrincipal
- .add(interestAccrued)
.multiply(dailyInterestRate)
.setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN);
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/ChargeDefinitionService.java b/service/src/main/java/io/mifos/individuallending/internal/service/ChargeDefinitionService.java
index 653496d..a72682f 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/ChargeDefinitionService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/ChargeDefinitionService.java
@@ -72,7 +72,7 @@
return ret.stream();
}
- public static Stream<ChargeDefinition> individualLoanChargesDerivedFromConfiguration() {
+ static Stream<ChargeDefinition> individualLoanChargesDerivedFromConfiguration() {
final List<ChargeDefinition> ret = new ArrayList<>();
final ChargeDefinition disbursePayment = new ChargeDefinition();
@@ -106,7 +106,7 @@
interestCharge.setForCycleSizeUnit(ChronoUnit.YEARS);
interestCharge.setAccrueAction(Action.APPLY_INTEREST.name());
interestCharge.setAccrualAccountDesignator(AccountDesignators.INTEREST_ACCRUAL);
- interestCharge.setProportionalTo(ChargeProportionalDesignator.PRINCIPAL_AND_INTEREST_DESIGNATOR.getValue());
+ interestCharge.setProportionalTo(ChargeProportionalDesignator.PRINCIPAL_DESIGNATOR.getValue());
interestCharge.setChargeMethod(ChargeDefinition.ChargeMethod.INTEREST);
interestCharge.setReadOnly(true);
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java
index 2009a45..fd62325 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java
@@ -134,10 +134,8 @@
final BigDecimal customerLoanRunningBalance = runningBalances.getBalance(AccountDesignators.CUSTOMER_LOAN_GROUP);
return customerLoanRunningBalance.subtract(paymentBuilder.getBalanceAdjustment(AccountDesignators.CUSTOMER_LOAN_GROUP));
}
- case PRINCIPAL_AND_INTEREST_DESIGNATOR: {
- final BigDecimal customerLoanPrincipal = runningBalances.getBalance(AccountDesignators.CUSTOMER_LOAN_PRINCIPAL);
- final BigDecimal customerLoanInterest = runningBalances.getBalance(AccountDesignators.CUSTOMER_LOAN_INTEREST);
- return customerLoanInterest.add(customerLoanPrincipal);
+ case PRINCIPAL_DESIGNATOR: {
+ return runningBalances.getBalance(AccountDesignators.CUSTOMER_LOAN_PRINCIPAL);
}
case CONTRACTUAL_REPAYMENT_DESIGNATOR:
return contractualRepayment;
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/PeriodChargeCalculator.java b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/PeriodChargeCalculator.java
index 0ced324..5c57218 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/PeriodChargeCalculator.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/PeriodChargeCalculator.java
@@ -41,9 +41,19 @@
final List<ScheduledCharge> scheduledCharges,
final int precision) {
return scheduledCharges.stream()
- .filter(PeriodChargeCalculator::accruedInterestCharge)
- .collect(Collectors.groupingBy(scheduledCharge -> scheduledCharge.getScheduledAction().getRepaymentPeriod(),
- Collectors.mapping(x -> chargeAmountPerPeriod(x, interest, precision), RateCollectors.compound(precision))));
+ .filter(PeriodChargeCalculator::accruedInterestCharge)
+ .collect(Collectors.groupingBy(scheduledCharge -> scheduledCharge.getScheduledAction().getRepaymentPeriod(),
+ Collectors.mapping(x -> chargeAmountPerPeriod(x, interest, precision), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+ }
+
+ static Map<Period, BigDecimal> getPeriodAccrualCompoundedInterestRate(
+ final BigDecimal interest,
+ final List<ScheduledCharge> scheduledCharges,
+ final int precision) {
+ return scheduledCharges.stream()
+ .filter(PeriodChargeCalculator::accruedInterestCharge)
+ .collect(Collectors.groupingBy(scheduledCharge -> scheduledCharge.getScheduledAction().getRepaymentPeriod(),
+ Collectors.mapping(x -> chargeAmountPerPeriod(x, interest, precision), RateCollectors.compound(precision))));
}
private static boolean accruedInterestCharge(final ScheduledCharge scheduledCharge)