myrle-krantz closed pull request #5: Removing dependency to java money library.
URL: https://github.com/apache/fineract-cn-deposit-account-management/pull/5
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/service/build.gradle b/service/build.gradle
index cd35ff3..f8d4e6a 100644
--- a/service/build.gradle
+++ b/service/build.gradle
@@ -60,9 +60,6 @@ dependencies {
             [group: 'org.apache.fineract.cn.rhythm', name: 'spi', version: 
versions.frameworkrhythm],
             [group: 'org.apache.fineract.cn.rhythm', name: 'api', version: 
versions.frameworkrhythm],
             [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: 'org.threeten', name: 'threeten-extra', version: '1.2']
     )
 }
diff --git 
a/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/InterestCalculator.java
 
b/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/InterestCalculator.java
index 6619921..79dcc60 100644
--- 
a/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/InterestCalculator.java
+++ 
b/service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/InterestCalculator.java
@@ -19,27 +19,8 @@
 package org.apache.fineract.cn.deposit.service.internal.command.handler;
 
 import com.google.common.collect.Sets;
-import org.apache.fineract.cn.deposit.api.v1.EventConstants;
-import org.apache.fineract.cn.deposit.api.v1.domain.InterestPayable;
-import org.apache.fineract.cn.deposit.api.v1.domain.Type;
-import org.apache.fineract.cn.deposit.service.ServiceConstants;
-import org.apache.fineract.cn.deposit.service.internal.command.AccrualCommand;
-import 
org.apache.fineract.cn.deposit.service.internal.command.DividendDistributionCommand;
-import 
org.apache.fineract.cn.deposit.service.internal.command.PayInterestCommand;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.AccruedInterestEntity;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.AccruedInterestRepository;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.CurrencyEntity;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.CurrencyRepository;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.DividendDistributionEntity;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.DividendDistributionRepository;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductDefinitionEntity;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductDefinitionRepository;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductInstanceEntity;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductInstanceRepository;
-import org.apache.fineract.cn.deposit.service.internal.repository.TermEntity;
-import 
org.apache.fineract.cn.deposit.service.internal.repository.TermRepository;
-import 
org.apache.fineract.cn.deposit.service.internal.service.helper.AccountingService;
 import java.math.BigDecimal;
+import java.math.MathContext;
 import java.sql.Date;
 import java.time.Clock;
 import java.time.LocalDate;
@@ -49,9 +30,6 @@
 import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
-import javax.money.CurrencyUnit;
-import javax.money.Monetary;
-import javax.money.MonetaryAmount;
 import javax.transaction.Transactional;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.fineract.cn.accounting.api.v1.domain.Account;
@@ -64,44 +42,51 @@
 import org.apache.fineract.cn.command.annotation.CommandHandler;
 import org.apache.fineract.cn.command.annotation.CommandLogLevel;
 import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.apache.fineract.cn.deposit.api.v1.EventConstants;
+import org.apache.fineract.cn.deposit.api.v1.domain.InterestPayable;
+import org.apache.fineract.cn.deposit.api.v1.domain.Type;
+import org.apache.fineract.cn.deposit.service.internal.command.AccrualCommand;
+import 
org.apache.fineract.cn.deposit.service.internal.command.DividendDistributionCommand;
+import 
org.apache.fineract.cn.deposit.service.internal.command.PayInterestCommand;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.AccruedInterestEntity;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.AccruedInterestRepository;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.DividendDistributionEntity;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.DividendDistributionRepository;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductDefinitionEntity;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductDefinitionRepository;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductInstanceEntity;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.ProductInstanceRepository;
+import org.apache.fineract.cn.deposit.service.internal.repository.TermEntity;
+import 
org.apache.fineract.cn.deposit.service.internal.repository.TermRepository;
+import 
org.apache.fineract.cn.deposit.service.internal.service.helper.AccountingService;
 import org.apache.fineract.cn.lang.DateConverter;
-import org.javamoney.calc.banking.AnnualPercentageYield;
-import org.javamoney.calc.common.Rate;
-import org.javamoney.moneta.Money;
-import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.domain.Sort;
 import org.threeten.extra.YearQuarter;
 
 @Aggregate
 public class InterestCalculator {
-
-  public static final String ACTIVE = "ACTIVE";
-  private final Logger logger;
+  private static final int INTEREST_PRECISION = 7;
+  private static final String ACTIVE = "ACTIVE";
   private final ProductDefinitionRepository productDefinitionRepository;
   private final ProductInstanceRepository productInstanceRepository;
   private final TermRepository termRepository;
-  private final CurrencyRepository currencyRepository;
   private final AccountingService accountingService;
   private final AccruedInterestRepository accruedInterestRepository;
   private final DividendDistributionRepository dividendDistributionRepository;
 
   @Autowired
-  public InterestCalculator(@Qualifier(ServiceConstants.LOGGER_NAME) final 
Logger logger,
-                            final ProductDefinitionRepository 
productDefinitionRepository,
-                            final ProductInstanceRepository 
productInstanceRepository,
-                            final TermRepository termRepository,
-                            final CurrencyRepository currencyRepository,
-                            final AccountingService accountingService,
-                            final AccruedInterestRepository 
accruedInterestRepository,
-                            final DividendDistributionRepository 
dividendDistributionRepository) {
+  public InterestCalculator(
+      final ProductDefinitionRepository productDefinitionRepository,
+      final ProductInstanceRepository productInstanceRepository,
+      final TermRepository termRepository,
+      final AccountingService accountingService,
+      final AccruedInterestRepository accruedInterestRepository,
+      final DividendDistributionRepository dividendDistributionRepository) {
     super();
-    this.logger = logger;
     this.productDefinitionRepository = productDefinitionRepository;
     this.productInstanceRepository = productInstanceRepository;
     this.termRepository = termRepository;
-    this.currencyRepository = currencyRepository;
     this.accruedInterestRepository = accruedInterestRepository;
     this.accountingService = accountingService;
     this.dividendDistributionRepository = dividendDistributionRepository;
@@ -121,33 +106,28 @@ public String process(final AccrualCommand 
accrualCommand) {
         final ArrayList<Double> accruedValues = new ArrayList<>();
 
         final TermEntity term = 
this.termRepository.findByProductDefinition(productDefinitionEntity);
-        final CurrencyEntity currency = 
this.currencyRepository.findByProductDefinition(productDefinitionEntity);
-        final CurrencyUnit currencyUnit = 
Monetary.getCurrency(currency.getCode());
 
         final List<ProductInstanceEntity> productInstances =
             
this.productInstanceRepository.findByProductDefinition(productDefinitionEntity);
 
-        final Money zero = Money.of(0.00D, currencyUnit);
-
         productInstances.forEach(productInstanceEntity -> {
           if (productInstanceEntity.getState().equals(ACTIVE)) {
 
             final Account account = 
this.accountingService.findAccount(productInstanceEntity.getAccountIdentifier());
 
             if (account.getBalance() > 0.00D) {
-              final Money balance = Money.of(account.getBalance(), 
currencyUnit);
+              final BigDecimal balance = 
BigDecimal.valueOf(account.getBalance());
 
-              final Rate rate = Rate.of(productDefinitionEntity.getInterest() 
/ 100.00D);
+              final BigDecimal rate = 
BigDecimal.valueOf(productDefinitionEntity.getInterest())
+                  .divide(BigDecimal.valueOf(100), INTEREST_PRECISION, 
BigDecimal.ROUND_HALF_EVEN);
 
-              final MonetaryAmount accruedInterest =
-                  AnnualPercentageYield
-                      .calculate(balance, rate, 
this.periodOfInterestPayable(term.getInterestPayable()))
-                      .divide(accrualDate.lengthOfYear());
+              final BigDecimal accruedInterest =
+                  accruedInterest(balance, rate,
+                      this.periodOfInterestPayable(term.getInterestPayable()), 
accrualDate.lengthOfYear());
 
-              if (accruedInterest.isGreaterThan(zero)) {
+              if (accruedInterest.compareTo(BigDecimal.ZERO) > 0) {
                 final Double doubleValue =
-                    
BigDecimal.valueOf(accruedInterest.getNumber().doubleValue())
-                        .setScale(5, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+                    accruedInterest.setScale(5, 
BigDecimal.ROUND_HALF_EVEN).doubleValue();
 
                 accruedValues.add(doubleValue);
 
@@ -266,12 +246,10 @@ public String process(final DividendDistributionCommand 
dividendDistributionComm
     if (optionalProductDefinition.isPresent()) {
       final ProductDefinitionEntity productDefinitionEntity = 
optionalProductDefinition.get();
       if (productDefinitionEntity.getActive()) {
-        final Rate rate = Rate.of(dividendDistributionCommand.rate());
+        final BigDecimal rate = 
BigDecimal.valueOf(dividendDistributionCommand.rate());
         final TermEntity term = 
this.termRepository.findByProductDefinition(productDefinitionEntity);
         final List<String> dateRanges = 
this.dateRanges(dividendDistributionCommand.dueDate(), 
term.getInterestPayable());
 
-        final CurrencyEntity currency = 
this.currencyRepository.findByProductDefinition(productDefinitionEntity);
-        final CurrencyUnit currencyUnit = 
Monetary.getCurrency(currency.getCode());
         final List<ProductInstanceEntity> productInstanceEntities =
             
this.productInstanceRepository.findByProductDefinition(productDefinitionEntity);
         productInstanceEntities.forEach((ProductInstanceEntity 
productInstanceEntity) -> {
@@ -289,31 +267,30 @@ public String process(final DividendDistributionCommand 
dividendDistributionComm
 
             final BalanceHolder balanceHolder;
             if (currentAccountEntries.isEmpty()) {
-              balanceHolder = new BalanceHolder(account.getBalance());
+              balanceHolder = new 
BalanceHolder(BigDecimal.valueOf(account.getBalance()));
             } else {
               final AccountEntry accountEntry = currentAccountEntries.get(0);
-              balanceHolder = new BalanceHolder(accountEntry.getBalance() - 
accountEntry.getAmount());
+              balanceHolder = new 
BalanceHolder(BigDecimal.valueOf(accountEntry.getBalance()).subtract(BigDecimal.valueOf(accountEntry.getAmount())));
             }
 
-            final DividendHolder dividendHolder = new 
DividendHolder(currencyUnit);
+            final DividendHolder dividendHolder = new DividendHolder();
             dateRanges.forEach(dateRange -> {
               final List<AccountEntry> accountEntries =
                   this.accountingService.fetchEntries(account.getIdentifier(), 
dateRange, Sort.Direction.DESC.name());
               if (!accountEntries.isEmpty()) {
-                balanceHolder.setBalance(accountEntries.get(0).getBalance());
+                
balanceHolder.setBalance(BigDecimal.valueOf(accountEntries.get(0).getBalance()));
               }
 
-              final Money currentBalance = 
Money.of(balanceHolder.getBalance(), currencyUnit);
+              final BigDecimal currentBalance = balanceHolder.getBalance();
               dividendHolder.addAmount(
-                  AnnualPercentageYield
-                      .calculate(currentBalance, rate, 12)
-                      
.divide(dividendDistributionCommand.dueDate().lengthOfYear()));
+                  accruedInterest(currentBalance, rate, 12, 
dividendDistributionCommand.dueDate().lengthOfYear())
+              );
             });
 
-            if (dividendHolder.getAmount().isGreaterThan(Money.of(0.00D, 
currencyUnit))) {
+            if (dividendHolder.getAmount().compareTo(BigDecimal.ZERO) > 0) {
 
               final String roundedAmount =
-                  
BigDecimal.valueOf(dividendHolder.getAmount().getNumber().doubleValue())
+                  dividendHolder.getAmount()
                       .setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
 
               final JournalEntry cashToExpenseJournalEntry = new 
JournalEntry();
@@ -404,35 +381,35 @@ private boolean shouldPayInterest(final String 
interestPayable, final LocalDate
   }
 
   private class BalanceHolder {
-    private Double balance;
+    private BigDecimal balance;
 
-    private BalanceHolder(final Double balance) {
+    private BalanceHolder(final BigDecimal balance) {
       super();
       this.balance = balance;
     }
 
-    private Double getBalance() {
+    private BigDecimal getBalance() {
       return this.balance;
     }
 
-    private void setBalance(final Double balance) {
+    private void setBalance(final BigDecimal balance) {
       this.balance = balance;
     }
   }
 
   private class DividendHolder {
-    private MonetaryAmount amount;
+    private BigDecimal amount;
 
-    private DividendHolder(final CurrencyUnit currencyUnit) {
+    private DividendHolder() {
       super();
-      this.amount = Money.of(0.00D, currencyUnit);
+      this.amount = BigDecimal.ZERO;
     }
 
-    private void addAmount(final MonetaryAmount toAdd) {
+    private void addAmount(final BigDecimal toAdd) {
       this.amount = this.amount.add(toAdd);
     }
 
-    private MonetaryAmount getAmount() {
+    private BigDecimal getAmount() {
       return this.amount;
     }
   }
@@ -465,4 +442,22 @@ private void payoutInterest(final String expenseAccount, 
final String customerAc
     this.accountingService.post(expenseToCustomerJournalEntry);
 
   }
-}
+
+  /**
+   * Copied from JavaMoney AnnualPercentageYield.calculate, and adjusted.
+   * @return the resulting amount, never null.
+   */
+  private static BigDecimal accruedInterest(
+      final BigDecimal amount,
+      final BigDecimal rate,
+      final int periods,
+      final int lengthOfYear) {
+    final BigDecimal baseFactor = 
rate.divide(BigDecimal.valueOf(periods),MathContext.DECIMAL64)
+        .add(BigDecimal.ONE);
+    final BigDecimal annualInterest = 
amount.multiply(baseFactor.pow(periods).subtract(BigDecimal.ONE));
+
+    return annualInterest
+            .divide(BigDecimal.valueOf(lengthOfYear),
+                amount.scale() + INTEREST_PRECISION, 
BigDecimal.ROUND_HALF_EVEN);
+  }
+}
\ No newline at end of file


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to