Removing dependency to java money library.
diff --git a/service/build.gradle b/service/build.gradle
index 7fe4315..adf4a9a 100644
--- a/service/build.gradle
+++ b/service/build.gradle
@@ -63,9 +63,6 @@
[group: 'org.apache.fineract.cn', name: 'mariadb', version: versions.frameworkmariadb],
[group: 'org.apache.fineract.cn', name: 'command', version: versions.frameworkcommand],
[group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator],
- [group: 'org.javamoney.lib', name: 'javamoney-calc', version: versions.javamoneylib],
- [group: 'javax.money', name: 'money-api', version: '1.0.1'],
- [group: 'org.javamoney', name: 'moneta', version: '1.0.1'],
[group: 'net.jodah', name: 'expiringmap', version: versions.expiringmap],
)
}
diff --git a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java
index 581aa5f..15abe0e 100644
--- a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java
+++ b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java
@@ -18,21 +18,18 @@
*/
package org.apache.fineract.cn.individuallending.internal.service;
-import org.javamoney.calc.CalculationContext;
-import org.javamoney.calc.common.Rate;
+import java.math.MathContext;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
-import javax.money.MonetaryAmount;
-import javax.money.MonetaryOperator;
import java.math.BigDecimal;
import java.util.Objects;
/**
* @author Myrle Krantz
*/
-public final class AnnuityPayment implements MonetaryOperator {
- private Rate rate;
+public final class AnnuityPayment {
+ private BigDecimal rate;
private int periods;
/**
@@ -41,7 +38,7 @@
* @param rate the target rate, not null.
* @param periods the periods, >= 0.
*/
- private AnnuityPayment(final @Nonnull Rate rate, final @Nonnegative int periods)
+ private AnnuityPayment(final @Nonnull BigDecimal rate, final @Nonnegative int periods)
{
this.rate = Objects.requireNonNull(rate);
if (periods < 0) {
@@ -50,31 +47,35 @@
this.periods = periods;
}
- public static AnnuityPayment of(final @Nonnull Rate rate, final @Nonnegative int periods)
+ public static AnnuityPayment of(final @Nonnull BigDecimal rate, final @Nonnegative int periods)
{
return new AnnuityPayment(rate, periods);
}
- public static MonetaryAmount calculate(
- final @Nonnull MonetaryAmount amount,
- final @Nonnull Rate rate,
- final @Nonnegative int periods)
+ public static BigDecimal calculate(
+ final @Nonnull BigDecimal amount,
+ final @Nonnull BigDecimal rate,
+ final @Nonnegative int periods,
+ final @Nonnegative int precision)
{
Objects.requireNonNull(amount, "Amount required");
Objects.requireNonNull(rate, "Rate required");
- if (rate.get().compareTo(BigDecimal.ZERO) == 0)
- return amount.divide(periods);
+ if (rate.compareTo(BigDecimal.ZERO) == 0)
+ return amount.divide(BigDecimal.valueOf(periods), precision, BigDecimal.ROUND_HALF_EVEN);
// AP(m) = m*r / [ (1-((1 + r).pow(-n))) ]
- return amount.multiply(rate.get()).divide(
- BigDecimal.ONE.subtract((BigDecimal.ONE.add(rate.get())
- .pow(-1 * periods, CalculationContext.mathContext()))));
+ return amount.multiply(rate).divide(
+ BigDecimal.ONE.subtract((BigDecimal.ONE.add(rate)
+ .pow(-1 * periods, MathContext.DECIMAL64))),
+ precision, BigDecimal.ROUND_HALF_EVEN);
}
- @Override
- public MonetaryAmount apply(final @Nonnull MonetaryAmount amount) {
- return calculate(amount, rate, periods);
+ public BigDecimal apply(
+ final @Nonnull BigDecimal amount,
+ final @Nonnegative int precision)
+ {
+ return calculate(amount, rate, periods, precision);
}
@Override
diff --git a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java
index 25a943a..e01629a 100644
--- a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java
+++ b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java
@@ -26,10 +26,6 @@
import org.apache.fineract.cn.individuallending.internal.service.schedule.Period;
import org.apache.fineract.cn.individuallending.internal.service.schedule.ScheduledCharge;
import org.apache.fineract.cn.portfolio.api.v1.domain.ChargeDefinition;
-import org.javamoney.calc.common.Rate;
-import org.javamoney.moneta.Money;
-
-import javax.money.MonetaryAmount;
import java.math.BigDecimal;
import java.time.Clock;
import java.time.LocalDate;
@@ -214,11 +210,12 @@
AccountDesignators.CUSTOMER_LOAN_PRINCIPAL,
AccountDesignators.CUSTOMER_LOAN_FEES).negate();
- final MonetaryAmount presentValue = AnnuityPayment.calculate(
- Money.of(finalDisbursementSize, "XXX"),
- Rate.of(geometricMeanAccrualRate),
- periodCount);
- return BigDecimal.valueOf(presentValue.getNumber().doubleValueExact()).setScale(minorCurrencyUnitDigits, BigDecimal.ROUND_HALF_EVEN);
+ final BigDecimal presentValue = AnnuityPayment.calculate(
+ finalDisbursementSize,
+ geometricMeanAccrualRate,
+ periodCount,
+ minorCurrencyUnitDigits);
+ return presentValue.setScale(minorCurrencyUnitDigits, BigDecimal.ROUND_HALF_EVEN);
}
private static boolean isIncurralActionForAccruedCharge(final ChargeDefinition chargeDefinition, final Action action) {