MIFOSX-1918
This commit is contained in:
@@ -11696,7 +11696,7 @@ GET https://DomainName/api/v1/loanproducts
|
|||||||
},
|
},
|
||||||
"preCloseInterestCalculationStrategy": {
|
"preCloseInterestCalculationStrategy": {
|
||||||
"id":1,
|
"id":1,
|
||||||
"code":"loanPreCloseInterestCalculationStrategy.tillPreClosureDate",
|
"code":"loanPreClosureInterestCalculationStrategy.tillPreClosureDate",
|
||||||
"value":"Till preclose Date"
|
"value":"Till preclose Date"
|
||||||
},
|
},
|
||||||
"isArrearsBasedOnOriginalSchedule" : true
|
"isArrearsBasedOnOriginalSchedule" : true
|
||||||
@@ -11803,7 +11803,7 @@ GET https://DomainName/api/v1/loanproducts/template
|
|||||||
"value": "Reduce EMI amount"
|
"value": "Reduce EMI amount"
|
||||||
},"preCloseInterestCalculationStrategy": {
|
},"preCloseInterestCalculationStrategy": {
|
||||||
"id":1,
|
"id":1,
|
||||||
"code":"loanPreCloseInterestCalculationStrategy.tillPreClosureDate",
|
"code":"loanPreClosureInterestCalculationStrategy.tillPreClosureDate",
|
||||||
"value":"Till preclose Date"
|
"value":"Till preclose Date"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -11841,15 +11841,15 @@ GET https://DomainName/api/v1/loanproducts/template
|
|||||||
"value": "Months"
|
"value": "Months"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"preCloseInterestCalculationStrategyOptions": [
|
"preClosureInterestCalculationStrategyOptions": [
|
||||||
{
|
{
|
||||||
"id":1,
|
"id":1,
|
||||||
"code":"loanPreCloseInterestCalculationStrategy.tillPreClosureDate",
|
"code":"loanPreClosureInterestCalculationStrategy.tillPreClosureDate",
|
||||||
"value":"Till preclose Date"
|
"value":"Till preclose Date"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id":2,
|
"id":2,
|
||||||
"code":"loanPreCloseInterestCalculationStrategy.tillRestFrequencyDate",
|
"code":"loanPreClosureInterestCalculationStrategy.tillRestFrequencyDate",
|
||||||
"value":"Till rest Frequency Date"
|
"value":"Till rest Frequency Date"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
+2
-2
@@ -51,7 +51,7 @@ public class LoanProductTestBuilder {
|
|||||||
private static final String CASH_BASED = "2";
|
private static final String CASH_BASED = "2";
|
||||||
private static final String ACCRUAL_PERIODIC = "3";
|
private static final String ACCRUAL_PERIODIC = "3";
|
||||||
private static final String ACCRUAL_UPFRONT = "4";
|
private static final String ACCRUAL_UPFRONT = "4";
|
||||||
|
|
||||||
public static final String INTEREST_APPLICABLE_STRATEGY_REST_DATE = "2";
|
public static final String INTEREST_APPLICABLE_STRATEGY_REST_DATE = "2";
|
||||||
public static final String INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE = "1";
|
public static final String INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE = "1";
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@ public class LoanProductTestBuilder {
|
|||||||
map.put("recalculationRestFrequencyType", recalculationRestFrequencyType);
|
map.put("recalculationRestFrequencyType", recalculationRestFrequencyType);
|
||||||
map.put("recalculationRestFrequencyInterval", recalculationRestFrequencyInterval);
|
map.put("recalculationRestFrequencyInterval", recalculationRestFrequencyInterval);
|
||||||
map.put("recalculationRestFrequencyDate", recalculationRestFrequencyDate);
|
map.put("recalculationRestFrequencyDate", recalculationRestFrequencyDate);
|
||||||
map.put("preCloseInterestCalculationStrategy", preCloseInterestCalculationStrategy);
|
map.put("preClosureInterestCalculationStrategy", preCloseInterestCalculationStrategy);
|
||||||
if (isArrearsBasedOnOriginalSchedule != null) {
|
if (isArrearsBasedOnOriginalSchedule != null) {
|
||||||
map.put("isArrearsBasedOnOriginalSchedule", isArrearsBasedOnOriginalSchedule);
|
map.put("isArrearsBasedOnOriginalSchedule", isArrearsBasedOnOriginalSchedule);
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -301,7 +301,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
|||||||
currency, installments);
|
currency, installments);
|
||||||
if (unprocessed.isGreaterThanZero()) {
|
if (unprocessed.isGreaterThanZero()) {
|
||||||
|
|
||||||
if (loanApplicationTerms.getPreCloseInterestCalculationStrategy().calculateTillRestFrequencyEnabled()) {
|
if (loanApplicationTerms.getPreClosureInterestCalculationStrategy().calculateTillRestFrequencyEnabled()) {
|
||||||
LocalDate applicableDate = getNextRestScheduleDate(detail.getTransactionDate().minusDays(1),
|
LocalDate applicableDate = getNextRestScheduleDate(detail.getTransactionDate().minusDays(1),
|
||||||
loanApplicationTerms, holidayDetailDTO);
|
loanApplicationTerms, holidayDetailDTO);
|
||||||
checkForOutstanding = detail.getTransactionDate().isEqual(applicableDate);
|
checkForOutstanding = detail.getTransactionDate().isEqual(applicableDate);
|
||||||
@@ -355,7 +355,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
|||||||
// apply interest calculation as per
|
// apply interest calculation as per
|
||||||
// configuration
|
// configuration
|
||||||
if (!outstandingBalance.isGreaterThan(unprocessed)
|
if (!outstandingBalance.isGreaterThan(unprocessed)
|
||||||
&& !loanApplicationTerms.getPreCloseInterestCalculationStrategy()
|
&& !loanApplicationTerms.getPreClosureInterestCalculationStrategy()
|
||||||
.calculateTillRestFrequencyEnabled()) {
|
.calculateTillRestFrequencyEnabled()) {
|
||||||
|
|
||||||
LocalDate calculateTill = detail.getTransactionDate();
|
LocalDate calculateTill = detail.getTransactionDate();
|
||||||
@@ -516,7 +516,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
|||||||
if (outstandingBalance.isLessThan(interestForThisinstallment)
|
if (outstandingBalance.isLessThan(interestForThisinstallment)
|
||||||
&& !scheduledDueDate.equals(detail.getTransactionDate())) {
|
&& !scheduledDueDate.equals(detail.getTransactionDate())) {
|
||||||
LocalDate calculateTill = detail.getTransactionDate();
|
LocalDate calculateTill = detail.getTransactionDate();
|
||||||
if (loanApplicationTerms.getPreCloseInterestCalculationStrategy().calculateTillRestFrequencyEnabled()) {
|
if (loanApplicationTerms.getPreClosureInterestCalculationStrategy().calculateTillRestFrequencyEnabled()) {
|
||||||
calculateTill = getNextRestScheduleDate(calculateTill.minusDays(1), loanApplicationTerms,
|
calculateTill = getNextRestScheduleDate(calculateTill.minusDays(1), loanApplicationTerms,
|
||||||
holidayDetailDTO);
|
holidayDetailDTO);
|
||||||
}
|
}
|
||||||
@@ -1603,7 +1603,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
|
|||||||
calculateInterestFrom = periodStartDateApplicableForInterest;
|
calculateInterestFrom = periodStartDateApplicableForInterest;
|
||||||
}
|
}
|
||||||
LocalDate calculateTill = onDate;
|
LocalDate calculateTill = onDate;
|
||||||
if (loanApplicationTerms.getPreCloseInterestCalculationStrategy().calculateTillRestFrequencyEnabled()) {
|
if (loanApplicationTerms.getPreClosureInterestCalculationStrategy().calculateTillRestFrequencyEnabled()) {
|
||||||
LocalDate applicableDate = getNextRestScheduleDate(onDate.minusDays(1), loanApplicationTerms, holidayDetailDTO);
|
LocalDate applicableDate = getNextRestScheduleDate(onDate.minusDays(1), loanApplicationTerms, holidayDetailDTO);
|
||||||
calculateTill = applicableDate;
|
calculateTill = applicableDate;
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-14
@@ -31,7 +31,7 @@ import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod;
|
|||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreCloseInterestCalculationStrategy;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreClosureInterestCalculationStrategy;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.RecalculationFrequencyType;
|
import org.mifosplatform.portfolio.loanproduct.domain.RecalculationFrequencyType;
|
||||||
@@ -138,7 +138,7 @@ public final class LoanApplicationTerms {
|
|||||||
private final BigDecimal principalThresholdForLastInstalment;
|
private final BigDecimal principalThresholdForLastInstalment;
|
||||||
private final Integer installmentAmountInMultiplesOf;
|
private final Integer installmentAmountInMultiplesOf;
|
||||||
|
|
||||||
private final LoanPreCloseInterestCalculationStrategy preCloseInterestCalculationStrategy;
|
private final LoanPreClosureInterestCalculationStrategy preClosureInterestCalculationStrategy;
|
||||||
|
|
||||||
public static LoanApplicationTerms assembleFrom(final ApplicationCurrency currency, final Integer loanTermFrequency,
|
public static LoanApplicationTerms assembleFrom(final ApplicationCurrency currency, final Integer loanTermFrequency,
|
||||||
final PeriodFrequencyType loanTermPeriodFrequencyType, final Integer numberOfRepayments, final Integer repaymentEvery,
|
final PeriodFrequencyType loanTermPeriodFrequencyType, final Integer numberOfRepayments, final Integer repaymentEvery,
|
||||||
@@ -155,7 +155,7 @@ public final class LoanApplicationTerms {
|
|||||||
final DaysInMonthType daysInMonthType, final DaysInYearType daysInYearType, final boolean isInterestRecalculationEnabled,
|
final DaysInMonthType daysInMonthType, final DaysInYearType daysInYearType, final boolean isInterestRecalculationEnabled,
|
||||||
final RecalculationFrequencyType recalculationFrequencyType, final CalendarInstance restCalendarInstance,
|
final RecalculationFrequencyType recalculationFrequencyType, final CalendarInstance restCalendarInstance,
|
||||||
final BigDecimal principalThresholdForLastInstalment, final Integer installmentAmountInMultiplesOf,
|
final BigDecimal principalThresholdForLastInstalment, final Integer installmentAmountInMultiplesOf,
|
||||||
final LoanPreCloseInterestCalculationStrategy preCloseInterestCalculationStrategy) {
|
final LoanPreClosureInterestCalculationStrategy preClosureInterestCalculationStrategy) {
|
||||||
|
|
||||||
final LoanRescheduleStrategyMethod rescheduleStrategyMethod = null;
|
final LoanRescheduleStrategyMethod rescheduleStrategyMethod = null;
|
||||||
final InterestRecalculationCompoundingMethod interestRecalculationCompoundingMethod = null;
|
final InterestRecalculationCompoundingMethod interestRecalculationCompoundingMethod = null;
|
||||||
@@ -167,7 +167,7 @@ public final class LoanApplicationTerms {
|
|||||||
disbursementDatas, maxOutstandingBalance, emiAmountVariations, graceOnArrearsAgeing, daysInMonthType, daysInYearType,
|
disbursementDatas, maxOutstandingBalance, emiAmountVariations, graceOnArrearsAgeing, daysInMonthType, daysInYearType,
|
||||||
isInterestRecalculationEnabled, rescheduleStrategyMethod, interestRecalculationCompoundingMethod, restCalendarInstance,
|
isInterestRecalculationEnabled, rescheduleStrategyMethod, interestRecalculationCompoundingMethod, restCalendarInstance,
|
||||||
recalculationFrequencyType, principalThresholdForLastInstalment, installmentAmountInMultiplesOf,
|
recalculationFrequencyType, principalThresholdForLastInstalment, installmentAmountInMultiplesOf,
|
||||||
preCloseInterestCalculationStrategy);
|
preClosureInterestCalculationStrategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanApplicationTerms assembleFrom(final ApplicationCurrency applicationCurrency, final Integer loanTermFrequency,
|
public static LoanApplicationTerms assembleFrom(final ApplicationCurrency applicationCurrency, final Integer loanTermFrequency,
|
||||||
@@ -180,7 +180,7 @@ public final class LoanApplicationTerms {
|
|||||||
final BigDecimal principalThresholdForLastInstalment, final Integer installmentAmountInMultiplesOf,
|
final BigDecimal principalThresholdForLastInstalment, final Integer installmentAmountInMultiplesOf,
|
||||||
final RecalculationFrequencyType recalculationFrequencyType, final CalendarInstance restCalendarInstance,
|
final RecalculationFrequencyType recalculationFrequencyType, final CalendarInstance restCalendarInstance,
|
||||||
final InterestRecalculationCompoundingMethod compoundingMethod,
|
final InterestRecalculationCompoundingMethod compoundingMethod,
|
||||||
final LoanPreCloseInterestCalculationStrategy loanPreCloseInterestCalculationStrategy) {
|
final LoanPreClosureInterestCalculationStrategy loanPreClosureInterestCalculationStrategy) {
|
||||||
|
|
||||||
final Integer numberOfRepayments = loanProductRelatedDetail.getNumberOfRepayments();
|
final Integer numberOfRepayments = loanProductRelatedDetail.getNumberOfRepayments();
|
||||||
final Integer repaymentEvery = loanProductRelatedDetail.getRepayEvery();
|
final Integer repaymentEvery = loanProductRelatedDetail.getRepayEvery();
|
||||||
@@ -213,7 +213,7 @@ public final class LoanApplicationTerms {
|
|||||||
multiDisburseLoan, emiAmount, disbursementDatas, maxOutstandingBalance, emiAmountVariations,
|
multiDisburseLoan, emiAmount, disbursementDatas, maxOutstandingBalance, emiAmountVariations,
|
||||||
loanProductRelatedDetail.getGraceOnDueDate(), daysInMonthType, daysInYearType, isInterestRecalculationEnabled,
|
loanProductRelatedDetail.getGraceOnDueDate(), daysInMonthType, daysInYearType, isInterestRecalculationEnabled,
|
||||||
rescheduleStrategyMethod, compoundingMethod, restCalendarInstance, recalculationFrequencyType,
|
rescheduleStrategyMethod, compoundingMethod, restCalendarInstance, recalculationFrequencyType,
|
||||||
principalThresholdForLastInstalment, installmentAmountInMultiplesOf, loanPreCloseInterestCalculationStrategy);
|
principalThresholdForLastInstalment, installmentAmountInMultiplesOf, loanPreClosureInterestCalculationStrategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanApplicationTerms assembleFrom(final ApplicationCurrency applicationCurrency, final Integer loanTermFrequency,
|
public static LoanApplicationTerms assembleFrom(final ApplicationCurrency applicationCurrency, final Integer loanTermFrequency,
|
||||||
@@ -224,7 +224,8 @@ public final class LoanApplicationTerms {
|
|||||||
final List<LoanTermVariationsData> emiAmountVariations, final LocalDate interestChargedFromDate,
|
final List<LoanTermVariationsData> emiAmountVariations, final LocalDate interestChargedFromDate,
|
||||||
final LoanInterestRecalculationDetails interestRecalculationDetails, final CalendarInstance restCalendarInstance,
|
final LoanInterestRecalculationDetails interestRecalculationDetails, final CalendarInstance restCalendarInstance,
|
||||||
final RecalculationFrequencyType recalculationFrequencyType, final BigDecimal principalThresholdForLastInstalment,
|
final RecalculationFrequencyType recalculationFrequencyType, final BigDecimal principalThresholdForLastInstalment,
|
||||||
Integer installmentAmountInMultiplesOf, final LoanPreCloseInterestCalculationStrategy loanPreCloseInterestCalculationStrategy) {
|
Integer installmentAmountInMultiplesOf,
|
||||||
|
final LoanPreClosureInterestCalculationStrategy loanPreClosureInterestCalculationStrategy) {
|
||||||
|
|
||||||
final Integer numberOfRepayments = loanProductRelatedDetail.getNumberOfRepayments();
|
final Integer numberOfRepayments = loanProductRelatedDetail.getNumberOfRepayments();
|
||||||
final Integer repaymentEvery = loanProductRelatedDetail.getRepayEvery();
|
final Integer repaymentEvery = loanProductRelatedDetail.getRepayEvery();
|
||||||
@@ -262,7 +263,7 @@ public final class LoanApplicationTerms {
|
|||||||
disbursementDatas, maxOutstandingBalance, emiAmountVariations, loanProductRelatedDetail.getGraceOnDueDate(),
|
disbursementDatas, maxOutstandingBalance, emiAmountVariations, loanProductRelatedDetail.getGraceOnDueDate(),
|
||||||
daysInMonthType, daysInYearType, isInterestRecalculationEnabled, rescheduleStrategyMethod,
|
daysInMonthType, daysInYearType, isInterestRecalculationEnabled, rescheduleStrategyMethod,
|
||||||
interestRecalculationCompoundingMethod, restCalendarInstance, recalculationFrequencyType,
|
interestRecalculationCompoundingMethod, restCalendarInstance, recalculationFrequencyType,
|
||||||
principalThresholdForLastInstalment, installmentAmountInMultiplesOf, loanPreCloseInterestCalculationStrategy);
|
principalThresholdForLastInstalment, installmentAmountInMultiplesOf, loanPreClosureInterestCalculationStrategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanApplicationTerms assembleFrom(final Integer repaymentEvery, final PeriodFrequencyType repaymentPeriodFrequencyType,
|
public static LoanApplicationTerms assembleFrom(final Integer repaymentEvery, final PeriodFrequencyType repaymentPeriodFrequencyType,
|
||||||
@@ -281,7 +282,7 @@ public final class LoanApplicationTerms {
|
|||||||
applicationTerms.interestRecalculationEnabled, applicationTerms.rescheduleStrategyMethod,
|
applicationTerms.interestRecalculationEnabled, applicationTerms.rescheduleStrategyMethod,
|
||||||
applicationTerms.interestRecalculationCompoundingMethod, applicationTerms.restCalendarInstance,
|
applicationTerms.interestRecalculationCompoundingMethod, applicationTerms.restCalendarInstance,
|
||||||
applicationTerms.recalculationFrequencyType, applicationTerms.principalThresholdForLastInstalment,
|
applicationTerms.recalculationFrequencyType, applicationTerms.principalThresholdForLastInstalment,
|
||||||
applicationTerms.installmentAmountInMultiplesOf, applicationTerms.preCloseInterestCalculationStrategy);
|
applicationTerms.installmentAmountInMultiplesOf, applicationTerms.preClosureInterestCalculationStrategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
private LoanApplicationTerms(final ApplicationCurrency currency, final Integer loanTermFrequency,
|
private LoanApplicationTerms(final ApplicationCurrency currency, final Integer loanTermFrequency,
|
||||||
@@ -300,7 +301,7 @@ public final class LoanApplicationTerms {
|
|||||||
final InterestRecalculationCompoundingMethod interestRecalculationCompoundingMethod,
|
final InterestRecalculationCompoundingMethod interestRecalculationCompoundingMethod,
|
||||||
final CalendarInstance restCalendarInstance, final RecalculationFrequencyType recalculationFrequencyType,
|
final CalendarInstance restCalendarInstance, final RecalculationFrequencyType recalculationFrequencyType,
|
||||||
final BigDecimal principalThresholdForLastInstalment, final Integer installmentAmountInMultiplesOf,
|
final BigDecimal principalThresholdForLastInstalment, final Integer installmentAmountInMultiplesOf,
|
||||||
final LoanPreCloseInterestCalculationStrategy preCloseInterestCalculationStrategy) {
|
final LoanPreClosureInterestCalculationStrategy preClosureInterestCalculationStrategy) {
|
||||||
this.currency = currency;
|
this.currency = currency;
|
||||||
this.loanTermFrequency = loanTermFrequency;
|
this.loanTermFrequency = loanTermFrequency;
|
||||||
this.loanTermPeriodFrequencyType = loanTermPeriodFrequencyType;
|
this.loanTermPeriodFrequencyType = loanTermPeriodFrequencyType;
|
||||||
@@ -344,7 +345,7 @@ public final class LoanApplicationTerms {
|
|||||||
this.recalculationFrequencyType = recalculationFrequencyType;
|
this.recalculationFrequencyType = recalculationFrequencyType;
|
||||||
this.principalThresholdForLastInstalment = principalThresholdForLastInstalment;
|
this.principalThresholdForLastInstalment = principalThresholdForLastInstalment;
|
||||||
this.installmentAmountInMultiplesOf = installmentAmountInMultiplesOf;
|
this.installmentAmountInMultiplesOf = installmentAmountInMultiplesOf;
|
||||||
this.preCloseInterestCalculationStrategy = preCloseInterestCalculationStrategy;
|
this.preClosureInterestCalculationStrategy = preClosureInterestCalculationStrategy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Money adjustPrincipalIfLastRepaymentPeriod(final Money principalForPeriod, final Money totalCumulativePrincipalToDate,
|
public Money adjustPrincipalIfLastRepaymentPeriod(final Money principalForPeriod, final Money totalCumulativePrincipalToDate,
|
||||||
@@ -1179,8 +1180,7 @@ public final class LoanApplicationTerms {
|
|||||||
return this.interestCalculationPeriodMethod;
|
return this.interestCalculationPeriodMethod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LoanPreClosureInterestCalculationStrategy getPreClosureInterestCalculationStrategy() {
|
||||||
public LoanPreCloseInterestCalculationStrategy getPreCloseInterestCalculationStrategy() {
|
return this.preClosureInterestCalculationStrategy;
|
||||||
return this.preCloseInterestCalculationStrategy;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -75,7 +75,7 @@ public interface LoanProductConstants {
|
|||||||
public static final String recalculationRestFrequencyIntervalParameterName = "recalculationRestFrequencyInterval";
|
public static final String recalculationRestFrequencyIntervalParameterName = "recalculationRestFrequencyInterval";
|
||||||
public static final String recalculationRestFrequencyDateParamName = "recalculationRestFrequencyDate";
|
public static final String recalculationRestFrequencyDateParamName = "recalculationRestFrequencyDate";
|
||||||
public static final String isArrearsBasedOnOriginalScheduleParamName = "isArrearsBasedOnOriginalSchedule";
|
public static final String isArrearsBasedOnOriginalScheduleParamName = "isArrearsBasedOnOriginalSchedule";
|
||||||
public static final String preCloseInterestCalculationStrategyParamName = "preCloseInterestCalculationStrategy";
|
public static final String preClosureInterestCalculationStrategyParamName = "preClosureInterestCalculationStrategy";
|
||||||
|
|
||||||
// Guarantee related
|
// Guarantee related
|
||||||
public static final String holdGuaranteeFundsParamName = "holdGuaranteeFunds";
|
public static final String holdGuaranteeFundsParamName = "holdGuaranteeFunds";
|
||||||
|
|||||||
+3
-3
@@ -130,7 +130,7 @@ public class LoanProductData {
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final List<EnumOptionData> rescheduleStrategyTypeOptions;
|
private final List<EnumOptionData> rescheduleStrategyTypeOptions;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final List<EnumOptionData> preCloseInterestCalculationStrategyOptions;
|
private final List<EnumOptionData> preClosureInterestCalculationStrategyOptions;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final List<EnumOptionData> interestRecalculationFrequencyTypeOptions;
|
private final List<EnumOptionData> interestRecalculationFrequencyTypeOptions;
|
||||||
@@ -481,7 +481,7 @@ public class LoanProductData {
|
|||||||
|
|
||||||
this.canDefineInstallmentAmount = canDefineInstallmentAmount;
|
this.canDefineInstallmentAmount = canDefineInstallmentAmount;
|
||||||
this.installmentAmountInMultiplesOf = installmentAmountInMultiplesOf;
|
this.installmentAmountInMultiplesOf = installmentAmountInMultiplesOf;
|
||||||
this.preCloseInterestCalculationStrategyOptions = null;
|
this.preClosureInterestCalculationStrategyOptions = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,7 +596,7 @@ public class LoanProductData {
|
|||||||
|
|
||||||
this.canDefineInstallmentAmount = productData.canDefineInstallmentAmount;
|
this.canDefineInstallmentAmount = productData.canDefineInstallmentAmount;
|
||||||
this.installmentAmountInMultiplesOf = productData.installmentAmountInMultiplesOf;
|
this.installmentAmountInMultiplesOf = productData.installmentAmountInMultiplesOf;
|
||||||
this.preCloseInterestCalculationStrategyOptions = preCloseInterestCalculationStrategyOptions;
|
this.preClosureInterestCalculationStrategyOptions = preCloseInterestCalculationStrategyOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Collection<ChargeData> nullIfEmpty(final Collection<ChargeData> charges) {
|
private Collection<ChargeData> nullIfEmpty(final Collection<ChargeData> charges) {
|
||||||
|
|||||||
+4
-4
@@ -12,7 +12,7 @@ import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.r
|
|||||||
import org.joda.time.LocalDate;
|
import org.joda.time.LocalDate;
|
||||||
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreCloseInterestCalculationStrategy;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreClosureInterestCalculationStrategy;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
||||||
|
|
||||||
public class LoanProductInterestRecalculationData {
|
public class LoanProductInterestRecalculationData {
|
||||||
@@ -29,7 +29,7 @@ public class LoanProductInterestRecalculationData {
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final boolean isArrearsBasedOnOriginalSchedule;
|
private final boolean isArrearsBasedOnOriginalSchedule;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final EnumOptionData preCloseInterestCalculationStrategy;
|
private final EnumOptionData preClosureInterestCalculationStrategy;
|
||||||
|
|
||||||
public LoanProductInterestRecalculationData(final Long id, final Long productId,
|
public LoanProductInterestRecalculationData(final Long id, final Long productId,
|
||||||
final EnumOptionData interestRecalculationCompoundingType, final EnumOptionData rescheduleStrategyType,
|
final EnumOptionData interestRecalculationCompoundingType, final EnumOptionData rescheduleStrategyType,
|
||||||
@@ -44,7 +44,7 @@ public class LoanProductInterestRecalculationData {
|
|||||||
this.recalculationRestFrequencyInterval = recalculationRestFrequencyInterval;
|
this.recalculationRestFrequencyInterval = recalculationRestFrequencyInterval;
|
||||||
this.recalculationRestFrequencyDate = recalculationRestFrequencyDate;
|
this.recalculationRestFrequencyDate = recalculationRestFrequencyDate;
|
||||||
this.isArrearsBasedOnOriginalSchedule = isArrearsBasedOnOriginalSchedule;
|
this.isArrearsBasedOnOriginalSchedule = isArrearsBasedOnOriginalSchedule;
|
||||||
this.preCloseInterestCalculationStrategy = preCloseInterestCalculationStrategy;
|
this.preClosureInterestCalculationStrategy = preCloseInterestCalculationStrategy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanProductInterestRecalculationData sensibleDefaultsForNewLoanProductCreation() {
|
public static LoanProductInterestRecalculationData sensibleDefaultsForNewLoanProductCreation() {
|
||||||
@@ -56,7 +56,7 @@ public class LoanProductInterestRecalculationData {
|
|||||||
final Integer recalculationRestFrequencyInterval = null;
|
final Integer recalculationRestFrequencyInterval = null;
|
||||||
final LocalDate recalculationRestFrequencyDate = null;
|
final LocalDate recalculationRestFrequencyDate = null;
|
||||||
final boolean isArrearsBasedOnOriginalSchedule = false;
|
final boolean isArrearsBasedOnOriginalSchedule = false;
|
||||||
final EnumOptionData preCloseInterestCalculationStrategy = preCloseInterestCalculationStrategy(LoanPreCloseInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE);
|
final EnumOptionData preCloseInterestCalculationStrategy = preCloseInterestCalculationStrategy(LoanPreClosureInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE);
|
||||||
return new LoanProductInterestRecalculationData(id, productId, interestRecalculationCompoundingType, rescheduleStrategyType,
|
return new LoanProductInterestRecalculationData(id, productId, interestRecalculationCompoundingType, rescheduleStrategyType,
|
||||||
recalculationRestFrequencyType, recalculationRestFrequencyInterval, recalculationRestFrequencyDate,
|
recalculationRestFrequencyType, recalculationRestFrequencyInterval, recalculationRestFrequencyDate,
|
||||||
isArrearsBasedOnOriginalSchedule, preCloseInterestCalculationStrategy);
|
isArrearsBasedOnOriginalSchedule, preCloseInterestCalculationStrategy);
|
||||||
|
|||||||
+12
-12
@@ -8,24 +8,24 @@ package org.mifosplatform.portfolio.loanproduct.domain;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public enum LoanPreCloseInterestCalculationStrategy {
|
public enum LoanPreClosureInterestCalculationStrategy {
|
||||||
|
|
||||||
NONE(0, "loanPreCloseInterestCalculationStrategy.none"), //
|
NONE(0, "loanPreClosureInterestCalculationStrategy.none"), //
|
||||||
TILL_PRE_CLOSURE_DATE(1, "loanPreCloseInterestCalculationStrategy.tillPreClosureDate"), //
|
TILL_PRE_CLOSURE_DATE(1, "loanPreClosureInterestCalculationStrategy.tillPreClosureDate"), //
|
||||||
TILL_REST_FREQUENCY_DATE(2, "loanPreCloseInterestCalculationStrategy.tillRestFrequencyDate");
|
TILL_REST_FREQUENCY_DATE(2, "loanPreClosureInterestCalculationStrategy.tillRestFrequencyDate");
|
||||||
|
|
||||||
// REPAYMENT_PERIOD_DATE(3,
|
// REPAYMENT_PERIOD_DATE(3,
|
||||||
// "loanPreCloseInterestCalculationStrategy.repaymentPeriodDate")
|
// "loanPreClosureInterestCalculationStrategy.repaymentPeriodDate")
|
||||||
|
|
||||||
private Integer value;
|
private Integer value;
|
||||||
private String code;
|
private String code;
|
||||||
|
|
||||||
private static final Map<Integer, LoanPreCloseInterestCalculationStrategy> intToEnumMap = new HashMap<>();
|
private static final Map<Integer, LoanPreClosureInterestCalculationStrategy> intToEnumMap = new HashMap<>();
|
||||||
private static int minValue;
|
private static int minValue;
|
||||||
private static int maxValue;
|
private static int maxValue;
|
||||||
static {
|
static {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (final LoanPreCloseInterestCalculationStrategy type : LoanPreCloseInterestCalculationStrategy.values()) {
|
for (final LoanPreClosureInterestCalculationStrategy type : LoanPreClosureInterestCalculationStrategy.values()) {
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
minValue = type.value;
|
minValue = type.value;
|
||||||
}
|
}
|
||||||
@@ -40,12 +40,12 @@ public enum LoanPreCloseInterestCalculationStrategy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanPreCloseInterestCalculationStrategy fromInt(final Integer ruleTypeValue) {
|
public static LoanPreClosureInterestCalculationStrategy fromInt(final Integer ruleTypeValue) {
|
||||||
final LoanPreCloseInterestCalculationStrategy type = intToEnumMap.get(ruleTypeValue);
|
final LoanPreClosureInterestCalculationStrategy type = intToEnumMap.get(ruleTypeValue);
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
private LoanPreCloseInterestCalculationStrategy(final Integer value, final String code) {
|
private LoanPreClosureInterestCalculationStrategy(final Integer value, final String code) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.code = code;
|
this.code = code;
|
||||||
}
|
}
|
||||||
@@ -67,10 +67,10 @@ public enum LoanPreCloseInterestCalculationStrategy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean calculateTillRestFrequencyEnabled() {
|
public boolean calculateTillRestFrequencyEnabled() {
|
||||||
return this.getValue().equals(LoanPreCloseInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE.getValue());
|
return this.getValue().equals(LoanPreClosureInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean calculateTillPreClosureDateEnabled() {
|
public boolean calculateTillPreClosureDateEnabled() {
|
||||||
return this.getValue().equals(LoanPreCloseInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue());
|
return this.getValue().equals(LoanPreClosureInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -1069,8 +1069,8 @@ public class LoanProduct extends AbstractPersistable<Long> {
|
|||||||
return this.installmentAmountInMultiplesOf;
|
return this.installmentAmountInMultiplesOf;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LoanPreCloseInterestCalculationStrategy preCloseInterestCalculationStrategy() {
|
public LoanPreClosureInterestCalculationStrategy preCloseInterestCalculationStrategy() {
|
||||||
LoanPreCloseInterestCalculationStrategy preCloseInterestCalculationStrategy = LoanPreCloseInterestCalculationStrategy.NONE;
|
LoanPreClosureInterestCalculationStrategy preCloseInterestCalculationStrategy = LoanPreClosureInterestCalculationStrategy.NONE;
|
||||||
if (this.isInterestRecalculationEnabled()) {
|
if (this.isInterestRecalculationEnabled()) {
|
||||||
preCloseInterestCalculationStrategy = getProductInterestRecalculationDetails().preCloseInterestCalculationStrategy();
|
preCloseInterestCalculationStrategy = getProductInterestRecalculationDetails().preCloseInterestCalculationStrategy();
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-12
@@ -62,7 +62,7 @@ public class LoanProductInterestRecalculationDetails extends AbstractPersistable
|
|||||||
private boolean isArrearsBasedOnOriginalSchedule;
|
private boolean isArrearsBasedOnOriginalSchedule;
|
||||||
|
|
||||||
@Column(name = "pre_close_interest_calculation_strategy")
|
@Column(name = "pre_close_interest_calculation_strategy")
|
||||||
private Integer preCloseInterestCalculationStrategy;
|
private Integer preClosureInterestCalculationStrategy;
|
||||||
|
|
||||||
protected LoanProductInterestRecalculationDetails() {
|
protected LoanProductInterestRecalculationDetails() {
|
||||||
//
|
//
|
||||||
@@ -96,9 +96,9 @@ public class LoanProductInterestRecalculationDetails extends AbstractPersistable
|
|||||||
}
|
}
|
||||||
|
|
||||||
Integer preCloseInterestCalculationStrategy = command
|
Integer preCloseInterestCalculationStrategy = command
|
||||||
.integerValueOfParameterNamed(LoanProductConstants.preCloseInterestCalculationStrategyParamName);
|
.integerValueOfParameterNamed(LoanProductConstants.preClosureInterestCalculationStrategyParamName);
|
||||||
if (preCloseInterestCalculationStrategy == null) {
|
if (preCloseInterestCalculationStrategy == null) {
|
||||||
preCloseInterestCalculationStrategy = LoanPreCloseInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue();
|
preCloseInterestCalculationStrategy = LoanPreClosureInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LoanProductInterestRecalculationDetails(interestRecalculationCompoundingMethod, loanRescheduleStrategyMethod,
|
return new LoanProductInterestRecalculationDetails(interestRecalculationCompoundingMethod, loanRescheduleStrategyMethod,
|
||||||
@@ -115,7 +115,7 @@ public class LoanProductInterestRecalculationDetails extends AbstractPersistable
|
|||||||
this.restInterval = restInterval;
|
this.restInterval = restInterval;
|
||||||
this.restFrequencyDate = restFrequencyDate;
|
this.restFrequencyDate = restFrequencyDate;
|
||||||
this.isArrearsBasedOnOriginalSchedule = isArrearsBasedOnOriginalSchedule;
|
this.isArrearsBasedOnOriginalSchedule = isArrearsBasedOnOriginalSchedule;
|
||||||
this.preCloseInterestCalculationStrategy = preCloseInterestCalculationStrategy;
|
this.preClosureInterestCalculationStrategy = preCloseInterestCalculationStrategy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateProduct(final LoanProduct loanProduct) {
|
public void updateProduct(final LoanProduct loanProduct) {
|
||||||
@@ -195,14 +195,14 @@ public class LoanProductInterestRecalculationDetails extends AbstractPersistable
|
|||||||
this.isArrearsBasedOnOriginalSchedule = newValue;
|
this.isArrearsBasedOnOriginalSchedule = newValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (command.isChangeInIntegerParameterNamed(LoanProductConstants.preCloseInterestCalculationStrategyParamName,
|
if (command.isChangeInIntegerParameterNamed(LoanProductConstants.preClosureInterestCalculationStrategyParamName,
|
||||||
this.preCloseInterestCalculationStrategy)) {
|
this.preClosureInterestCalculationStrategy)) {
|
||||||
Integer newValue = command.integerValueOfParameterNamed(LoanProductConstants.preCloseInterestCalculationStrategyParamName);
|
Integer newValue = command.integerValueOfParameterNamed(LoanProductConstants.preClosureInterestCalculationStrategyParamName);
|
||||||
if (newValue == null) {
|
if (newValue == null) {
|
||||||
newValue = LoanPreCloseInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue();
|
newValue = LoanPreClosureInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue();
|
||||||
}
|
}
|
||||||
actualChanges.put(LoanProductConstants.preCloseInterestCalculationStrategyParamName, newValue);
|
actualChanges.put(LoanProductConstants.preClosureInterestCalculationStrategyParamName, newValue);
|
||||||
this.preCloseInterestCalculationStrategy = newValue;
|
this.preClosureInterestCalculationStrategy = newValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ public class LoanProductInterestRecalculationDetails extends AbstractPersistable
|
|||||||
return this.isArrearsBasedOnOriginalSchedule;
|
return this.isArrearsBasedOnOriginalSchedule;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LoanPreCloseInterestCalculationStrategy preCloseInterestCalculationStrategy() {
|
public LoanPreClosureInterestCalculationStrategy preCloseInterestCalculationStrategy() {
|
||||||
return LoanPreCloseInterestCalculationStrategy.fromInt(this.preCloseInterestCalculationStrategy);
|
return LoanPreClosureInterestCalculationStrategy.fromInt(this.preClosureInterestCalculationStrategy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+41
-46
@@ -26,7 +26,7 @@ import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidation
|
|||||||
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
|
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
|
||||||
import org.mifosplatform.portfolio.loanproduct.LoanProductConstants;
|
import org.mifosplatform.portfolio.loanproduct.LoanProductConstants;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreCloseInterestCalculationStrategy;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreClosureInterestCalculationStrategy;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.RecalculationFrequencyType;
|
import org.mifosplatform.portfolio.loanproduct.domain.RecalculationFrequencyType;
|
||||||
@@ -44,47 +44,41 @@ public final class LoanProductDataValidator {
|
|||||||
/**
|
/**
|
||||||
* The parameters supported for this command.
|
* The parameters supported for this command.
|
||||||
*/
|
*/
|
||||||
private final Set<String> supportedParameters = new HashSet<>(
|
private final Set<String> supportedParameters = new HashSet<>(Arrays.asList("locale", "dateFormat", "name", "description", "fundId",
|
||||||
Arrays.asList("locale", "dateFormat", "name", "description", "fundId", "currencyCode", "digitsAfterDecimal", "inMultiplesOf",
|
"currencyCode", "digitsAfterDecimal", "inMultiplesOf", "principal", "minPrincipal", "maxPrincipal", "repaymentEvery",
|
||||||
"principal", "minPrincipal", "maxPrincipal", "repaymentEvery", "numberOfRepayments", "minNumberOfRepayments",
|
"numberOfRepayments", "minNumberOfRepayments", "maxNumberOfRepayments", "repaymentFrequencyType", "interestRatePerPeriod",
|
||||||
"maxNumberOfRepayments", "repaymentFrequencyType", "interestRatePerPeriod", "minInterestRatePerPeriod",
|
"minInterestRatePerPeriod", "maxInterestRatePerPeriod", "interestRateFrequencyType", "amortizationType", "interestType",
|
||||||
"maxInterestRatePerPeriod", "interestRateFrequencyType", "amortizationType", "interestType",
|
"interestCalculationPeriodType", "inArrearsTolerance", "transactionProcessingStrategyId", "graceOnPrincipalPayment",
|
||||||
"interestCalculationPeriodType", "inArrearsTolerance", "transactionProcessingStrategyId", "graceOnPrincipalPayment",
|
"graceOnInterestPayment", "graceOnInterestCharged", "charges", "accountingRule", "includeInBorrowerCycle", "startDate",
|
||||||
"graceOnInterestPayment", "graceOnInterestCharged", "charges", "accountingRule", "includeInBorrowerCycle", "startDate",
|
"closeDate", "externalId", LOAN_PRODUCT_ACCOUNTING_PARAMS.FEES_RECEIVABLE.getValue(),
|
||||||
"closeDate", "externalId", LOAN_PRODUCT_ACCOUNTING_PARAMS.FEES_RECEIVABLE.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.FUND_SOURCE.getValue(), LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_FEES.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.FUND_SOURCE.getValue(), LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_FEES.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_PENALTIES.getValue(), LOAN_PRODUCT_ACCOUNTING_PARAMS.INTEREST_ON_LOANS.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_PENALTIES.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.INTEREST_RECEIVABLE.getValue(), LOAN_PRODUCT_ACCOUNTING_PARAMS.LOAN_PORTFOLIO.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.INTEREST_ON_LOANS.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.OVERPAYMENT.getValue(), LOAN_PRODUCT_ACCOUNTING_PARAMS.TRANSFERS_SUSPENSE.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.INTEREST_RECEIVABLE.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.LOSSES_WRITTEN_OFF.getValue(), LOAN_PRODUCT_ACCOUNTING_PARAMS.PENALTIES_RECEIVABLE.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.LOAN_PORTFOLIO.getValue(), LOAN_PRODUCT_ACCOUNTING_PARAMS.OVERPAYMENT.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.TRANSFERS_SUSPENSE.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.FEE_INCOME_ACCOUNT_MAPPING.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.LOSSES_WRITTEN_OFF.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_RECOVERY.getValue(),
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.PENALTIES_RECEIVABLE.getValue(),
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.PENALTY_INCOME_ACCOUNT_MAPPING.getValue(), LoanProductConstants.useBorrowerCycleParameterName,
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue(),
|
LoanProductConstants.principalVariationsForBorrowerCycleParameterName,
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.FEE_INCOME_ACCOUNT_MAPPING.getValue(),
|
LoanProductConstants.interestRateVariationsForBorrowerCycleParameterName,
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_RECOVERY.getValue(),
|
LoanProductConstants.numberOfRepaymentVariationsForBorrowerCycleParameterName, LoanProductConstants.shortName,
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.PENALTY_INCOME_ACCOUNT_MAPPING.getValue(),
|
LoanProductConstants.multiDisburseLoanParameterName, LoanProductConstants.outstandingLoanBalanceParameterName,
|
||||||
LoanProductConstants.useBorrowerCycleParameterName,
|
LoanProductConstants.maxTrancheCountParameterName, LoanProductConstants.graceOnArrearsAgeingParameterName,
|
||||||
LoanProductConstants.principalVariationsForBorrowerCycleParameterName,
|
LoanProductConstants.overdueDaysForNPAParameterName, LoanProductConstants.isInterestRecalculationEnabledParameterName,
|
||||||
LoanProductConstants.interestRateVariationsForBorrowerCycleParameterName,
|
LoanProductConstants.daysInYearTypeParameterName, LoanProductConstants.daysInMonthTypeParameterName,
|
||||||
LoanProductConstants.numberOfRepaymentVariationsForBorrowerCycleParameterName, LoanProductConstants.shortName,
|
LoanProductConstants.rescheduleStrategyMethodParameterName,
|
||||||
LoanProductConstants.multiDisburseLoanParameterName, LoanProductConstants.outstandingLoanBalanceParameterName,
|
LoanProductConstants.interestRecalculationCompoundingMethodParameterName,
|
||||||
LoanProductConstants.maxTrancheCountParameterName, LoanProductConstants.graceOnArrearsAgeingParameterName,
|
LoanProductConstants.recalculationRestFrequencyDateParamName,
|
||||||
LoanProductConstants.overdueDaysForNPAParameterName, LoanProductConstants.isInterestRecalculationEnabledParameterName,
|
LoanProductConstants.recalculationRestFrequencyIntervalParameterName,
|
||||||
LoanProductConstants.daysInYearTypeParameterName, LoanProductConstants.daysInMonthTypeParameterName,
|
LoanProductConstants.recalculationRestFrequencyTypeParameterName,
|
||||||
LoanProductConstants.rescheduleStrategyMethodParameterName,
|
LoanProductConstants.isArrearsBasedOnOriginalScheduleParamName,
|
||||||
LoanProductConstants.interestRecalculationCompoundingMethodParameterName,
|
LoanProductConstants.minimumDaysBetweenDisbursalAndFirstRepayment, LoanProductConstants.mandatoryGuaranteeParamName,
|
||||||
LoanProductConstants.recalculationRestFrequencyDateParamName,
|
LoanProductConstants.holdGuaranteeFundsParamName, LoanProductConstants.minimumGuaranteeFromGuarantorParamName,
|
||||||
LoanProductConstants.recalculationRestFrequencyIntervalParameterName,
|
LoanProductConstants.minimumGuaranteeFromOwnFundsParamName, LoanProductConstants.principalThresholdForLastInstallmentParamName,
|
||||||
LoanProductConstants.recalculationRestFrequencyTypeParameterName,
|
LoanProductConstants.accountMovesOutOfNPAOnlyOnArrearsCompletionParamName, LoanProductConstants.canDefineEmiAmountParamName,
|
||||||
LoanProductConstants.isArrearsBasedOnOriginalScheduleParamName,
|
LoanProductConstants.installmentAmountInMultiplesOfParamName,
|
||||||
LoanProductConstants.minimumDaysBetweenDisbursalAndFirstRepayment, LoanProductConstants.mandatoryGuaranteeParamName,
|
LoanProductConstants.preClosureInterestCalculationStrategyParamName));
|
||||||
LoanProductConstants.holdGuaranteeFundsParamName, LoanProductConstants.minimumGuaranteeFromGuarantorParamName,
|
|
||||||
LoanProductConstants.minimumGuaranteeFromOwnFundsParamName,
|
|
||||||
LoanProductConstants.principalThresholdForLastInstallmentParamName,
|
|
||||||
LoanProductConstants.accountMovesOutOfNPAOnlyOnArrearsCompletionParamName,
|
|
||||||
LoanProductConstants.canDefineEmiAmountParamName, LoanProductConstants.installmentAmountInMultiplesOfParamName,
|
|
||||||
LoanProductConstants.preCloseInterestCalculationStrategyParamName));
|
|
||||||
|
|
||||||
private final FromJsonHelper fromApiJsonHelper;
|
private final FromJsonHelper fromApiJsonHelper;
|
||||||
|
|
||||||
@@ -545,15 +539,16 @@ public final class LoanProductDataValidator {
|
|||||||
baseDataValidator.reset().parameter(LoanProductConstants.isArrearsBasedOnOriginalScheduleParamName)
|
baseDataValidator.reset().parameter(LoanProductConstants.isArrearsBasedOnOriginalScheduleParamName)
|
||||||
.value(isArrearsBasedOnOriginalSchedule).notNull().isOneOfTheseValues(true, false);
|
.value(isArrearsBasedOnOriginalSchedule).notNull().isOneOfTheseValues(true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Integer preCloseInterestCalculationStrategy = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(
|
final Integer preCloseInterestCalculationStrategy = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(
|
||||||
LoanProductConstants.preCloseInterestCalculationStrategyParamName, element);
|
LoanProductConstants.preClosureInterestCalculationStrategyParamName, element);
|
||||||
baseDataValidator
|
baseDataValidator
|
||||||
.reset()
|
.reset()
|
||||||
.parameter(LoanProductConstants.preCloseInterestCalculationStrategyParamName)
|
.parameter(LoanProductConstants.preClosureInterestCalculationStrategyParamName)
|
||||||
.value(preCloseInterestCalculationStrategy)
|
.value(preCloseInterestCalculationStrategy)
|
||||||
.ignoreIfNull()
|
.ignoreIfNull()
|
||||||
.inMinMaxRange(LoanPreCloseInterestCalculationStrategy.getMinValue(), LoanPreCloseInterestCalculationStrategy.getMaxValue());
|
.inMinMaxRange(LoanPreClosureInterestCalculationStrategy.getMinValue(),
|
||||||
|
LoanPreClosureInterestCalculationStrategy.getMaxValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validateForUpdate(final String json, final LoanProduct loanProduct) {
|
public void validateForUpdate(final String json, final LoanProduct loanProduct) {
|
||||||
|
|||||||
+6
-5
@@ -13,27 +13,28 @@ import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.i
|
|||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestType;
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestType;
|
||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.loanCycleValueConditionType;
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.loanCycleValueConditionType;
|
||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.loanTermFrequencyType;
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.loanTermFrequencyType;
|
||||||
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.preCloseInterestCalculationStrategy;
|
||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyDayOfWeekType;
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyDayOfWeekType;
|
||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyNthDayType;
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyNthDayType;
|
||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyType;
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyType;
|
||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.rescheduleStrategyType;
|
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.rescheduleStrategyType;
|
||||||
import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.preCloseInterestCalculationStrategy;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
||||||
|
import org.mifosplatform.portfolio.common.domain.DayOfWeekType;
|
||||||
import org.mifosplatform.portfolio.common.domain.NthDayType;
|
import org.mifosplatform.portfolio.common.domain.NthDayType;
|
||||||
import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType;
|
import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType;
|
||||||
import org.mifosplatform.portfolio.common.domain.DayOfWeekType;
|
|
||||||
import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionProcessingStrategyRepository;
|
import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionProcessingStrategyRepository;
|
||||||
import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData;
|
import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreCloseInterestCalculationStrategy;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreClosureInterestCalculationStrategy;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy;
|
||||||
@@ -177,8 +178,8 @@ public class LoanDropdownReadPlatformServiceImpl implements LoanDropdownReadPlat
|
|||||||
public List<EnumOptionData> retrivePreCloseInterestCalculationStrategyOptions() {
|
public List<EnumOptionData> retrivePreCloseInterestCalculationStrategyOptions() {
|
||||||
|
|
||||||
final List<EnumOptionData> preCloseInterestCalculationStrategyOptions = Arrays.asList(
|
final List<EnumOptionData> preCloseInterestCalculationStrategyOptions = Arrays.asList(
|
||||||
preCloseInterestCalculationStrategy(LoanPreCloseInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE),
|
preCloseInterestCalculationStrategy(LoanPreClosureInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE),
|
||||||
preCloseInterestCalculationStrategy(LoanPreCloseInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE));
|
preCloseInterestCalculationStrategy(LoanPreClosureInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE));
|
||||||
return preCloseInterestCalculationStrategyOptions;
|
return preCloseInterestCalculationStrategyOptions;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+11
-7
@@ -20,7 +20,7 @@ import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod;
|
|||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreCloseInterestCalculationStrategy;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanPreClosureInterestCalculationStrategy;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductParamType;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductParamType;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
|
||||||
@@ -598,19 +598,23 @@ public class LoanEnumerations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static EnumOptionData preCloseInterestCalculationStrategy(final int id) {
|
public static EnumOptionData preCloseInterestCalculationStrategy(final int id) {
|
||||||
return preCloseInterestCalculationStrategy(LoanPreCloseInterestCalculationStrategy.fromInt(id));
|
return preCloseInterestCalculationStrategy(LoanPreClosureInterestCalculationStrategy.fromInt(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EnumOptionData preCloseInterestCalculationStrategy(final LoanPreCloseInterestCalculationStrategy type) {
|
public static EnumOptionData preCloseInterestCalculationStrategy(final LoanPreClosureInterestCalculationStrategy type) {
|
||||||
EnumOptionData optionData = null;
|
EnumOptionData optionData = null;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TILL_PRE_CLOSURE_DATE:
|
case TILL_PRE_CLOSURE_DATE:
|
||||||
optionData = new EnumOptionData(LoanPreCloseInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue().longValue(),
|
optionData = new EnumOptionData(LoanPreClosureInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getValue().longValue(),
|
||||||
LoanPreCloseInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getCode(), "Till preclose Date");
|
LoanPreClosureInterestCalculationStrategy.TILL_PRE_CLOSURE_DATE.getCode(), "Till preclose Date");
|
||||||
break;
|
break;
|
||||||
case TILL_REST_FREQUENCY_DATE:
|
case TILL_REST_FREQUENCY_DATE:
|
||||||
optionData = new EnumOptionData(LoanPreCloseInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE.getValue().longValue(),
|
optionData = new EnumOptionData(LoanPreClosureInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE.getValue().longValue(),
|
||||||
LoanPreCloseInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE.getCode(), "Till rest Frequency Date");
|
LoanPreClosureInterestCalculationStrategy.TILL_REST_FREQUENCY_DATE.getCode(), "Till rest Frequency Date");
|
||||||
|
break;
|
||||||
|
case NONE:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return optionData;
|
return optionData;
|
||||||
|
|||||||
Reference in New Issue
Block a user