mifosx-92: tidy up loan product in prep for tranche loans.

This commit is contained in:
Keith Woodlock
2012-10-11 17:59:13 +01:00
parent 90f78597d9
commit ab9497c985
12 changed files with 437 additions and 516 deletions
@@ -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<String> typicalResponseParameters = new HashSet<String>(
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<String> typicalResponseParameters = new HashSet<String>(
Arrays.asList("id", "name", "description", "fundId", "fundName", "principal", "inArrearsTolerance", "numberOfRepayments",
"repaymentEvery", "interestRatePerPeriod", "annualInterestRate",
"repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType",
"charges", "createdOn", "lastModifedOn")
);
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
final Set<String> 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<LoanProductData> products = this.loanProductReadPlatformService.retrieveAllLoanProducts();
final Collection<LoanProductData> 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<String> typicalResponseParameters = new HashSet<String>(
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<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
final Set<String> 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<String> typicalResponseParameters = new HashSet<String>(
Arrays.asList("id", "name", "description", "fundId", "fundName",
"transactionProcessingStrategyId", "transactionProcessingStrategyName",
"principal", "inArrearsTolerance", "numberOfRepayments",
"repaymentEvery", "interestRatePerPeriod", "annualInterestRate",
"repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType",
"interestCalculationPeriodType", "charges",
"createdOn", "lastModifedOn")
);
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
final Set<String> 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<ChargeData> 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<String> responseParameters) {
responseParameters.addAll(Arrays.asList("currencyOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions",
"repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "transactionProcessingStrategyOptions", "chargeOptions"));
Collection<ChargeData> chargeOptions = this.chargeReadPlatformService.retrieveLoanApplicableCharges();
chargeOptions.removeAll(productData.charges());
List<CurrencyData> currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies();
List<EnumOptionData> amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions();
List<EnumOptionData> interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions();
List<EnumOptionData> interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions();
List<EnumOptionData> loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions();
List<EnumOptionData> repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions();
List<EnumOptionData> interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions();
Collection<FundData> fundOptions = this.fundReadPlatformService.retrieveAllFunds();
Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions = this.dropdownReadPlatformService.retreiveTransactionProcessingStrategies();
return new LoanProductData(productData, chargeOptions, currencyOptions, amortizationTypeOptions, interestTypeOptions,
interestCalculationPeriodTypeOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, interestRateFrequencyTypeOptions, fundOptions, transactionProcessingStrategyOptions);
}
}
@@ -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<LoanProductLookup> productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup();
Collection<LoanProductData> productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup();
Collection<EnumOptionData>loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions();
Collection<EnumOptionData>repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions();
Collection<EnumOptionData>interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions();
@@ -237,7 +237,7 @@ public class LoansApiResource {
}
}
Collection<LoanProductLookup> productOptions = new ArrayList<LoanProductLookup>();
Collection<LoanProductData> productOptions = new ArrayList<LoanProductData>();
Collection<EnumOptionData> loanTermFrequencyTypeOptions = null;
Collection<EnumOptionData> repaymentFrequencyTypeOptions = new ArrayList<EnumOptionData>();
Collection<TransactionProcessingStrategyData> repaymentStrategyOptions = null;
@@ -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;
@@ -63,7 +63,7 @@ public class LoanAccountData {
// template
private final Collection<StaffData> loanOfficerOptions;
private final Collection<LoanProductLookup> productOptions;
private final Collection<LoanProductData> productOptions;
private final Collection<EnumOptionData> termFrequencyTypeOptions;
private final Collection<EnumOptionData> repaymentFrequencyTypeOptions;
private final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions;
@@ -82,7 +82,7 @@ public class LoanAccountData {
final Collection<LoanTransactionNewData> transactions,
final LoanPermissionData permissions,
final Collection<LoanChargeData> charges,
final Collection<LoanProductLookup> productOptions,
final Collection<LoanProductData> productOptions,
final Collection<EnumOptionData> termFrequencyTypeOptions,
final Collection<EnumOptionData> repaymentFrequencyTypeOptions,
final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions,
@@ -77,7 +77,7 @@ public class LoanBasicDetailsData {
final EnumOptionData termPeriodFrequencyType = product.getRepaymentFrequencyType();
final Collection<LoanChargeData> charges = new ArrayList<LoanChargeData>();
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()));
}
@@ -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<ChargeData> charges;
private final Collection<ChargeData> charges;
private DateTime createdOn;
private DateTime lastModifedOn;
private final DateTime createdOn;
private final DateTime lastModifedOn;
private final List<CurrencyData> currencyOptions;
private final Collection<FundData> fundOptions;
private final Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions;
private final List<EnumOptionData> amortizationTypeOptions;
private final List<EnumOptionData> interestTypeOptions;
private final List<EnumOptionData> interestCalculationPeriodTypeOptions;
private final List<EnumOptionData> repaymentFrequencyTypeOptions;
private final List<EnumOptionData> interestRateFrequencyTypeOptions;
private final List<EnumOptionData> loanTermFrequencyTypeOptions;
private final Collection<ChargeData> 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<ChargeData> 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<CurrencyData> currencyOptions = new ArrayList<CurrencyData>();
private Collection<FundData> fundOptions = new ArrayList<FundData>();
private Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions = new ArrayList<TransactionProcessingStrategyData>();
private List<EnumOptionData> amortizationTypeOptions = new ArrayList<EnumOptionData>();
private List<EnumOptionData> interestTypeOptions = new ArrayList<EnumOptionData>();
private List<EnumOptionData> interestCalculationPeriodTypeOptions = new ArrayList<EnumOptionData>();
private List<EnumOptionData> repaymentFrequencyTypeOptions = new ArrayList<EnumOptionData>();
private List<EnumOptionData> interestRateFrequencyTypeOptions = new ArrayList<EnumOptionData>();
private List<EnumOptionData> loanTermFrequencyTypeOptions = new ArrayList<EnumOptionData>();
private Collection<ChargeData> chargeOptions = new ArrayList<ChargeData>();
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<ChargeData> 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<ChargeData> 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<ChargeData> chargeOptions,
final List<CurrencyData> currencyOptions,
final List<EnumOptionData> amortizationTypeOptions,
final List<EnumOptionData> interestTypeOptions,
final List<EnumOptionData> interestCalculationPeriodTypeOptions,
final List<EnumOptionData> loanTermFrequencyTypeOptions,
final List<EnumOptionData> repaymentFrequencyTypeOptions,
final List<EnumOptionData> interestRateFrequencyTypeOptions,
final Collection<FundData> fundOptions,
final Collection<TransactionProcessingStrategyData> 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<ChargeData> charges() {
Collection<ChargeData> chargesLocal = new ArrayList<ChargeData>();
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<EnumOptionData> getRepaymentFrequencyTypeOptions() {
return repaymentFrequencyTypeOptions;
}
public void setRepaymentFrequencyTypeOptions(
List<EnumOptionData> repaymentFrequencyTypeOptions) {
this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions;
}
public List<EnumOptionData> getInterestRateFrequencyTypeOptions() {
return interestRateFrequencyTypeOptions;
}
public void setInterestRateFrequencyTypeOptions(
List<EnumOptionData> interestRateFrequencyTypeOptions) {
this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions;
}
public EnumOptionData getLoanTermFrequencyType() {
return loanTermFrequencyType;
}
public void setLoanTermFrequencyType(EnumOptionData loanTermFrequencyType) {
this.loanTermFrequencyType = loanTermFrequencyType;
}
public List<EnumOptionData> getLoanTermFrequencyTypeOptions() {
return loanTermFrequencyTypeOptions;
}
public void setLoanTermFrequencyTypeOptions(
List<EnumOptionData> loanTermFrequencyTypeOptions) {
this.loanTermFrequencyTypeOptions = loanTermFrequencyTypeOptions;
public DateTime getLastModifedOn() {
return lastModifedOn;
}
public List<CurrencyData> getCurrencyOptions() {
return currencyOptions;
}
public void setCurrencyOptions(List<CurrencyData> currencyOptions) {
this.currencyOptions = currencyOptions;
}
public Collection<FundData> getFundOptions() {
return fundOptions;
}
public void setFundOptions(Collection<FundData> fundOptions) {
this.fundOptions = fundOptions;
}
public Collection<TransactionProcessingStrategyData> getTransactionProcessingStrategyOptions() {
return transactionProcessingStrategyOptions;
}
public void setTransactionProcessingStrategyOptions(
Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions) {
this.transactionProcessingStrategyOptions = transactionProcessingStrategyOptions;
}
public List<EnumOptionData> getAmortizationTypeOptions() {
return amortizationTypeOptions;
}
public void setAmortizationTypeOptions(
List<EnumOptionData> amortizationTypeOptions) {
this.amortizationTypeOptions = amortizationTypeOptions;
}
public List<EnumOptionData> getInterestTypeOptions() {
return interestTypeOptions;
}
public void setInterestTypeOptions(List<EnumOptionData> interestTypeOptions) {
this.interestTypeOptions = interestTypeOptions;
}
public List<EnumOptionData> getInterestCalculationPeriodTypeOptions() {
return interestCalculationPeriodTypeOptions;
}
public void setInterestCalculationPeriodTypeOptions(
List<EnumOptionData> interestCalculationPeriodTypeOptions) {
this.interestCalculationPeriodTypeOptions = interestCalculationPeriodTypeOptions;
public List<EnumOptionData> getRepaymentFrequencyTypeOptions() {
return repaymentFrequencyTypeOptions;
}
public Collection<ChargeData> getCharges() {
return charges;
}
public List<EnumOptionData> getInterestRateFrequencyTypeOptions() {
return interestRateFrequencyTypeOptions;
}
public void setCharges(Collection<ChargeData> charges) {
this.charges = charges;
}
public List<EnumOptionData> getLoanTermFrequencyTypeOptions() {
return loanTermFrequencyTypeOptions;
}
public Collection<ChargeData> getChargeOptions() {
return chargeOptions;
}
public void setChargeOptions(Collection<ChargeData> chargeOptions) {
this.chargeOptions = chargeOptions;
}
public Collection<ChargeData> getChargeOptions() {
return chargeOptions;
}
}
@@ -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;
}
}
@@ -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<MoneyData> {
private String currencyCode;
@@ -335,23 +335,23 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
throw new InvalidJsonException();
}
Type typeOfMap = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
final Type typeOfMap = new TypeToken<Map<String, Object>>(){}.getType();
final Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>(
final Set<String> supportedParams = new HashSet<String>(
Arrays.asList("name", "officeId", "externalId", "clientMembers")
);
checkForUnsupportedParameters(requestMap, supportedParams);
Set<String> modifiedParameters = new HashSet<String>();
final Set<String> modifiedParameters = new HashSet<String>();
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<Map<String, Object>>(){}.getType();
Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap);
final Type typeOfMap = new TypeToken<Map<String, Object>>(){}.getType();
final Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>(
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<String> supportedParams = new HashSet<String>(
Arrays.asList("name", "description", "fundId", "transactionProcessingStrategyId",
"currencyCode", "digitsAfterDecimal",
"principal", "inArrearsTolerance",
"interestRatePerPeriod", "repaymentEvery", "numberOfRepayments",
"repaymentFrequencyType", "interestRateFrequencyType",
"amortizationType", "interestType", "interestCalculationPeriodType",
"charges", "locale")
);
checkForUnsupportedParameters(requestMap, supportedParams);
Set<String> modifiedParameters = new HashSet<String>();
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<String> modifiedParameters = new HashSet<String>();
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<Map<String, Object>>(){}.getType();
Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap);
final Type typeOfMap = new TypeToken<Map<String, Object>>(){}.getType();
final Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>(
final Set<String> supportedParams = new HashSet<String>(
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<String> modifiedParameters = new HashSet<String>();
final Set<String> modifiedParameters = new HashSet<String>();
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);
@@ -46,18 +46,16 @@ public class JsonParserHelper {
return longValue;
}
public String extractStringNamed(final String parameterName,
final JsonElement element, final Set<String> modifiedParameters) {
public String extractStringNamed(final String parameterName, final JsonElement element, final Set<String> 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;
}
}
}
@@ -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<LoanProductData> retrieveAllLoanProducts();
Collection<LoanProductLookup> retrieveAllLoanProductsForLookup();
Collection<LoanProductData> retrieveAllLoanProductsForLookup();
LoanProductData retrieveLoanProduct(Long productId);
@@ -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<ChargeData> 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<ChargeData> 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<LoanProductData> loanProducts = this.jdbcTemplate.query(sql, rm, new Object[] {});
for (LoanProductData loanProduct : loanProducts){
Collection<ChargeData> charges = this.chargeReadPlatformService.retrieveLoanProductCharges(loanProduct.getId());
loanProduct.setCharges(charges);
}
return loanProducts;
return this.jdbcTemplate.query(sql, rm, new Object[] {});
}
@Override
public Collection<LoanProductLookup> retrieveAllLoanProductsForLookup() {
public Collection<LoanProductData> 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<LoanProductData> {
public LoanProductMapper() {
private final Collection<ChargeData> charges;
public LoanProductMapper(final Collection<ChargeData> 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<LoanProductLookup> {
RowMapper<LoanProductData> {
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<CurrencyData> currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies();
List<EnumOptionData> amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions();
List<EnumOptionData> interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions();
List<EnumOptionData> interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions();
List<EnumOptionData> loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions();
List<EnumOptionData> repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions();
List<EnumOptionData> interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions();
Collection<FundData> fundOptions = this.fundReadPlatformService.retrieveAllFunds();
Collection<TransactionProcessingStrategyData> 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);
}
}