From ab9497c9858fc6a0af0adc06dd39948a3a6aaf7d Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Thu, 11 Oct 2012 17:44:59 +0100 Subject: [PATCH] mifosx-92: tidy up loan product in prep for tranche loans. --- .../platform/api/LoanProductsApiResource.java | 125 ++--- .../platform/api/LoansApiResource.java | 6 +- .../platform/api/data/CurrencyData.java | 11 +- .../platform/api/data/LoanAccountData.java | 4 +- .../api/data/LoanBasicDetailsData.java | 2 +- .../platform/api/data/LoanProductData.java | 445 +++++++++--------- .../platform/api/data/LoanProductLookup.java | 26 - .../mifosng/platform/api/data/MoneyData.java | 4 + .../ApiDataConversionServiceImpl.java | 103 ++-- .../api/infrastructure/JsonParserHelper.java | 14 +- .../LoanProductReadPlatformService.java | 3 +- .../LoanProductReadPlatformServiceImpl.java | 210 +++------ 12 files changed, 437 insertions(+), 516 deletions(-) delete mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java index 30f9cc3fc..f0328a657 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java @@ -3,6 +3,7 @@ package org.mifosng.platform.api; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ws.rs.Consumes; @@ -14,17 +15,23 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.mifosng.platform.api.commands.LoanProductCommand; import org.mifosng.platform.api.data.ChargeData; +import org.mifosng.platform.api.data.CurrencyData; import org.mifosng.platform.api.data.EntityIdentifier; +import org.mifosng.platform.api.data.EnumOptionData; +import org.mifosng.platform.api.data.FundData; import org.mifosng.platform.api.data.LoanProductData; +import org.mifosng.platform.api.data.TransactionProcessingStrategyData; import org.mifosng.platform.api.infrastructure.ApiDataConversionService; import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService; import org.mifosng.platform.api.infrastructure.ApiParameterHelper; import org.mifosng.platform.charge.service.ChargeReadPlatformService; +import org.mifosng.platform.currency.service.CurrencyReadPlatformService; +import org.mifosng.platform.fund.service.FundReadPlatformService; +import org.mifosng.platform.loanproduct.service.LoanDropdownReadPlatformService; import org.mifosng.platform.loanproduct.service.LoanProductReadPlatformService; import org.mifosng.platform.loanproduct.service.LoanProductWritePlatformService; import org.springframework.beans.factory.annotation.Autowired; @@ -50,17 +57,39 @@ public class LoanProductsApiResource { @Autowired private ApiJsonSerializerService apiJsonSerializerService; + + @Autowired + private CurrencyReadPlatformService currencyReadPlatformService; + + @Autowired + private FundReadPlatformService fundReadPlatformService; + + @Autowired + private LoanDropdownReadPlatformService dropdownReadPlatformService; + private final Set typicalResponseParameters = new HashSet( + Arrays.asList("id", "name", "description", + "fundId", "fundName", + "transactionProcessingStrategyId", "transactionProcessingStrategyName", + "principal", "inArrearsTolerance", + "numberOfRepayments", "repaymentEvery", + "interestRatePerPeriod", "annualInterestRate", + "repaymentFrequencyType", "interestRateFrequencyType", + "amortizationType", "interestType", "interestCalculationPeriodType", + "charges", + "createdOn", "lastModifedOn") + ); + @POST @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) - public Response createLoanProduct(final String jsonRequestBody) { + public String createLoanProduct(final String jsonRequestBody) { final LoanProductCommand command = this.apiDataConversionService.convertJsonToLoanProductCommand(null, jsonRequestBody); - EntityIdentifier entityIdentifier = this.loanProductWritePlatformService.createLoanProduct(command); + final EntityIdentifier identifier = this.loanProductWritePlatformService.createLoanProduct(command); - return Response.ok().entity(entityIdentifier).build(); + return apiJsonSerializerService.serializeEntityIdentifier(identifier); } @GET @@ -68,52 +97,31 @@ public class LoanProductsApiResource { @Produces({MediaType.APPLICATION_JSON}) public String retrieveAllLoanProducts(@Context final UriInfo uriInfo) { - Set typicalResponseParameters = new HashSet( - Arrays.asList("id", "name", "description", "fundId", "fundName", "principal", "inArrearsTolerance", "numberOfRepayments", - "repaymentEvery", "interestRatePerPeriod", "annualInterestRate", - "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", - "charges", "createdOn", "lastModifedOn") - ); - - Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); if (responseParameters.isEmpty()) { responseParameters.addAll(typicalResponseParameters); } - boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - Collection products = this.loanProductReadPlatformService.retrieveAllLoanProducts(); + final Collection products = this.loanProductReadPlatformService.retrieveAllLoanProducts(); return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, products); } - /* - * see - * http://stackoverflow.com/questions/5250074/what-uri-can-be-used-to-request - * -a-default-resource - */ @GET @Path("template") @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) public String retrieveNewLoanProductDetails(@Context final UriInfo uriInfo) { - // TODO - KW - every addition of a parameter here requires same addition in supported params used in 'apiDataConversionService' method. - Set typicalResponseParameters = new HashSet( - Arrays.asList("id", "name", "description", "fundId", "fundName", "transactionProcessingStrategyId", "transactionProcessingStrategyName", - "principal", "inArrearsTolerance", "numberOfRepayments", - "repaymentEvery", "interestRatePerPeriod", "annualInterestRate", - "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", "charges", - "createdOn", "lastModifedOn","currencyOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", - "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "transactionProcessingStrategyOptions", "chargeOptions") - ); - - Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); if (responseParameters.isEmpty()) { responseParameters.addAll(typicalResponseParameters); } - boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveNewLoanProductDetails(); + loanProduct = handleTemplate(loanProduct, responseParameters); return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); } @@ -124,45 +132,54 @@ public class LoanProductsApiResource { @Produces({MediaType.APPLICATION_JSON}) public String retrieveLoanProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) { - Set typicalResponseParameters = new HashSet( - Arrays.asList("id", "name", "description", "fundId", "fundName", - "transactionProcessingStrategyId", "transactionProcessingStrategyName", - "principal", "inArrearsTolerance", "numberOfRepayments", - "repaymentEvery", "interestRatePerPeriod", "annualInterestRate", - "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", - "interestCalculationPeriodType", "charges", - "createdOn", "lastModifedOn") - ); - - Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); if (responseParameters.isEmpty()) { responseParameters.addAll(typicalResponseParameters); } - boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + final boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); if (template) { - responseParameters.addAll(Arrays.asList("currencyOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", - "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "transactionProcessingStrategyOptions", "chargeOptions")); - Collection chargeOptions = this.chargeReadPlatformService.retrieveLoanApplicableCharges(); - chargeOptions.removeAll(loanProduct.getCharges()); - loanProduct.setChargeOptions(chargeOptions); + loanProduct = handleTemplate(loanProduct, responseParameters); } return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); } - + @PUT @Path("{productId}") @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) - public Response updateLoanProduct(@PathParam("productId") final Long productId, final String jsonRequestBody) { + public String updateLoanProduct(@PathParam("productId") final Long productId, final String jsonRequestBody) { - LoanProductCommand command = this.apiDataConversionService.convertJsonToLoanProductCommand(productId, jsonRequestBody); + final LoanProductCommand command = this.apiDataConversionService.convertJsonToLoanProductCommand(productId, jsonRequestBody); - EntityIdentifier entityIdentifier = this.loanProductWritePlatformService.updateLoanProduct(command); + final EntityIdentifier identifier = this.loanProductWritePlatformService.updateLoanProduct(command); - return Response.ok().entity(entityIdentifier).build(); + return apiJsonSerializerService.serializeEntityIdentifier(identifier); + } + + private LoanProductData handleTemplate(final LoanProductData productData, final Set responseParameters) { + + responseParameters.addAll(Arrays.asList("currencyOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", + "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "transactionProcessingStrategyOptions", "chargeOptions")); + + Collection chargeOptions = this.chargeReadPlatformService.retrieveLoanApplicableCharges(); + chargeOptions.removeAll(productData.charges()); + + List currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies(); + List amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions(); + List interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions(); + List interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions(); + List loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); + List repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); + List interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions(); + + Collection fundOptions = this.fundReadPlatformService.retrieveAllFunds(); + Collection transactionProcessingStrategyOptions = this.dropdownReadPlatformService.retreiveTransactionProcessingStrategies(); + + return new LoanProductData(productData, chargeOptions, currencyOptions, amortizationTypeOptions, interestTypeOptions, + interestCalculationPeriodTypeOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, interestRateFrequencyTypeOptions, fundOptions, transactionProcessingStrategyOptions); } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java index b3ef75d95..30e78a241 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java @@ -37,7 +37,7 @@ import org.mifosng.platform.api.data.LoanAccountData; import org.mifosng.platform.api.data.LoanBasicDetailsData; import org.mifosng.platform.api.data.LoanChargeData; import org.mifosng.platform.api.data.LoanPermissionData; -import org.mifosng.platform.api.data.LoanProductLookup; +import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.LoanTransactionNewData; import org.mifosng.platform.api.data.MoneyData; @@ -134,7 +134,7 @@ public class LoansApiResource { "chargeTemplate", "charges")); // tempate related - Collection productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup(); + Collection productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup(); CollectionloanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); CollectionrepaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); CollectioninterestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions(); @@ -237,7 +237,7 @@ public class LoansApiResource { } } - Collection productOptions = new ArrayList(); + Collection productOptions = new ArrayList(); Collection loanTermFrequencyTypeOptions = null; Collection repaymentFrequencyTypeOptions = new ArrayList(); Collection repaymentStrategyOptions = null; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/CurrencyData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/CurrencyData.java index 338b48482..431ac9630 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/CurrencyData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/CurrencyData.java @@ -1,8 +1,9 @@ package org.mifosng.platform.api.data; -import java.io.Serializable; - -public class CurrencyData implements Serializable { +/** + * Immutable data object representing currency. + */ +public class CurrencyData { private final String code; private final String name; @@ -11,6 +12,10 @@ public class CurrencyData implements Serializable { private final String nameCode; private final String displayLabel; + public static CurrencyData blank() { + return new CurrencyData("", "", 0, "", ""); + } + public CurrencyData(final String code, final String name, final int decimalPlaces, final String displaySymbol, final String nameCode) { this.code = code; this.name = name; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountData.java index 3408203eb..de3bc3d7b 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountData.java @@ -63,7 +63,7 @@ public class LoanAccountData { // template private final Collection loanOfficerOptions; - private final Collection productOptions; + private final Collection productOptions; private final Collection termFrequencyTypeOptions; private final Collection repaymentFrequencyTypeOptions; private final Collection repaymentStrategyOptions; @@ -82,7 +82,7 @@ public class LoanAccountData { final Collection transactions, final LoanPermissionData permissions, final Collection charges, - final Collection productOptions, + final Collection productOptions, final Collection termFrequencyTypeOptions, final Collection repaymentFrequencyTypeOptions, final Collection repaymentStrategyOptions, diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanBasicDetailsData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanBasicDetailsData.java index 59dc12783..6d4da79d0 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanBasicDetailsData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanBasicDetailsData.java @@ -77,7 +77,7 @@ public class LoanBasicDetailsData { final EnumOptionData termPeriodFrequencyType = product.getRepaymentFrequencyType(); final Collection charges = new ArrayList(); - for (ChargeData charge : product.getCharges()) { + for (ChargeData charge : product.charges()) { charges.add(LoanChargeData.newChargeDetails(charge.getId(), charge.getName(), charge.getCurrency(), charge.getAmount(), charge.getChargeTimeType(), charge.getChargeCalculationType())); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java index d92786089..0b023ef16 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java @@ -6,76 +6,161 @@ import java.util.Collection; import java.util.List; import org.joda.time.DateTime; +import org.mifosng.platform.loan.domain.AmortizationMethod; +import org.mifosng.platform.loan.domain.InterestCalculationPeriodMethod; +import org.mifosng.platform.loan.domain.InterestMethod; +import org.mifosng.platform.loan.domain.PeriodFrequencyType; +import org.mifosng.platform.loanproduct.service.LoanEnumerations; +/** + * Immutable data object to represent loan products. + */ public class LoanProductData { - private Long id; - private String name; - private String description; + private final Long id; + private final String name; + private final String description; - private Long fundId; - private String fundName; + private final Long fundId; + private final String fundName; - private Long transactionProcessingStrategyId; - private String transactionProcessingStrategyName; + private final Long transactionProcessingStrategyId; + private final String transactionProcessingStrategyName; - private CurrencyData currency; - private BigDecimal principal; - private BigDecimal inArrearsTolerance; + private final CurrencyData currency; + private final BigDecimal principal; + private final BigDecimal inArrearsTolerance; - private Integer numberOfRepayments; - private Integer loanTermFrequency; - private Integer repaymentEvery; - private BigDecimal interestRatePerPeriod = BigDecimal.ZERO; - private BigDecimal annualInterestRate = BigDecimal.ZERO; + private final Integer numberOfRepayments; + private final Integer loanTermFrequency; + private final Integer repaymentEvery; + private final BigDecimal interestRatePerPeriod; + private final BigDecimal annualInterestRate; - private EnumOptionData loanTermFrequencyType; - private EnumOptionData repaymentFrequencyType; - private EnumOptionData interestRateFrequencyType; - private EnumOptionData amortizationType; - private EnumOptionData interestType; - private EnumOptionData interestCalculationPeriodType; + private final EnumOptionData loanTermFrequencyType; + private final EnumOptionData repaymentFrequencyType; + private final EnumOptionData interestRateFrequencyType; + private final EnumOptionData amortizationType; + private final EnumOptionData interestType; + private final EnumOptionData interestCalculationPeriodType; - private Collection charges; + private final Collection charges; - private DateTime createdOn; - private DateTime lastModifedOn; + private final DateTime createdOn; + private final DateTime lastModifedOn; + + private final List currencyOptions; + private final Collection fundOptions; + private final Collection transactionProcessingStrategyOptions; + private final List amortizationTypeOptions; + private final List interestTypeOptions; + private final List interestCalculationPeriodTypeOptions; + private final List repaymentFrequencyTypeOptions; + private final List interestRateFrequencyTypeOptions; + private final List loanTermFrequencyTypeOptions; + private final Collection chargeOptions; + + /** + * Used when returning lookup information about loan product for dropdowns. + */ + public static LoanProductData lookup(final Long id, final String name) { + final DateTime createdOn = null; + final DateTime lastModifedOn = null; + final String description = null; + final CurrencyData currency = null; + final BigDecimal principal = null; + final BigDecimal tolerance = null; + final Integer numberOfRepayments = null; + final Integer loanTermFrequency = null; + final Integer repaymentEvery = null; + final BigDecimal interestRatePerPeriod = null; + final BigDecimal annualInterestRate = null; + final EnumOptionData loanTermFrequencyType = null; + final EnumOptionData repaymentFrequencyType = null; + final EnumOptionData interestRateFrequencyType = null; + final EnumOptionData amortizationType = null; + final EnumOptionData interestType = null; + final EnumOptionData interestCalculationPeriodType = null; + final Long fundId = null; + final String fundName = null; + final Long transactionProcessingStrategyId = null; + final String transactionProcessingStrategyName = null; + final Collection charges = null; + + return new LoanProductData(createdOn, lastModifedOn, id, name, description, currency, principal, tolerance, + numberOfRepayments, loanTermFrequency, repaymentEvery, interestRatePerPeriod, annualInterestRate, + loanTermFrequencyType, repaymentFrequencyType, interestRateFrequencyType, + amortizationType, interestType, interestCalculationPeriodType, + fundId, fundName, transactionProcessingStrategyId, transactionProcessingStrategyName, charges); + } + + public static LoanProductData sensibleDefaultsForNewLoanProductCreation() { - private List currencyOptions = new ArrayList(); - private Collection fundOptions = new ArrayList(); - private Collection transactionProcessingStrategyOptions = new ArrayList(); - private List amortizationTypeOptions = new ArrayList(); - private List interestTypeOptions = new ArrayList(); - private List interestCalculationPeriodTypeOptions = new ArrayList(); - private List repaymentFrequencyTypeOptions = new ArrayList(); - private List interestRateFrequencyTypeOptions = new ArrayList(); - private List loanTermFrequencyTypeOptions = new ArrayList(); - private Collection chargeOptions = new ArrayList(); - - public LoanProductData() { - // + final DateTime createdOn = null; + final DateTime lastModifedOn = null; + final Long id = null; + final String name = null; + final String description = null; + final CurrencyData currency = CurrencyData.blank(); + final BigDecimal principal = null; + final BigDecimal tolerance = null; + final Integer numberOfRepayments = null; + final Integer loanTermFrequency = null; + final Integer repaymentEvery = null; + final BigDecimal interestRatePerPeriod = null; + final BigDecimal annualInterestRate = null; + final EnumOptionData loanTermFrequencyType = LoanEnumerations.loanTermFrequencyType(PeriodFrequencyType.MONTHS); + final EnumOptionData repaymentFrequencyType = LoanEnumerations.repaymentFrequencyType(PeriodFrequencyType.MONTHS); + final EnumOptionData interestRateFrequencyType = LoanEnumerations.interestRateFrequencyType(PeriodFrequencyType.MONTHS); + final EnumOptionData amortizationType = LoanEnumerations.amortizationType(AmortizationMethod.EQUAL_INSTALLMENTS); + final EnumOptionData interestType = LoanEnumerations.interestType(InterestMethod.DECLINING_BALANCE); + final EnumOptionData interestCalculationPeriodType = LoanEnumerations.interestCalculationPeriodType(InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD); + final Long fundId = null; + final String fundName = null; + final Long transactionProcessingStrategyId = null; + final String transactionProcessingStrategyName = null; + final Collection charges = null; + + return new LoanProductData(createdOn, lastModifedOn, id, name, description, currency, principal, tolerance, + numberOfRepayments, loanTermFrequency, repaymentEvery, interestRatePerPeriod, annualInterestRate, + loanTermFrequencyType, repaymentFrequencyType, interestRateFrequencyType, + amortizationType, interestType, interestCalculationPeriodType, + fundId, fundName, transactionProcessingStrategyId, transactionProcessingStrategyName, charges); } - public LoanProductData(DateTime createdOn, DateTime lastModifedOn, Long id, - String name, String description, MoneyData principal, - MoneyData tolerance, Integer numberOfRepayments, - Integer loanTermFrequency, - Integer repaymentEvery, BigDecimal interestRatePerPeriod, - BigDecimal annualInterestRate, - EnumOptionData loanTermFrequencyType, - EnumOptionData repaymentFrequencyType, - EnumOptionData interestRateFrequencyType, - EnumOptionData amortizationType, EnumOptionData interestType, - EnumOptionData interestCalculationPeriodType, Long fundId, - String fundName, Long transactionProcessingStrategyId, String transactionProcessingStrategyName) { + public LoanProductData( + final DateTime createdOn, + final DateTime lastModifedOn, + final Long id, + final String name, + final String description, + final CurrencyData currency, + final BigDecimal principal, + final BigDecimal tolerance, + final Integer numberOfRepayments, + final Integer loanTermFrequency, + final Integer repaymentEvery, + final BigDecimal interestRatePerPeriod, + final BigDecimal annualInterestRate, + final EnumOptionData loanTermFrequencyType, + final EnumOptionData repaymentFrequencyType, + final EnumOptionData interestRateFrequencyType, + final EnumOptionData amortizationType, + final EnumOptionData interestType, + final EnumOptionData interestCalculationPeriodType, + final Long fundId, + final String fundName, + final Long transactionProcessingStrategyId, + final String transactionProcessingStrategyName, + final Collection charges) { this.createdOn = createdOn; this.lastModifedOn = lastModifedOn; this.id = id; this.name = name; this.description = description; - this.currency = new CurrencyData(principal.getCurrencyCode(), principal.getDefaultName(), principal.getDigitsAfterDecimal(), principal.getDisplaySymbol(), principal.getNameCode()); - this.principal = principal.getAmount(); - this.inArrearsTolerance = tolerance.getAmount(); + this.currency = currency; + this.principal = principal; + this.inArrearsTolerance = tolerance; this.numberOfRepayments = numberOfRepayments; this.loanTermFrequency = loanTermFrequency; this.repaymentEvery = repaymentEvery; @@ -91,286 +176,210 @@ public class LoanProductData { this.fundName = fundName; this.transactionProcessingStrategyId = transactionProcessingStrategyId; this.transactionProcessingStrategyName = transactionProcessingStrategyName; + this.charges = charges; + + this.chargeOptions = null; + this.currencyOptions = null; + this.fundOptions = null; + this.transactionProcessingStrategyOptions = null; + this.amortizationTypeOptions = null; + this.interestTypeOptions = null; + this.interestCalculationPeriodTypeOptions = null; + this.loanTermFrequencyTypeOptions = null; + this.repaymentFrequencyTypeOptions = null; + this.interestRateFrequencyTypeOptions = null; + } + + public LoanProductData( + final LoanProductData productData, + final Collection chargeOptions, + final List currencyOptions, + final List amortizationTypeOptions, + final List interestTypeOptions, + final List interestCalculationPeriodTypeOptions, + final List loanTermFrequencyTypeOptions, + final List repaymentFrequencyTypeOptions, + final List interestRateFrequencyTypeOptions, + final Collection fundOptions, + final Collection transactionProcessingStrategyOptions) { + this.createdOn = productData.createdOn; + this.lastModifedOn = productData.lastModifedOn; + this.id = productData.id; + this.name = productData.name; + this.description = productData.description; + this.principal = productData.principal; + this.inArrearsTolerance = productData.inArrearsTolerance; + this.numberOfRepayments = productData.numberOfRepayments; + this.loanTermFrequency = productData.loanTermFrequency; + this.repaymentEvery = productData.repaymentEvery; + this.interestRatePerPeriod = productData.interestRatePerPeriod; + this.annualInterestRate = productData.annualInterestRate; + this.loanTermFrequencyType = productData.loanTermFrequencyType; + this.repaymentFrequencyType = productData.repaymentFrequencyType; + this.interestRateFrequencyType = productData.interestRateFrequencyType; + this.amortizationType = productData.amortizationType; + this.interestType = productData.interestType; + this.interestCalculationPeriodType = productData.interestCalculationPeriodType; + this.fundId = productData.fundId; + this.fundName = productData.fundName; + this.transactionProcessingStrategyId = productData.transactionProcessingStrategyId; + this.transactionProcessingStrategyName = productData.transactionProcessingStrategyName; + this.charges = null; + + this.chargeOptions = chargeOptions; + this.currencyOptions = currencyOptions; + if (this.currencyOptions.size() == 1) { + this.currency = this.currencyOptions.get(0); + } else { + this.currency = productData.currency; + } + this.fundOptions = fundOptions; + this.transactionProcessingStrategyOptions = transactionProcessingStrategyOptions; + this.amortizationTypeOptions = amortizationTypeOptions; + this.interestTypeOptions = interestTypeOptions; + this.interestCalculationPeriodTypeOptions = interestCalculationPeriodTypeOptions; + this.loanTermFrequencyTypeOptions = loanTermFrequencyTypeOptions; + this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions; + this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions; + } + + public Collection charges() { + Collection chargesLocal = new ArrayList(); + if (this.charges != null) { + chargesLocal = this.charges; + } + return chargesLocal; } public Long getId() { return id; } - public void setId(Long id) { - this.id = id; - } - public String getName() { return name; } - public void setName(String name) { - this.name = name; - } - public String getDescription() { return description; } - public void setDescription(String description) { - this.description = description; - } - public Long getFundId() { return fundId; } - public void setFundId(Long fundId) { - this.fundId = fundId; - } - public String getFundName() { return fundName; } - public void setFundName(String fundName) { - this.fundName = fundName; - } - public Long getTransactionProcessingStrategyId() { return transactionProcessingStrategyId; } - public void setTransactionProcessingStrategyId(Long transactionProcessingStrategyId) { - this.transactionProcessingStrategyId = transactionProcessingStrategyId; - } - public String getTransactionProcessingStrategyName() { return transactionProcessingStrategyName; } - public void setTransactionProcessingStrategyName( - String transactionProcessingStrategyName) { - this.transactionProcessingStrategyName = transactionProcessingStrategyName; - } - public CurrencyData getCurrency() { return currency; } - public void setCurrency(CurrencyData currency) { - this.currency = currency; - } - public BigDecimal getPrincipal() { return principal; } - public void setPrincipal(BigDecimal principal) { - this.principal = principal; - } - public BigDecimal getInArrearsTolerance() { return inArrearsTolerance; } - public void setInArrearsTolerance(BigDecimal inArrearsTolerance) { - this.inArrearsTolerance = inArrearsTolerance; - } - public Integer getNumberOfRepayments() { return numberOfRepayments; } - public void setNumberOfRepayments(Integer numberOfRepayments) { - this.numberOfRepayments = numberOfRepayments; - } - public Integer getLoanTermFrequency() { return loanTermFrequency; } - public void setLoanTermFrequency(Integer loanTermFrequency) { - this.loanTermFrequency = loanTermFrequency; - } - public Integer getRepaymentEvery() { return repaymentEvery; } - public void setRepaymentEvery(Integer repaymentEvery) { - this.repaymentEvery = repaymentEvery; - } - public BigDecimal getInterestRatePerPeriod() { return interestRatePerPeriod; } - public void setInterestRatePerPeriod(BigDecimal interestRatePerPeriod) { - this.interestRatePerPeriod = interestRatePerPeriod; - } - public BigDecimal getAnnualInterestRate() { return annualInterestRate; } - public void setAnnualInterestRate(BigDecimal annualInterestRate) { - this.annualInterestRate = annualInterestRate; - } - - public DateTime getCreatedOn() { - return createdOn; - } - - public void setCreatedOn(DateTime createdOn) { - this.createdOn = createdOn; - } - - public DateTime getLastModifedOn() { - return lastModifedOn; - } - - public void setLastModifedOn(DateTime lastModifedOn) { - this.lastModifedOn = lastModifedOn; + public EnumOptionData getLoanTermFrequencyType() { + return loanTermFrequencyType; } public EnumOptionData getRepaymentFrequencyType() { return repaymentFrequencyType; } - public void setRepaymentFrequencyType(EnumOptionData repaymentFrequencyType) { - this.repaymentFrequencyType = repaymentFrequencyType; - } - public EnumOptionData getInterestRateFrequencyType() { return interestRateFrequencyType; } - public void setInterestRateFrequencyType( - EnumOptionData interestRateFrequencyType) { - this.interestRateFrequencyType = interestRateFrequencyType; - } - public EnumOptionData getAmortizationType() { return amortizationType; } - public void setAmortizationType(EnumOptionData amortizationType) { - this.amortizationType = amortizationType; - } - public EnumOptionData getInterestType() { return interestType; } - public void setInterestType(EnumOptionData interestType) { - this.interestType = interestType; - } - public EnumOptionData getInterestCalculationPeriodType() { return interestCalculationPeriodType; } - public void setInterestCalculationPeriodType( - EnumOptionData interestCalculationPeriodType) { - this.interestCalculationPeriodType = interestCalculationPeriodType; + public DateTime getCreatedOn() { + return createdOn; } - public List getRepaymentFrequencyTypeOptions() { - return repaymentFrequencyTypeOptions; - } - - public void setRepaymentFrequencyTypeOptions( - List repaymentFrequencyTypeOptions) { - this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions; - } - - public List getInterestRateFrequencyTypeOptions() { - return interestRateFrequencyTypeOptions; - } - - public void setInterestRateFrequencyTypeOptions( - List interestRateFrequencyTypeOptions) { - this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions; - } - - public EnumOptionData getLoanTermFrequencyType() { - return loanTermFrequencyType; - } - - public void setLoanTermFrequencyType(EnumOptionData loanTermFrequencyType) { - this.loanTermFrequencyType = loanTermFrequencyType; - } - - public List getLoanTermFrequencyTypeOptions() { - return loanTermFrequencyTypeOptions; - } - - public void setLoanTermFrequencyTypeOptions( - List loanTermFrequencyTypeOptions) { - this.loanTermFrequencyTypeOptions = loanTermFrequencyTypeOptions; + public DateTime getLastModifedOn() { + return lastModifedOn; } public List getCurrencyOptions() { return currencyOptions; } - public void setCurrencyOptions(List currencyOptions) { - this.currencyOptions = currencyOptions; - } - public Collection getFundOptions() { return fundOptions; } - public void setFundOptions(Collection fundOptions) { - this.fundOptions = fundOptions; - } - public Collection getTransactionProcessingStrategyOptions() { return transactionProcessingStrategyOptions; } - public void setTransactionProcessingStrategyOptions( - Collection transactionProcessingStrategyOptions) { - this.transactionProcessingStrategyOptions = transactionProcessingStrategyOptions; - } - public List getAmortizationTypeOptions() { return amortizationTypeOptions; } - public void setAmortizationTypeOptions( - List amortizationTypeOptions) { - this.amortizationTypeOptions = amortizationTypeOptions; - } - public List getInterestTypeOptions() { return interestTypeOptions; } - public void setInterestTypeOptions(List interestTypeOptions) { - this.interestTypeOptions = interestTypeOptions; - } - public List getInterestCalculationPeriodTypeOptions() { return interestCalculationPeriodTypeOptions; } - public void setInterestCalculationPeriodTypeOptions( - List interestCalculationPeriodTypeOptions) { - this.interestCalculationPeriodTypeOptions = interestCalculationPeriodTypeOptions; + public List getRepaymentFrequencyTypeOptions() { + return repaymentFrequencyTypeOptions; } - public Collection getCharges() { - return charges; - } + public List getInterestRateFrequencyTypeOptions() { + return interestRateFrequencyTypeOptions; + } - public void setCharges(Collection charges) { - this.charges = charges; - } + public List getLoanTermFrequencyTypeOptions() { + return loanTermFrequencyTypeOptions; + } - public Collection getChargeOptions() { - return chargeOptions; - } - - public void setChargeOptions(Collection chargeOptions) { - this.chargeOptions = chargeOptions; - } + public Collection getChargeOptions() { + return chargeOptions; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java deleted file mode 100644 index 5724c7682..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.mifosng.platform.api.data; - -/** - * Immutable data object used for basic loan product info for lookup situations. - * - * TODO - kw - this can be replace and the normal {@link LoanProductData} used where only id and name are populated as google gson does - * not return null attributes/parameters. - */ -public class LoanProductLookup { - - private final Long id; - private final String name; - - public LoanProductLookup(final Long id, final String name) { - this.id = id; - this.name = name; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/MoneyData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/MoneyData.java index e012b830d..2b719c8e7 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/MoneyData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/MoneyData.java @@ -4,6 +4,10 @@ import java.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; +/** + * @deprecated - Want to remove this and its usage around loans in full. In its place we just pass back a {@link BigDecimal} for the amount and a {@link CurrencyData} is also passed back. + */ +@Deprecated public class MoneyData implements Serializable, Comparable { private String currencyCode; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java index 303b0326c..008456f37 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java @@ -335,23 +335,23 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { throw new InvalidJsonException(); } - Type typeOfMap = new TypeToken>(){}.getType(); - Map requestMap = gsonConverter.fromJson(json, typeOfMap); + final Type typeOfMap = new TypeToken>(){}.getType(); + final Map requestMap = gsonConverter.fromJson(json, typeOfMap); - Set supportedParams = new HashSet( + final Set supportedParams = new HashSet( Arrays.asList("name", "officeId", "externalId", "clientMembers") ); checkForUnsupportedParameters(requestMap, supportedParams); - Set modifiedParameters = new HashSet(); + final Set modifiedParameters = new HashSet(); - Long officeId = extractLongParameter("officeId", requestMap, modifiedParameters); - String externalId = extractStringParameter("externalId", requestMap, modifiedParameters); - String name = extractStringParameter("name", requestMap, modifiedParameters); + final Long officeId = extractLongParameter("officeId", requestMap, modifiedParameters); + final String externalId = extractStringParameter("externalId", requestMap, modifiedParameters); + final String name = extractStringParameter("name", requestMap, modifiedParameters); // check array - JsonParser parser = new JsonParser(); + final JsonParser parser = new JsonParser(); String[] clientMembers = null; JsonElement element = parser.parse(json); @@ -378,44 +378,54 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { throw new InvalidJsonException(); } - Type typeOfMap = new TypeToken>(){}.getType(); - Map requestMap = gsonConverter.fromJson(json, typeOfMap); + final Type typeOfMap = new TypeToken>(){}.getType(); + final Map requestMap = gsonConverter.fromJson(json, typeOfMap); - Set supportedParams = new HashSet( - Arrays.asList("name", "description", "fundId", "transactionProcessingStrategyId", "currencyCode", "digitsAfterDecimal", - "principal", "inArrearsTolerance", "interestRatePerPeriod", "repaymentEvery", "numberOfRepayments", - "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", +// FIXME - A - LoanProduct - KW - Do we add support for "overpaidTolerance" parameter? + final Set supportedParams = new HashSet( + Arrays.asList("name", "description", "fundId", "transactionProcessingStrategyId", + "currencyCode", "digitsAfterDecimal", + "principal", "inArrearsTolerance", + "interestRatePerPeriod", "repaymentEvery", "numberOfRepayments", + "repaymentFrequencyType", "interestRateFrequencyType", + "amortizationType", "interestType", "interestCalculationPeriodType", "charges", "locale") ); checkForUnsupportedParameters(requestMap, supportedParams); - Set modifiedParameters = new HashSet(); - - String name = extractStringParameter("name", requestMap, modifiedParameters); - String description = extractStringParameter("description", requestMap, modifiedParameters); - Long fundId = extractLongParameter("fundId", requestMap, modifiedParameters); - Long transactionProcessingStrategyId = extractLongParameter("transactionProcessingStrategyId", requestMap, modifiedParameters); - String currencyCode = extractStringParameter("currencyCode", requestMap, modifiedParameters); - Integer digitsAfterDecimalValue = extractIntegerParameter("digitsAfterDecimal", requestMap, modifiedParameters); - BigDecimal principalValue = extractBigDecimalParameter("principal", requestMap, modifiedParameters); - BigDecimal inArrearsToleranceValue = extractBigDecimalParameter("inArrearsTolerance", requestMap, modifiedParameters); - BigDecimal interestRatePerPeriodValue = extractBigDecimalParameter("interestRatePerPeriod", requestMap, modifiedParameters); + final JsonParser parser = new JsonParser(); + final JsonElement element = parser.parse(json); + final JsonParserHelper helper = new JsonParserHelper(); - Integer repaymentEveryValue = extractIntegerParameter("repaymentEvery", requestMap, modifiedParameters); - Integer numberOfRepaymentsValue = extractIntegerParameter("numberOfRepayments", requestMap, modifiedParameters); - Integer repaymentFrequencyTypeValue = extractIntegerParameter("repaymentFrequencyType", requestMap, modifiedParameters); + final Set modifiedParameters = new HashSet(); + final String name = helper.extractStringNamed("name", element, modifiedParameters); + final String description = helper.extractStringNamed("description", element, modifiedParameters); + final Long fundId = helper.extractLongNamed("fundId", element, modifiedParameters); - Integer interestRateFrequencyTypeValue = extractIntegerParameter("interestRateFrequencyType", requestMap, modifiedParameters); - Integer amortizationTypeValue = extractIntegerParameter("amortizationType", requestMap, modifiedParameters); - Integer interestTypeValue = extractIntegerParameter("interestType", requestMap, modifiedParameters); - Integer interestCalculationPeriodTypeValue = extractIntegerParameter("interestCalculationPeriodType", requestMap, modifiedParameters); - - // check array - JsonParser parser = new JsonParser(); - + final Long transactionProcessingStrategyId = helper.extractLongNamed("transactionProcessingStrategyId", element, modifiedParameters); + + final String currencyCode = helper.extractStringNamed("currencyCode", element, modifiedParameters); + final Integer digitsAfterDecimal = helper.extractIntegerNamed("digitsAfterDecimal", element, modifiedParameters); + + final BigDecimal principal = helper.extractBigDecimalNamed("principal", element, modifiedParameters); + final BigDecimal inArrearsTolerance = helper.extractBigDecimalNamed("inArrearsTolerance", element, modifiedParameters); + final BigDecimal interestRatePerPeriod = helper.extractBigDecimalNamed("interestRatePerPeriod", element, modifiedParameters); + final Integer repaymentEvery = helper.extractIntegerNamed("repaymentEvery", element, modifiedParameters); + final Integer numberOfRepayments = helper.extractIntegerNamed("numberOfRepayments", element, modifiedParameters); + final Integer repaymentFrequencyType = helper.extractIntegerNamed("repaymentFrequencyType", element, modifiedParameters); + +// FIXME - A - LoanProduct - KW - should loan term fields be part of product also as are basic part of 'loan terms' +// final Integer loanTermFrequency = helper.extractIntegerNamed("loanTermFrequency", element, modifiedParameters); +// final Integer loanTermFrequencyType = helper.extractIntegerNamed("loanTermFrequencyType", element, modifiedParameters); + final Integer interestRateFrequencyType = helper.extractIntegerNamed("interestRateFrequencyType", element, modifiedParameters); + final Integer amortizationType = helper.extractIntegerNamed("amortizationType", element, modifiedParameters); + final Integer interestType = helper.extractIntegerNamed("interestType", element, modifiedParameters); + final Integer interestCalculationPeriodType = helper.extractIntegerNamed("interestCalculationPeriodType", element, modifiedParameters); + + // FIXME - A - LoanProduct - KW - product charges at present dont allow for adding 'charge' to loan product and setting its 'amount', might this be needed? + // loan product charges String[] charges = null; - JsonElement element = parser.parse(json); if (element.isJsonObject()) { JsonObject object = element.getAsJsonObject(); if (object.has("charges")) { @@ -427,11 +437,10 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { } } } - // return new LoanProductCommand(modifiedParameters, resourceIdentifier, name, description, fundId, transactionProcessingStrategyId, - currencyCode, digitsAfterDecimalValue, principalValue, inArrearsToleranceValue, numberOfRepaymentsValue, repaymentEveryValue, interestRatePerPeriodValue, - repaymentFrequencyTypeValue, interestRateFrequencyTypeValue, amortizationTypeValue, interestTypeValue, interestCalculationPeriodTypeValue, charges); + currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, numberOfRepayments, repaymentEvery, interestRatePerPeriod, + repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType, interestCalculationPeriodType, charges); } @Override @@ -441,10 +450,10 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { throw new InvalidJsonException(); } - Type typeOfMap = new TypeToken>(){}.getType(); - Map requestMap = gsonConverter.fromJson(json, typeOfMap); + final Type typeOfMap = new TypeToken>(){}.getType(); + final Map requestMap = gsonConverter.fromJson(json, typeOfMap); - Set supportedParams = new HashSet( + final Set supportedParams = new HashSet( Arrays.asList("clientId", "groupId", "productId", "externalId", "fundId", "transactionProcessingStrategyId", "principal", "inArrearsTolerance", "interestRatePerPeriod", "repaymentEvery", "numberOfRepayments", "loanTermFrequency", "loanTermFrequencyType", "charges", @@ -455,11 +464,11 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { checkForUnsupportedParameters(requestMap, supportedParams); - Set modifiedParameters = new HashSet(); + final Set modifiedParameters = new HashSet(); - JsonParser parser = new JsonParser(); - JsonElement element = parser.parse(json); - JsonParserHelper helper = new JsonParserHelper(); + final JsonParser parser = new JsonParser(); + final JsonElement element = parser.parse(json); + final JsonParserHelper helper = new JsonParserHelper(); final Long clientId = helper.extractLongNamed("clientId", element, modifiedParameters); final Long groupId = helper.extractLongNamed("groupId", element, modifiedParameters); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/JsonParserHelper.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/JsonParserHelper.java index 9634038c1..9b0666709 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/JsonParserHelper.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/JsonParserHelper.java @@ -46,18 +46,16 @@ public class JsonParserHelper { return longValue; } - public String extractStringNamed(final String parameterName, - final JsonElement element, final Set modifiedParameters) { + public String extractStringNamed(final String parameterName, final JsonElement element, final Set modifiedParameters) { String stringValue = null; if (element.isJsonObject()) { JsonObject object = element.getAsJsonObject(); - if (object.has(parameterName) - && object.get(parameterName).isJsonPrimitive()) { + if (object.has(parameterName) && object.get(parameterName).isJsonPrimitive()) { modifiedParameters.add(parameterName); - JsonPrimitive primitive = object.get(parameterName) - .getAsJsonPrimitive(); - if (StringUtils.isNotBlank(stringValue)) { - stringValue = primitive.getAsString(); + final JsonPrimitive primitive = object.get(parameterName).getAsJsonPrimitive(); + final String valueAsString = primitive.getAsString(); + if (StringUtils.isNotBlank(valueAsString)) { + stringValue = valueAsString; } } } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java index 2b06257d5..795e4f7ce 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java @@ -3,13 +3,12 @@ package org.mifosng.platform.loanproduct.service; import java.util.Collection; import org.mifosng.platform.api.data.LoanProductData; -import org.mifosng.platform.api.data.LoanProductLookup; public interface LoanProductReadPlatformService { Collection retrieveAllLoanProducts(); - Collection retrieveAllLoanProductsForLookup(); + Collection retrieveAllLoanProductsForLookup(); LoanProductData retrieveLoanProduct(Long productId); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java index 86aabc689..4a324b40a 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java @@ -4,27 +4,16 @@ import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; -import java.util.List; import org.joda.time.DateTime; import org.mifosng.platform.api.data.ChargeData; import org.mifosng.platform.api.data.CurrencyData; import org.mifosng.platform.api.data.EnumOptionData; -import org.mifosng.platform.api.data.FundData; import org.mifosng.platform.api.data.LoanProductData; -import org.mifosng.platform.api.data.LoanProductLookup; -import org.mifosng.platform.api.data.MoneyData; -import org.mifosng.platform.api.data.TransactionProcessingStrategyData; import org.mifosng.platform.charge.service.ChargeReadPlatformService; -import org.mifosng.platform.currency.service.CurrencyReadPlatformService; import org.mifosng.platform.exceptions.LoanProductNotFoundException; -import org.mifosng.platform.fund.service.FundReadPlatformService; import org.mifosng.platform.infrastructure.JdbcSupport; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; -import org.mifosng.platform.loan.domain.AmortizationMethod; -import org.mifosng.platform.loan.domain.InterestCalculationPeriodMethod; -import org.mifosng.platform.loan.domain.InterestMethod; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.security.PlatformSecurityContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; @@ -36,24 +25,15 @@ import org.springframework.stereotype.Service; public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatformService { private final PlatformSecurityContext context; - private final CurrencyReadPlatformService currencyReadPlatformService; private final JdbcTemplate jdbcTemplate; - private final LoanDropdownReadPlatformService dropdownReadPlatformService; - private final FundReadPlatformService fundReadPlatformService; private final ChargeReadPlatformService chargeReadPlatformService; @Autowired public LoanProductReadPlatformServiceImpl( final PlatformSecurityContext context, - final CurrencyReadPlatformService currencyReadPlatformService, - final FundReadPlatformService fundReadPlatformService, - final LoanDropdownReadPlatformService dropdownReadPlatformService, final ChargeReadPlatformService chargeReadPlatformService, final TenantAwareRoutingDataSource dataSource) { this.context = context; - this.currencyReadPlatformService = currencyReadPlatformService; - this.fundReadPlatformService = fundReadPlatformService; - this.dropdownReadPlatformService = dropdownReadPlatformService; this.chargeReadPlatformService = chargeReadPlatformService; this.jdbcTemplate = new JdbcTemplate(dataSource); } @@ -62,19 +42,14 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo public LoanProductData retrieveLoanProduct(final Long loanProductId) { try { - LoanProductMapper rm = new LoanProductMapper(); - String sql = "select " + rm.loanProductSchema() - + " where lp.id = ?"; + final Collection charges = this.chargeReadPlatformService.retrieveLoanProductCharges(loanProductId); + + final LoanProductMapper rm = new LoanProductMapper(charges); + final String sql = "select " + rm.loanProductSchema() + " where lp.id = ?"; - LoanProductData productData = this.jdbcTemplate.queryForObject(sql, - rm, new Object[] { loanProductId }); - - Collection charges = this.chargeReadPlatformService.retrieveLoanProductCharges(loanProductId); - productData.setCharges(charges); - - populateProductDataWithDropdownOptions(productData); - - return productData; + + return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { loanProductId }); + } catch (EmptyResultDataAccessException e) { throw new LoanProductNotFoundException(loanProductId); } @@ -85,69 +60,37 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo this.context.authenticatedUser(); - LoanProductMapper rm = new LoanProductMapper(); + final LoanProductMapper rm = new LoanProductMapper(null); - String sql = "select " + rm.loanProductSchema(); + final String sql = "select " + rm.loanProductSchema(); - Collection loanProducts = this.jdbcTemplate.query(sql, rm, new Object[] {}); - for (LoanProductData loanProduct : loanProducts){ - Collection charges = this.chargeReadPlatformService.retrieveLoanProductCharges(loanProduct.getId()); - loanProduct.setCharges(charges); - } - - return loanProducts; + return this.jdbcTemplate.query(sql, rm, new Object[] {}); } @Override - public Collection retrieveAllLoanProductsForLookup() { + public Collection retrieveAllLoanProductsForLookup() { this.context.authenticatedUser(); - LoanProductLookupMapper rm = new LoanProductLookupMapper(); + final LoanProductLookupMapper rm = new LoanProductLookupMapper(); - String sql = "select " + rm.loanProductLookupSchema(); + final String sql = "select " + rm.loanProductLookupSchema(); return this.jdbcTemplate.query(sql, rm, new Object[] {}); } @Override public LoanProductData retrieveNewLoanProductDetails() { - - LoanProductData productData = new LoanProductData(); - - productData.setAmortizationType(LoanEnumerations.amortizationType(AmortizationMethod.EQUAL_INSTALLMENTS)); - productData.setInterestType(LoanEnumerations.interestType(InterestMethod.DECLINING_BALANCE)); - - productData.setLoanTermFrequencyType(LoanEnumerations.loanTermFrequencyType(PeriodFrequencyType.MONTHS)); - - productData.setRepaymentFrequencyType(LoanEnumerations.repaymentFrequencyType(PeriodFrequencyType.MONTHS)); - - productData.setInterestRateFrequencyType(LoanEnumerations.interestRateFrequencyType(PeriodFrequencyType.MONTHS)); - - productData.setInterestCalculationPeriodType(LoanEnumerations.interestCalculationPeriodType(InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD)); - - productData.setChargeOptions(this.chargeReadPlatformService.retrieveLoanApplicableCharges()); - - populateProductDataWithDropdownOptions(productData); - - productData.setPrincipal(BigDecimal.ZERO); - productData.setInArrearsTolerance(BigDecimal.ZERO); - - CurrencyData currency = new CurrencyData("", "", 0, "", ""); - productData.setCurrency(currency); - - if (productData.getCurrencyOptions().size() == 1) { - currency = productData.getCurrencyOptions().get(0); - productData.setCurrency(currency); - } - - return productData; + return LoanProductData.sensibleDefaultsForNewLoanProductCreation(); } private static final class LoanProductMapper implements RowMapper { - public LoanProductMapper() { + private final Collection charges; + + public LoanProductMapper(final Collection charges) { + this.charges = charges; } public String loanProductSchema() { @@ -170,115 +113,78 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo public LoanProductData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - Long id = rs.getLong("id"); - String name = rs.getString("name"); - String description = rs.getString("description"); + final Long id = rs.getLong("id"); + final String name = rs.getString("name"); + final String description = rs.getString("description"); + final Long fundId = JdbcSupport.getLong(rs, "fundId"); + final String fundName = rs.getString("fundName"); + final Long transactionStrategyId = JdbcSupport.getLong(rs, "transactionStrategyId"); + final String transactionStrategyName = rs.getString("transactionStrategyName"); - Long fundId = JdbcSupport.getLong(rs, "fundId"); - String fundName = rs.getString("fundName"); - - Long transactionStrategyId = JdbcSupport.getLong(rs, "transactionStrategyId"); - String transactionStrategyName = rs.getString("transactionStrategyName"); + final String currencyCode = rs.getString("currencyCode"); + final String currencyName = rs.getString("currencyName"); + final String currencyNameCode = rs.getString("currencyNameCode"); + final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol"); + final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); - String currencyCode = rs.getString("currencyCode"); - String currencyName = rs.getString("currencyName"); - String currencyNameCode = rs.getString("currencyNameCode"); - String currencyDisplaySymbol = rs - .getString("currencyDisplaySymbol"); - Integer currencyDigits = JdbcSupport.getInteger(rs, - "currencyDigits"); - - CurrencyData currencyData = new CurrencyData(currencyCode, + final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol, currencyNameCode); - BigDecimal principal = rs.getBigDecimal("principal"); - BigDecimal tolerance = rs.getBigDecimal("tolerance"); + final BigDecimal principal = rs.getBigDecimal("principal"); + final BigDecimal tolerance = rs.getBigDecimal("tolerance"); - MoneyData principalMoney = MoneyData.of(currencyData, principal); - MoneyData toleranceMoney = MoneyData.of(currencyData, tolerance); + final Integer numberOfRepayments = JdbcSupport.getInteger(rs,"numberOfRepayments"); + final Integer repaymentEvery = JdbcSupport.getInteger(rs, "repaidEvery"); + final Integer loanTermFrequency = repaymentEvery * numberOfRepayments; + final BigDecimal interestRatePerPeriod = rs.getBigDecimal("interestRatePerPeriod"); + final BigDecimal annualInterestRate = rs.getBigDecimal("annualInterestRate"); - Integer numberOfRepayments = JdbcSupport.getInteger(rs,"numberOfRepayments"); - Integer repaymentEvery = JdbcSupport.getInteger(rs, "repaidEvery"); - Integer loanTermFrequency = repaymentEvery * numberOfRepayments; - BigDecimal interestRatePerPeriod = rs.getBigDecimal("interestRatePerPeriod"); - BigDecimal annualInterestRate = rs.getBigDecimal("annualInterestRate"); - - int repaymentFrequencyTypeId = JdbcSupport.getInteger(rs, "repaymentPeriodFrequency"); - EnumOptionData repaymentFrequencyType = LoanEnumerations.repaymentFrequencyType(repaymentFrequencyTypeId); + final int repaymentFrequencyTypeId = JdbcSupport.getInteger(rs, "repaymentPeriodFrequency"); + final EnumOptionData repaymentFrequencyType = LoanEnumerations.repaymentFrequencyType(repaymentFrequencyTypeId); - EnumOptionData loanTermFrequencyType = LoanEnumerations.loanTermFrequencyType(repaymentFrequencyTypeId); + final EnumOptionData loanTermFrequencyType = LoanEnumerations.loanTermFrequencyType(repaymentFrequencyTypeId); - int amortizationTypeId = JdbcSupport.getInteger(rs, - "amortizationMethod"); - EnumOptionData amortizationType = LoanEnumerations - .amortizationType(amortizationTypeId); + final int amortizationTypeId = JdbcSupport.getInteger(rs, "amortizationMethod"); + final EnumOptionData amortizationType = LoanEnumerations.amortizationType(amortizationTypeId); - int interestRateFrequencyTypeId = JdbcSupport.getInteger(rs,"interestRatePerPeriodFreq"); - EnumOptionData interestRateFrequencyType = LoanEnumerations.interestRateFrequencyType(interestRateFrequencyTypeId); + final int interestRateFrequencyTypeId = JdbcSupport.getInteger(rs,"interestRatePerPeriodFreq"); + final EnumOptionData interestRateFrequencyType = LoanEnumerations.interestRateFrequencyType(interestRateFrequencyTypeId); - int interestTypeId = JdbcSupport.getInteger(rs, "interestMethod"); - EnumOptionData interestType = LoanEnumerations.interestType(interestTypeId); + final int interestTypeId = JdbcSupport.getInteger(rs, "interestMethod"); + final EnumOptionData interestType = LoanEnumerations.interestType(interestTypeId); - int interestCalculationPeriodTypeId = JdbcSupport.getInteger(rs, - "interestCalculationInPeriodMethod"); - EnumOptionData interestCalculationPeriodType = LoanEnumerations - .interestCalculationPeriodType(interestCalculationPeriodTypeId); + final int interestCalculationPeriodTypeId = JdbcSupport.getInteger(rs,"interestCalculationInPeriodMethod"); + final EnumOptionData interestCalculationPeriodType = LoanEnumerations.interestCalculationPeriodType(interestCalculationPeriodTypeId); - DateTime createdOn = JdbcSupport.getDateTime(rs, "createdon"); - DateTime lastModifedOn = JdbcSupport.getDateTime(rs, "modifiedon"); + final DateTime createdOn = JdbcSupport.getDateTime(rs, "createdon"); + final DateTime lastModifedOn = JdbcSupport.getDateTime(rs, "modifiedon"); return new LoanProductData(createdOn, lastModifedOn, id, name, - description, principalMoney, toleranceMoney, + description, currency, principal, tolerance, numberOfRepayments, loanTermFrequency, repaymentEvery, interestRatePerPeriod, annualInterestRate, loanTermFrequencyType, repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType, - interestCalculationPeriodType, fundId, fundName, transactionStrategyId, transactionStrategyName); + interestCalculationPeriodType, fundId, fundName, transactionStrategyId, transactionStrategyName, this.charges); } } private static final class LoanProductLookupMapper implements - RowMapper { + RowMapper { public String loanProductLookupSchema() { return "lp.id as id, lp.name as name from m_product_loan lp"; } @Override - public LoanProductLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) + public LoanProductData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - Long id = rs.getLong("id"); - String name = rs.getString("name"); + final Long id = rs.getLong("id"); + final String name = rs.getString("name"); - return new LoanProductLookup(id, name); + return LoanProductData.lookup(id, name); } - } - - private void populateProductDataWithDropdownOptions(final LoanProductData productData) { - - List currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies(); - List amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions(); - List interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions(); - List interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions(); - List loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); - List repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); - List interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions(); - - Collection fundOptions = this.fundReadPlatformService.retrieveAllFunds(); - Collection transactionProcessingStrategyOptions = this.dropdownReadPlatformService.retreiveTransactionProcessingStrategies(); - - productData.setCurrencyOptions(currencyOptions); - productData.setAmortizationTypeOptions(amortizationTypeOptions); - productData.setInterestTypeOptions(interestTypeOptions); - productData.setInterestCalculationPeriodTypeOptions(interestCalculationPeriodTypeOptions); - productData.setLoanTermFrequencyTypeOptions(loanTermFrequencyTypeOptions); - productData.setRepaymentFrequencyTypeOptions(repaymentFrequencyTypeOptions); - productData.setInterestRateFrequencyTypeOptions(interestRateFrequencyTypeOptions); - productData.setFundOptions(fundOptions); - productData.setTransactionProcessingStrategyOptions(transactionProcessingStrategyOptions); - } - } \ No newline at end of file