From 3d399eba1072b9bce51932db83f91e099c3af44d Mon Sep 17 00:00:00 2001 From: Vishwas Babu A J Date: Mon, 8 Dec 2014 17:50:14 -0800 Subject: [PATCH] MIFOSX-1728 --- ...anApplicationCommandFromApiJsonHelper.java | 35 ++++++++++++++++++- ...WritePlatformServiceJpaRepositoryImpl.java | 14 ++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java index 7ba21aed9..9cf83f342 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java @@ -763,10 +763,43 @@ public final class LoanApplicationCommandFromApiJsonHelper { } public void validateLoanTermAndRepaidEveryValues(final Integer loanTermFrequency, final Integer loanTermFrequencyType, - final Integer numberOfRepayments, final Integer repaymentEvery, final Integer repaymentEveryType) { + final Integer numberOfRepayments, final Integer repaymentEvery, final Integer repaymentEveryType, final Loan loan) { final List dataValidationErrors = new ArrayList<>(); this.apiJsonHelper.validateSelectedPeriodFrequencyTypeIsTheSame(dataValidationErrors, loanTermFrequency, loanTermFrequencyType, numberOfRepayments, repaymentEvery, repaymentEveryType); + + /** + * For multi-disbursal loans where schedules are auto-generated based on + * a fixed EMI, ensure the number of repayments is within the + * permissible range defined by the loan product + **/ + if (loan.loanProduct().isMultiDisburseLoan() && loan.getFixedEmiAmount() != null) { + Integer minimumNoOfRepayments = loan.loanProduct().getMinNumberOfRepayments(); + Integer maximumNoOfRepayments = loan.loanProduct().getMaxNumberOfRepayments(); + Integer actualNumberOfRepayments = loan.getRepaymentScheduleInstallments().size(); + // validate actual number of repayments is > minimum number of + // repayments + if (minimumNoOfRepayments != null && minimumNoOfRepayments != 0 && actualNumberOfRepayments < minimumNoOfRepayments) { + final ApiParameterError error = ApiParameterError.generalError( + "validation.msg.loan.numberOfRepayments.lesser.than.minimumNumberOfRepayments", + "The total number of calculated repayments for this loan " + actualNumberOfRepayments + + " is lesser than the allowed minimum of " + minimumNoOfRepayments, actualNumberOfRepayments, + minimumNoOfRepayments); + dataValidationErrors.add(error); + } + + // validate actual number of repayments is < maximum number of + // repayments + if (maximumNoOfRepayments != null && maximumNoOfRepayments != 0 && actualNumberOfRepayments > maximumNoOfRepayments) { + final ApiParameterError error = ApiParameterError.generalError( + "validation.msg.loan.numberOfRepayments.greater.than.maximumNumberOfRepayments", + "The total number of calculated repayments for this loan " + actualNumberOfRepayments + + " is greater than the allowed maximum of " + maximumNoOfRepayments, actualNumberOfRepayments, + maximumNoOfRepayments); + dataValidationErrors.add(error); + } + + } if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index bac4afa4a..e754aedf7 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -227,7 +227,8 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final LoanProductRelatedDetail productRelatedDetail = newLoanApplication.repaymentScheduleDetail(); this.fromApiJsonDeserializer.validateLoanTermAndRepaidEveryValues(newLoanApplication.getTermFrequency(), newLoanApplication.getTermPeriodFrequencyType(), productRelatedDetail.getNumberOfRepayments(), - productRelatedDetail.getRepayEvery(), productRelatedDetail.getRepaymentPeriodFrequencyType().getValue()); + productRelatedDetail.getRepayEvery(), productRelatedDetail.getRepaymentPeriodFrequencyType().getValue(), + newLoanApplication); this.loanRepository.save(newLoanApplication); @@ -487,11 +488,6 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa existingLoanApplication.updateIsInterestRecalculationEnabled(); validateSubmittedOnDate(existingLoanApplication); - final LoanProductRelatedDetail productRelatedDetail = existingLoanApplication.repaymentScheduleDetail(); - this.fromApiJsonDeserializer.validateLoanTermAndRepaidEveryValues(existingLoanApplication.getTermFrequency(), - existingLoanApplication.getTermPeriodFrequencyType(), productRelatedDetail.getNumberOfRepayments(), - productRelatedDetail.getRepayEvery(), productRelatedDetail.getRepaymentPeriodFrequencyType().getValue()); - final String fundIdParamName = "fundId"; if (changes.containsKey(fundIdParamName)) { final Long fundId = command.longValueOfParameterNamed(fundIdParamName); @@ -544,6 +540,12 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa existingLoanApplication.updateLoanCharges(possiblyModifedLoanCharges); } + final LoanProductRelatedDetail productRelatedDetail = existingLoanApplication.repaymentScheduleDetail(); + this.fromApiJsonDeserializer.validateLoanTermAndRepaidEveryValues(existingLoanApplication.getTermFrequency(), + existingLoanApplication.getTermPeriodFrequencyType(), productRelatedDetail.getNumberOfRepayments(), + productRelatedDetail.getRepayEvery(), productRelatedDetail.getRepaymentPeriodFrequencyType().getValue(), + existingLoanApplication); + saveAndFlushLoanWithDataIntegrityViolationChecks(existingLoanApplication); final String submittedOnNote = command.stringValueOfParameterNamed("submittedOnNote");