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 <[email protected]>
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;