in fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java [1047:1240]
private void validateInterestRecalculationParams(final JsonElement element, final DataValidatorBuilder baseDataValidator,
final LoanProduct loanProduct) {
InterestRecalculationCompoundingMethod compoundingMethod = null;
if (loanProduct == null || this.fromApiJsonHelper
.parameterExists(LoanProductConstants.interestRecalculationCompoundingMethodParameterName, element)) {
final Integer interestRecalculationCompoundingMethod = this.fromApiJsonHelper.extractIntegerNamed(
LoanProductConstants.interestRecalculationCompoundingMethodParameterName, element, Locale.getDefault());
baseDataValidator.reset().parameter(LoanProductConstants.interestRecalculationCompoundingMethodParameterName)
.value(interestRecalculationCompoundingMethod).notNull().inMinMaxRange(0, 3);
if (interestRecalculationCompoundingMethod != null) {
compoundingMethod = InterestRecalculationCompoundingMethod.fromInt(interestRecalculationCompoundingMethod);
}
}
if (compoundingMethod == null) {
if (loanProduct == null) {
compoundingMethod = InterestRecalculationCompoundingMethod.NONE;
} else {
compoundingMethod = InterestRecalculationCompoundingMethod
.fromInt(loanProduct.getProductInterestRecalculationDetails().getInterestRecalculationCompoundingMethod());
}
}
if (loanProduct == null
|| this.fromApiJsonHelper.parameterExists(LoanProductConstants.rescheduleStrategyMethodParameterName, element)) {
final Integer rescheduleStrategyMethod = this.fromApiJsonHelper
.extractIntegerNamed(LoanProductConstants.rescheduleStrategyMethodParameterName, element, Locale.getDefault());
baseDataValidator.reset().parameter(LoanProductConstants.rescheduleStrategyMethodParameterName).value(rescheduleStrategyMethod)
.notNull().inMinMaxRange(1, 4);
final LoanRescheduleStrategyMethod loanRescheduleStrategyMethod = LoanRescheduleStrategyMethod
.fromInt(rescheduleStrategyMethod);
String loanScheduleType = LoanScheduleType.CUMULATIVE.toString();
if (fromApiJsonHelper.parameterExists(LoanProductConstants.LOAN_SCHEDULE_TYPE, element)) {
loanScheduleType = fromApiJsonHelper.extractStringNamed(LoanProductConstants.LOAN_SCHEDULE_TYPE, element);
}
if (LoanScheduleType.CUMULATIVE.equals(LoanScheduleType.valueOf(loanScheduleType))
&& fromApiJsonHelper.parameterExists(LoanProductConstants.disallowInterestCalculationOnPastDueParamName, element)) {
baseDataValidator.reset().parameter(LoanProductConstants.disallowInterestCalculationOnPastDueParamName).failWithCode(
"disallow.interest.calculation.on.past.due.not.supported.for.loan.schedule.type.cumulative",
"Do not calculate interest on past due principal balances is only supported for Progressive loan schedule type");
}
if (LoanScheduleType.CUMULATIVE.equals(LoanScheduleType.valueOf(loanScheduleType))
&& LoanRescheduleStrategyMethod.ADJUST_LAST_UNPAID_PERIOD.equals(loanRescheduleStrategyMethod)) {
baseDataValidator.reset().parameter(LoanProductConstants.rescheduleStrategyMethodParameterName).failWithCode(
"reschedule.strategy.method.not.supported.for.loan.schedule.type.cumulative",
"Adjust last, unpaid period is only supported for Progressive loan schedule type");
}
if (LoanScheduleType.PROGRESSIVE.equals(LoanScheduleType.valueOf(loanScheduleType))
&& !LoanRescheduleStrategyMethod.ADJUST_LAST_UNPAID_PERIOD.equals(loanRescheduleStrategyMethod)) {
baseDataValidator.reset().parameter(LoanProductConstants.rescheduleStrategyMethodParameterName).failWithCode(
"reschedule.strategy.method.not.supported.for.loan.schedule.type.progressive",
loanRescheduleStrategyMethod.toString()
+ " reschedule strategy type is not supported for Progressive loan schedule type");
}
}
RecalculationFrequencyType frequencyType = null;
if (loanProduct == null
|| this.fromApiJsonHelper.parameterExists(LoanProductConstants.recalculationRestFrequencyTypeParameterName, element)) {
final Integer recalculationRestFrequencyType = this.fromApiJsonHelper
.extractIntegerNamed(LoanProductConstants.recalculationRestFrequencyTypeParameterName, element, Locale.getDefault());
baseDataValidator.reset().parameter(LoanProductConstants.recalculationRestFrequencyTypeParameterName)
.value(recalculationRestFrequencyType).notNull().inMinMaxRange(1, 4);
if (recalculationRestFrequencyType != null) {
frequencyType = RecalculationFrequencyType.fromInt(recalculationRestFrequencyType);
}
}
if (frequencyType == null) {
if (loanProduct == null) {
frequencyType = RecalculationFrequencyType.INVALID;
} else {
frequencyType = loanProduct.getProductInterestRecalculationDetails().getRestFrequencyType();
}
}
if (!frequencyType.isSameAsRepayment()) {
if (loanProduct == null || this.fromApiJsonHelper
.parameterExists(LoanProductConstants.recalculationRestFrequencyIntervalParameterName, element)) {
final Integer recurrenceInterval = this.fromApiJsonHelper.extractIntegerNamed(
LoanProductConstants.recalculationRestFrequencyIntervalParameterName, element, Locale.getDefault());
baseDataValidator.reset().parameter(LoanProductConstants.recalculationRestFrequencyIntervalParameterName)
.value(recurrenceInterval).notNull();
}
if (loanProduct == null
|| this.fromApiJsonHelper.parameterExists(LoanProductConstants.recalculationRestFrequencyNthDayParamName, element)
|| this.fromApiJsonHelper.parameterExists(LoanProductConstants.recalculationRestFrequencyWeekdayParamName, element)) {
CalendarUtils.validateNthDayOfMonthFrequency(baseDataValidator,
LoanProductConstants.recalculationRestFrequencyNthDayParamName,
LoanProductConstants.recalculationRestFrequencyWeekdayParamName, element, this.fromApiJsonHelper);
}
if (loanProduct == null
|| this.fromApiJsonHelper.parameterExists(LoanProductConstants.recalculationRestFrequencyOnDayParamName, element)) {
final Integer recalculationRestFrequencyOnDay = this.fromApiJsonHelper
.extractIntegerNamed(LoanProductConstants.recalculationRestFrequencyOnDayParamName, element, Locale.getDefault());
baseDataValidator.reset().parameter(LoanProductConstants.recalculationRestFrequencyOnDayParamName)
.value(recalculationRestFrequencyOnDay).ignoreIfNull().inMinMaxRange(1, 28);
}
}
if (compoundingMethod.isCompoundingEnabled()) {
RecalculationFrequencyType compoundingFrequencyType = null;
if (loanProduct == null || this.fromApiJsonHelper
.parameterExists(LoanProductConstants.recalculationCompoundingFrequencyTypeParameterName, element)) {
final Integer recalculationCompoundingFrequencyType = this.fromApiJsonHelper.extractIntegerNamed(
LoanProductConstants.recalculationCompoundingFrequencyTypeParameterName, element, Locale.getDefault());
baseDataValidator.reset().parameter(LoanProductConstants.recalculationCompoundingFrequencyTypeParameterName)
.value(recalculationCompoundingFrequencyType).notNull().inMinMaxRange(1, 4);
if (recalculationCompoundingFrequencyType != null) {
compoundingFrequencyType = RecalculationFrequencyType.fromInt(recalculationCompoundingFrequencyType);
if (!compoundingFrequencyType.isSameAsRepayment()) {
PeriodFrequencyType repaymentFrequencyType = null;
if (this.fromApiJsonHelper.parameterExists(REPAYMENT_FREQUENCY_TYPE, element)) {
Integer repaymentFrequencyTypeVal = this.fromApiJsonHelper.extractIntegerNamed(REPAYMENT_FREQUENCY_TYPE,
element, Locale.getDefault());
repaymentFrequencyType = PeriodFrequencyType.fromInt(repaymentFrequencyTypeVal);
} else if (loanProduct != null) {
repaymentFrequencyType = loanProduct.getLoanProductRelatedDetail().getRepaymentPeriodFrequencyType();
}
if (!compoundingFrequencyType.isSameFrequency(repaymentFrequencyType)) {
baseDataValidator.reset().parameter(LoanProductConstants.recalculationCompoundingFrequencyTypeParameterName)
.value(recalculationCompoundingFrequencyType).failWithCode("must.be.same.as.repayment.frequency");
}
}
}
}
if (compoundingFrequencyType == null) {
if (loanProduct == null) {
compoundingFrequencyType = RecalculationFrequencyType.INVALID;
} else {
compoundingFrequencyType = loanProduct.getProductInterestRecalculationDetails().getCompoundingFrequencyType();
}
}
if (!compoundingFrequencyType.isSameAsRepayment()) {
if (loanProduct == null || this.fromApiJsonHelper
.parameterExists(LoanProductConstants.recalculationCompoundingFrequencyIntervalParameterName, element)) {
final Integer recurrenceInterval = this.fromApiJsonHelper.extractIntegerNamed(
LoanProductConstants.recalculationCompoundingFrequencyIntervalParameterName, element, Locale.getDefault());
Integer repaymentEvery = null;
if (loanProduct == null) {
repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(REPAYMENT_EVERY, element);
} else {
repaymentEvery = loanProduct.getLoanProductRelatedDetail().getRepayEvery();
}
baseDataValidator.reset().parameter(LoanProductConstants.recalculationCompoundingFrequencyIntervalParameterName)
.value(recurrenceInterval).notNull().integerInMultiplesOfNumber(repaymentEvery);
}
if (loanProduct == null
|| this.fromApiJsonHelper.parameterExists(LoanProductConstants.recalculationCompoundingFrequencyNthDayParamName,
element)
|| this.fromApiJsonHelper.parameterExists(LoanProductConstants.recalculationCompoundingFrequencyWeekdayParamName,
element)) {
CalendarUtils.validateNthDayOfMonthFrequency(baseDataValidator,
LoanProductConstants.recalculationCompoundingFrequencyNthDayParamName,
LoanProductConstants.recalculationCompoundingFrequencyWeekdayParamName, element, this.fromApiJsonHelper);
}
if (loanProduct == null || this.fromApiJsonHelper
.parameterExists(LoanProductConstants.recalculationCompoundingFrequencyOnDayParamName, element)) {
final Integer recalculationRestFrequencyOnDay = this.fromApiJsonHelper.extractIntegerNamed(
LoanProductConstants.recalculationCompoundingFrequencyOnDayParamName, element, Locale.getDefault());
baseDataValidator.reset().parameter(LoanProductConstants.recalculationCompoundingFrequencyOnDayParamName)
.value(recalculationRestFrequencyOnDay).ignoreIfNull().inMinMaxRange(1, 28);
}
}
}
if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.isArrearsBasedOnOriginalScheduleParamName, element)) {
final Boolean isArrearsBasedOnOriginalSchedule = this.fromApiJsonHelper
.extractBooleanNamed(LoanProductConstants.isArrearsBasedOnOriginalScheduleParamName, element);
baseDataValidator.reset().parameter(LoanProductConstants.isArrearsBasedOnOriginalScheduleParamName)
.value(isArrearsBasedOnOriginalSchedule).notNull().isOneOfTheseValues(true, false);
}
if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.isCompoundingToBePostedAsTransactionParamName, element)) {
final Boolean isCompoundingToBePostedAsTransactions = this.fromApiJsonHelper
.extractBooleanNamed(LoanProductConstants.isCompoundingToBePostedAsTransactionParamName, element);
baseDataValidator.reset().parameter(LoanProductConstants.isCompoundingToBePostedAsTransactionParamName)
.value(isCompoundingToBePostedAsTransactions).notNull().isOneOfTheseValues(true, false);
}
final Integer preCloseInterestCalculationStrategy = this.fromApiJsonHelper
.extractIntegerWithLocaleNamed(LoanProductConstants.preClosureInterestCalculationStrategyParamName, element);
baseDataValidator.reset().parameter(LoanProductConstants.preClosureInterestCalculationStrategyParamName)
.value(preCloseInterestCalculationStrategy).ignoreIfNull().inMinMaxRange(
LoanPreCloseInterestCalculationStrategy.getMinValue(), LoanPreCloseInterestCalculationStrategy.getMaxValue());
}