Merge pull request #1211 from fynmanoj/AL-9
FINERACT-1108 Custom-installment-in-reshedule
This commit is contained in:
+21
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
+20
@@ -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");
|
||||
|
||||
+3
@@ -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";
|
||||
|
||||
|
||||
+24
-2
@@ -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;
|
||||
|
||||
+23
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user