fineract-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From av...@apache.org
Subject [fineract] branch develop updated: FINERACT-1108-Custom-installment-in-reshedule
Date Fri, 14 Aug 2020 16:18:44 GMT
This is an automated email from the ASF dual-hosted git repository.

avikg 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 9752366  FINERACT-1108-Custom-installment-in-reshedule
     new bd9119e  Merge pull request #1211 from fynmanoj/AL-9
9752366 is described below

commit 9752366c70c667ed43fe0687f5d9454bfdda7284
Author: Manoj <manoj@fynarfin.io>
AuthorDate: Fri Aug 14 21:44:50 2020 +0530

    FINERACT-1108-Custom-installment-in-reshedule
---
 .../LoanRescheduleRequestTest.java                 | 21 +++++++++++++++++
 .../loans/LoanRescheduleRequestTestBuilder.java    | 20 +++++++++++++++++
 .../RescheduleLoansApiConstants.java               |  3 +++
 .../data/LoanRescheduleRequestDataValidator.java   | 26 ++++++++++++++++++++--
 ...nRescheduleRequestWritePlatformServiceImpl.java | 25 +++++++++++++++++++--
 5 files changed, 91 insertions(+), 4 deletions(-)

diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java
b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java
index d3d30e5..de62d0d 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java
@@ -206,4 +206,25 @@ public class LoanRescheduleRequestTest {
 
         LOG.info("Successfully approved loan reschedule request (ID: {})", this.loanRescheduleRequestId);
     }
+
+    /**
+     * create new loan reschedule request
+     **/
+    private void createLoanRescheduleChangeEMIRequest() {
+        LOG.info("---------------------------------CREATING LOAN RESCHEDULE REQUEST CHANGE
EMI------------------------------------------");
+
+        final String requestJSON = new LoanRescheduleRequestTestBuilder().updateGraceOnPrincipal(null).updateGraceOnInterest(null)
+                .updateExtraTerms(null).updateEMI("5000").updateEmiChangeEndDate("4 February
2015")
+                .updateRescheduleFromDate("04 January 2015").updateRecalculateInterest(true).build(this.loanId.toString());
+
+        this.loanRescheduleRequestId = this.loanRescheduleRequestHelper.createLoanRescheduleRequest(requestJSON);
+        this.loanRescheduleRequestHelper.verifyCreationOfLoanRescheduleRequest(this.loanRescheduleRequestId);
+
+        LOG.info("Successfully created loan reschedule request (ID: {} )", this.loanRescheduleRequestId);
+    }
+
+    @Test
+    public void testCreateLoanRescheduleChangeEMIRequest() {
+        this.createLoanRescheduleChangeEMIRequest();
+    }
 }
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanRescheduleRequestTestBuilder.java
b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanRescheduleRequestTestBuilder.java
index a445416..f1dfb1f 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanRescheduleRequestTestBuilder.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanRescheduleRequestTestBuilder.java
@@ -33,6 +33,8 @@ public class LoanRescheduleRequestTestBuilder {
     private String rescheduleReasonId = "1";
     private String rescheduleReasonComment = null;
     private String submittedOnDate = "04 September 2014";
+    private String emi = null;
+    private String emiEndDate = null;
 
     public String build(final String loanId) {
         final HashMap<String, Object> map = new HashMap<>();
@@ -71,6 +73,14 @@ public class LoanRescheduleRequestTestBuilder {
             map.put("rescheduleReasonComment", rescheduleReasonComment);
         }
 
+        if (emi != null) {
+            map.put("emi", emi);
+        }
+
+        if (emiEndDate != null) {
+            map.put("endDate", emiEndDate);
+        }
+
         return new Gson().toJson(map);
     }
 
@@ -136,6 +146,16 @@ public class LoanRescheduleRequestTestBuilder {
         return this;
     }
 
+    public LoanRescheduleRequestTestBuilder updateEmiChangeEndDate(final String emiChangeEndDate)
{
+        this.emiEndDate = emiChangeEndDate;
+        return this;
+    }
+
+    public LoanRescheduleRequestTestBuilder updateEMI(final String emi) {
+        this.emi = emi;
+        return this;
+    }
+
     public String getRejectLoanRescheduleRequestJSON() {
         final HashMap<String, String> map = new HashMap<>();
         map.put("locale", "en");
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
index 3904fa8..7cbdc37 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
@@ -53,6 +53,9 @@ public class RescheduleLoansApiConstants {
     public static final String pendingCommandParamName = "pending";
     public static final String rejectCommandParamName = "reject";
 
+    public static final String endDateParamName = "endDate";
+    public static final String emiParamName = "emi";
+
     // reject action request parameters
     public static final String rejectedOnDateParam = "rejectedOnDate";
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java
index 0e4f05b..ee35f99 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java
@@ -21,6 +21,7 @@ package org.apache.fineract.portfolio.loanaccount.rescheduleloan.data;
 import com.google.gson.JsonElement;
 import com.google.gson.reflect.TypeToken;
 import java.lang.reflect.Type;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -56,7 +57,8 @@ public class LoanRescheduleRequestDataValidator {
                     RescheduleLoansApiConstants.rescheduleFromDateParamName, RescheduleLoansApiConstants.newInterestRateParamName,
                     RescheduleLoansApiConstants.rescheduleReasonIdParamName, RescheduleLoansApiConstants.rescheduleReasonCommentParamName,
                     RescheduleLoansApiConstants.submittedOnDateParamName, RescheduleLoansApiConstants.loanIdParamName,
-                    RescheduleLoansApiConstants.adjustedDueDateParamName, RescheduleLoansApiConstants.recalculateInterestParamName));
+                    RescheduleLoansApiConstants.adjustedDueDateParamName, RescheduleLoansApiConstants.recalculateInterestParamName,
+                    RescheduleLoansApiConstants.endDateParamName, RescheduleLoansApiConstants.emiParamName));
 
     private static final Set<String> REJECT_REQUEST_DATA_PARAMETERS = new HashSet<>(
             Arrays.asList(RescheduleLoansApiConstants.localeParamName, RescheduleLoansApiConstants.dateFormatParamName,
@@ -141,6 +143,25 @@ public class LoanRescheduleRequestDataValidator {
         dataValidatorBuilder.reset().parameter(RescheduleLoansApiConstants.rescheduleReasonCommentParamName).value(rescheduleReasonComment)
                 .ignoreIfNull().notExceedingLengthOf(500);
 
+        if (this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.emiParamName,
jsonElement)
+                || this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.endDateParamName,
jsonElement)) {
+            final LocalDate endDate = jsonCommand.localDateValueOfParameterNamed(RescheduleLoansApiConstants.endDateParamName);
+            final BigDecimal emi = jsonCommand.bigDecimalValueOfParameterNamed(RescheduleLoansApiConstants.emiParamName);
+
+            dataValidatorBuilder.reset().parameter(RescheduleLoansApiConstants.endDateParamName).value(endDate).notNull();
+            dataValidatorBuilder.reset().parameter(RescheduleLoansApiConstants.emiParamName).value(emi).notNull().positiveAmount();
+
+            if (endDate != null) {
+                LoanRepaymentScheduleInstallment endInstallment = loan.getRepaymentScheduleInstallment(endDate);
+
+                if (endInstallment == null) {
+                    dataValidatorBuilder.reset().parameter(RescheduleLoansApiConstants.endDateParamName)
+                            .failWithCode("repayment.schedule.installment.does.not.exist",
"Repayment schedule installment does not exist");
+                }
+            }
+
+        }
+
         final LocalDate adjustedDueDate = this.fromJsonHelper.extractLocalDateNamed(RescheduleLoansApiConstants.adjustedDueDateParamName,
                 jsonElement);
 
@@ -155,7 +176,8 @@ public class LoanRescheduleRequestDataValidator {
                 && !this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.graceOnInterestParamName,
jsonElement)
                 && !this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.extraTermsParamName,
jsonElement)
                 && !this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.newInterestRateParamName,
jsonElement)
-                && !this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.adjustedDueDateParamName,
jsonElement)) {
+                && !this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.adjustedDueDateParamName,
jsonElement)
+                && !this.fromJsonHelper.parameterExists(RescheduleLoansApiConstants.emiParamName,
jsonElement)) {
             dataValidatorBuilder.reset().parameter(RescheduleLoansApiConstants.graceOnPrincipalParamName).notNull();
         }
         LoanRepaymentScheduleInstallment installment = null;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
index c7aa49f..6399310 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
@@ -212,6 +212,9 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements
LoanResche
             final Boolean recalculateInterest = jsonCommand
                     .booleanObjectValueOfParameterNamed(RescheduleLoansApiConstants.recalculateInterestParamName);
 
+            final Date endDate = jsonCommand.dateValueOfParameterNamed(RescheduleLoansApiConstants.endDateParamName);
+            final BigDecimal emi = jsonCommand.bigDecimalValueOfParameterNamed(RescheduleLoansApiConstants.emiParamName);
+
             // initialize set the value to null
             Date submittedOnDate = null;
 
@@ -277,7 +280,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements
LoanResche
             // create term variations for flat and declining balance loans
             createLoanTermVariationsForRegularLoans(loan, graceOnPrincipal, graceOnInterest,
extraTerms, interestRate, rescheduleFromDate,
                     adjustedDueDate, loanRescheduleRequest, loanRescheduleRequestToTermVariationMappings,
isActive, isSpecificToInstallment,
-                    decimalValue, dueDate);
+                    decimalValue, dueDate, endDate, emi);
 
             // create a new entry in the m_loan_reschedule_request table
             this.loanRescheduleRequestRepository.save(loanRescheduleRequest);
@@ -301,7 +304,25 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements
LoanResche
             final Integer extraTerms, final BigDecimal interestRate, Date rescheduleFromDate,
Date adjustedDueDate,
             final LoanRescheduleRequest loanRescheduleRequest,
             List<LoanRescheduleRequestToTermVariationMapping> loanRescheduleRequestToTermVariationMappings,
final Boolean isActive,
-            final boolean isSpecificToInstallment, BigDecimal decimalValue, Date dueDate)
{
+            final boolean isSpecificToInstallment, BigDecimal decimalValue, Date dueDate,
Date endDate, BigDecimal emi) {
+
+        if (rescheduleFromDate != null && endDate != null && emi != null)
{
+            LoanTermVariations parent = null;
+            LocalDate rescheduleFromLocDate = new LocalDate(rescheduleFromDate);
+            LocalDate endDateLocDate = new LocalDate(endDate);
+            final Integer termType = LoanTermVariationType.EMI_AMOUNT.getValue();
+            List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
+            for (LoanRepaymentScheduleInstallment installment : installments) {
+                if (installment.getDueDate().isEqual(rescheduleFromLocDate) || installment.getDueDate().isEqual(endDateLocDate)
+                        || (installment.getDueDate().isAfter(rescheduleFromLocDate) &&
installment.getDueDate().isBefore(endDateLocDate))) {
+                    createLoanTermVariations(termType, loan, installment.getDueDate().toDate(),
installment.getDueDate().toDate(),
+                            loanRescheduleRequestToTermVariationMappings, isActive, true,
emi, parent);
+                }
+                if (installment.getDueDate().isAfter(endDateLocDate)) {
+                    break;
+                }
+            }
+        }
 
         if (rescheduleFromDate != null && adjustedDueDate != null) {
             LoanTermVariations parent = null;


Mime
View raw message