MIFOSX-1842 validations added for add/delete tranches.

This commit is contained in:
Chandrika
2015-04-13 14:15:25 -04:00
parent f4ed5f80dd
commit 006b14db0a
4 changed files with 131 additions and 75 deletions
@@ -1564,29 +1564,32 @@ public class Loan extends AbstractPersistable<Long> {
int i = 0; int i = 0;
do { do {
final JsonObject jsonObject = disbursementDataArray.get(i).getAsJsonObject(); final JsonObject jsonObject = disbursementDataArray.get(i).getAsJsonObject();
if (jsonObject.has(LoanApiConstants.disbursementDateParameterName)
&& jsonObject.has(LoanApiConstants.disbursementPrincipalParameterName)) {
Date expectedDisbursementDate = null; Date expectedDisbursementDate = null;
BigDecimal principal = null; BigDecimal principal = null;
LocalDate date = null; LocalDate date = null;
Long id = null; Long id = null;
if (jsonObject.has(LoanApiConstants.disbursementDateParameterName) if (jsonObject.get(LoanApiConstants.disbursementDateParameterName) != null
&& jsonObject.get(LoanApiConstants.disbursementDateParameterName) != null
&& jsonObject.get(LoanApiConstants.disbursementDateParameterName).isJsonPrimitive()) { && jsonObject.get(LoanApiConstants.disbursementDateParameterName).isJsonPrimitive()) {
final JsonPrimitive primitive = jsonObject.get(LoanApiConstants.disbursementDateParameterName).getAsJsonPrimitive(); final JsonPrimitive primitive = jsonObject.get(LoanApiConstants.disbursementDateParameterName)
.getAsJsonPrimitive();
final String valueAsString = primitive.getAsString(); final String valueAsString = primitive.getAsString();
if (StringUtils.isNotBlank(valueAsString)) { if (StringUtils.isNotBlank(valueAsString)) {
date = JsonParserHelper.convertFrom(valueAsString, LoanApiConstants.disbursementDateParameterName, dateFormat, date = JsonParserHelper.convertFrom(valueAsString, LoanApiConstants.disbursementDateParameterName,
locale); dateFormat, locale);
} }
} }
if (date != null) { if (date != null) {
expectedDisbursementDate = date.toDate(); expectedDisbursementDate = date.toDate();
} }
if (jsonObject.has(LoanApiConstants.disbursementPrincipalParameterName) if (jsonObject.get(LoanApiConstants.disbursementPrincipalParameterName).isJsonPrimitive()
&& jsonObject.get(LoanApiConstants.disbursementPrincipalParameterName).isJsonPrimitive() && StringUtils.isNotBlank((jsonObject.get(LoanApiConstants.disbursementPrincipalParameterName)
&& StringUtils.isNotBlank((jsonObject.get(LoanApiConstants.disbursementPrincipalParameterName).getAsString()))) { .getAsString()))) {
principal = jsonObject.getAsJsonPrimitive(LoanApiConstants.disbursementPrincipalParameterName).getAsBigDecimal(); principal = jsonObject.getAsJsonPrimitive(LoanApiConstants.disbursementPrincipalParameterName)
.getAsBigDecimal();
} }
if (jsonObject.has(LoanApiConstants.disbursementIdParameterName) if (jsonObject.has(LoanApiConstants.disbursementIdParameterName)
&& jsonObject.get(LoanApiConstants.disbursementIdParameterName).isJsonPrimitive() && jsonObject.get(LoanApiConstants.disbursementIdParameterName).isJsonPrimitive()
@@ -1615,6 +1618,7 @@ public class Loan extends AbstractPersistable<Long> {
actualChanges.put(LoanApiConstants.disbursementDataParameterName, expectedDisbursementDate + "-" + principal); actualChanges.put(LoanApiConstants.disbursementDataParameterName, expectedDisbursementDate + "-" + principal);
actualChanges.put("recalculateLoanSchedule", true); actualChanges.put("recalculateLoanSchedule", true);
} }
}
i++; i++;
} while (i < disbursementDataArray.size()); } while (i < disbursementDataArray.size());
for (Long id : list) { for (Long id : list) {
@@ -0,0 +1,17 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.portfolio.loanaccount.exception;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException;
public class LoanMultiDisbursementException extends AbstractPlatformDomainRuleException {
public LoanMultiDisbursementException(final String entity, final String defaultUserMessage,
final Object... defaultUserMessageArgs) {
super("error.msg." + defaultUserMessage,defaultUserMessage);
}
}
@@ -840,11 +840,13 @@ public final class LoanApplicationCommandFromApiJsonHelper {
if (variationArray != null) { if (variationArray != null) {
for (int i = 0; i < variationArray.size(); i++) { for (int i = 0; i < variationArray.size(); i++) {
final JsonObject jsonObject1 = variationArray.get(i).getAsJsonObject(); final JsonObject jsonObject1 = variationArray.get(i).getAsJsonObject();
if(jsonObject1.has(LoanApiConstants.disbursementDateParameterName)){
LocalDate date1 = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, jsonObject1, LocalDate date1 = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, jsonObject1,
dateFormat, locale); dateFormat, locale);
for (int j = i + 1; j < variationArray.size(); j++) { for (int j = i + 1; j < variationArray.size(); j++) {
final JsonObject jsonObject2 = variationArray.get(j).getAsJsonObject(); final JsonObject jsonObject2 = variationArray.get(j).getAsJsonObject();
if(jsonObject2.has(LoanApiConstants.disbursementDateParameterName)){
LocalDate date2 = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, LocalDate date2 = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName,
jsonObject2, dateFormat, locale); jsonObject2, dateFormat, locale);
if (date1.isAfter(date2)) { if (date1.isAfter(date2)) {
@@ -854,6 +856,9 @@ public final class LoanApplicationCommandFromApiJsonHelper {
} }
} }
} }
}
}
} }
public void validateLoanMultiDisbursementdate(final JsonElement element, final DataValidatorBuilder baseDataValidator, public void validateLoanMultiDisbursementdate(final JsonElement element, final DataValidatorBuilder baseDataValidator,
@@ -875,6 +880,8 @@ public final class LoanApplicationCommandFromApiJsonHelper {
int i = 0; int i = 0;
do { do {
final JsonObject jsonObject = variationArray.get(i).getAsJsonObject(); final JsonObject jsonObject = variationArray.get(i).getAsJsonObject();
if (jsonObject.has(LoanApiConstants.disbursementDateParameterName)
&& jsonObject.has(LoanApiConstants.disbursementPrincipalParameterName)) {
LocalDate expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed( LocalDate expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed(
LoanApiConstants.disbursementDateParameterName, jsonObject, dateFormat, locale); LoanApiConstants.disbursementDateParameterName, jsonObject, dateFormat, locale);
if (expectedDisbursementDates.contains(expectedDisbursementDate)) { if (expectedDisbursementDates.contains(expectedDisbursementDate)) {
@@ -886,6 +893,7 @@ public final class LoanApplicationCommandFromApiJsonHelper {
.failWithCode(LoanApiConstants.DISBURSEMENT_DATE_BEFORE_ERROR); .failWithCode(LoanApiConstants.DISBURSEMENT_DATE_BEFORE_ERROR);
} }
expectedDisbursementDates.add(expectedDisbursementDate); expectedDisbursementDates.add(expectedDisbursementDate);
BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalNamed( BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalNamed(
LoanApiConstants.disbursementPrincipalParameterName, jsonObject, locale); LoanApiConstants.disbursementPrincipalParameterName, jsonObject, locale);
baseDataValidator.reset().parameter(LoanApiConstants.disbursementDataParameterName) baseDataValidator.reset().parameter(LoanApiConstants.disbursementDataParameterName)
@@ -901,7 +909,8 @@ public final class LoanApplicationCommandFromApiJsonHelper {
if (expectedDisbursement.equals(expectedDisbursementDate)) { if (expectedDisbursement.equals(expectedDisbursementDate)) {
isFirstinstallmentOnExpectedDisbursementDate = true; isFirstinstallmentOnExpectedDisbursementDate = true;
} }
i++;
}i++;
} while (i < variationArray.size()); } while (i < variationArray.size());
if (!isFirstinstallmentOnExpectedDisbursementDate) { if (!isFirstinstallmentOnExpectedDisbursementDate) {
baseDataValidator.reset().parameter(LoanApiConstants.disbursementDateParameterName) baseDataValidator.reset().parameter(LoanApiConstants.disbursementDateParameterName)
@@ -130,6 +130,7 @@ import org.mifosplatform.portfolio.loanaccount.exception.LoanOfficerAssignmentEx
import org.mifosplatform.portfolio.loanaccount.exception.LoanOfficerUnassignmentException; import org.mifosplatform.portfolio.loanaccount.exception.LoanOfficerUnassignmentException;
import org.mifosplatform.portfolio.loanaccount.exception.LoanTransactionNotFoundException; import org.mifosplatform.portfolio.loanaccount.exception.LoanTransactionNotFoundException;
import org.mifosplatform.portfolio.loanaccount.exception.MultiDisbursementDataRequiredException; import org.mifosplatform.portfolio.loanaccount.exception.MultiDisbursementDataRequiredException;
import org.mifosplatform.portfolio.loanaccount.exception.LoanMultiDisbursementException;
import org.mifosplatform.portfolio.loanaccount.guarantor.service.GuarantorDomainService; import org.mifosplatform.portfolio.loanaccount.guarantor.service.GuarantorDomainService;
import org.mifosplatform.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.mifosplatform.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData;
import org.mifosplatform.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator; import org.mifosplatform.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator;
@@ -2584,6 +2585,21 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); } if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); }
} }
private void validateForAddAndDeleteTranche(final Loan loan){
BigDecimal totalDisbursedAmount = BigDecimal.ZERO;
Collection<LoanDisbursementDetails> loanDisburseDetails = loan.getDisbursementDetails();
for (LoanDisbursementDetails disbursementDetails : loanDisburseDetails) {
if(disbursementDetails.actualDisbursementDate() != null){
totalDisbursedAmount = totalDisbursedAmount.add(disbursementDetails.principal());
}
}
if(totalDisbursedAmount.compareTo(loan.getApprovedPrincipal()) == 0){
final String errorMessage = "loan.disbursement.cannot.be.a.edited";
throw new LoanMultiDisbursementException(LoanApiConstants.disbursementDataParameterName, errorMessage);
}
}
@Override @Override
@Transactional @Transactional
public CommandProcessingResult addAndDeleteLoanDisburseDetails(Long loanId, JsonCommand command) { public CommandProcessingResult addAndDeleteLoanDisburseDetails(Long loanId, JsonCommand command) {
@@ -2592,8 +2608,18 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
checkClientOrGroupActive(loan); checkClientOrGroupActive(loan);
final Map<String, Object> actualChanges = new LinkedHashMap<>(); final Map<String, Object> actualChanges = new LinkedHashMap<>();
LocalDate expectedDisbursementDate = loan.getExpectedDisbursedOnLocalDate(); LocalDate expectedDisbursementDate = loan.getExpectedDisbursedOnLocalDate();
if(!loan.loanProduct().isMultiDisburseLoan()){
final String errorMessage = "loan.product.does.not.support.multiple.disbursals";
throw new LoanMultiDisbursementException(LoanApiConstants.disbursementDataParameterName, errorMessage);
}
if(loan.isSubmittedAndPendingApproval()){
final String errorMessage = "loan.account.should.be.approved";
throw new LoanMultiDisbursementException(LoanApiConstants.disbursementDataParameterName, errorMessage);
}
validateMultiDisbursementData(command, expectedDisbursementDate); validateMultiDisbursementData(command, expectedDisbursementDate);
this.validateForAddAndDeleteTranche(loan);
loan.updateDisbursementDetails(command, actualChanges); loan.updateDisbursementDetails(command, actualChanges);
if (loan.getDisbursementDetails().isEmpty()) { if (loan.getDisbursementDetails().isEmpty()) {