This is an automated email from the ASF dual-hosted git repository.
adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git
The following commit(s) were added to refs/heads/develop by this push:
new adcfc3c8b FINERACT-1981: Function Value using simple interest for EMI
calculation
adcfc3c8b is described below
commit adcfc3c8ba916ba55c9e83e8646c954ef03be442
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Tue May 28 05:43:38 2024 -0600
FINERACT-1981: Function Value using simple interest for EMI calculation
---
.../loanproduct/calc/emi/FnValueFunctions.java | 44 ++++++++++++++++++++++
.../{ => calc}/ratefactor/RateFactorFunctions.java | 2 +-
.../EMICalculationFunctionsTest.java} | 33 +++++++++++++++-
3 files changed, 76 insertions(+), 3 deletions(-)
diff --git
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/emi/FnValueFunctions.java
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/emi/FnValueFunctions.java
new file mode 100644
index 000000000..e7c152afb
--- /dev/null
+++
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/emi/FnValueFunctions.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.portfolio.loanproduct.calc.emi;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+
+public class FnValueFunctions {
+
+ protected FnValueFunctions() {}
+
+ /**
+ * To calculate the function value for each period, we are going to use
the next formula:
+ *
+ * fn = 1 + fnValueFrom * rateFactorEnd
+ *
+ * @param previousFnValue
+ *
+ * @param currentRateFactor
+ *
+ * @param mathContext
+ *
+ */
+ public static BigDecimal fnValue(final BigDecimal previousFnValue, final
BigDecimal currentRateFactor, final MathContext mc) {
+ return BigDecimal.ONE.add(previousFnValue.multiply(currentRateFactor,
mc));
+ }
+
+}
diff --git
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/ratefactor/RateFactorFunctions.java
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ratefactor/RateFactorFunctions.java
similarity index 96%
rename from
fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/ratefactor/RateFactorFunctions.java
rename to
fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ratefactor/RateFactorFunctions.java
index c663d4fa7..99f8b68aa 100644
---
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/ratefactor/RateFactorFunctions.java
+++
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ratefactor/RateFactorFunctions.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.fineract.portfolio.loanproduct.ratefactor;
+package org.apache.fineract.portfolio.loanproduct.calc.ratefactor;
import java.math.BigDecimal;
import java.math.MathContext;
diff --git
a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/ratefactor/RateFactorFunctionsTest.java
b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/calc/EMICalculationFunctionsTest.java
similarity index 75%
rename from
fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/ratefactor/RateFactorFunctionsTest.java
rename to
fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/calc/EMICalculationFunctionsTest.java
index b535992d7..e11be4db5 100644
---
a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/ratefactor/RateFactorFunctionsTest.java
+++
b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/calc/EMICalculationFunctionsTest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.fineract.portfolio.loanproduct.ratefactor;
+package org.apache.fineract.portfolio.loanproduct.calc;
import java.math.BigDecimal;
import java.math.MathContext;
@@ -28,6 +28,8 @@ import
org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
import org.apache.fineract.portfolio.common.domain.DaysInYearType;
import
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
+import org.apache.fineract.portfolio.loanproduct.calc.emi.FnValueFunctions;
+import
org.apache.fineract.portfolio.loanproduct.calc.ratefactor.RateFactorFunctions;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
@@ -38,7 +40,7 @@ import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
-class RateFactorFunctionsTest {
+class EMICalculationFunctionsTest {
private static MockedStatic<MoneyHelper> moneyHelper =
Mockito.mockStatic(MoneyHelper.class);
@@ -94,6 +96,33 @@ class RateFactorFunctionsTest {
}
}
+ @Test
+ public void testFnValueFunctionDay365() {
+ // Given
+ final DaysInYearType daysInYearType = DaysInYearType.DAYS_365;
+ final MathContext mc = MoneyHelper.getMathContext();
+ final String[] expectedValues = new String[] { "1.0000000",
"2.0075336", "3.0237007", "4.0472656", "5.0798590", "6.1194484" };
+
+ final List<BigDecimal> fnValuesCalculated = new ArrayList<>();
+ BigDecimal previousFnValue = BigDecimal.ZERO;
+ for (LoanRepaymentScheduleInstallment period : periods) {
+ final Long daysInPeriod =
DateUtils.getDifferenceInDays(period.getFromDate(), period.getDueDate());
+ final Integer daysInYear = DateUtils.daysInYear(daysInYearType,
period.getFromDate());
+ final BigDecimal rateFactor =
RateFactorFunctions.rateFactor(interestRate, daysInPeriod, daysInYear,
+ MoneyHelper.getMathContext());
+
+ final BigDecimal currentFnValue =
FnValueFunctions.fnValue(previousFnValue, rateFactor, mc);
+ fnValuesCalculated.add(currentFnValue);
+
+ previousFnValue = currentFnValue;
+ }
+
+ int idx = 0;
+ for (BigDecimal fnValue : fnValuesCalculated) {
+ Assertions.assertEquals(expectedValues[idx++], fnValue.toString());
+ }
+ }
+
@NotNull
private static LoanRepaymentScheduleInstallment createPeriod(int periodId,
LocalDate start, LocalDate end) {
LoanRepaymentScheduleInstallment period =
Mockito.mock(LoanRepaymentScheduleInstallment.class);