From a032ad2133e54eb43e8704b9d6043da4e2653433 Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Tue, 22 Apr 2014 22:31:36 +0530 Subject: [PATCH] MIFOSX-1056 - changed to use create validation from preview --- .../loanaccount/api/LoansApiResource.java | 2 +- ...oanScheduleCalculationPlatformService.java | 2 +- ...cheduleCalculationPlatformServiceImpl.java | 10 +- ...ateLoanScheduleQueryFromApiJsonHelper.java | 105 +----------------- ...WritePlatformServiceJpaRepositoryImpl.java | 2 +- 5 files changed, 13 insertions(+), 108 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java index c6378b624..279f0bdc0 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java @@ -488,7 +488,7 @@ public class LoansApiResource { final JsonElement parsedQuery = this.fromJsonHelper.parse(apiRequestBodyAsJson); final JsonQuery query = JsonQuery.from(apiRequestBodyAsJson, parsedQuery, this.fromJsonHelper); - final LoanScheduleModel loanSchedule = this.calculationPlatformService.calculateLoanSchedule(query); + final LoanScheduleModel loanSchedule = this.calculationPlatformService.calculateLoanSchedule(query, true); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.loanScheduleToApiJsonSerializer.serialize(settings, loanSchedule.toData(), new HashSet()); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformService.java index e95a84fe5..ddb6a1357 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformService.java @@ -10,5 +10,5 @@ import org.mifosplatform.portfolio.loanaccount.loanschedule.domain.LoanScheduleM public interface LoanScheduleCalculationPlatformService { - LoanScheduleModel calculateLoanSchedule(JsonQuery query); + LoanScheduleModel calculateLoanSchedule(JsonQuery query, Boolean validateParams); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java index eb9484eaf..8d7d1692a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java @@ -16,6 +16,7 @@ import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.portfolio.accountdetails.domain.AccountType; import org.mifosplatform.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel; import org.mifosplatform.portfolio.loanaccount.serialization.CalculateLoanScheduleQueryFromApiJsonHelper; +import org.mifosplatform.portfolio.loanaccount.serialization.LoanApplicationCommandFromApiJsonHelper; import org.mifosplatform.portfolio.loanaccount.service.LoanReadPlatformService; import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository; @@ -33,23 +34,28 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC private final LoanProductRepository loanProductRepository; private final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer; private final LoanReadPlatformService loanReadPlatformService; + private final LoanApplicationCommandFromApiJsonHelper loanApiJsonDeserializer; @Autowired public LoanScheduleCalculationPlatformServiceImpl(final CalculateLoanScheduleQueryFromApiJsonHelper fromApiJsonDeserializer, final LoanScheduleAssembler loanScheduleAssembler, final FromJsonHelper fromJsonHelper, final LoanProductRepository loanProductRepository, final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer, - final LoanReadPlatformService loanReadPlatformService) { + final LoanReadPlatformService loanReadPlatformService, final LoanApplicationCommandFromApiJsonHelper loanApiJsonDeserializer) { this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.loanScheduleAssembler = loanScheduleAssembler; this.fromJsonHelper = fromJsonHelper; this.loanProductRepository = loanProductRepository; this.loanProductCommandFromApiJsonDeserializer = loanProductCommandFromApiJsonDeserializer; this.loanReadPlatformService = loanReadPlatformService; + this.loanApiJsonDeserializer = loanApiJsonDeserializer; } @Override - public LoanScheduleModel calculateLoanSchedule(final JsonQuery query) { + public LoanScheduleModel calculateLoanSchedule(final JsonQuery query, Boolean validateParams) { + if (validateParams) { + this.loanApiJsonDeserializer.validateForCreate(query.json()); + } this.fromApiJsonDeserializer.validate(query.json()); final List dataValidationErrors = new ArrayList(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java index 3fa834b4d..054928e32 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java @@ -6,19 +6,16 @@ package org.mifosplatform.portfolio.loanaccount.serialization; import java.lang.reflect.Type; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; import org.mifosplatform.infrastructure.core.data.ApiParameterError; -import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder; import org.mifosplatform.infrastructure.core.exception.InvalidJsonException; import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; @@ -27,9 +24,7 @@ import org.mifosplatform.portfolio.loanproduct.LoanProductConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.google.gson.JsonArray; import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @Component @@ -41,12 +36,12 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { final Set supportedParameters = new HashSet(Arrays.asList("id", "clientId", "groupId", "loanType", "calendarId", "productId", "accountNo", "externalId", "fundId", "loanOfficerId", "loanPurposeId", "transactionProcessingStrategyId", "principal", "inArrearsTolerance", "interestRatePerPeriod", "repaymentEvery", "numberOfRepayments", "loanTermFrequency", - "loanTermFrequencyType", "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", + "loanTermFrequencyType", "repaymentFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", "expectedDisbursementDate", "repaymentsStartingFromDate", "graceOnPrincipalPayment", "graceOnInterestPayment", "graceOnInterestCharged", "interestChargedFromDate", "submittedOnDate", "submittedOnNote", "locale", "dateFormat", "charges", "collateral", "syncDisbursementWithMeeting", "linkAccountId", LoanApiConstants.disbursementDataParameterName, LoanApiConstants.emiAmountParameterName, - LoanApiConstants.maxOutstandingBalanceParameterName,LoanProductConstants.graceOnArrearsAgeingParameterName)); + LoanApiConstants.maxOutstandingBalanceParameterName, LoanProductConstants.graceOnArrearsAgeingParameterName)); private final FromJsonHelper fromApiJsonHelper; @@ -62,38 +57,25 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); final List dataValidationErrors = new ArrayList(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final Long productId = this.fromApiJsonHelper.extractLongNamed("productId", element); - baseDataValidator.reset().parameter("productId").value(productId).notNull().integerGreaterThanZero(); - - final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("principal", element); - baseDataValidator.reset().parameter("principal").value(principal).notNull().positiveAmount(); - final String loanTermFrequencyParameterName = "loanTermFrequency"; final Integer loanTermFrequency = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(loanTermFrequencyParameterName, element); - baseDataValidator.reset().parameter(loanTermFrequencyParameterName).value(loanTermFrequency).notNull().integerGreaterThanZero(); final String loanTermFrequencyTypeParameterName = "loanTermFrequencyType"; final Integer loanTermFrequencyType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(loanTermFrequencyTypeParameterName, element); - baseDataValidator.reset().parameter(loanTermFrequencyTypeParameterName).value(loanTermFrequencyType).notNull().inMinMaxRange(0, 3); final String numberOfRepaymentsParameterName = "numberOfRepayments"; final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(numberOfRepaymentsParameterName, element); - baseDataValidator.reset().parameter(numberOfRepaymentsParameterName).value(numberOfRepayments).notNull().integerGreaterThanZero(); final String repaymentEveryParameterName = "repaymentEvery"; final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(repaymentEveryParameterName, element); - baseDataValidator.reset().parameter(repaymentEveryParameterName).value(repaymentEvery).notNull().integerGreaterThanZero(); final String repaymentEveryFrequencyTypeParameterName = "repaymentFrequencyType"; final Integer repaymentEveryType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(repaymentEveryFrequencyTypeParameterName, element); - baseDataValidator.reset().parameter(repaymentEveryFrequencyTypeParameterName).value(repaymentEveryType).notNull() - .inMinMaxRange(0, 3); // FIXME - KW - this constraint doesnt really need to be here. should be // possible to express loan term as say 12 months whilst also saying @@ -101,45 +83,20 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { validateSelectedPeriodFrequencyTypeIsTheSame(dataValidationErrors, loanTermFrequency, loanTermFrequencyType, numberOfRepayments, repaymentEvery, repaymentEveryType); - final String interestRatePerPeriodParameterName = "interestRatePerPeriod"; - final BigDecimal interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed( - interestRatePerPeriodParameterName, element); - baseDataValidator.reset().parameter(interestRatePerPeriodParameterName).value(interestRatePerPeriod).notNull() - .zeroOrPositiveAmount(); - - final String interestTypeParameterName = "interestType"; - final Integer interestType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(interestTypeParameterName, element); - baseDataValidator.reset().parameter(interestTypeParameterName).value(interestType).notNull().inMinMaxRange(0, 1); - - final String interestCalculationPeriodTypeParameterName = "interestCalculationPeriodType"; - final Integer interestCalculationPeriodType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed( - interestCalculationPeriodTypeParameterName, element); - baseDataValidator.reset().parameter(interestCalculationPeriodTypeParameterName).value(interestCalculationPeriodType).notNull() - .inMinMaxRange(0, 1); - - final String amortizationTypeParameterName = "amortizationType"; - final Integer amortizationType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(amortizationTypeParameterName, element); - baseDataValidator.reset().parameter(amortizationTypeParameterName).value(amortizationType).notNull().inMinMaxRange(0, 1); - final String expectedDisbursementDateParameterName = "expectedDisbursementDate"; final LocalDate expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed(expectedDisbursementDateParameterName, element); - baseDataValidator.reset().parameter(expectedDisbursementDateParameterName).value(expectedDisbursementDate).notNull(); LocalDate repaymentsStartingFromDate = null; final String repaymentsStartingFromDateParameterName = "repaymentsStartingFromDate"; if (this.fromApiJsonHelper.parameterExists(repaymentsStartingFromDateParameterName, element)) { repaymentsStartingFromDate = this.fromApiJsonHelper.extractLocalDateNamed(repaymentsStartingFromDateParameterName, element); - baseDataValidator.reset().parameter(repaymentsStartingFromDateParameterName).value(repaymentsStartingFromDate).ignoreIfNull() - .notNull(); } LocalDate interestChargedFromDate = null; final String interestChargedFromDateParameterName = "interestChargedFromDate"; if (this.fromApiJsonHelper.parameterExists(interestChargedFromDateParameterName, element)) { interestChargedFromDate = this.fromApiJsonHelper.extractLocalDateNamed(interestChargedFromDateParameterName, element); - baseDataValidator.reset().parameter(interestChargedFromDateParameterName).value(interestChargedFromDate).ignoreIfNull() - .notNull(); } validateRepaymentsStartingFromDateIsAfterDisbursementDate(dataValidationErrors, expectedDisbursementDate, @@ -148,64 +105,6 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { validateRepaymentsStartingFromDateAndInterestChargedFromDate(dataValidationErrors, expectedDisbursementDate, repaymentsStartingFromDate, interestChargedFromDate); - final String transactionProcessingStrategyIdParameterName = "transactionProcessingStrategyId"; - final Long transactionProcessingStrategyId = this.fromApiJsonHelper.extractLongNamed(transactionProcessingStrategyIdParameterName, - element); - baseDataValidator.reset().parameter(transactionProcessingStrategyIdParameterName).value(transactionProcessingStrategyId).notNull() - .integerGreaterThanZero(); - - // charges - final String chargesParameterName = "charges"; - if (element.isJsonObject() && this.fromApiJsonHelper.parameterExists(chargesParameterName, element)) { - final JsonObject topLevelJsonElement = element.getAsJsonObject(); - final String dateFormat = this.fromApiJsonHelper.extractDateFormatParameter(topLevelJsonElement); - final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement); - - if (topLevelJsonElement.get(chargesParameterName).isJsonArray()) { - final Type arrayObjectParameterTypeOfMap = new TypeToken>() {}.getType(); - final Set supportedParameters = new HashSet(Arrays.asList("id", "chargeId", "amount", "chargeTimeType", - "chargeCalculationType", "dueDate")); - - final JsonArray array = topLevelJsonElement.get("charges").getAsJsonArray(); - for (int i = 1; i <= array.size(); i++) { - - final JsonObject loanChargeElement = array.get(i - 1).getAsJsonObject(); - final String arrayObjectJson = this.fromApiJsonHelper.toJson(loanChargeElement); - this.fromApiJsonHelper.checkForUnsupportedParameters(arrayObjectParameterTypeOfMap, arrayObjectJson, - supportedParameters); - - final Long chargeId = this.fromApiJsonHelper.extractLongNamed("chargeId", loanChargeElement); - baseDataValidator.reset().parameter("charges").parameterAtIndexArray("chargeId", i).value(chargeId).notNull() - .integerGreaterThanZero(); - - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed("amount", loanChargeElement, locale); - baseDataValidator.reset().parameter("charges").parameterAtIndexArray("amount", i).value(amount).notNull() - .positiveAmount(); - - this.fromApiJsonHelper.extractLocalDateNamed("dueDate", loanChargeElement, dateFormat, locale); - } - } - } - - boolean meetingIdRequired = false; - // validate syncDisbursement - final String syncDisbursementParameterName = "syncDisbursementWithMeeting"; - if (this.fromApiJsonHelper.parameterExists(syncDisbursementParameterName, element)) { - final Boolean syncDisbursement = this.fromApiJsonHelper.extractBooleanNamed(syncDisbursementParameterName, element); - if (syncDisbursement == null) { - baseDataValidator.reset().parameter(syncDisbursementParameterName).value(syncDisbursement).trueOrFalseRequired(false); - } else if (syncDisbursement.booleanValue()) { - meetingIdRequired = true; - } - } - - final String calendarIdParameterName = "calendarId"; - // if disbursement is synced then must have a meeting (calendar) - if (meetingIdRequired || this.fromApiJsonHelper.parameterExists(calendarIdParameterName, element)) { - final Long calendarId = this.fromApiJsonHelper.extractLongNamed(calendarIdParameterName, element); - baseDataValidator.reset().parameter(calendarIdParameterName).value(calendarId).notNull().integerGreaterThanZero(); - } - 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 4c303cc2a..bc8dbc445 100644 --- 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 @@ -417,7 +417,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final JsonElement parsedQuery = this.fromJsonHelper.parse(command.json()); final JsonQuery query = JsonQuery.from(command.json(), parsedQuery, this.fromJsonHelper); - final LoanScheduleModel loanSchedule = this.calculationPlatformService.calculateLoanSchedule(query); + final LoanScheduleModel loanSchedule = this.calculationPlatformService.calculateLoanSchedule(query, false); existingLoanApplication.updateLoanSchedule(loanSchedule); }