diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositAccountsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositAccountsApiResource.java index 0e68540c7..9f62e2f6c 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositAccountsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositAccountsApiResource.java @@ -36,12 +36,12 @@ import org.mifosng.platform.api.infrastructure.PortfolioApiDataConversionService import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService; import org.mifosng.platform.exceptions.UnrecognizedQueryParamException; import org.mifosng.platform.infrastructure.api.ApiParameterHelper; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.saving.service.DepositAccountReadPlatformService; import org.mifosng.platform.saving.service.DepositAccountWritePlatformService; import org.mifosng.platform.savingproduct.service.DepositProductReadPlatformService; import org.mifosng.platform.savingproduct.service.SavingsDepositEnumerations; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositProductsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositProductsApiResource.java index 7ae1dd361..515db9bc7 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositProductsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/DepositProductsApiResource.java @@ -26,13 +26,13 @@ import org.mifosng.platform.api.data.EnumOptionData; import org.mifosng.platform.api.infrastructure.PortfolioApiDataConversionService; import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService; import org.mifosng.platform.infrastructure.api.ApiParameterHelper; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.savingproduct.service.DepositProductReadPlatformService; import org.mifosng.platform.savingproduct.service.DepositProductWritePlatformService; import org.mifosng.platform.savingproduct.service.SavingsDepositEnumerations; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.configuration.service.CurrencyReadPlatformService; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; 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 deleted file mode 100644 index 90788169c..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.mifosng.platform.api; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -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.UriInfo; - -import org.mifosng.platform.api.commands.LoanProductCommand; -import org.mifosng.platform.api.data.EntityIdentifier; -import org.mifosng.platform.api.data.EnumOptionData; -import org.mifosng.platform.api.data.LoanProductData; -import org.mifosng.platform.api.data.TransactionProcessingStrategyData; -import org.mifosng.platform.api.infrastructure.PortfolioApiDataConversionService; -import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService; -import org.mifosng.platform.infrastructure.api.ApiParameterHelper; -import org.mifosng.platform.loanproduct.service.LoanDropdownReadPlatformService; -import org.mifosng.platform.loanproduct.service.LoanProductReadPlatformService; -import org.mifosng.platform.loanproduct.service.LoanProductWritePlatformService; -import org.mifosplatform.infrastructure.configuration.data.CurrencyData; -import org.mifosplatform.infrastructure.configuration.service.CurrencyReadPlatformService; -import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; -import org.mifosplatform.portfolio.charge.data.ChargeData; -import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService; -import org.mifosplatform.portfolio.fund.data.FundData; -import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Path("/loanproducts") -@Component -@Scope("singleton") -public class LoanProductsApiResource { - - @Autowired - private LoanProductReadPlatformService loanProductReadPlatformService; - - @Autowired - private LoanProductWritePlatformService loanProductWritePlatformService; - - @Autowired - private ChargeReadPlatformService chargeReadPlatformService; - - @Autowired - private PortfolioApiDataConversionService apiDataConversionService; - - @Autowired - private PortfolioApiJsonSerializerService apiJsonSerializerService; - - @Autowired - private CurrencyReadPlatformService currencyReadPlatformService; - - @Autowired - private FundReadPlatformService fundReadPlatformService; - - @Autowired - private LoanDropdownReadPlatformService dropdownReadPlatformService; - - private final String entityType = "LOANPRODUCT"; - @Autowired - private PlatformSecurityContext context; - - @POST - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String createLoanProduct(final String jsonRequestBody) { - - final LoanProductCommand command = this.apiDataConversionService.convertJsonToLoanProductCommand(null, jsonRequestBody); - - final EntityIdentifier identifier = this.loanProductWritePlatformService.createLoanProduct(command); - - return apiJsonSerializerService.serializeEntityIdentifier(identifier); - } - - @GET - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String retrieveAllLoanProducts(@Context final UriInfo uriInfo) { - - context.authenticatedUser().validateHasReadPermission(entityType); - - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - - final Collection products = this.loanProductReadPlatformService.retrieveAllLoanProducts(); - - return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, products); - } - - @GET - @Path("template") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String retrieveNewLoanProductDetails(@Context final UriInfo uriInfo) { - - context.authenticatedUser().validateHasReadPermission(entityType); - - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - - LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveNewLoanProductDetails(); - loanProduct = handleTemplate(loanProduct); - - return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); - } - - @GET - @Path("{productId}") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String retrieveLoanProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) { - - context.authenticatedUser().validateHasReadPermission(entityType); - - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - final boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); - - LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); - if (template) { - loanProduct = handleTemplate(loanProduct); - } - - return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); - } - - @PUT - @Path("{productId}") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String updateLoanProduct(@PathParam("productId") final Long productId, final String jsonRequestBody) { - - final LoanProductCommand command = this.apiDataConversionService.convertJsonToLoanProductCommand(productId, jsonRequestBody); - - final EntityIdentifier identifier = this.loanProductWritePlatformService.updateLoanProduct(command); - - return apiJsonSerializerService.serializeEntityIdentifier(identifier); - } - - private LoanProductData handleTemplate(final LoanProductData productData) { - - final boolean feeChargesOnly = true; - Collection chargeOptions = this.chargeReadPlatformService.retrieveLoanApplicableCharges(feeChargesOnly); - chargeOptions.removeAll(productData.charges()); - - final List currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies(); - final List amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions(); - final List interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions(); - final List interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions(); - final List loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); - final List repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); - final List interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions(); - - final Collection fundOptions = this.fundReadPlatformService.retrieveAllFunds(); - final 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 9a1aad1fb..41fb014c5 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 @@ -35,11 +35,9 @@ 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.LoanProductData; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.StaffAccountSummaryCollectionData; -import org.mifosng.platform.api.data.TransactionProcessingStrategyData; import org.mifosng.platform.api.infrastructure.PortfolioApiDataConversionService; import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService; import org.mifosng.platform.exceptions.UnrecognizedQueryParamException; @@ -48,8 +46,6 @@ import org.mifosng.platform.infrastructure.api.ApiParameterHelper; import org.mifosng.platform.loan.service.CalculationPlatformService; import org.mifosng.platform.loan.service.LoanReadPlatformService; import org.mifosng.platform.loan.service.LoanWritePlatformService; -import org.mifosng.platform.loanproduct.service.LoanDropdownReadPlatformService; -import org.mifosng.platform.loanproduct.service.LoanProductReadPlatformService; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; import org.mifosplatform.infrastructure.office.data.OfficeLookup; @@ -63,6 +59,10 @@ import org.mifosplatform.portfolio.charge.data.ChargeData; import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService; import org.mifosplatform.portfolio.fund.data.FundData; import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; +import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; +import org.mifosplatform.portfolio.loanproduct.service.LoanDropdownReadPlatformService; +import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java index 5348cbdd3..33cb854e6 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.util.Set; import org.joda.time.LocalDate; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; /** * Immutable command for submitting new loan application. @@ -209,7 +210,7 @@ public class LoanApplicationCommand { public LoanProductCommand toLoanProductCommand() { // FIXME - KW - CHARGE - FIX UP FOR CHARGES - take look at loan product charges also and align usage with other loan areas. - return new LoanProductCommand(modifiedParameters, this.productId, null, null, + return new LoanProductCommand(modifiedParameters, false, this.productId, null, null, this.fundId, this.transactionProcessingStrategyId, null, null, this.principal, this.inArrearsTolerance, diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanProductCommand.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanProductCommand.java deleted file mode 100644 index 2eb7ec65b..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanProductCommand.java +++ /dev/null @@ -1,211 +0,0 @@ -package org.mifosng.platform.api.commands; - -import java.math.BigDecimal; -import java.util.Set; - -/** - * Immutable command for creating or updating details of a loan product. - */ -public class LoanProductCommand { - - private final Long id; - private final String name; - private final String description; - - private final Long fundId; - private final Long transactionProcessingStrategyId; - - private final String currencyCode; - private final Integer digitsAfterDecimal; - private final BigDecimal principal; - private final BigDecimal inArrearsTolerance; - - private final Integer numberOfRepayments; - private final Integer repaymentEvery; - - private final BigDecimal interestRatePerPeriod; - - private final Integer repaymentFrequencyType; - private final Integer interestRateFrequencyType; - private final Integer amortizationType; - private final Integer interestType; - private final Integer interestCalculationPeriodType; - - private final String[] charges; - - private final Set modifiedParameters; - - public LoanProductCommand( - final Set modifiedParameters, - final Long id, final String name, final String description, - final Long fundId, final Long transactionProcessingStrategyId, - final String currencyCode, final Integer digitsAfterDecimal, - final BigDecimal principal, final BigDecimal inArrearsTolerance, final Integer numberOfRepayments, - final Integer repaymentEvery, final BigDecimal interestRatePerPeriod, - final Integer repaymentFrequencyType, final Integer interestRateFrequencyType, final Integer amortizationType, final Integer interestType, - final Integer interestCalculationPeriodType, final String[] charges) { - this.modifiedParameters = modifiedParameters; - this.id = id; - this.name = name; - this.description = description; - this.fundId = fundId; - this.transactionProcessingStrategyId = transactionProcessingStrategyId; - this.currencyCode = currencyCode; - this.digitsAfterDecimal = digitsAfterDecimal; - this.principal = principal; - if (inArrearsTolerance != null && BigDecimal.ZERO.compareTo(inArrearsTolerance) == 0) { - this.inArrearsTolerance = null; - } else { - this.inArrearsTolerance = inArrearsTolerance; - } - this.numberOfRepayments = numberOfRepayments; - this.repaymentEvery = repaymentEvery; - this.interestRatePerPeriod = interestRatePerPeriod; - this.repaymentFrequencyType = repaymentFrequencyType; - this.interestRateFrequencyType = interestRateFrequencyType; - this.amortizationType = amortizationType; - this.interestType = interestType; - this.interestCalculationPeriodType = interestCalculationPeriodType; - this.charges = charges; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public Long getFundId() { - return fundId; - } - - public Long getTransactionProcessingStrategyId() { - return transactionProcessingStrategyId; - } - - public String getCurrencyCode() { - return currencyCode; - } - - public Integer getDigitsAfterDecimal() { - return digitsAfterDecimal; - } - - public BigDecimal getPrincipal() { - return principal; - } - - public BigDecimal getInArrearsTolerance() { - return inArrearsTolerance; - } - - public Integer getNumberOfRepayments() { - return numberOfRepayments; - } - - public Integer getRepaymentEvery() { - return repaymentEvery; - } - - public BigDecimal getInterestRatePerPeriod() { - return interestRatePerPeriod; - } - - public Integer getRepaymentFrequencyType() { - return repaymentFrequencyType; - } - - public Integer getInterestRateFrequencyType() { - return interestRateFrequencyType; - } - - public Integer getAmortizationType() { - return amortizationType; - } - - public Integer getInterestType() { - return interestType; - } - - public Integer getInterestCalculationPeriodType() { - return interestCalculationPeriodType; - } - - public String[] getCharges() { - return charges; - } - - public boolean isNameChanged() { - return this.modifiedParameters.contains("name"); - } - - public boolean isDescriptionChanged() { - return this.modifiedParameters.contains("description"); - } - - public boolean isFundChanged() { - return this.modifiedParameters.contains("fundId"); - } - - public boolean isTransactionProcessingStrategyChanged() { - return this.modifiedParameters.contains("transactionProcessingStrategyId"); - } - - public boolean isCurrencyCodeChanged() { - return this.modifiedParameters.contains("currencyCode"); - } - - public boolean isDigitsAfterDecimalChanged() { - return this.modifiedParameters.contains("digitsAfterDecimal"); - } - - public boolean isPrincipalChanged() { - return this.modifiedParameters.contains("principal"); - } - - public boolean isInArrearsToleranceChanged() { - return this.modifiedParameters.contains("inArrearsTolerance"); - } - - public boolean isNumberOfRepaymentsChanged() { - return this.modifiedParameters.contains("numberOfRepayments"); - } - - public boolean isRepaymentEveryChanged() { - return this.modifiedParameters.contains("repaymentEvery"); - } - - public boolean isRepaymentFrequencyTypeChanged() { - return this.modifiedParameters.contains("repaymentFrequencyType"); - } - - public boolean isAmortizationTypeChanged() { - return this.modifiedParameters.contains("amortizationType"); - } - - public boolean isInterestTypeChanged() { - return this.modifiedParameters.contains("interestType"); - } - - public boolean isInterestRatePerPeriodChanged() { - return this.modifiedParameters.contains("interestRatePerPeriod"); - } - - public boolean isInterestRateFrequencyTypeChanged() { - return this.modifiedParameters.contains("interestRateFrequencyType"); - } - - public boolean isInterestCalculationPeriodTypeChanged() { - return this.modifiedParameters.contains("interestCalculationPeriodType"); - } - - public boolean isChargesChanged() { - return this.modifiedParameters.contains("charges"); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/EnumOptionData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/EnumOptionData.java index a07b958ff..f9b1406cf 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/EnumOptionData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/EnumOptionData.java @@ -2,25 +2,25 @@ package org.mifosng.platform.api.data; public class EnumOptionData { - private final Long id; - private final String code; - private final String value; + private final Long id; + private final String code; + private final String value; - public EnumOptionData(final Long id, final String code, final String value) { - this.id = id; - this.code = code; - this.value = value; - } + public EnumOptionData(final Long id, final String code, final String value) { + this.id = id; + this.code = code; + this.value = value; + } - public Long getId() { - return id; - } + public Long getId() { + return id; + } - public String getCode() { - return code; - } + public String getCode() { + return code; + } - public String getValue() { - return value; - } + public String getValue() { + return value; + } } \ No newline at end of file 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 e2f96002a..e5e8d9e88 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 @@ -8,6 +8,8 @@ import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.staff.data.StaffData; import org.mifosplatform.portfolio.charge.data.ChargeData; import org.mifosplatform.portfolio.fund.data.FundData; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; +import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; /** * Immutable data object representing loan account data. 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 903c1b096..8629b41fd 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 @@ -10,6 +10,7 @@ import org.joda.time.LocalDate; import org.joda.time.Months; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.portfolio.charge.data.ChargeData; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; /** * Immutable data object for core details of loan to be combined with {@link LoanAccountData} usage. 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 deleted file mode 100644 index 5187e4bae..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java +++ /dev/null @@ -1,388 +0,0 @@ -package org.mifosng.platform.api.data; - -import java.math.BigDecimal; -import java.util.ArrayList; -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; -import org.mifosplatform.infrastructure.configuration.data.CurrencyData; -import org.mifosplatform.portfolio.charge.data.ChargeData; -import org.mifosplatform.portfolio.fund.data.FundData; - -/** - * Immutable data object to represent loan products. - */ -public class LoanProductData { - - private final Long id; - private final String name; - private final String description; - - private final Long fundId; - private final String fundName; - - private final Long transactionProcessingStrategyId; - private final String transactionProcessingStrategyName; - - private final CurrencyData currency; - private final BigDecimal principal; - private final BigDecimal inArrearsTolerance; - - private final Integer numberOfRepayments; - private final Integer loanTermFrequency; - private final Integer repaymentEvery; - private final BigDecimal interestRatePerPeriod; - private final BigDecimal annualInterestRate; - - 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 final Collection charges; - - 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() { - - 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( - 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 = currency; - this.principal = principal; - this.inArrearsTolerance = tolerance; - this.numberOfRepayments = numberOfRepayments; - this.loanTermFrequency = loanTermFrequency; - this.repaymentEvery = repaymentEvery; - this.interestRatePerPeriod = interestRatePerPeriod; - this.annualInterestRate = annualInterestRate; - this.loanTermFrequencyType = loanTermFrequencyType; - this.repaymentFrequencyType = repaymentFrequencyType; - this.interestRateFrequencyType = interestRateFrequencyType; - this.amortizationType = amortizationType; - this.interestType = interestType; - this.interestCalculationPeriodType = interestCalculationPeriodType; - this.fundId = fundId; - 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 = productData.charges(); - - 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 String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public Long getFundId() { - return fundId; - } - - public String getFundName() { - return fundName; - } - - public Long getTransactionProcessingStrategyId() { - return transactionProcessingStrategyId; - } - - public String getTransactionProcessingStrategyName() { - return transactionProcessingStrategyName; - } - - public CurrencyData getCurrency() { - return currency; - } - - public BigDecimal getPrincipal() { - return principal; - } - - public BigDecimal getInArrearsTolerance() { - return inArrearsTolerance; - } - - public Integer getNumberOfRepayments() { - return numberOfRepayments; - } - - public Integer getLoanTermFrequency() { - return loanTermFrequency; - } - - public Integer getRepaymentEvery() { - return repaymentEvery; - } - - public BigDecimal getInterestRatePerPeriod() { - return interestRatePerPeriod; - } - - public BigDecimal getAnnualInterestRate() { - return annualInterestRate; - } - - public EnumOptionData getLoanTermFrequencyType() { - return loanTermFrequencyType; - } - - public EnumOptionData getRepaymentFrequencyType() { - return repaymentFrequencyType; - } - - public EnumOptionData getInterestRateFrequencyType() { - return interestRateFrequencyType; - } - - public EnumOptionData getAmortizationType() { - return amortizationType; - } - - public EnumOptionData getInterestType() { - return interestType; - } - - public EnumOptionData getInterestCalculationPeriodType() { - return interestCalculationPeriodType; - } - - public DateTime getCreatedOn() { - return createdOn; - } - - public DateTime getLastModifedOn() { - return lastModifedOn; - } - - public List getCurrencyOptions() { - return currencyOptions; - } - - public Collection getFundOptions() { - return fundOptions; - } - - public Collection getTransactionProcessingStrategyOptions() { - return transactionProcessingStrategyOptions; - } - - public List getAmortizationTypeOptions() { - return amortizationTypeOptions; - } - - public List getInterestTypeOptions() { - return interestTypeOptions; - } - - public List getInterestCalculationPeriodTypeOptions() { - return interestCalculationPeriodTypeOptions; - } - - public List getRepaymentFrequencyTypeOptions() { - return repaymentFrequencyTypeOptions; - } - - public List getInterestRateFrequencyTypeOptions() { - return interestRateFrequencyTypeOptions; - } - - public List getLoanTermFrequencyTypeOptions() { - return loanTermFrequencyTypeOptions; - } - - public Collection getChargeOptions() { - return chargeOptions; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java index b28ffa689..cfc99cfd7 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java @@ -17,7 +17,6 @@ import org.mifosng.platform.api.data.GroupData; import org.mifosng.platform.api.data.GuarantorData; import org.mifosng.platform.api.data.LoanAccountData; import org.mifosng.platform.api.data.LoanChargeData; -import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.NoteData; @@ -40,6 +39,7 @@ import org.mifosplatform.infrastructure.user.api.data.RoleData; import org.mifosplatform.infrastructure.user.api.data.RolePermissionsData; import org.mifosplatform.portfolio.charge.data.ChargeData; import org.mifosplatform.portfolio.fund.data.FundData; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java index b027b47a1..ef89a8459 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java @@ -13,7 +13,6 @@ import org.mifosng.platform.api.commands.GroupCommand; import org.mifosng.platform.api.commands.GuarantorCommand; import org.mifosng.platform.api.commands.LoanApplicationCommand; import org.mifosng.platform.api.commands.LoanChargeCommand; -import org.mifosng.platform.api.commands.LoanProductCommand; import org.mifosng.platform.api.commands.LoanStateTransitionCommand; import org.mifosng.platform.api.commands.LoanTransactionCommand; import org.mifosng.platform.api.commands.NoteCommand; @@ -32,6 +31,7 @@ import org.mifosplatform.infrastructure.user.command.RolePermissionCommand; import org.mifosplatform.infrastructure.user.command.UserCommand; import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand; import org.mifosplatform.portfolio.fund.command.FundCommand; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; public interface PortfolioApiDataConversionService { @@ -51,7 +51,7 @@ public interface PortfolioApiDataConversionService { BranchMoneyTransferCommand convertApiRequestJsonToBranchMoneyTransferCommand(String json); - LoanProductCommand convertJsonToLoanProductCommand(Long resourceIdentifier, String json); + LoanProductCommand convertApiRequestJsonToLoanProductCommand(Long resourceIdentifier, String json); SavingProductCommand convertJsonToSavingProductCommand(Long resourceIdentifier, String json); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java index 89f43fb60..3c9908ddf 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java @@ -30,7 +30,6 @@ import org.mifosng.platform.api.commands.GroupCommand; import org.mifosng.platform.api.commands.GuarantorCommand; import org.mifosng.platform.api.commands.LoanApplicationCommand; import org.mifosng.platform.api.commands.LoanChargeCommand; -import org.mifosng.platform.api.commands.LoanProductCommand; import org.mifosng.platform.api.commands.LoanStateTransitionCommand; import org.mifosng.platform.api.commands.LoanTransactionCommand; import org.mifosng.platform.api.commands.NoteCommand; @@ -54,6 +53,7 @@ import org.mifosplatform.infrastructure.user.command.RolePermissionCommand; import org.mifosplatform.infrastructure.user.command.UserCommand; import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand; import org.mifosplatform.portfolio.fund.command.FundCommand; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.number.NumberFormatter; import org.springframework.stereotype.Service; @@ -518,7 +518,7 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo } @Override - public LoanProductCommand convertJsonToLoanProductCommand(final Long resourceIdentifier, final String json) { + public LoanProductCommand convertApiRequestJsonToLoanProductCommand(final Long resourceIdentifier, final String json) { if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } @@ -581,7 +581,7 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo } } - return new LoanProductCommand(modifiedParameters, resourceIdentifier, name, description, fundId, transactionProcessingStrategyId, + return new LoanProductCommand(modifiedParameters, false, resourceIdentifier, name, description, fundId, transactionProcessingStrategyId, currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, numberOfRepayments, repaymentEvery, interestRatePerPeriod, repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType, interestCalculationPeriodType, charges); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java index 0c39479ac..057a0b53d 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java @@ -15,7 +15,6 @@ import org.mifosng.platform.api.data.GroupData; import org.mifosng.platform.api.data.GuarantorData; import org.mifosng.platform.api.data.LoanAccountData; import org.mifosng.platform.api.data.LoanChargeData; -import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.NoteData; @@ -37,6 +36,7 @@ import org.mifosplatform.infrastructure.user.api.data.RoleData; import org.mifosplatform.infrastructure.user.api.data.RolePermissionsData; import org.mifosplatform.portfolio.charge.data.ChargeData; import org.mifosplatform.portfolio.fund.data.FundData; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; public interface PortfolioApiJsonSerializerService { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeerializerServiceGoogleGson.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeerializerServiceGoogleGson.java index 7b4044bff..a5adf5b82 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeerializerServiceGoogleGson.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeerializerServiceGoogleGson.java @@ -21,6 +21,7 @@ import org.mifosplatform.infrastructure.user.command.RolePermissionCommand; import org.mifosplatform.infrastructure.user.command.UserCommand; import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand; import org.mifosplatform.portfolio.fund.command.FundCommand; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; import org.springframework.stereotype.Service; import com.google.gson.Gson; @@ -268,6 +269,55 @@ public class PortfolioCommandDeerializerServiceGoogleGson implements PortfolioCo return new ClientCommand(parametersPassedInRequest, clientId, externalId, firstname, lastname, clientOrBusinessName, officeId, joiningDate, makerCheckerApproval); + } + + @Override + public LoanProductCommand deserializeLoanProductCommand(final Long loanProductId, final String commandAsJson, final boolean makerCheckerApproval) { + if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); } + + final JsonParserHelper helper = new JsonParserHelper(); + final JsonElement element = parser.parse(commandAsJson); + + final Set parametersPassedInRequest = new HashSet(); + + final String name = helper.extractStringNamed("name", element, parametersPassedInRequest); + final String description = helper.extractStringNamed("description", element, parametersPassedInRequest); + final Long fundId = helper.extractLongNamed("fundId", element, parametersPassedInRequest); + + final Long transactionProcessingStrategyId = helper + .extractLongNamed("transactionProcessingStrategyId", element, parametersPassedInRequest); + + final String currencyCode = helper.extractStringNamed("currencyCode", element, parametersPassedInRequest); + final Integer digitsAfterDecimal = helper.extractIntegerNamed("digitsAfterDecimal", element, Locale.US, parametersPassedInRequest); + + final BigDecimal principal = helper.extractBigDecimalNamed("principal", element.getAsJsonObject(), Locale.US, parametersPassedInRequest); + final BigDecimal inArrearsTolerance = helper.extractBigDecimalNamed("inArrearsTolerance", element.getAsJsonObject(), Locale.US, parametersPassedInRequest); + final BigDecimal interestRatePerPeriod = helper.extractBigDecimalNamed("interestRatePerPeriod", element.getAsJsonObject(), Locale.US, parametersPassedInRequest); + final Integer repaymentEvery = helper.extractIntegerNamed("repaymentEvery", element, Locale.US, parametersPassedInRequest); + final Integer numberOfRepayments = helper.extractIntegerNamed("numberOfRepayments", element, Locale.US, parametersPassedInRequest); + final Integer repaymentFrequencyType = helper.extractIntegerNamed("repaymentFrequencyType", element, Locale.US, parametersPassedInRequest); + final Integer interestRateFrequencyType = helper.extractIntegerNamed("interestRateFrequencyType", element, Locale.US, parametersPassedInRequest); + final Integer amortizationType = helper.extractIntegerNamed("amortizationType", element, Locale.US, parametersPassedInRequest); + final Integer interestType = helper.extractIntegerNamed("interestType", element, Locale.US, parametersPassedInRequest); + final Integer interestCalculationPeriodType = helper.extractIntegerNamed("interestCalculationPeriodType", element, Locale.US, + parametersPassedInRequest); + + String[] charges = null; + if (element.isJsonObject()) { + JsonObject object = element.getAsJsonObject(); + if (object.has("charges")) { + parametersPassedInRequest.add("charges"); + JsonArray array = object.get("charges").getAsJsonArray(); + charges = new String[array.size()]; + for (int i = 0; i < array.size(); i++) { + charges[i] = array.get(i).getAsString(); + } + } + } + + return new LoanProductCommand(parametersPassedInRequest, makerCheckerApproval, loanProductId, name, description, fundId, transactionProcessingStrategyId, + currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, numberOfRepayments, repaymentEvery, interestRatePerPeriod, + repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType, interestCalculationPeriodType, charges); } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeserializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeserializerService.java index 67745edcc..7f4abea87 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeserializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioCommandDeserializerService.java @@ -12,6 +12,7 @@ import org.mifosplatform.infrastructure.user.command.RolePermissionCommand; import org.mifosplatform.infrastructure.user.command.UserCommand; import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand; import org.mifosplatform.portfolio.fund.command.FundCommand; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; /** * Service for de-serializing JSON for a command into the platforms internal @@ -48,4 +49,6 @@ public interface PortfolioCommandDeserializerService { ChargeDefinitionCommand deserializeChargeDefinitionCommand(Long chargeDefinitionId, String commandAsJson, boolean makerCheckerApproval); ClientCommand deserializeClientCommand(Long clientId, String commandAsJson, boolean makerCheckerApproval); + + LoanProductCommand deserializeLoanProductCommand(Long resourceId, String json, boolean b); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/AmortizationMethod.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/AmortizationMethod.java deleted file mode 100644 index 1de7a7216..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/AmortizationMethod.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.mifosng.platform.loan.domain; - -public enum AmortizationMethod { - EQUAL_PRINCIPAL(0, "amortizationType.equal.principal"), EQUAL_INSTALLMENTS(1, "amortizationType.equal.installments"), INVALID(2, "amortizationType.invalid"); - - private final Integer value; - private final String code; - - private AmortizationMethod(final Integer value, final String code) { - this.value = value; - this.code = code; - } - - public Integer getValue() { - return this.value; - } - - public String getCode() { - return code; - } - - public static AmortizationMethod fromInt(final Integer selectedMethod) { - - if (selectedMethod == null) { - return null; - } - - AmortizationMethod repaymentMethod = null; - switch (selectedMethod) { - case 0: - repaymentMethod = AmortizationMethod.EQUAL_PRINCIPAL; - break; - case 1: - repaymentMethod = AmortizationMethod.EQUAL_INSTALLMENTS; - break; - default: - repaymentMethod = AmortizationMethod.INVALID; - break; - } - return repaymentMethod; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/InterestCalculationPeriodMethod.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/InterestCalculationPeriodMethod.java deleted file mode 100644 index ffbff6cb4..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/InterestCalculationPeriodMethod.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.mifosng.platform.loan.domain; - -public enum InterestCalculationPeriodMethod { - DAILY(0, "interestCalculationPeriodType.daily"), SAME_AS_REPAYMENT_PERIOD(1, "interestCalculationPeriodType.same.as.repayment.period"), INVALID(2, "interestCalculationPeriodType.invalid"); - - private final Integer value; - private final String code; - - private InterestCalculationPeriodMethod(final Integer value, final String code) { - this.value = value; - this.code = code; - } - - public Integer getValue() { - return this.value; - } - - public String getCode() { - return code; - } - - public static InterestCalculationPeriodMethod fromInt(final Integer selectedMethod) { - - InterestCalculationPeriodMethod repaymentMethod = null; - switch (selectedMethod) { - case 0: - repaymentMethod = InterestCalculationPeriodMethod.DAILY; - break; - case 1: - repaymentMethod = InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD; - break; - default: - repaymentMethod = InterestCalculationPeriodMethod.INVALID; - break; - } - return repaymentMethod; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/InterestMethod.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/InterestMethod.java deleted file mode 100644 index 408ad8b99..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/InterestMethod.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.mifosng.platform.loan.domain; - -public enum InterestMethod { - DECLINING_BALANCE(0, "interestType.declining.balance"), FLAT(1, "interestType.flat"), INVALID(2, "interestType.invalid"); - - private final Integer value; - private final String code; - - private InterestMethod(final Integer value, final String code) { - this.value = value; - this.code = code; - } - - public Integer getValue() { - return this.value; - } - - public String getCode() { - return code; - } - - public static InterestMethod fromInt(final Integer selectedMethod) { - - InterestMethod repaymentMethod = null; - switch (selectedMethod) { - case 0: - repaymentMethod = InterestMethod.DECLINING_BALANCE; - break; - case 1: - repaymentMethod = InterestMethod.FLAT; - break; - default: - repaymentMethod = InterestMethod.INVALID; - break; - } - return repaymentMethod; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java index 50df32783..8bff2c8b1 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java @@ -42,6 +42,10 @@ import org.mifosplatform.infrastructure.configuration.domain.Money; import org.mifosplatform.infrastructure.staff.domain.Staff; import org.mifosplatform.infrastructure.user.domain.AppUser; import org.mifosplatform.portfolio.fund.domain.Fund; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; @Entity @Table(name = "m_loan", uniqueConstraints = @UniqueConstraint(columnNames = { "external_id" })) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProduct.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProduct.java deleted file mode 100644 index 47cf6d5fc..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProduct.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.mifosng.platform.loan.domain; - -import java.math.BigDecimal; -import java.util.Set; - -import javax.persistence.Column; -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import org.apache.commons.lang.StringUtils; -import org.mifosng.platform.api.commands.LoanProductCommand; -import org.mifosng.platform.infrastructure.AbstractAuditableCustom; -import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; -import org.mifosplatform.infrastructure.user.domain.AppUser; -import org.mifosplatform.portfolio.charge.domain.Charge; -import org.mifosplatform.portfolio.fund.domain.Fund; - -/** - * Loan products allow for categorisation of an organisations loans into something meaningful to them. - * - * They provide a means of simplifying creation/maintenance of loans. - * They can also allow for product comparison to take place when reporting. - * - * They allow for constraints to be added at product level. - */ -@Entity -@Table(name = "m_product_loan") -public class LoanProduct extends AbstractAuditableCustom { - - @SuppressWarnings("unused") - @ManyToOne - @JoinColumn(name = "fund_id", nullable = true) - private Fund fund; - - @SuppressWarnings("unused") - @ManyToOne - @JoinColumn(name = "loan_transaction_strategy_id", nullable = true) - private LoanTransactionProcessingStrategy transactionProcessingStrategy; - - @SuppressWarnings("unused") - @Column(name = "name", nullable = false) - private String name; - - @SuppressWarnings("unused") - @Column(name = "description") - private String description; - - @ManyToMany - @JoinTable(name = "m_product_loan_charge", - joinColumns = @JoinColumn(name = "product_loan_id"), - inverseJoinColumns = @JoinColumn(name = "charge_id")) - private Set charges; - - @Embedded - private final LoanProductRelatedDetail loanProductRelatedDetail; - - protected LoanProduct() { - this.loanProductRelatedDetail = null; - } - - public LoanProduct( - final Fund fund, - final LoanTransactionProcessingStrategy transactionProcessingStrategy, - final String name, - final String description, - final MonetaryCurrency currency, - final BigDecimal defaultPrincipal, - final BigDecimal defaultNominalInterestRatePerPeriod, - final PeriodFrequencyType interestPeriodFrequencyType, - final BigDecimal defaultAnnualNominalInterestRate, - final InterestMethod interestMethod, - final InterestCalculationPeriodMethod interestCalculationPeriodMethod, - final Integer repayEvery, - final PeriodFrequencyType repaymentFrequencyType, - final Integer defaultNumberOfInstallments, - final AmortizationMethod amortizationMethod, - final BigDecimal inArrearsTolerance, - final Set charges) { - this.fund = fund; - this.transactionProcessingStrategy = transactionProcessingStrategy; - this.name = name.trim(); - if (StringUtils.isNotBlank(description)) { - this.description = description.trim(); - } else { - this.description = null; - } - - if (charges != null){ - this.charges = charges; - } - - this.loanProductRelatedDetail = new LoanProductRelatedDetail(currency, - defaultPrincipal, defaultNominalInterestRatePerPeriod, interestPeriodFrequencyType, defaultAnnualNominalInterestRate, - interestMethod, interestCalculationPeriodMethod, - repayEvery, repaymentFrequencyType, defaultNumberOfInstallments, amortizationMethod, inArrearsTolerance); - } - - public MonetaryCurrency getCurrency() { - return this.loanProductRelatedDetail.getCurrency(); - } - - public Set getCharges() { - return charges; - } - - public void update( - final LoanProductCommand command, - final Fund fund, - final LoanTransactionProcessingStrategy strategy, - final Set charges) { - - if (command.isNameChanged()) { - this.name = command.getName(); - } - - if (command.isDescriptionChanged()) { - this.description = command.getDescription(); - } - - if (command.isFundChanged()) { - this.fund = fund; - } - - if (command.isTransactionProcessingStrategyChanged()) { - this.transactionProcessingStrategy = strategy; - } - - if (command.isChargesChanged()){ - this.charges = charges; - } - - this.loanProductRelatedDetail.update(command); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductRelatedDetail.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductRelatedDetail.java deleted file mode 100644 index 9e9097a7b..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductRelatedDetail.java +++ /dev/null @@ -1,195 +0,0 @@ -package org.mifosng.platform.loan.domain; - -import java.math.BigDecimal; - -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.Embedded; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; - -import org.mifosng.platform.api.commands.LoanProductCommand; -import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; -import org.mifosplatform.infrastructure.configuration.domain.Money; - -/** - * LoanRepaymentScheduleDetail encapsulates all the details of a - * {@link LoanProduct} that are also used and persisted by a {@link Loan}. - */ -@Embeddable -public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentScheduleRelatedDetail { - - @Embedded - private MonetaryCurrency currency; - - @Column(name = "principal_amount", scale = 6, precision = 19, nullable = false) - private BigDecimal principal; - - @Column(name = "nominal_interest_rate_per_period", scale = 6, precision = 19, nullable = false) - private BigDecimal nominalInterestRatePerPeriod; - - @Enumerated(EnumType.ORDINAL) - @Column(name = "interest_period_frequency_enum", nullable = false) - private PeriodFrequencyType interestPeriodFrequencyType; - - @Column(name = "annual_nominal_interest_rate", scale = 6, precision = 19, nullable = false) - private BigDecimal annualNominalInterestRate; - - @Enumerated(EnumType.ORDINAL) - @Column(name = "interest_method_enum", nullable = false) - private InterestMethod interestMethod; - - @Enumerated(EnumType.ORDINAL) - @Column(name = "interest_calculated_in_period_enum", nullable = false) - private InterestCalculationPeriodMethod interestCalculationPeriodMethod; - - @Column(name = "repay_every", nullable = false) - private Integer repayEvery; - - @Enumerated(EnumType.ORDINAL) - @Column(name = "repayment_period_frequency_enum", nullable = false) - private PeriodFrequencyType repaymentPeriodFrequencyType; - - @Column(name = "number_of_repayments", nullable = false) - private Integer numberOfRepayments; - - @Enumerated(EnumType.ORDINAL) - @Column(name = "amortization_method_enum", nullable = false) - private AmortizationMethod amortizationMethod; - - @Column(name = "arrearstolerance_amount", scale = 6, precision = 19, nullable = true) - private BigDecimal inArrearsTolerance; - - protected LoanProductRelatedDetail() { - // - } - - public LoanProductRelatedDetail(final MonetaryCurrency currency, - final BigDecimal defaultPrincipal, - final BigDecimal defaultNominalInterestRatePerPeriod, - final PeriodFrequencyType interestPeriodFrequencyType, - final BigDecimal defaultAnnualNominalInterestRate, - final InterestMethod interestMethod, - final InterestCalculationPeriodMethod interestCalculationPeriodMethod, - final Integer repayEvery, - final PeriodFrequencyType repaymentFrequencyType, - final Integer defaultNumberOfRepayments, - final AmortizationMethod amortizationMethod, - final BigDecimal inArrearsTolerance) { - this.currency = currency; - this.principal = defaultPrincipal; - this.nominalInterestRatePerPeriod = defaultNominalInterestRatePerPeriod; - this.interestPeriodFrequencyType = interestPeriodFrequencyType; - this.annualNominalInterestRate = defaultAnnualNominalInterestRate; - this.interestMethod = interestMethod; - this.interestCalculationPeriodMethod = interestCalculationPeriodMethod; - this.repayEvery = repayEvery; - this.repaymentPeriodFrequencyType = repaymentFrequencyType; - this.numberOfRepayments = defaultNumberOfRepayments; - this.amortizationMethod = amortizationMethod; - if (inArrearsTolerance != null && BigDecimal.ZERO.compareTo(inArrearsTolerance) == 0) { - this.inArrearsTolerance = null; - } else { - this.inArrearsTolerance = inArrearsTolerance; - } - } - - public MonetaryCurrency getCurrency() { - return this.currency.copy(); - } - - public Money getPrincipal() { - return Money.of(this.currency, this.principal); - } - - public Money getInArrearsTolerance() { - return Money.of(this.currency, this.inArrearsTolerance); - } - - public BigDecimal getNominalInterestRatePerPeriod() { - return BigDecimal.valueOf(Double.valueOf(this.nominalInterestRatePerPeriod.stripTrailingZeros().toString())) ; - } - - public PeriodFrequencyType getInterestPeriodFrequencyType() { - return interestPeriodFrequencyType; - } - - public BigDecimal getAnnualNominalInterestRate() { - return BigDecimal.valueOf(Double.valueOf(this.annualNominalInterestRate.stripTrailingZeros().toString())) ; - } - - public InterestMethod getInterestMethod() { - return interestMethod; - } - - public InterestCalculationPeriodMethod getInterestCalculationPeriodMethod() { - return interestCalculationPeriodMethod; - } - - @Override - public Integer getRepayEvery() { - return repayEvery; - } - - @Override - public PeriodFrequencyType getRepaymentPeriodFrequencyType() { - return repaymentPeriodFrequencyType; - } - - @Override - public Integer getNumberOfRepayments() { - return numberOfRepayments; - } - - public AmortizationMethod getAmortizationMethod() { - return amortizationMethod; - } - - public void update(final LoanProductCommand command) { - - Integer digitsAfterDecimalChanged = this.currency.getDigitsAfterDecimal(); - if (command.isDigitsAfterDecimalChanged()) { - digitsAfterDecimalChanged = command.getDigitsAfterDecimal(); - } - - String currencyCodeChanged = this.currency.getCode(); - if (command.isCurrencyCodeChanged()) { - currencyCodeChanged = command.getCurrencyCode(); - } - - if (command.isDigitsAfterDecimalChanged() || command.isCurrencyCodeChanged()) { - this.currency = new MonetaryCurrency(currencyCodeChanged, digitsAfterDecimalChanged); - } - - if (command.isPrincipalChanged()) { - this.principal = command.getPrincipal(); - } - if (command.isRepaymentEveryChanged()) { - this.repayEvery = command.getRepaymentEvery(); - } - if (command.isRepaymentFrequencyTypeChanged()) { - this.repaymentPeriodFrequencyType = PeriodFrequencyType.fromInt(command.getRepaymentFrequencyType()); - } - if (command.isNumberOfRepaymentsChanged()) { - this.numberOfRepayments = command.getNumberOfRepayments(); - } - if (command.isAmortizationTypeChanged()) { - this.amortizationMethod = AmortizationMethod.fromInt(command.getAmortizationType()); - } - if (command.isInArrearsToleranceChanged()) { - this.inArrearsTolerance = command.getInArrearsTolerance(); - } - if (command.isInterestRatePerPeriodChanged()) { - this.nominalInterestRatePerPeriod = command.getInterestRatePerPeriod(); - } - if (command.isInterestRateFrequencyTypeChanged()) { - this.interestPeriodFrequencyType = PeriodFrequencyType.fromInt(command.getInterestRateFrequencyType()); - } - if (command.isInterestTypeChanged()) { - this.interestMethod = InterestMethod.fromInt(command.getInterestType()); - } - if (command.isInterestCalculationPeriodTypeChanged()) { - this.interestCalculationPeriodMethod = InterestCalculationPeriodMethod.fromInt(command.getInterestCalculationPeriodType()); - } - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductRepository.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductRepository.java deleted file mode 100644 index 6651d0de7..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.mifosng.platform.loan.domain; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -public interface LoanProductRepository extends - JpaRepository, JpaSpecificationExecutor { - // no behaviour added -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanRepaymentScheduleTransactionProcessorFactory.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanRepaymentScheduleTransactionProcessorFactory.java index 011b3aedb..3c29132ce 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanRepaymentScheduleTransactionProcessorFactory.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanRepaymentScheduleTransactionProcessorFactory.java @@ -1,5 +1,7 @@ package org.mifosng.platform.loan.domain; +import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; + /** * diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransaction.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransaction.java index 2209e56dc..91f1fc1fb 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransaction.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransaction.java @@ -19,11 +19,11 @@ import org.joda.time.LocalDate; import org.mifosng.platform.api.data.EnumOptionData; import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.infrastructure.AbstractAuditableCustom; -import org.mifosng.platform.loanproduct.service.LoanEnumerations; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; import org.springframework.format.annotation.DateTimeFormat; /** diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransactionProcessingStrategy.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransactionProcessingStrategy.java deleted file mode 100644 index 6fd0a927c..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransactionProcessingStrategy.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.mifosng.platform.loan.domain; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; - -import org.mifosng.platform.api.data.TransactionProcessingStrategyData; -import org.mifosng.platform.infrastructure.AbstractAuditableCustom; -import org.mifosplatform.infrastructure.user.domain.AppUser; - -/** - * - */ -@Entity -@Table(name = "ref_loan_transaction_processing_strategy") -public class LoanTransactionProcessingStrategy extends AbstractAuditableCustom { - - @Column(name = "code", unique=true) - private String code; - - @Column(name = "name") - private String name; - - protected LoanTransactionProcessingStrategy() { - // - } - - public TransactionProcessingStrategyData toData() { - return new TransactionProcessingStrategyData(this.getId(), this.code, this.name); - } - - public boolean isStandardMifosStrategy() { - return "mifos-standard-strategy".equalsIgnoreCase(this.code); - } - - public boolean isHeavensfamilyStrategy() { - return "heavensfamily-strategy".equalsIgnoreCase(this.code); - } - - public boolean isCreocoreStrategy() { - return "creocore-strategy".equalsIgnoreCase(this.code); - } - - public boolean isIndianRBIStrategy() { - return "rbi-india-strategy".equalsIgnoreCase(this.code); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransactionProcessingStrategyRepository.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransactionProcessingStrategyRepository.java index 41c47e77c..ebdffe7c4 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransactionProcessingStrategyRepository.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanTransactionProcessingStrategyRepository.java @@ -1,5 +1,6 @@ package org.mifosng.platform.loan.domain; +import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/PeriodFrequencyType.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/PeriodFrequencyType.java deleted file mode 100644 index b057b4191..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/PeriodFrequencyType.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.mifosng.platform.loan.domain; - -public enum PeriodFrequencyType { - DAYS(0, "periodFrequencyType.days"), // - WEEKS(1, "periodFrequencyType.weeks"), // - MONTHS(2, "periodFrequencyType.months"), // - YEARS(3, "periodFrequencyType.years"), // - INVALID(4, "periodFrequencyType.invalid"); - - private final Integer value; - private final String code; - - private PeriodFrequencyType(final Integer value, final String code) { - this.value = value; - this.code = code; - } - - public Integer getValue() { - return this.value; - } - - public String getCode() { - return code; - } - - public static PeriodFrequencyType fromInt(final Integer frequency) { - - PeriodFrequencyType repaymentFrequencyType = PeriodFrequencyType.INVALID; - switch (frequency) { - case 0: - repaymentFrequencyType = PeriodFrequencyType.DAYS; - break; - case 1: - repaymentFrequencyType = PeriodFrequencyType.WEEKS; - break; - case 2: - repaymentFrequencyType = PeriodFrequencyType.MONTHS; - break; - case 3: - repaymentFrequencyType = PeriodFrequencyType.YEARS; - break; - default: - repaymentFrequencyType = PeriodFrequencyType.INVALID; - break; - } - return repaymentFrequencyType; - } -} diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/CalculationPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/CalculationPlatformServiceImpl.java index d296c42ee..3a6daa4dc 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/CalculationPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/CalculationPlatformServiceImpl.java @@ -4,16 +4,16 @@ import java.util.Set; import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand; import org.mifosng.platform.api.data.LoanScheduleData; -import org.mifosng.platform.loan.domain.InterestMethod; import org.mifosng.platform.loan.domain.LoanCharge; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.loanschedule.domain.DefaultLoanScheduleGeneratorFactory; import org.mifosng.platform.loanschedule.domain.LoanScheduleGenerator; import org.mifosng.platform.loanschedule.domain.LoanScheduleGeneratorFactory; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrencyRepository; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java index ddde33989..8d3237608 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java @@ -19,27 +19,27 @@ import org.mifosng.platform.exceptions.StaffNotFoundException; import org.mifosng.platform.exceptions.StaffRoleException; import org.mifosng.platform.group.domain.Group; import org.mifosng.platform.group.domain.GroupRepository; -import org.mifosng.platform.loan.domain.AmortizationMethod; import org.mifosng.platform.loan.domain.DefaultLoanLifecycleStateMachine; -import org.mifosng.platform.loan.domain.InterestCalculationPeriodMethod; -import org.mifosng.platform.loan.domain.InterestMethod; import org.mifosng.platform.loan.domain.Loan; import org.mifosng.platform.loan.domain.LoanCharge; import org.mifosng.platform.loan.domain.LoanLifecycleStateMachine; -import org.mifosng.platform.loan.domain.LoanProduct; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; -import org.mifosng.platform.loan.domain.LoanProductRepository; import org.mifosng.platform.loan.domain.LoanRepaymentScheduleInstallment; import org.mifosng.platform.loan.domain.LoanStatus; -import org.mifosng.platform.loan.domain.LoanTransactionProcessingStrategy; import org.mifosng.platform.loan.domain.LoanTransactionProcessingStrategyRepository; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.loanschedule.domain.AprCalculator; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.staff.domain.Staff; import org.mifosplatform.infrastructure.staff.domain.StaffRepository; import org.mifosplatform.portfolio.fund.domain.Fund; import org.mifosplatform.portfolio.fund.domain.FundRepository; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository; +import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanProductRelatedDetailAssembler.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanProductRelatedDetailAssembler.java index 6fe603c43..7651b0012 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanProductRelatedDetailAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanProductRelatedDetailAssembler.java @@ -4,15 +4,15 @@ import java.math.BigDecimal; import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand; import org.mifosng.platform.exceptions.LoanProductNotFoundException; -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.LoanProduct; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; -import org.mifosng.platform.loan.domain.LoanProductRepository; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.loanschedule.domain.AprCalculator; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java index 17e77e668..a1985aabb 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java @@ -14,7 +14,6 @@ import org.mifosng.platform.api.data.GroupData; 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.LoanProductData; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.api.data.LoanSchedulePeriodData; import org.mifosng.platform.api.data.LoanTransactionData; @@ -30,14 +29,15 @@ import org.mifosng.platform.loan.domain.LoanRepository; import org.mifosng.platform.loan.domain.LoanTransaction; import org.mifosng.platform.loan.domain.LoanTransactionRepository; import org.mifosng.platform.loan.domain.LoanTransactionType; -import org.mifosng.platform.loanproduct.service.LoanEnumerations; -import org.mifosng.platform.loanproduct.service.LoanProductReadPlatformService; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrencyRepository; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; +import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; +import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java index e63bdb8d4..4eebb515a 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -38,15 +38,11 @@ import org.mifosng.platform.loan.domain.Loan; import org.mifosng.platform.loan.domain.LoanCharge; import org.mifosng.platform.loan.domain.LoanChargeRepository; import org.mifosng.platform.loan.domain.LoanLifecycleStateMachine; -import org.mifosng.platform.loan.domain.LoanProduct; -import org.mifosng.platform.loan.domain.LoanProductRepository; import org.mifosng.platform.loan.domain.LoanRepaymentScheduleInstallment; import org.mifosng.platform.loan.domain.LoanRepository; import org.mifosng.platform.loan.domain.LoanStatus; import org.mifosng.platform.loan.domain.LoanTransaction; -import org.mifosng.platform.loan.domain.LoanTransactionProcessingStrategy; import org.mifosng.platform.loan.domain.LoanTransactionRepository; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; @@ -57,6 +53,10 @@ import org.mifosplatform.infrastructure.user.domain.AppUser; import org.mifosplatform.portfolio.charge.domain.Charge; import org.mifosplatform.portfolio.charge.domain.ChargeRepository; import org.mifosplatform.portfolio.fund.domain.Fund; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository; +import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductWritePlatformService.java deleted file mode 100644 index 188e87294..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductWritePlatformService.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.mifosng.platform.loanproduct.service; - -import org.mifosng.platform.api.commands.LoanProductCommand; -import org.mifosng.platform.api.data.EntityIdentifier; -import org.springframework.security.access.prepost.PreAuthorize; - -public interface LoanProductWritePlatformService { - - @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'ORGANISATION_ADMINISTRATION_SUPER_USER', 'CREATE_LOANPRODUCT')") - EntityIdentifier createLoanProduct(LoanProductCommand command); - - @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'ORGANISATION_ADMINISTRATION_SUPER_USER', 'UPDATE_LOANPRODUCT')") - EntityIdentifier updateLoanProduct(LoanProductCommand command); -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java deleted file mode 100644 index dace449b7..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.mifosng.platform.loanproduct.service; - -import java.math.BigDecimal; -import java.util.HashSet; -import java.util.Set; - -import org.mifosng.platform.api.commands.LoanProductCommand; -import org.mifosng.platform.api.data.EntityIdentifier; -import org.mifosng.platform.exceptions.ChargeIsNotActiveException; -import org.mifosng.platform.exceptions.ChargeNotFoundException; -import org.mifosng.platform.exceptions.FundNotFoundException; -import org.mifosng.platform.exceptions.InvalidCurrencyException; -import org.mifosng.platform.exceptions.LoanProductNotFoundException; -import org.mifosng.platform.exceptions.LoanTransactionProcessingStrategyNotFoundException; -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.LoanProduct; -import org.mifosng.platform.loan.domain.LoanProductRepository; -import org.mifosng.platform.loan.domain.LoanTransactionProcessingStrategy; -import org.mifosng.platform.loan.domain.LoanTransactionProcessingStrategyRepository; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; -import org.mifosng.platform.loanschedule.domain.AprCalculator; -import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; -import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; -import org.mifosplatform.portfolio.charge.domain.Charge; -import org.mifosplatform.portfolio.charge.domain.ChargeRepository; -import org.mifosplatform.portfolio.fund.domain.Fund; -import org.mifosplatform.portfolio.fund.domain.FundRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.ObjectUtils; - -@Service -public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanProductWritePlatformService { - - private final PlatformSecurityContext context; - private final LoanProductRepository loanProductRepository; - private final AprCalculator aprCalculator; - private final FundRepository fundRepository; - private final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository; - private final ChargeRepository chargeRepository; - - @Autowired - public LoanProductWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final LoanProductRepository loanProductRepository, - final AprCalculator aprCalculator, final FundRepository fundRepository, final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository, - final ChargeRepository chargeRepository) { - this.context = context; - this.loanProductRepository = loanProductRepository; - this.aprCalculator = aprCalculator; - this.fundRepository = fundRepository; - this.loanTransactionProcessingStrategyRepository = loanTransactionProcessingStrategyRepository; - this.chargeRepository = chargeRepository; - } - - @Transactional - @Override - public EntityIdentifier createLoanProduct(final LoanProductCommand command) { - - this.context.authenticatedUser(); - - LoanProductCommandValidator validator = new LoanProductCommandValidator(command); - validator.validateForCreate(); - - // assemble LoanProduct from data - InterestMethod interestMethod = InterestMethod.fromInt(command.getInterestType()); - InterestCalculationPeriodMethod interestCalculationPeriodMethod = InterestCalculationPeriodMethod.fromInt(command.getInterestCalculationPeriodType()); - - AmortizationMethod amortizationMethod = AmortizationMethod.fromInt(command.getAmortizationType()); - - PeriodFrequencyType repaymentFrequencyType = PeriodFrequencyType - .fromInt(command.getRepaymentFrequencyType()); - - PeriodFrequencyType interestFrequencyType = PeriodFrequencyType - .fromInt(command.getInterestRateFrequencyType()); - - MonetaryCurrency currency = new MonetaryCurrency(command.getCurrencyCode(), command.getDigitsAfterDecimal()); - - BigDecimal annualInterestRate = this.aprCalculator.calculateFrom(interestFrequencyType, command.getInterestRatePerPeriod()); - - // associating fund with loan product at creation is optional for now. - Fund fund = findFundByIdIfProvided(command.getFundId()); - LoanTransactionProcessingStrategy loanTransactionProcessingStrategy = findStrategyByIdIfProvided(command.getTransactionProcessingStrategyId()); - - final Set charges = this.assembleSetOfCharges(command, null); - - LoanProduct loanproduct = new LoanProduct(fund, loanTransactionProcessingStrategy, - command.getName(), command.getDescription(), - currency, command.getPrincipal(), - command.getInterestRatePerPeriod(), interestFrequencyType, annualInterestRate, interestMethod, interestCalculationPeriodMethod, - command.getRepaymentEvery(), repaymentFrequencyType, command.getNumberOfRepayments(), - amortizationMethod, command.getInArrearsTolerance(), charges); - - this.loanProductRepository.save(loanproduct); - - return new EntityIdentifier(loanproduct.getId()); - } - - private LoanTransactionProcessingStrategy findStrategyByIdIfProvided(final Long transactionProcessingStrategyId) { - LoanTransactionProcessingStrategy strategy = null; - if (transactionProcessingStrategyId != null) { - strategy = this.loanTransactionProcessingStrategyRepository.findOne(transactionProcessingStrategyId); - if (strategy == null) { - throw new LoanTransactionProcessingStrategyNotFoundException(transactionProcessingStrategyId); - } - } - return strategy; - } - - private Fund findFundByIdIfProvided(final Long fundId) { - Fund fund = null; - if (fundId != null) { - fund = this.fundRepository.findOne(fundId); - if (fund == null) { - throw new FundNotFoundException(fundId); - } - } - return fund; - } - - @Transactional - @Override - public EntityIdentifier updateLoanProduct(final LoanProductCommand command) { - - this.context.authenticatedUser(); - - LoanProductCommandValidator validator = new LoanProductCommandValidator(command); - validator.validateForUpdate(); - - LoanProduct product = this.loanProductRepository.findOne(command.getId()); - if (product == null) { - throw new LoanProductNotFoundException(command.getId()); - } - - // associating fund with loan product at creation is optional for now. - Fund fund = null; - if (command.isFundChanged()) { - fund = findFundByIdIfProvided(command.getFundId()); - } - - LoanTransactionProcessingStrategy loanTransactionProcessingStrategy = null; - if (command.isTransactionProcessingStrategyChanged()) { - loanTransactionProcessingStrategy = findStrategyByIdIfProvided(command.getTransactionProcessingStrategyId()); - } - - final Set charges = this.assembleSetOfCharges(command, product.getCurrency().getCode()); - - product.update(command, fund, loanTransactionProcessingStrategy, charges); - - this.loanProductRepository.save(product); - - return new EntityIdentifier(Long.valueOf(product.getId())); - } - - private Set assembleSetOfCharges(final LoanProductCommand command, final String currencyCode) { - - Set charges = new HashSet(); - String[] chargesArray = command.getCharges(); - - String loanProductCurrencyCode = command.getCurrencyCode(); - if (loanProductCurrencyCode == null){ - loanProductCurrencyCode = currencyCode; - } - - if (command.isChargesChanged() && !ObjectUtils.isEmpty(chargesArray)) { - for (String chargeId : chargesArray) { - Long id = Long.valueOf(chargeId); - Charge charge = this.chargeRepository.findOne(id); - if (charge == null || charge.isDeleted()) { - throw new ChargeNotFoundException(id); - } - if (!charge.isActive()){ - throw new ChargeIsNotActiveException(id, charge.getName()); - } - if (!loanProductCurrencyCode.equals(charge.getCurrencyCode())){ - String errorMessage = "Charge and Loan Product must have the same currency."; - throw new InvalidCurrencyException("charge", "attach.to.loan.product", errorMessage); - } - charges.add(charge); - } - } - - return charges; - } - -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGenerator.java index 71ccce491..67d14227e 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGenerator.java @@ -7,8 +7,8 @@ import java.util.Set; import org.joda.time.LocalDate; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.loan.domain.LoanCharge; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; public interface AmortizationLoanScheduleGenerator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGeneratorFactory.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGeneratorFactory.java index c47e2a977..6a676ecad 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGeneratorFactory.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AmortizationLoanScheduleGeneratorFactory.java @@ -1,6 +1,6 @@ package org.mifosng.platform.loanschedule.domain; -import org.mifosng.platform.loan.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; public class AmortizationLoanScheduleGeneratorFactory { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AprCalculator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AprCalculator.java index da0497cdc..a85e5a6ab 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AprCalculator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/AprCalculator.java @@ -2,7 +2,7 @@ package org.mifosng.platform.loanschedule.domain; import java.math.BigDecimal; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.stereotype.Component; @Component diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGenerator.java index 190b927b9..ecb91876c 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGenerator.java @@ -6,11 +6,11 @@ import java.util.Set; import org.joda.time.LocalDate; import org.mifosng.platform.api.data.LoanScheduleData; -import org.mifosng.platform.loan.domain.AmortizationMethod; import org.mifosng.platform.loan.domain.LoanCharge; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; /** *

diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultLoanScheduleGeneratorFactory.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultLoanScheduleGeneratorFactory.java index 55b54c6c8..12496a009 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultLoanScheduleGeneratorFactory.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultLoanScheduleGeneratorFactory.java @@ -1,6 +1,6 @@ package org.mifosng.platform.loanschedule.domain; -import org.mifosng.platform.loan.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; public class DefaultLoanScheduleGeneratorFactory implements LoanScheduleGeneratorFactory { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultPaymentPeriodsInOneYearCalculator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultPaymentPeriodsInOneYearCalculator.java index 42d1a6d63..8c4c99b49 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultPaymentPeriodsInOneYearCalculator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultPaymentPeriodsInOneYearCalculator.java @@ -4,7 +4,7 @@ import java.util.List; import org.joda.time.Days; import org.joda.time.LocalDate; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public class DefaultPaymentPeriodsInOneYearCalculator implements PaymentPeriodsInOneYearCalculator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultScheduledDateGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultScheduledDateGenerator.java index cdc7f1439..e984c0e3d 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultScheduledDateGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/DefaultScheduledDateGenerator.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; import org.joda.time.LocalDate; -import org.mifosng.platform.loan.domain.LoanProductMinimumRepaymentScheduleRelatedDetail; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductMinimumRepaymentScheduleRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; public class DefaultScheduledDateGenerator implements ScheduledDateGenerator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java index 7cf0f9144..8c3b5c008 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualInstallmentsAmortizationLoanScheduleGenerator.java @@ -11,11 +11,11 @@ import org.joda.time.LocalDate; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.api.data.LoanSchedulePeriodData; import org.mifosng.platform.loan.domain.LoanCharge; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; /** * Irregular payments for declining balance not supported diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java index 61f790b39..b5688b2ea 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/EqualPrincipalAmortizationLoanScheduleGenerator.java @@ -11,11 +11,11 @@ import org.joda.time.LocalDate; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.api.data.LoanSchedulePeriodData; import org.mifosng.platform.loan.domain.LoanCharge; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; public class EqualPrincipalAmortizationLoanScheduleGenerator implements AmortizationLoanScheduleGenerator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGenerator.java index 94d9fb87b..e394455b7 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGenerator.java @@ -13,12 +13,12 @@ import org.joda.time.LocalDate; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.api.data.LoanSchedulePeriodData; import org.mifosng.platform.loan.domain.LoanCharge; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGenerator.java index 5dbb0cd52..28f42bdd3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGenerator.java @@ -5,9 +5,9 @@ import java.util.Set; import org.joda.time.LocalDate; import org.mifosng.platform.api.data.LoanScheduleData; import org.mifosng.platform.loan.domain.LoanCharge; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.ApplicationCurrency; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public interface LoanScheduleGenerator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGeneratorFactory.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGeneratorFactory.java index 230206169..87085b9e3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGeneratorFactory.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/LoanScheduleGeneratorFactory.java @@ -1,6 +1,6 @@ package org.mifosng.platform.loanschedule.domain; -import org.mifosng.platform.loan.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; public interface LoanScheduleGeneratorFactory { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java index 6f884aab8..09b0d77c6 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java @@ -3,7 +3,7 @@ package org.mifosng.platform.loanschedule.domain; import java.util.List; import org.joda.time.LocalDate; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public interface PaymentPeriodsInOneYearCalculator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PeriodicInterestRateCalculator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PeriodicInterestRateCalculator.java index 225ebe6de..5496dc4af 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PeriodicInterestRateCalculator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PeriodicInterestRateCalculator.java @@ -4,9 +4,9 @@ import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public class PeriodicInterestRateCalculator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PmtCalculator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PmtCalculator.java index fd708aa54..2165daac5 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PmtCalculator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/PmtCalculator.java @@ -2,9 +2,9 @@ package org.mifosng.platform.loanschedule.domain; import java.math.BigDecimal; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; public class PmtCalculator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/ScheduledDateGenerator.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/ScheduledDateGenerator.java index ae440ef99..aa0979d47 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/ScheduledDateGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanschedule/domain/ScheduledDateGenerator.java @@ -3,8 +3,8 @@ package org.mifosng.platform.loanschedule.domain; import java.util.List; import org.joda.time.LocalDate; -import org.mifosng.platform.loan.domain.LoanProductMinimumRepaymentScheduleRelatedDetail; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductMinimumRepaymentScheduleRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; public interface ScheduledDateGenerator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/DepositAccount.java b/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/DepositAccount.java index 692652954..437c4c8ef 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/DepositAccount.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/DepositAccount.java @@ -29,11 +29,11 @@ import org.mifosng.platform.api.commands.DepositStateTransitionApprovalCommand; import org.mifosng.platform.client.domain.Client; import org.mifosng.platform.exceptions.InvalidDepositStateTransitionException; import org.mifosng.platform.infrastructure.AbstractAuditableCustom; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.savingproduct.domain.DepositProduct; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; @Entity @Table(name = "m_deposit_account", uniqueConstraints = @UniqueConstraint(name="deposit_acc_external_id", columnNames = { "external_id" })) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/FixedTermDepositInterestCalculator.java b/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/FixedTermDepositInterestCalculator.java index 8c9b675fd..07215d5eb 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/FixedTermDepositInterestCalculator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/FixedTermDepositInterestCalculator.java @@ -4,8 +4,8 @@ import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.stereotype.Service; @Service diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/SavingAccount.java b/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/SavingAccount.java index bd980e05b..aae798a53 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/SavingAccount.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/saving/domain/SavingAccount.java @@ -16,7 +16,6 @@ import javax.persistence.UniqueConstraint; import org.joda.time.LocalDate; import org.mifosng.platform.client.domain.Client; import org.mifosng.platform.infrastructure.AbstractAuditableCustom; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.savingproduct.domain.SavingFrequencyType; import org.mifosng.platform.savingproduct.domain.SavingInterestCalculationMethod; import org.mifosng.platform.savingproduct.domain.SavingProduct; @@ -26,6 +25,7 @@ import org.mifosng.platform.savingproduct.domain.TenureTypeEnum; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; @Entity @Table(name = "m_saving_account", uniqueConstraints = @UniqueConstraint(name="saving_acc_external_id", columnNames = { "external_id" })) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/DepositAccountAssembler.java b/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/DepositAccountAssembler.java index e455c5d44..6d7a044a8 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/DepositAccountAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/DepositAccountAssembler.java @@ -11,7 +11,6 @@ import org.mifosng.platform.client.domain.ClientRepository; import org.mifosng.platform.exceptions.ClientNotFoundException; import org.mifosng.platform.exceptions.DepositAccounDataValidationtException; import org.mifosng.platform.exceptions.DepositProductNotFoundException; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.saving.domain.DepositAccount; import org.mifosng.platform.saving.domain.DepositAccountStatus; import org.mifosng.platform.saving.domain.DepositLifecycleStateMachine; @@ -20,6 +19,7 @@ import org.mifosng.platform.saving.domain.FixedTermDepositInterestCalculator; import org.mifosng.platform.savingproduct.domain.DepositProduct; import org.mifosng.platform.savingproduct.domain.DepositProductRepository; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/SavingAccountAssembler.java b/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/SavingAccountAssembler.java index 13d3772c8..166860ad1 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/SavingAccountAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/saving/service/SavingAccountAssembler.java @@ -10,7 +10,6 @@ import org.mifosng.platform.client.domain.Client; import org.mifosng.platform.client.domain.ClientRepository; import org.mifosng.platform.exceptions.ClientNotFoundException; import org.mifosng.platform.exceptions.ProductNotFoundException; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.saving.domain.DepositAccountStatus; import org.mifosng.platform.saving.domain.DepositLifecycleStateMachine; import org.mifosng.platform.saving.domain.DepositLifecycleStateMachineImpl; @@ -25,6 +24,7 @@ import org.mifosng.platform.savingproduct.domain.SavingsInterestType; import org.mifosng.platform.savingproduct.domain.TenureTypeEnum; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/DepositProduct.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/DepositProduct.java index d8e33ea4e..1111343ef 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/DepositProduct.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/DepositProduct.java @@ -12,9 +12,9 @@ import org.apache.commons.lang.StringUtils; import org.mifosng.platform.api.commands.DepositProductCommand; import org.mifosng.platform.exceptions.ValueOutsideRangeException; import org.mifosng.platform.infrastructure.AbstractAuditableCustom; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; @Entity @Table(name = "m_product_deposit", uniqueConstraints={ diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProduct.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProduct.java index 756c14ead..8f952789c 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProduct.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProduct.java @@ -10,9 +10,9 @@ import javax.persistence.Table; import org.apache.commons.lang.StringUtils; import org.mifosng.platform.api.commands.SavingProductCommand; import org.mifosng.platform.infrastructure.AbstractAuditableCustom; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; @Entity @Table(name = "m_product_savings") diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProductRelatedDetail.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProductRelatedDetail.java index 571788d5f..d011454ec 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProductRelatedDetail.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/domain/SavingProductRelatedDetail.java @@ -7,8 +7,8 @@ import javax.persistence.Embeddable; import javax.persistence.Embedded; import org.mifosng.platform.api.commands.SavingProductCommand; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; @Embeddable public class SavingProductRelatedDetail { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductReadPlatformServiceImpl.java index f0a35bd48..1aebd0f6d 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductReadPlatformServiceImpl.java @@ -12,9 +12,9 @@ import org.mifosng.platform.api.data.DepositProductLookup; import org.mifosng.platform.api.data.EnumOptionData; import org.mifosng.platform.infrastructure.JdbcSupport; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductWritePlatformServiceJpaRepositoryImpl.java index 73f576c5e..1044ad1b4 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/DepositProductWritePlatformServiceJpaRepositoryImpl.java @@ -4,11 +4,11 @@ import org.mifosng.platform.api.commands.DepositProductCommand; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.exceptions.DepositProductNotFoundException; import org.mifosng.platform.exceptions.PlatformDataIntegrityException; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.savingproduct.domain.DepositProduct; import org.mifosng.platform.savingproduct.domain.DepositProductRepository; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductReadPlatformServiceImpl.java index a9737ff13..07674bef3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductReadPlatformServiceImpl.java @@ -13,11 +13,11 @@ import org.mifosng.platform.api.data.SavingProductLookup; import org.mifosng.platform.exceptions.LoanProductNotFoundException; import org.mifosng.platform.infrastructure.JdbcSupport; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.savingproduct.domain.SavingProductType; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.configuration.service.CurrencyReadPlatformService; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductWritePlatformServiceJpaRepositoryImpl.java index c25ad7ac6..348434ce2 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingProductWritePlatformServiceJpaRepositoryImpl.java @@ -4,7 +4,6 @@ import org.mifosng.platform.api.commands.SavingProductCommand; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.exceptions.ProductNotFoundException; import org.mifosng.platform.exceptions.SavingProductNotFoundException; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosng.platform.savingproduct.domain.SavingFrequencyType; import org.mifosng.platform.savingproduct.domain.SavingInterestCalculationMethod; import org.mifosng.platform.savingproduct.domain.SavingProduct; @@ -14,6 +13,7 @@ import org.mifosng.platform.savingproduct.domain.SavingsInterestType; import org.mifosng.platform.savingproduct.domain.TenureTypeEnum; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingsDepositEnumerations.java b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingsDepositEnumerations.java index 3f58c749a..d6ca7857d 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingsDepositEnumerations.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/savingproduct/service/SavingsDepositEnumerations.java @@ -1,7 +1,7 @@ package org.mifosng.platform.savingproduct.service; import org.mifosng.platform.api.data.EnumOptionData; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public class SavingsDepositEnumerations { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandSource.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandSource.java index 799f4e924..fcc8b5e22 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandSource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandSource.java @@ -171,8 +171,11 @@ public class CommandSource extends AbstractPersistable { return this.resource.equalsIgnoreCase("CHARGES"); } + public boolean isLoanProductResource() { + return this.resource.equalsIgnoreCase("LOANPRODUCTS"); + } + public boolean isClientResource() { return this.resource.equalsIgnoreCase("CLIENTS"); } - } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/ChargeDefinitionCommandHandler.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/ChargeDefinitionCommandHandler.java index 1850bd90f..a9164ff3a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/ChargeDefinitionCommandHandler.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/ChargeDefinitionCommandHandler.java @@ -22,11 +22,10 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler { private final ChangeDetectionService changeDetectionService; private final PortfolioCommandDeserializerService commandDeserializerService; private final ChargeWritePlatformService writePlatformService; - + @Autowired public ChargeDefinitionCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService, - final PortfolioCommandDeserializerService commandDeserializerService, - final ChargeWritePlatformService writePlatformService) { + final PortfolioCommandDeserializerService commandDeserializerService, final ChargeWritePlatformService writePlatformService) { this.context = context; this.changeDetectionService = changeDetectionService; this.commandDeserializerService = commandDeserializerService; @@ -42,8 +41,9 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler { CommandSource commandSourceResult = commandSource.copy(); final Long resourceId = commandSource.resourceId(); - final ChargeDefinitionCommand command = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, commandSourceResult.json(), true); - + final ChargeDefinitionCommand command = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, + commandSourceResult.json(), false); + if (commandSource.isCreate()) { try { Long newResourceId = this.writePlatformService.createCharge(command); @@ -54,13 +54,15 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler { } } else if (commandSource.isUpdate()) { try { - final String jsonOfChangesOnly = this.changeDetectionService.detectChangesOnUpdate(commandSource.resourceName(), commandSource.resourceId(), commandSource.json()); + final String jsonOfChangesOnly = this.changeDetectionService.detectChangesOnUpdate(commandSource.resourceName(), + commandSource.resourceId(), commandSource.json()); commandSourceResult.updateJsonTo(jsonOfChangesOnly); - final ChargeDefinitionCommand changesOnly = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, jsonOfChangesOnly, false); + final ChargeDefinitionCommand changesOnly = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, + jsonOfChangesOnly, false); this.writePlatformService.updateCharge(changesOnly); - + commandSourceResult.markAsChecked(maker, asToday); } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { // swallow this rollback transaction by design @@ -81,32 +83,34 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler { public CommandSource handleCommandForCheckerApproval(final CommandSource commandSourceResult) { final AppUser checker = context.authenticatedUser(); - + Long resourceId = commandSourceResult.resourceId(); - final ChargeDefinitionCommand command = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, commandSourceResult.json(), true); - - if (commandSourceResult.isUserResource()) { - if (commandSourceResult.isCreate()) { - final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", "CREATE_CHARGE_MAKER"); - context.authenticatedUser().validateHasPermissionTo("CREATE_CHARGE_MAKER", allowedPermissions); - - resourceId = this.writePlatformService.createCharge(command); - commandSourceResult.updateResourceId(resourceId); - commandSourceResult.markAsChecked(checker, new LocalDate()); - } else if (commandSourceResult.isUpdate()) { - final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", "UPDATE_CHARGE_MAKER"); - context.authenticatedUser().validateHasPermissionTo("UPDATE_CHARGE_MAKER", allowedPermissions); - - this.writePlatformService.updateCharge(command); - - commandSourceResult.markAsChecked(checker, new LocalDate()); - } else if (commandSourceResult.isDelete()) { - final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", "DELETE_CHARGE_MAKER"); - context.authenticatedUser().validateHasPermissionTo("DELETE_CHARGE_MAKER", allowedPermissions); - - this.writePlatformService.deleteCharge(command); - commandSourceResult.markAsChecked(checker, new LocalDate()); - } + final ChargeDefinitionCommand command = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, + commandSourceResult.json(), true); + + if (commandSourceResult.isCreate()) { + final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", + "CREATE_CHARGE_MAKER"); + context.authenticatedUser().validateHasPermissionTo("CREATE_CHARGE_MAKER", allowedPermissions); + + resourceId = this.writePlatformService.createCharge(command); + commandSourceResult.updateResourceId(resourceId); + commandSourceResult.markAsChecked(checker, new LocalDate()); + } else if (commandSourceResult.isUpdate()) { + final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", + "UPDATE_CHARGE_MAKER"); + context.authenticatedUser().validateHasPermissionTo("UPDATE_CHARGE_MAKER", allowedPermissions); + + this.writePlatformService.updateCharge(command); + + commandSourceResult.markAsChecked(checker, new LocalDate()); + } else if (commandSourceResult.isDelete()) { + final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", + "DELETE_CHARGE_MAKER"); + context.authenticatedUser().validateHasPermissionTo("DELETE_CHARGE_MAKER", allowedPermissions); + + this.writePlatformService.deleteCharge(command); + commandSourceResult.markAsChecked(checker, new LocalDate()); } return commandSourceResult; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/CommandSourceHandlerDelegator.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/CommandSourceHandlerDelegator.java index 95c6e85d3..4c5b9aad1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/CommandSourceHandlerDelegator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/CommandSourceHandlerDelegator.java @@ -24,6 +24,7 @@ public class CommandSourceHandlerDelegator { private final OfficeTransactionCommandHandler officeTransactionCommandHandler; private final CurrencyCommandHandler currencyCommandHandler; private final ChargeDefinitionCommandHandler chargeDefinitionCommandHandler; + private final LoanProductCommandHandler loanProductCommandHandler; @Autowired public CommandSourceHandlerDelegator(final PlatformSecurityContext context, @@ -37,7 +38,8 @@ public class CommandSourceHandlerDelegator { final OfficeCommandHandler officeCommandHandler, final OfficeTransactionCommandHandler officeTransactionCommandHandler, final CurrencyCommandHandler currencyCommandHandler, - final ChargeDefinitionCommandHandler chargeDefinitionCommandHandler) { + final ChargeDefinitionCommandHandler chargeDefinitionCommandHandler, + final LoanProductCommandHandler loanProductCommandHandler) { this.context = context; this.clientCommandHandler = clientCommandHandler; this.roleCommandHandler = roleCommandHandler; @@ -50,6 +52,7 @@ public class CommandSourceHandlerDelegator { this.officeTransactionCommandHandler = officeTransactionCommandHandler; this.currencyCommandHandler = currencyCommandHandler; this.chargeDefinitionCommandHandler = chargeDefinitionCommandHandler; + this.loanProductCommandHandler = loanProductCommandHandler; } public CommandSource handleCommandWithSupportForRollback(final CommandSource commandSource) { @@ -78,6 +81,8 @@ public class CommandSourceHandlerDelegator { commandSourceResult = currencyCommandHandler.handleCommandWithSupportForRollback(commandSource); } else if (commandSource.isChargeDefinitionResource()) { commandSourceResult = chargeDefinitionCommandHandler.handleCommandWithSupportForRollback(commandSource); + } else if (commandSource.isLoanProductResource()) { + commandSourceResult = loanProductCommandHandler.handleCommandWithSupportForRollback(commandSource); } else { throw new UnsupportedCommandException(commandSource.commandName()); } @@ -110,6 +115,8 @@ public class CommandSourceHandlerDelegator { commandSourceResult = currencyCommandHandler.handleCommandForCheckerApproval(existingCommandSource); } else if (existingCommandSource.isChargeDefinitionResource()) { commandSourceResult = chargeDefinitionCommandHandler.handleCommandForCheckerApproval(existingCommandSource); + } else if (existingCommandSource.isLoanProductResource()) { + commandSourceResult = loanProductCommandHandler.handleCommandForCheckerApproval(existingCommandSource); } else { throw new UnsupportedCommandException(existingCommandSource.commandName()); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/LoanProductCommandHandler.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/LoanProductCommandHandler.java new file mode 100644 index 000000000..122beea08 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/LoanProductCommandHandler.java @@ -0,0 +1,106 @@ +package org.mifosplatform.commands.handler; + +import java.util.Arrays; +import java.util.List; + +import org.joda.time.LocalDate; +import org.mifosng.platform.api.data.EntityIdentifier; +import org.mifosng.platform.api.infrastructure.PortfolioCommandDeserializerService; +import org.mifosng.platform.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; +import org.mifosng.platform.infrastructure.errorhandling.UnsupportedCommandException; +import org.mifosplatform.commands.domain.CommandSource; +import org.mifosplatform.commands.service.ChangeDetectionService; +import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; +import org.mifosplatform.portfolio.loanproduct.service.LoanProductWritePlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class LoanProductCommandHandler implements CommandSourceHandler { + + private final PlatformSecurityContext context; + private final ChangeDetectionService changeDetectionService; + private final PortfolioCommandDeserializerService commandDeserializerService; + private final LoanProductWritePlatformService writePlatformService; + + @Autowired + public LoanProductCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService, + final PortfolioCommandDeserializerService commandDeserializerService, final LoanProductWritePlatformService writePlatformService) { + this.context = context; + this.changeDetectionService = changeDetectionService; + this.commandDeserializerService = commandDeserializerService; + this.writePlatformService = writePlatformService; + } + + @Override + public CommandSource handleCommandWithSupportForRollback(final CommandSource commandSource) { + + final AppUser maker = context.authenticatedUser(); + final LocalDate asToday = new LocalDate(); + + final Long resourceId = commandSource.resourceId(); + final LoanProductCommand command = this.commandDeserializerService.deserializeLoanProductCommand(resourceId, commandSource.json(), + false); + + CommandSource commandSourceResult = commandSource.copy(); + + if (commandSource.isCreate()) { + try { + EntityIdentifier result = this.writePlatformService.createLoanProduct(command); + commandSourceResult.markAsChecked(maker, asToday); + commandSourceResult.updateResourceId(result.getEntityId()); + } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { + // swallow this rollback transaction by design + } + } else if (commandSource.isUpdate()) { + try { + final String jsonOfChangesOnly = this.changeDetectionService.detectChangesOnUpdate(commandSource.resourceName(), + commandSource.resourceId(), commandSource.json()); + commandSourceResult.updateJsonTo(jsonOfChangesOnly); + + final LoanProductCommand changesOnly = this.commandDeserializerService.deserializeLoanProductCommand(resourceId, + jsonOfChangesOnly, false); + + this.writePlatformService.updateLoanProduct(changesOnly); + + commandSourceResult.markAsChecked(maker, asToday); + } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { + // swallow this rollback transaction by design + } + } else if (commandSource.isDelete()) { throw new UnsupportedCommandException(commandSource.commandName()); } + + return commandSourceResult; + } + + @Override + public CommandSource handleCommandForCheckerApproval(final CommandSource commandSourceResult) { + + final AppUser checker = context.authenticatedUser(); + + Long resourceId = commandSourceResult.resourceId(); + final LoanProductCommand command = this.commandDeserializerService.deserializeLoanProductCommand(resourceId, + commandSourceResult.json(), true); + + if (commandSourceResult.isCreate()) { + final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", + "CREATE_LOANPRODUCT_MAKER"); + context.authenticatedUser().validateHasPermissionTo("CREATE_LOANPRODUCT_MAKER", allowedPermissions); + + EntityIdentifier result = this.writePlatformService.createLoanProduct(command); + commandSourceResult.updateResourceId(result.getEntityId()); + commandSourceResult.markAsChecked(checker, new LocalDate()); + } else if (commandSourceResult.isUpdate()) { + final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", + "UPDATE_LOANPRODUCT_MAKER"); + context.authenticatedUser().validateHasPermissionTo("UPDATE_LOANPRODUCT_MAKER", allowedPermissions); + + this.writePlatformService.updateLoanProduct(command); + + commandSourceResult.markAsChecked(checker, new LocalDate()); + } else if (commandSourceResult.isDelete()) { throw new UnsupportedCommandException(commandSourceResult.commandName()); } + + return commandSourceResult; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/MonetaryCurrency.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/MonetaryCurrency.java index c6dd50465..eafe764df 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/MonetaryCurrency.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/MonetaryCurrency.java @@ -8,31 +8,31 @@ import javax.persistence.Embeddable; @Embeddable public class MonetaryCurrency implements Serializable { - @Column(name = "currency_code", length = 3, nullable=false) - private final String code; + @Column(name = "currency_code", length = 3, nullable = false) + private final String code; - @Column(name = "currency_digits", nullable=false) - private final int digitsAfterDecimal; + @Column(name = "currency_digits", nullable = false) + private final int digitsAfterDecimal; - protected MonetaryCurrency() { - this.code = null; - this.digitsAfterDecimal = 0; - } + protected MonetaryCurrency() { + this.code = null; + this.digitsAfterDecimal = 0; + } - public MonetaryCurrency(final String code, final int digitsAfterDecimal) { - this.code = code; - this.digitsAfterDecimal = digitsAfterDecimal; - } - - public MonetaryCurrency copy() { - return new MonetaryCurrency(this.code, this.digitsAfterDecimal); - } + public MonetaryCurrency(final String code, final int digitsAfterDecimal) { + this.code = code; + this.digitsAfterDecimal = digitsAfterDecimal; + } - public String getCode() { - return code; - } + public MonetaryCurrency copy() { + return new MonetaryCurrency(this.code, this.digitsAfterDecimal); + } - public int getDigitsAfterDecimal() { - return digitsAfterDecimal; - } + public String getCode() { + return code; + } + + public int getDigitsAfterDecimal() { + return digitsAfterDecimal; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformService.java index 797def261..e62f49bef 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformService.java @@ -5,6 +5,7 @@ import java.util.Collection; import org.mifosng.platform.api.data.LoanChargeData; import org.mifosplatform.portfolio.charge.data.ChargeData; +// FIXME - KW - break out methods that belong to product charges and loan charges public interface ChargeReadPlatformService { Collection retrieveAllCharges(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/api/LoanProductsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/api/LoanProductsApiResource.java new file mode 100644 index 000000000..bc55233d5 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/api/LoanProductsApiResource.java @@ -0,0 +1,195 @@ +package org.mifosplatform.portfolio.loanproduct.api; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +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.UriInfo; + +import org.mifosng.platform.api.data.EntityIdentifier; +import org.mifosng.platform.api.data.EnumOptionData; +import org.mifosng.platform.api.infrastructure.PortfolioApiDataConversionService; +import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService; +import org.mifosng.platform.api.infrastructure.PortfolioCommandSerializerService; +import org.mifosng.platform.infrastructure.api.ApiParameterHelper; +import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService; +import org.mifosplatform.infrastructure.configuration.data.CurrencyData; +import org.mifosplatform.infrastructure.configuration.service.CurrencyReadPlatformService; +import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.charge.data.ChargeData; +import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService; +import org.mifosplatform.portfolio.fund.data.FundData; +import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; +import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; +import org.mifosplatform.portfolio.loanproduct.service.LoanDropdownReadPlatformService; +import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Path("/loanproducts") +@Component +@Scope("singleton") +public class LoanProductsApiResource { + + private final String resourceNameForPermissions = "LOANPRODUCT"; + + private final PlatformSecurityContext context; + private final LoanProductReadPlatformService loanProductReadPlatformService; + private final ChargeReadPlatformService chargeReadPlatformService; + private final CurrencyReadPlatformService currencyReadPlatformService; + private final FundReadPlatformService fundReadPlatformService; + private final LoanDropdownReadPlatformService dropdownReadPlatformService; + private final PortfolioApiJsonSerializerService apiJsonSerializerService; + private final PortfolioApiDataConversionService apiDataConversionService; + private final PortfolioCommandSerializerService commandSerializerService; + private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; + + @Autowired + public LoanProductsApiResource(final PlatformSecurityContext context, final LoanProductReadPlatformService readPlatformService, + final ChargeReadPlatformService chargeReadPlatformService, final CurrencyReadPlatformService currencyReadPlatformService, + final FundReadPlatformService fundReadPlatformService, final LoanDropdownReadPlatformService dropdownReadPlatformService, + final PortfolioApiJsonSerializerService apiJsonSerializerService, + final PortfolioApiDataConversionService apiDataConversionService, + final PortfolioCommandSerializerService commandSerializerService, + final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { + this.context = context; + this.loanProductReadPlatformService = readPlatformService; + this.chargeReadPlatformService = chargeReadPlatformService; + this.currencyReadPlatformService = currencyReadPlatformService; + this.fundReadPlatformService = fundReadPlatformService; + this.dropdownReadPlatformService = dropdownReadPlatformService; + this.apiJsonSerializerService = apiJsonSerializerService; + this.apiDataConversionService = apiDataConversionService; + this.commandSerializerService = commandSerializerService; + this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; + } + + @POST + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String createLoanProduct(final String apiRequestBodyAsJson) { + + final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", + "CREATE_LOANPRODUCT"); + context.authenticatedUser().validateHasPermissionTo("CREATE_LOANPRODUCT", allowedPermissions); + + final LoanProductCommand command = this.apiDataConversionService.convertApiRequestJsonToLoanProductCommand(null, + apiRequestBodyAsJson); + final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command); + + final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", "loanproducts", null, + commandSerializedAsJson); + + return this.apiJsonSerializerService.serializeEntityIdentifier(result); + } + + @GET + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveAllLoanProducts(@Context final UriInfo uriInfo) { + + context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); + + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + + final Collection products = this.loanProductReadPlatformService.retrieveAllLoanProducts(); + + return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, products); + } + + @GET + @Path("template") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveNewLoanProductDetails(@Context final UriInfo uriInfo) { + + context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); + + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + + LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveNewLoanProductDetails(); + loanProduct = handleTemplate(loanProduct); + + return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); + } + + @GET + @Path("{productId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveLoanProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) { + + context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); + + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + final boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); + + LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); + if (template) { + loanProduct = handleTemplate(loanProduct); + } + + return this.apiJsonSerializerService.serializeLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); + } + + @PUT + @Path("{productId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String updateLoanProduct(@PathParam("productId") final Long productId, final String apiRequestBodyAsJson) { + + final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", + "UPDATE_LOANPRODUCT"); + context.authenticatedUser().validateHasPermissionTo("UPDATE_LOANPRODUCT", allowedPermissions); + + final LoanProductCommand command = this.apiDataConversionService.convertApiRequestJsonToLoanProductCommand(productId, + apiRequestBodyAsJson); + final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command); + + final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "loanproducts", null, + commandSerializedAsJson); + + return this.apiJsonSerializerService.serializeEntityIdentifier(result); + } + + private LoanProductData handleTemplate(final LoanProductData productData) { + + final boolean feeChargesOnly = true; + Collection chargeOptions = this.chargeReadPlatformService.retrieveLoanApplicableCharges(feeChargesOnly); + chargeOptions.removeAll(productData.charges()); + + final List currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies(); + final List amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions(); + final List interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions(); + final List interestCalculationPeriodTypeOptions = dropdownReadPlatformService + .retrieveLoanInterestRateCalculatedInPeriodOptions(); + final List loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); + final List repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); + final List interestRateFrequencyTypeOptions = dropdownReadPlatformService + .retrieveInterestRateFrequencyTypeOptions(); + + final Collection fundOptions = this.fundReadPlatformService.retrieveAllFunds(); + final 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/mifosplatform/portfolio/loanproduct/command/LoanProductCommand.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/command/LoanProductCommand.java new file mode 100644 index 000000000..1392f37f6 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/command/LoanProductCommand.java @@ -0,0 +1,216 @@ +package org.mifosplatform.portfolio.loanproduct.command; + +import java.math.BigDecimal; +import java.util.Set; + +/** + * Immutable command for creating or updating details of a loan product. + */ +public class LoanProductCommand { + + + private final String name; + private final String description; + + private final Long fundId; + private final Long transactionProcessingStrategyId; + + private final String currencyCode; + private final Integer digitsAfterDecimal; + private final BigDecimal principal; + private final BigDecimal inArrearsTolerance; + + private final Integer numberOfRepayments; + private final Integer repaymentEvery; + + private final BigDecimal interestRatePerPeriod; + + private final Integer repaymentFrequencyType; + private final Integer interestRateFrequencyType; + private final Integer amortizationType; + private final Integer interestType; + private final Integer interestCalculationPeriodType; + + private final String[] charges; + + private final transient Set modifiedParameters; + private final transient boolean makerCheckerApproval; + private final transient Long id; + + public LoanProductCommand(final Set modifiedParameters, + final boolean makerCheckerApproval, final Long id, final String name, final String description, + final Long fundId, final Long transactionProcessingStrategyId, final String currencyCode, final Integer digitsAfterDecimal, + final BigDecimal principal, final BigDecimal inArrearsTolerance, final Integer numberOfRepayments, + final Integer repaymentEvery, final BigDecimal interestRatePerPeriod, final Integer repaymentFrequencyType, + final Integer interestRateFrequencyType, final Integer amortizationType, final Integer interestType, + final Integer interestCalculationPeriodType, final String[] charges) { + this.modifiedParameters = modifiedParameters; + this.makerCheckerApproval = makerCheckerApproval; + this.id = id; + this.name = name; + this.description = description; + this.fundId = fundId; + this.transactionProcessingStrategyId = transactionProcessingStrategyId; + this.currencyCode = currencyCode; + this.digitsAfterDecimal = digitsAfterDecimal; + this.principal = principal; + if (inArrearsTolerance != null && BigDecimal.ZERO.compareTo(inArrearsTolerance) == 0) { + this.inArrearsTolerance = null; + } else { + this.inArrearsTolerance = inArrearsTolerance; + } + this.numberOfRepayments = numberOfRepayments; + this.repaymentEvery = repaymentEvery; + this.interestRatePerPeriod = interestRatePerPeriod; + this.repaymentFrequencyType = repaymentFrequencyType; + this.interestRateFrequencyType = interestRateFrequencyType; + this.amortizationType = amortizationType; + this.interestType = interestType; + this.interestCalculationPeriodType = interestCalculationPeriodType; + this.charges = charges; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public Long getFundId() { + return fundId; + } + + public Long getTransactionProcessingStrategyId() { + return transactionProcessingStrategyId; + } + + public String getCurrencyCode() { + return currencyCode; + } + + public Integer getDigitsAfterDecimal() { + return digitsAfterDecimal; + } + + public BigDecimal getPrincipal() { + return principal; + } + + public BigDecimal getInArrearsTolerance() { + return inArrearsTolerance; + } + + public Integer getNumberOfRepayments() { + return numberOfRepayments; + } + + public Integer getRepaymentEvery() { + return repaymentEvery; + } + + public BigDecimal getInterestRatePerPeriod() { + return interestRatePerPeriod; + } + + public Integer getRepaymentFrequencyType() { + return repaymentFrequencyType; + } + + public Integer getInterestRateFrequencyType() { + return interestRateFrequencyType; + } + + public Integer getAmortizationType() { + return amortizationType; + } + + public Integer getInterestType() { + return interestType; + } + + public Integer getInterestCalculationPeriodType() { + return interestCalculationPeriodType; + } + + public String[] getCharges() { + return charges; + } + + public boolean isNameChanged() { + return this.modifiedParameters.contains("name"); + } + + public boolean isDescriptionChanged() { + return this.modifiedParameters.contains("description"); + } + + public boolean isFundChanged() { + return this.modifiedParameters.contains("fundId"); + } + + public boolean isTransactionProcessingStrategyChanged() { + return this.modifiedParameters.contains("transactionProcessingStrategyId"); + } + + public boolean isCurrencyCodeChanged() { + return this.modifiedParameters.contains("currencyCode"); + } + + public boolean isDigitsAfterDecimalChanged() { + return this.modifiedParameters.contains("digitsAfterDecimal"); + } + + public boolean isPrincipalChanged() { + return this.modifiedParameters.contains("principal"); + } + + public boolean isInArrearsToleranceChanged() { + return this.modifiedParameters.contains("inArrearsTolerance"); + } + + public boolean isNumberOfRepaymentsChanged() { + return this.modifiedParameters.contains("numberOfRepayments"); + } + + public boolean isRepaymentEveryChanged() { + return this.modifiedParameters.contains("repaymentEvery"); + } + + public boolean isRepaymentFrequencyTypeChanged() { + return this.modifiedParameters.contains("repaymentFrequencyType"); + } + + public boolean isAmortizationTypeChanged() { + return this.modifiedParameters.contains("amortizationType"); + } + + public boolean isInterestTypeChanged() { + return this.modifiedParameters.contains("interestType"); + } + + public boolean isInterestRatePerPeriodChanged() { + return this.modifiedParameters.contains("interestRatePerPeriod"); + } + + public boolean isInterestRateFrequencyTypeChanged() { + return this.modifiedParameters.contains("interestRateFrequencyType"); + } + + public boolean isInterestCalculationPeriodTypeChanged() { + return this.modifiedParameters.contains("interestCalculationPeriodType"); + } + + public boolean isChargesChanged() { + return this.modifiedParameters.contains("charges"); + } + + public boolean isApprovedByChecker() { + return this.makerCheckerApproval; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/data/LoanProductData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/data/LoanProductData.java new file mode 100644 index 000000000..00a0a3f3a --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/data/LoanProductData.java @@ -0,0 +1,365 @@ +package org.mifosplatform.portfolio.loanproduct.data; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.joda.time.DateTime; +import org.mifosng.platform.api.data.EnumOptionData; +import org.mifosplatform.infrastructure.configuration.data.CurrencyData; +import org.mifosplatform.portfolio.charge.data.ChargeData; +import org.mifosplatform.portfolio.fund.data.FundData; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; + +/** + * Immutable data object to represent loan products. + */ +public class LoanProductData { + + private final Long id; + private final String name; + private final String description; + + private final Long fundId; + private final String fundName; + + private final Long transactionProcessingStrategyId; + private final String transactionProcessingStrategyName; + + private final CurrencyData currency; + private final BigDecimal principal; + private final BigDecimal inArrearsTolerance; + + private final Integer numberOfRepayments; + private final Integer loanTermFrequency; + private final Integer repaymentEvery; + private final BigDecimal interestRatePerPeriod; + private final BigDecimal annualInterestRate; + + 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 final Collection charges; + + 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() { + + 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(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 = currency; + this.principal = principal; + this.inArrearsTolerance = tolerance; + this.numberOfRepayments = numberOfRepayments; + this.loanTermFrequency = loanTermFrequency; + this.repaymentEvery = repaymentEvery; + this.interestRatePerPeriod = interestRatePerPeriod; + this.annualInterestRate = annualInterestRate; + this.loanTermFrequencyType = loanTermFrequencyType; + this.repaymentFrequencyType = repaymentFrequencyType; + this.interestRateFrequencyType = interestRateFrequencyType; + this.amortizationType = amortizationType; + this.interestType = interestType; + this.interestCalculationPeriodType = interestCalculationPeriodType; + this.fundId = fundId; + 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 = productData.charges(); + + 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 String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public Long getFundId() { + return fundId; + } + + public String getFundName() { + return fundName; + } + + public Long getTransactionProcessingStrategyId() { + return transactionProcessingStrategyId; + } + + public String getTransactionProcessingStrategyName() { + return transactionProcessingStrategyName; + } + + public CurrencyData getCurrency() { + return currency; + } + + public BigDecimal getPrincipal() { + return principal; + } + + public BigDecimal getInArrearsTolerance() { + return inArrearsTolerance; + } + + public Integer getNumberOfRepayments() { + return numberOfRepayments; + } + + public Integer getLoanTermFrequency() { + return loanTermFrequency; + } + + public Integer getRepaymentEvery() { + return repaymentEvery; + } + + public BigDecimal getInterestRatePerPeriod() { + return interestRatePerPeriod; + } + + public BigDecimal getAnnualInterestRate() { + return annualInterestRate; + } + + public EnumOptionData getLoanTermFrequencyType() { + return loanTermFrequencyType; + } + + public EnumOptionData getRepaymentFrequencyType() { + return repaymentFrequencyType; + } + + public EnumOptionData getInterestRateFrequencyType() { + return interestRateFrequencyType; + } + + public EnumOptionData getAmortizationType() { + return amortizationType; + } + + public EnumOptionData getInterestType() { + return interestType; + } + + public EnumOptionData getInterestCalculationPeriodType() { + return interestCalculationPeriodType; + } + + public DateTime getCreatedOn() { + return createdOn; + } + + public DateTime getLastModifedOn() { + return lastModifedOn; + } + + public List getCurrencyOptions() { + return currencyOptions; + } + + public Collection getFundOptions() { + return fundOptions; + } + + public Collection getTransactionProcessingStrategyOptions() { + return transactionProcessingStrategyOptions; + } + + public List getAmortizationTypeOptions() { + return amortizationTypeOptions; + } + + public List getInterestTypeOptions() { + return interestTypeOptions; + } + + public List getInterestCalculationPeriodTypeOptions() { + return interestCalculationPeriodTypeOptions; + } + + public List getRepaymentFrequencyTypeOptions() { + return repaymentFrequencyTypeOptions; + } + + public List getInterestRateFrequencyTypeOptions() { + return interestRateFrequencyTypeOptions; + } + + public List getLoanTermFrequencyTypeOptions() { + return loanTermFrequencyTypeOptions; + } + + public Collection getChargeOptions() { + return chargeOptions; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/TransactionProcessingStrategyData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/data/TransactionProcessingStrategyData.java similarity index 61% rename from mifosng-provider/src/main/java/org/mifosng/platform/api/data/TransactionProcessingStrategyData.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/data/TransactionProcessingStrategyData.java index 8a3d81601..1c604e1ff 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/TransactionProcessingStrategyData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/data/TransactionProcessingStrategyData.java @@ -1,9 +1,12 @@ -package org.mifosng.platform.api.data; +package org.mifosplatform.portfolio.loanproduct.data; public final class TransactionProcessingStrategyData { + @SuppressWarnings("unused") private final Long id; + @SuppressWarnings("unused") private final String code; + @SuppressWarnings("unused") private final String name; public TransactionProcessingStrategyData(final Long id, final String code, final String name) { @@ -11,16 +14,4 @@ public final class TransactionProcessingStrategyData { this.code = code; this.name = name; } - - public Long getId() { - return id; - } - - public String getCode() { - return code; - } - - public String getName() { - return name; - } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/AmortizationMethod.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/AmortizationMethod.java new file mode 100644 index 000000000..1710cb2d4 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/AmortizationMethod.java @@ -0,0 +1,42 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +public enum AmortizationMethod { + EQUAL_PRINCIPAL(0, "amortizationType.equal.principal"), // + EQUAL_INSTALLMENTS(1, "amortizationType.equal.installments"), // + INVALID(2, "amortizationType.invalid"); + + private final Integer value; + private final String code; + + private AmortizationMethod(final Integer value, final String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return code; + } + + public static AmortizationMethod fromInt(final Integer selectedMethod) { + + if (selectedMethod == null) { return null; } + + AmortizationMethod repaymentMethod = null; + switch (selectedMethod) { + case 0: + repaymentMethod = AmortizationMethod.EQUAL_PRINCIPAL; + break; + case 1: + repaymentMethod = AmortizationMethod.EQUAL_INSTALLMENTS; + break; + default: + repaymentMethod = AmortizationMethod.INVALID; + break; + } + return repaymentMethod; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java new file mode 100644 index 000000000..f6e9c4bfb --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java @@ -0,0 +1,40 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +public enum InterestCalculationPeriodMethod { + DAILY(0, "interestCalculationPeriodType.daily"), // + SAME_AS_REPAYMENT_PERIOD(1, "interestCalculationPeriodType.same.as.repayment.period"), // + INVALID(2, "interestCalculationPeriodType.invalid"); + + private final Integer value; + private final String code; + + private InterestCalculationPeriodMethod(final Integer value, final String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return code; + } + + public static InterestCalculationPeriodMethod fromInt(final Integer selectedMethod) { + + InterestCalculationPeriodMethod repaymentMethod = null; + switch (selectedMethod) { + case 0: + repaymentMethod = InterestCalculationPeriodMethod.DAILY; + break; + case 1: + repaymentMethod = InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD; + break; + default: + repaymentMethod = InterestCalculationPeriodMethod.INVALID; + break; + } + return repaymentMethod; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/InterestMethod.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/InterestMethod.java new file mode 100644 index 000000000..d0f29a3f1 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/InterestMethod.java @@ -0,0 +1,38 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +public enum InterestMethod { + DECLINING_BALANCE(0, "interestType.declining.balance"), FLAT(1, "interestType.flat"), INVALID(2, "interestType.invalid"); + + private final Integer value; + private final String code; + + private InterestMethod(final Integer value, final String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return code; + } + + public static InterestMethod fromInt(final Integer selectedMethod) { + + InterestMethod repaymentMethod = null; + switch (selectedMethod) { + case 0: + repaymentMethod = InterestMethod.DECLINING_BALANCE; + break; + case 1: + repaymentMethod = InterestMethod.FLAT; + break; + default: + repaymentMethod = InterestMethod.INVALID; + break; + } + return repaymentMethod; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java new file mode 100644 index 000000000..4649fd2c1 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java @@ -0,0 +1,123 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +import java.math.BigDecimal; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.apache.commons.lang.StringUtils; +import org.mifosng.platform.infrastructure.AbstractAuditableCustom; +import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; +import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.charge.domain.Charge; +import org.mifosplatform.portfolio.fund.domain.Fund; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; + +/** + * Loan products allow for categorisation of an organisations loans into + * something meaningful to them. + * + * They provide a means of simplifying creation/maintenance of loans. They can + * also allow for product comparison to take place when reporting. + * + * They allow for constraints to be added at product level. + */ +@Entity +@Table(name = "m_product_loan") +public class LoanProduct extends AbstractAuditableCustom { + + @SuppressWarnings("unused") + @ManyToOne + @JoinColumn(name = "fund_id", nullable = true) + private Fund fund; + + @SuppressWarnings("unused") + @ManyToOne + @JoinColumn(name = "loan_transaction_strategy_id", nullable = true) + private LoanTransactionProcessingStrategy transactionProcessingStrategy; + + @SuppressWarnings("unused") + @Column(name = "name", nullable = false) + private String name; + + @SuppressWarnings("unused") + @Column(name = "description") + private String description; + + @ManyToMany + @JoinTable(name = "m_product_loan_charge", joinColumns = @JoinColumn(name = "product_loan_id"), inverseJoinColumns = @JoinColumn(name = "charge_id")) + private Set charges; + + @Embedded + private final LoanProductRelatedDetail loanProductRelatedDetail; + + protected LoanProduct() { + this.loanProductRelatedDetail = null; + } + + public LoanProduct(final Fund fund, final LoanTransactionProcessingStrategy transactionProcessingStrategy, final String name, + final String description, final MonetaryCurrency currency, final BigDecimal defaultPrincipal, + final BigDecimal defaultNominalInterestRatePerPeriod, final PeriodFrequencyType interestPeriodFrequencyType, + final BigDecimal defaultAnnualNominalInterestRate, final InterestMethod interestMethod, + final InterestCalculationPeriodMethod interestCalculationPeriodMethod, final Integer repayEvery, + final PeriodFrequencyType repaymentFrequencyType, final Integer defaultNumberOfInstallments, + final AmortizationMethod amortizationMethod, final BigDecimal inArrearsTolerance, final Set charges) { + this.fund = fund; + this.transactionProcessingStrategy = transactionProcessingStrategy; + this.name = name.trim(); + if (StringUtils.isNotBlank(description)) { + this.description = description.trim(); + } else { + this.description = null; + } + + if (charges != null) { + this.charges = charges; + } + + this.loanProductRelatedDetail = new LoanProductRelatedDetail(currency, defaultPrincipal, defaultNominalInterestRatePerPeriod, + interestPeriodFrequencyType, defaultAnnualNominalInterestRate, interestMethod, interestCalculationPeriodMethod, repayEvery, + repaymentFrequencyType, defaultNumberOfInstallments, amortizationMethod, inArrearsTolerance); + } + + public MonetaryCurrency getCurrency() { + return this.loanProductRelatedDetail.getCurrency(); + } + + public Set getCharges() { + return charges; + } + + public void update(final LoanProductCommand command, final Fund fund, final LoanTransactionProcessingStrategy strategy, + final Set charges) { + + if (command.isNameChanged()) { + this.name = command.getName(); + } + + if (command.isDescriptionChanged()) { + this.description = command.getDescription(); + } + + if (command.isFundChanged()) { + this.fund = fund; + } + + if (command.isTransactionProcessingStrategyChanged()) { + this.transactionProcessingStrategy = strategy; + } + + if (command.isChargesChanged()) { + this.charges = charges; + } + + this.loanProductRelatedDetail.update(command); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java similarity index 74% rename from mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java index 538cf1bdc..9b1c500de 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java @@ -1,9 +1,11 @@ -package org.mifosng.platform.loan.domain; +package org.mifosplatform.portfolio.loanproduct.domain; import java.io.Serializable; + /** - * Represents the bare minimum repayment details needed for activities related to generating repayment schedules. + * Represents the bare minimum repayment details needed for activities related + * to generating repayment schedules. */ public interface LoanProductMinimumRepaymentScheduleRelatedDetail extends Serializable { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java new file mode 100644 index 000000000..ca135acf4 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java @@ -0,0 +1,190 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.Embedded; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +import org.mifosng.platform.loan.domain.Loan; +import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; +import org.mifosplatform.infrastructure.configuration.domain.Money; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; + +/** + * LoanRepaymentScheduleDetail encapsulates all the details of a + * {@link LoanProduct} that are also used and persisted by a {@link Loan}. + */ +@Embeddable +public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentScheduleRelatedDetail { + + @Embedded + private MonetaryCurrency currency; + + @Column(name = "principal_amount", scale = 6, precision = 19, nullable = false) + private BigDecimal principal; + + @Column(name = "nominal_interest_rate_per_period", scale = 6, precision = 19, nullable = false) + private BigDecimal nominalInterestRatePerPeriod; + + @Enumerated(EnumType.ORDINAL) + @Column(name = "interest_period_frequency_enum", nullable = false) + private PeriodFrequencyType interestPeriodFrequencyType; + + @Column(name = "annual_nominal_interest_rate", scale = 6, precision = 19, nullable = false) + private BigDecimal annualNominalInterestRate; + + @Enumerated(EnumType.ORDINAL) + @Column(name = "interest_method_enum", nullable = false) + private InterestMethod interestMethod; + + @Enumerated(EnumType.ORDINAL) + @Column(name = "interest_calculated_in_period_enum", nullable = false) + private InterestCalculationPeriodMethod interestCalculationPeriodMethod; + + @Column(name = "repay_every", nullable = false) + private Integer repayEvery; + + @Enumerated(EnumType.ORDINAL) + @Column(name = "repayment_period_frequency_enum", nullable = false) + private PeriodFrequencyType repaymentPeriodFrequencyType; + + @Column(name = "number_of_repayments", nullable = false) + private Integer numberOfRepayments; + + @Enumerated(EnumType.ORDINAL) + @Column(name = "amortization_method_enum", nullable = false) + private AmortizationMethod amortizationMethod; + + @Column(name = "arrearstolerance_amount", scale = 6, precision = 19, nullable = true) + private BigDecimal inArrearsTolerance; + + protected LoanProductRelatedDetail() { + // + } + + public LoanProductRelatedDetail(final MonetaryCurrency currency, final BigDecimal defaultPrincipal, + final BigDecimal defaultNominalInterestRatePerPeriod, final PeriodFrequencyType interestPeriodFrequencyType, + final BigDecimal defaultAnnualNominalInterestRate, final InterestMethod interestMethod, + final InterestCalculationPeriodMethod interestCalculationPeriodMethod, final Integer repayEvery, + final PeriodFrequencyType repaymentFrequencyType, final Integer defaultNumberOfRepayments, + final AmortizationMethod amortizationMethod, final BigDecimal inArrearsTolerance) { + this.currency = currency; + this.principal = defaultPrincipal; + this.nominalInterestRatePerPeriod = defaultNominalInterestRatePerPeriod; + this.interestPeriodFrequencyType = interestPeriodFrequencyType; + this.annualNominalInterestRate = defaultAnnualNominalInterestRate; + this.interestMethod = interestMethod; + this.interestCalculationPeriodMethod = interestCalculationPeriodMethod; + this.repayEvery = repayEvery; + this.repaymentPeriodFrequencyType = repaymentFrequencyType; + this.numberOfRepayments = defaultNumberOfRepayments; + this.amortizationMethod = amortizationMethod; + if (inArrearsTolerance != null && BigDecimal.ZERO.compareTo(inArrearsTolerance) == 0) { + this.inArrearsTolerance = null; + } else { + this.inArrearsTolerance = inArrearsTolerance; + } + } + + public MonetaryCurrency getCurrency() { + return this.currency.copy(); + } + + public Money getPrincipal() { + return Money.of(this.currency, this.principal); + } + + public Money getInArrearsTolerance() { + return Money.of(this.currency, this.inArrearsTolerance); + } + + public BigDecimal getNominalInterestRatePerPeriod() { + return BigDecimal.valueOf(Double.valueOf(this.nominalInterestRatePerPeriod.stripTrailingZeros().toString())); + } + + public PeriodFrequencyType getInterestPeriodFrequencyType() { + return interestPeriodFrequencyType; + } + + public BigDecimal getAnnualNominalInterestRate() { + return BigDecimal.valueOf(Double.valueOf(this.annualNominalInterestRate.stripTrailingZeros().toString())); + } + + public InterestMethod getInterestMethod() { + return interestMethod; + } + + public InterestCalculationPeriodMethod getInterestCalculationPeriodMethod() { + return interestCalculationPeriodMethod; + } + + @Override + public Integer getRepayEvery() { + return repayEvery; + } + + @Override + public PeriodFrequencyType getRepaymentPeriodFrequencyType() { + return repaymentPeriodFrequencyType; + } + + @Override + public Integer getNumberOfRepayments() { + return numberOfRepayments; + } + + public AmortizationMethod getAmortizationMethod() { + return amortizationMethod; + } + + public void update(final LoanProductCommand command) { + + Integer digitsAfterDecimalChanged = this.currency.getDigitsAfterDecimal(); + if (command.isDigitsAfterDecimalChanged()) { + digitsAfterDecimalChanged = command.getDigitsAfterDecimal(); + } + + String currencyCodeChanged = this.currency.getCode(); + if (command.isCurrencyCodeChanged()) { + currencyCodeChanged = command.getCurrencyCode(); + } + + if (command.isDigitsAfterDecimalChanged() || command.isCurrencyCodeChanged()) { + this.currency = new MonetaryCurrency(currencyCodeChanged, digitsAfterDecimalChanged); + } + + if (command.isPrincipalChanged()) { + this.principal = command.getPrincipal(); + } + if (command.isRepaymentEveryChanged()) { + this.repayEvery = command.getRepaymentEvery(); + } + if (command.isRepaymentFrequencyTypeChanged()) { + this.repaymentPeriodFrequencyType = PeriodFrequencyType.fromInt(command.getRepaymentFrequencyType()); + } + if (command.isNumberOfRepaymentsChanged()) { + this.numberOfRepayments = command.getNumberOfRepayments(); + } + if (command.isAmortizationTypeChanged()) { + this.amortizationMethod = AmortizationMethod.fromInt(command.getAmortizationType()); + } + if (command.isInArrearsToleranceChanged()) { + this.inArrearsTolerance = command.getInArrearsTolerance(); + } + if (command.isInterestRatePerPeriodChanged()) { + this.nominalInterestRatePerPeriod = command.getInterestRatePerPeriod(); + } + if (command.isInterestRateFrequencyTypeChanged()) { + this.interestPeriodFrequencyType = PeriodFrequencyType.fromInt(command.getInterestRateFrequencyType()); + } + if (command.isInterestTypeChanged()) { + this.interestMethod = InterestMethod.fromInt(command.getInterestType()); + } + if (command.isInterestCalculationPeriodTypeChanged()) { + this.interestCalculationPeriodMethod = InterestCalculationPeriodMethod.fromInt(command.getInterestCalculationPeriodType()); + } + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRepository.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRepository.java new file mode 100644 index 000000000..decc0912d --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRepository.java @@ -0,0 +1,8 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface LoanProductRepository extends JpaRepository, JpaSpecificationExecutor { + // no behaviour added +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java new file mode 100644 index 000000000..41a858093 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java @@ -0,0 +1,47 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +import org.mifosng.platform.infrastructure.AbstractAuditableCustom; +import org.mifosplatform.infrastructure.user.domain.AppUser; +import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; + +/** + * + */ +@Entity +@Table(name = "ref_loan_transaction_processing_strategy") +public class LoanTransactionProcessingStrategy extends AbstractAuditableCustom { + + @Column(name = "code", unique = true) + private String code; + + @Column(name = "name") + private String name; + + protected LoanTransactionProcessingStrategy() { + // + } + + public TransactionProcessingStrategyData toData() { + return new TransactionProcessingStrategyData(this.getId(), this.code, this.name); + } + + public boolean isStandardMifosStrategy() { + return "mifos-standard-strategy".equalsIgnoreCase(this.code); + } + + public boolean isHeavensfamilyStrategy() { + return "heavensfamily-strategy".equalsIgnoreCase(this.code); + } + + public boolean isCreocoreStrategy() { + return "creocore-strategy".equalsIgnoreCase(this.code); + } + + public boolean isIndianRBIStrategy() { + return "rbi-india-strategy".equalsIgnoreCase(this.code); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/PeriodFrequencyType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/PeriodFrequencyType.java new file mode 100644 index 000000000..9fddbe8ee --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/PeriodFrequencyType.java @@ -0,0 +1,48 @@ +package org.mifosplatform.portfolio.loanproduct.domain; + +public enum PeriodFrequencyType { + DAYS(0, "periodFrequencyType.days"), // + WEEKS(1, "periodFrequencyType.weeks"), // + MONTHS(2, "periodFrequencyType.months"), // + YEARS(3, "periodFrequencyType.years"), // + INVALID(4, "periodFrequencyType.invalid"); + + private final Integer value; + private final String code; + + private PeriodFrequencyType(final Integer value, final String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return code; + } + + public static PeriodFrequencyType fromInt(final Integer frequency) { + + PeriodFrequencyType repaymentFrequencyType = PeriodFrequencyType.INVALID; + switch (frequency) { + case 0: + repaymentFrequencyType = PeriodFrequencyType.DAYS; + break; + case 1: + repaymentFrequencyType = PeriodFrequencyType.WEEKS; + break; + case 2: + repaymentFrequencyType = PeriodFrequencyType.MONTHS; + break; + case 3: + repaymentFrequencyType = PeriodFrequencyType.YEARS; + break; + default: + repaymentFrequencyType = PeriodFrequencyType.INVALID; + break; + } + return repaymentFrequencyType; + } +} diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanDropdownReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java similarity index 81% rename from mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanDropdownReadPlatformService.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java index 667a8da56..fd97341cc 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanDropdownReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java @@ -1,10 +1,10 @@ -package org.mifosng.platform.loanproduct.service; +package org.mifosplatform.portfolio.loanproduct.service; import java.util.Collection; import java.util.List; import org.mifosng.platform.api.data.EnumOptionData; -import org.mifosng.platform.api.data.TransactionProcessingStrategyData; +import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; public interface LoanDropdownReadPlatformService { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java similarity index 74% rename from mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java index e16569804..83a208e56 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java @@ -1,11 +1,11 @@ -package org.mifosng.platform.loanproduct.service; +package org.mifosplatform.portfolio.loanproduct.service; -import static org.mifosng.platform.loanproduct.service.LoanEnumerations.amortizationType; -import static org.mifosng.platform.loanproduct.service.LoanEnumerations.interestCalculationPeriodType; -import static org.mifosng.platform.loanproduct.service.LoanEnumerations.interestRateFrequencyType; -import static org.mifosng.platform.loanproduct.service.LoanEnumerations.interestType; -import static org.mifosng.platform.loanproduct.service.LoanEnumerations.loanTermFrequencyType; -import static org.mifosng.platform.loanproduct.service.LoanEnumerations.repaymentFrequencyType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.amortizationType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestCalculationPeriodType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestRateFrequencyType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.loanTermFrequencyType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyType; import java.util.ArrayList; import java.util.Arrays; @@ -13,13 +13,13 @@ import java.util.Collection; import java.util.List; import org.mifosng.platform.api.data.EnumOptionData; -import org.mifosng.platform.api.data.TransactionProcessingStrategyData; -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.LoanTransactionProcessingStrategy; import org.mifosng.platform.loan.domain.LoanTransactionProcessingStrategyRepository; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanEnumerations.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java similarity index 96% rename from mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanEnumerations.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java index f615ee46c..0bdbc2028 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanEnumerations.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java @@ -1,12 +1,12 @@ -package org.mifosng.platform.loanproduct.service; +package org.mifosplatform.portfolio.loanproduct.service; import org.mifosng.platform.api.data.EnumOptionData; -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.LoanStatus; import org.mifosng.platform.loan.domain.LoanTransactionType; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public class LoanEnumerations { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductCommandValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductCommandValidator.java similarity index 97% rename from mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductCommandValidator.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductCommandValidator.java index 1454eb61b..28b8363a0 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductCommandValidator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductCommandValidator.java @@ -1,12 +1,12 @@ -package org.mifosng.platform.loanproduct.service; +package org.mifosplatform.portfolio.loanproduct.service; import java.util.ArrayList; import java.util.List; import org.mifosng.platform.DataValidatorBuilder; -import org.mifosng.platform.api.commands.LoanProductCommand; import org.mifosng.platform.api.data.ApiParameterError; import org.mifosng.platform.exceptions.PlatformApiDataValidationException; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; public class LoanProductCommandValidator { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformService.java similarity index 71% rename from mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformService.java index 795e4f7ce..b5b84e8cd 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformService.java @@ -1,8 +1,8 @@ -package org.mifosng.platform.loanproduct.service; +package org.mifosplatform.portfolio.loanproduct.service; import java.util.Collection; -import org.mifosng.platform.api.data.LoanProductData; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; public interface LoanProductReadPlatformService { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java similarity index 98% rename from mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java rename to mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java index e0ff63fc4..97197c5d7 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java @@ -1,4 +1,4 @@ -package org.mifosng.platform.loanproduct.service; +package org.mifosplatform.portfolio.loanproduct.service; import java.math.BigDecimal; import java.sql.ResultSet; @@ -7,7 +7,6 @@ import java.util.Collection; import org.joda.time.DateTime; import org.mifosng.platform.api.data.EnumOptionData; -import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.exceptions.LoanProductNotFoundException; import org.mifosng.platform.infrastructure.JdbcSupport; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; @@ -15,6 +14,7 @@ import org.mifosplatform.infrastructure.configuration.data.CurrencyData; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.portfolio.charge.data.ChargeData; import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService; +import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductWritePlatformService.java new file mode 100644 index 000000000..1fca75482 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductWritePlatformService.java @@ -0,0 +1,11 @@ +package org.mifosplatform.portfolio.loanproduct.service; + +import org.mifosng.platform.api.data.EntityIdentifier; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; + +public interface LoanProductWritePlatformService { + + EntityIdentifier createLoanProduct(LoanProductCommand command); + + EntityIdentifier updateLoanProduct(LoanProductCommand command); +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java new file mode 100644 index 000000000..7baa19d81 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java @@ -0,0 +1,185 @@ +package org.mifosplatform.portfolio.loanproduct.service; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; + +import org.mifosng.platform.api.data.EntityIdentifier; +import org.mifosng.platform.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; +import org.mifosng.platform.exceptions.ChargeIsNotActiveException; +import org.mifosng.platform.exceptions.ChargeNotFoundException; +import org.mifosng.platform.exceptions.FundNotFoundException; +import org.mifosng.platform.exceptions.InvalidCurrencyException; +import org.mifosng.platform.exceptions.LoanProductNotFoundException; +import org.mifosng.platform.exceptions.LoanTransactionProcessingStrategyNotFoundException; +import org.mifosng.platform.loan.domain.LoanTransactionProcessingStrategyRepository; +import org.mifosng.platform.loanschedule.domain.AprCalculator; +import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; +import org.mifosplatform.infrastructure.configuration.service.ConfigurationDomainService; +import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.portfolio.charge.domain.Charge; +import org.mifosplatform.portfolio.charge.domain.ChargeRepository; +import org.mifosplatform.portfolio.fund.domain.Fund; +import org.mifosplatform.portfolio.fund.domain.FundRepository; +import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository; +import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +@Service +public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanProductWritePlatformService { + + private final PlatformSecurityContext context; + private final LoanProductRepository loanProductRepository; + private final AprCalculator aprCalculator; + private final FundRepository fundRepository; + private final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository; + private final ChargeRepository chargeRepository; + private final ConfigurationDomainService configurationDomainService; + + @Autowired + public LoanProductWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, + final LoanProductRepository loanProductRepository, final AprCalculator aprCalculator, final FundRepository fundRepository, + final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository, + final ChargeRepository chargeRepository, + final ConfigurationDomainService configurationDomainService) { + this.context = context; + this.loanProductRepository = loanProductRepository; + this.aprCalculator = aprCalculator; + this.fundRepository = fundRepository; + this.loanTransactionProcessingStrategyRepository = loanTransactionProcessingStrategyRepository; + this.chargeRepository = chargeRepository; + this.configurationDomainService = configurationDomainService; + } + + @Transactional + @Override + public EntityIdentifier createLoanProduct(final LoanProductCommand command) { + + this.context.authenticatedUser(); + + LoanProductCommandValidator validator = new LoanProductCommandValidator(command); + validator.validateForCreate(); + + // assemble LoanProduct from data + InterestMethod interestMethod = InterestMethod.fromInt(command.getInterestType()); + InterestCalculationPeriodMethod interestCalculationPeriodMethod = InterestCalculationPeriodMethod.fromInt(command + .getInterestCalculationPeriodType()); + + AmortizationMethod amortizationMethod = AmortizationMethod.fromInt(command.getAmortizationType()); + + PeriodFrequencyType repaymentFrequencyType = PeriodFrequencyType.fromInt(command.getRepaymentFrequencyType()); + + PeriodFrequencyType interestFrequencyType = PeriodFrequencyType.fromInt(command.getInterestRateFrequencyType()); + + MonetaryCurrency currency = new MonetaryCurrency(command.getCurrencyCode(), command.getDigitsAfterDecimal()); + + BigDecimal annualInterestRate = this.aprCalculator.calculateFrom(interestFrequencyType, command.getInterestRatePerPeriod()); + + // associating fund with loan product at creation is optional for now. + Fund fund = findFundByIdIfProvided(command.getFundId()); + LoanTransactionProcessingStrategy loanTransactionProcessingStrategy = findStrategyByIdIfProvided(command + .getTransactionProcessingStrategyId()); + + final Set charges = this.assembleSetOfCharges(command, null); + + LoanProduct loanproduct = new LoanProduct(fund, loanTransactionProcessingStrategy, command.getName(), command.getDescription(), + currency, command.getPrincipal(), command.getInterestRatePerPeriod(), interestFrequencyType, annualInterestRate, + interestMethod, interestCalculationPeriodMethod, command.getRepaymentEvery(), repaymentFrequencyType, + command.getNumberOfRepayments(), amortizationMethod, command.getInArrearsTolerance(), charges); + + this.loanProductRepository.save(loanproduct); + + if (this.configurationDomainService.isMakerCheckerEnabledForTask("CREATE_LOANPRODUCT") && !command.isApprovedByChecker()) { throw new RollbackTransactionAsCommandIsNotApprovedByCheckerException(); } + + return new EntityIdentifier(loanproduct.getId()); + } + + private LoanTransactionProcessingStrategy findStrategyByIdIfProvided(final Long transactionProcessingStrategyId) { + LoanTransactionProcessingStrategy strategy = null; + if (transactionProcessingStrategyId != null) { + strategy = this.loanTransactionProcessingStrategyRepository.findOne(transactionProcessingStrategyId); + if (strategy == null) { throw new LoanTransactionProcessingStrategyNotFoundException(transactionProcessingStrategyId); } + } + return strategy; + } + + private Fund findFundByIdIfProvided(final Long fundId) { + Fund fund = null; + if (fundId != null) { + fund = this.fundRepository.findOne(fundId); + if (fund == null) { throw new FundNotFoundException(fundId); } + } + return fund; + } + + @Transactional + @Override + public EntityIdentifier updateLoanProduct(final LoanProductCommand command) { + + this.context.authenticatedUser(); + + LoanProductCommandValidator validator = new LoanProductCommandValidator(command); + validator.validateForUpdate(); + + LoanProduct product = this.loanProductRepository.findOne(command.getId()); + if (product == null) { throw new LoanProductNotFoundException(command.getId()); } + + // associating fund with loan product at creation is optional for now. + Fund fund = null; + if (command.isFundChanged()) { + fund = findFundByIdIfProvided(command.getFundId()); + } + + LoanTransactionProcessingStrategy loanTransactionProcessingStrategy = null; + if (command.isTransactionProcessingStrategyChanged()) { + loanTransactionProcessingStrategy = findStrategyByIdIfProvided(command.getTransactionProcessingStrategyId()); + } + + final Set charges = this.assembleSetOfCharges(command, product.getCurrency().getCode()); + + product.update(command, fund, loanTransactionProcessingStrategy, charges); + + this.loanProductRepository.save(product); + + if (this.configurationDomainService.isMakerCheckerEnabledForTask("UPDATE_LOANPRODUCT") && !command.isApprovedByChecker()) { throw new RollbackTransactionAsCommandIsNotApprovedByCheckerException(); } + + return new EntityIdentifier(Long.valueOf(product.getId())); + } + + private Set assembleSetOfCharges(final LoanProductCommand command, final String currencyCode) { + + Set charges = new HashSet(); + String[] chargesArray = command.getCharges(); + + String loanProductCurrencyCode = command.getCurrencyCode(); + if (loanProductCurrencyCode == null) { + loanProductCurrencyCode = currencyCode; + } + + if (command.isChargesChanged() && !ObjectUtils.isEmpty(chargesArray)) { + for (String chargeId : chargesArray) { + Long id = Long.valueOf(chargeId); + Charge charge = this.chargeRepository.findOne(id); + if (charge == null || charge.isDeleted()) { throw new ChargeNotFoundException(id); } + if (!charge.isActive()) { throw new ChargeIsNotActiveException(id, charge.getName()); } + if (!loanProductCurrencyCode.equals(charge.getCurrencyCode())) { + String errorMessage = "Charge and Loan Product must have the same currency."; + throw new InvalidCurrencyException("charge", "attach.to.loan.product", errorMessage); + } + charges.add(charge); + } + } + + return charges; + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGeneratorTest.java b/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGeneratorTest.java index 67da9778e..9ae940bd6 100644 --- a/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGeneratorTest.java +++ b/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/DecliningBalanceMethodLoanScheduleGeneratorTest.java @@ -6,8 +6,8 @@ package org.mifosng.platform.loanschedule.domain; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; import org.mockito.runners.MockitoJUnitRunner; @SuppressWarnings("unused") diff --git a/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGeneratorTest.java b/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGeneratorTest.java index c10275a92..dcc32a0a1 100644 --- a/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGeneratorTest.java +++ b/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/FlatMethodLoanScheduleGeneratorTest.java @@ -6,8 +6,8 @@ package org.mifosng.platform.loanschedule.domain; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mifosng.platform.loan.domain.LoanProductRelatedDetail; import org.mifosplatform.infrastructure.configuration.data.CurrencyData; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; import org.mockito.runners.MockitoJUnitRunner; @SuppressWarnings("unused") diff --git a/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/LoanProductRelatedDetailTestHelper.java b/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/LoanProductRelatedDetailTestHelper.java index a0f0c43d5..a5835a87b 100644 --- a/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/LoanProductRelatedDetailTestHelper.java +++ b/mifosng-provider/src/test/java/org/mifosng/platform/loanschedule/domain/LoanProductRelatedDetailTestHelper.java @@ -2,13 +2,13 @@ package org.mifosng.platform.loanschedule.domain; import java.math.BigDecimal; -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.LoanProductRelatedDetail; import org.mifosng.platform.loan.domain.MonetaryCurrencyBuilder; -import org.mifosng.platform.loan.domain.PeriodFrequencyType; import org.mifosplatform.infrastructure.configuration.domain.MonetaryCurrency; +import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestCalculationPeriodMethod; +import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; /** * This class is used to keep in one place configurations for setting up {@link LoanProductRelatedDetail} object used in {@link LoanScheduleGenerator}'s