From 29e36a0797eb4c52766bc37d874b71986b7ad42d Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Wed, 5 Sep 2012 23:19:08 +0100 Subject: [PATCH] MIFOSX-32: continue WIP on abilit to modify loan application. --- .../platform/api/LoansApiResource.java | 62 +++++++- .../platform/api/data/EnumOptionData.java | 32 +--- .../platform/api/data/LoanAccountData.java | 148 ++++++++++++------ .../api/data/LoanAccountSummaryData.java | 5 +- .../api/data/LoanBasicDetailsData.java | 56 ++++--- .../platform/api/data/LoanProductLookup.java | 28 ++-- .../GoogleGsonApiJsonSerializerService.java | 6 +- .../loan/service/LoanReadPlatformService.java | 6 +- .../service/LoanReadPlatformServiceImpl.java | 94 +++++------ .../loanproduct/service/LoanEnumerations.java | 64 +++++++- 10 files changed, 325 insertions(+), 176 deletions(-) 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 59828fccb..12d311544 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 @@ -1,8 +1,10 @@ package org.mifosng.platform.api; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ws.rs.Consumes; @@ -26,24 +28,33 @@ import org.mifosng.platform.api.commands.LoanTransactionCommand; import org.mifosng.platform.api.commands.SubmitLoanApplicationCommand; import org.mifosng.platform.api.commands.UndoStateTransitionCommand; import org.mifosng.platform.api.data.ChargeData; +import org.mifosng.platform.api.data.CurrencyData; import org.mifosng.platform.api.data.EntityIdentifier; +import org.mifosng.platform.api.data.EnumOptionData; +import org.mifosng.platform.api.data.FundData; import org.mifosng.platform.api.data.LoanAccountData; import org.mifosng.platform.api.data.LoanAccountSummaryData; import org.mifosng.platform.api.data.LoanBasicDetailsData; import org.mifosng.platform.api.data.LoanPermissionData; +import org.mifosng.platform.api.data.LoanProductLookup; import org.mifosng.platform.api.data.LoanRepaymentPeriodData; import org.mifosng.platform.api.data.LoanRepaymentTransactionData; import org.mifosng.platform.api.data.LoanSchedule; import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.NewLoanData; +import org.mifosng.platform.api.data.TransactionProcessingStrategyData; import org.mifosng.platform.api.infrastructure.ApiDataConversionService; import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService; import org.mifosng.platform.api.infrastructure.ApiParameterHelper; import org.mifosng.platform.charge.service.ChargeReadPlatformService; +import org.mifosng.platform.currency.service.CurrencyReadPlatformService; import org.mifosng.platform.exceptions.UnrecognizedQueryParamException; +import org.mifosng.platform.fund.service.FundReadPlatformService; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -58,7 +69,16 @@ public class LoansApiResource { @Autowired private LoanWritePlatformService loanWritePlatformService; + + @Autowired + private LoanProductReadPlatformService loanProductReadPlatformService; + @Autowired + private LoanDropdownReadPlatformService dropdownReadPlatformService; + + @Autowired + private FundReadPlatformService fundReadPlatformService; + @Autowired private ChargeReadPlatformService chargeReadPlatformService; @@ -70,7 +90,7 @@ public class LoansApiResource { @Autowired private ApiJsonSerializerService apiJsonSerializerService; - + @GET @Path("template") @Consumes({ MediaType.APPLICATION_JSON }) @@ -110,7 +130,7 @@ public class LoansApiResource { "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", "submittedOnDate", "approvedOnDate", "expectedDisbursementDate", "actualDisbursementDate", "expectedFirstRepaymentOnDate", "interestChargedFromDate", "closedOnDate", "expectedMaturityDate", - "lifeCycleStatusId", "lifeCycleStatusText", "lifeCycleStatusDate") + "status", "lifeCycleStatusDate") ); Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); @@ -138,15 +158,47 @@ public class LoansApiResource { loanRepayments = this.loanReadPlatformService.retrieveLoanPayments(loanId); repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(loanId); - summary = this.loanReadPlatformService.retrieveSummary(loanBasicDetails.getPrincipal(), repaymentSchedule, loanRepayments); + summary = this.loanReadPlatformService.retrieveSummary(loanBasicDetails.getCurrency(), repaymentSchedule, loanRepayments); - boolean isWaiveAllowed = summary.isWaiveAllowed(loanBasicDetails.getInArrearsTolerance()); + boolean isWaiveAllowed = summary.isWaiveAllowed(loanBasicDetails.getCurrency(), loanBasicDetails.getInArrearsTolerance()); permissions = this.loanReadPlatformService.retrieveLoanPermissions(loanBasicDetails, isWaiveAllowed, loanRepayments.size()); charges = this.chargeReadPlatformService.retrieveLoanCharges(loanId); } - LoanAccountData loanAccount = new LoanAccountData(loanBasicDetails, summary, repaymentSchedule, loanRepayments, permissions, charges); + Collection productOptions = new ArrayList(); + List loanTermFrequencyTypeOptions = new ArrayList(); + List repaymentFrequencyTypeOptions = new ArrayList(); + Collection transactionProcessingStrategyOptions = new ArrayList(); + + List interestRateFrequencyTypeOptions = new ArrayList(); + List amortizationTypeOptions = new ArrayList(); + List interestTypeOptions = new ArrayList(); + List interestCalculationPeriodTypeOptions = new ArrayList(); + Collection fundOptions = new ArrayList(); + + final boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); + if(template) { + responseParameters.addAll(Arrays.asList("productOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", + "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "transactionProcessingStrategyOptions", "chargeOptions")); + + productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup(); + loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); + repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); + interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions(); + + amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions(); + interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions(); + interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions(); + + fundOptions = this.fundReadPlatformService.retrieveAllFunds(); + transactionProcessingStrategyOptions = this.dropdownReadPlatformService.retreiveTransactionProcessingStrategies(); + } + + LoanAccountData loanAccount = new LoanAccountData(loanBasicDetails, summary, repaymentSchedule, loanRepayments, permissions, charges, + productOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, + transactionProcessingStrategyOptions, interestRateFrequencyTypeOptions, + fundOptions); return this.apiJsonSerializerService.serialzieLoanAccountDataToJson(prettyPrint, responseParameters, loanAccount); } 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 31fc647d6..a07b958ff 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 @@ -1,16 +1,10 @@ package org.mifosng.platform.api.data; -import java.io.Serializable; +public class EnumOptionData { -public class EnumOptionData implements Serializable { - - private Long id; - private String code; - private String value; - - protected EnumOptionData() { - // - } + 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; @@ -19,26 +13,14 @@ public class EnumOptionData implements Serializable { } public Long getId() { - return this.id; - } - - public void setId(final Long id) { - this.id = id; - } - - public String getValue() { - return this.value; - } - - public void setValue(final String value) { - this.value = value; + return id; } public String getCode() { return code; } - public void setCode(String code) { - this.code = code; + 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 759194839..95821554b 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 @@ -2,6 +2,7 @@ package org.mifosng.platform.api.data; import java.math.BigDecimal; import java.util.Collection; +import java.util.List; import org.joda.time.LocalDate; @@ -17,45 +18,54 @@ public class LoanAccountData { private final Long loanProductId; private final String loanProductName; private final String loanProductDescription; - private final Integer lifeCycleStatusId; - private final String lifeCycleStatusText; - private final LocalDate lifeCycleStatusDate; - + private final EnumOptionData status; private final Long fundId; private final String fundName; - + private final CurrencyData currency; + private final BigDecimal principal; + private final BigDecimal inArrearsTolerance; + + private final Integer termFrequency; + private final EnumOptionData termPeriodFrequencyType; + private final Integer numberOfRepayments; + private final Integer repaymentEvery; + private final EnumOptionData repaymentFrequencyType; + private final Integer transactionStrategyId; + private final EnumOptionData amortizationType; + private final BigDecimal interestRatePerPeriod; + private final EnumOptionData interestRateFrequencyType; + private final BigDecimal annualInterestRate; + private final EnumOptionData interestType; + private final EnumOptionData interestCalculationPeriodType; + + private Collection charges; + private final LocalDate submittedOnDate; private final LocalDate approvedOnDate; private final LocalDate expectedDisbursementDate; private final LocalDate actualDisbursementDate; - private final LocalDate expectedFirstRepaymentOnDate; + private final LocalDate repaymentsStartingFromDate; private final LocalDate interestChargedFromDate; private final LocalDate closedOnDate; private final LocalDate expectedMaturityDate; - - private final CurrencyData currency; - private final MoneyData principal; - private final MoneyData inArrearsTolerance; - - private final Integer numberOfRepayments; - private final Integer repaymentEvery; - private final BigDecimal interestRatePerPeriod; - private final BigDecimal annualInterestRate; - - private final EnumOptionData repaymentFrequencyType; - private final EnumOptionData interestRateFrequencyType; - private final EnumOptionData amortizationType; - private final EnumOptionData interestType; - private final EnumOptionData interestCalculationPeriodType; - + private final LocalDate lifeCycleStatusDate; + + // template + private final Collection productOptions; + private final List termFrequencyTypeOptions; + private final List repaymentFrequencyTypeOptions; + private final Collection repaymentStrategyOptions; + private final Collection fundOptions; + + // associations private final LoanAccountSummaryData summary; private final Collection repaymentSchedule; private final Collection loanRepayments; private final LoanPermissionData permissions; - private final LoanConvenienceData convenienceData; - private Collection charges; + private final List interestRateFrequencyTypeOptions; + public LoanAccountData( final LoanBasicDetailsData basicDetails, @@ -63,12 +73,24 @@ public class LoanAccountData { final Collection repaymentSchedule, final Collection loanRepayments, final LoanPermissionData permissions, - final Collection charges) { + final Collection charges, + final Collection productOptions, + final List termFrequencyTypeOptions, + final List repaymentFrequencyTypeOptions, + final Collection transactionProcessingStrategyOptions, + final List interestRateFrequencyTypeOptions, + final Collection fundOptions) { this.summary = summary; this.repaymentSchedule = repaymentSchedule; this.loanRepayments = loanRepayments; this.permissions = permissions; this.charges = charges; + this.productOptions = productOptions; + this.termFrequencyTypeOptions = termFrequencyTypeOptions; + this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions; + this.repaymentStrategyOptions = transactionProcessingStrategyOptions; + this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions; + this.fundOptions = fundOptions; int maxSubmittedOnOffsetFromToday = basicDetails .getMaxSubmittedOnOffsetFromToday(); @@ -104,16 +126,18 @@ public class LoanAccountData { this.actualDisbursementDate = basicDetails.getActualDisbursementDate(); this.closedOnDate = basicDetails.getClosedOnDate(); this.expectedMaturityDate = basicDetails.getExpectedMaturityDate(); - this.expectedFirstRepaymentOnDate = basicDetails - .getExpectedFirstRepaymentOnDate(); - this.interestChargedFromDate = basicDetails - .getInterestChargedFromDate(); + this.repaymentsStartingFromDate = basicDetails.getExpectedFirstRepaymentOnDate(); + this.interestChargedFromDate = basicDetails.getInterestChargedFromDate(); this.currency = basicDetails.getCurrency(); this.principal = basicDetails.getPrincipal(); this.inArrearsTolerance = basicDetails.getInArrearsTolerance(); + + this.termFrequency = basicDetails.getTermFrequency(); + this.termPeriodFrequencyType = basicDetails.getTermPeriodFrequencyType(); this.numberOfRepayments = basicDetails.getNumberOfRepayments(); this.repaymentEvery = basicDetails.getRepaymentEvery(); + this.transactionStrategyId = basicDetails.getTransactionStrategyId(); this.interestRatePerPeriod = basicDetails.getInterestRatePerPeriod(); this.annualInterestRate = basicDetails.getAnnualInterestRate(); this.repaymentFrequencyType = basicDetails.getRepaymentFrequencyType(); @@ -123,8 +147,8 @@ public class LoanAccountData { this.interestType = basicDetails.getInterestType(); this.interestCalculationPeriodType = basicDetails .getInterestCalculationPeriodType(); - this.lifeCycleStatusText = basicDetails.getLifeCycleStatusText(); - this.lifeCycleStatusId = basicDetails.getLifeCycleStatusId(); + + this.status = basicDetails.getStatus(); this.lifeCycleStatusDate = basicDetails.getLifeCycleStatusDate(); } @@ -155,6 +179,10 @@ public class LoanAccountData { public String getLoanProductDescription() { return loanProductDescription; } + + public EnumOptionData getStatus() { + return status; + } public Long getFundId() { return fundId; @@ -179,9 +207,9 @@ public class LoanAccountData { public LocalDate getActualDisbursementDate() { return actualDisbursementDate; } - - public LocalDate getExpectedFirstRepaymentOnDate() { - return expectedFirstRepaymentOnDate; + + public LocalDate getRepaymentsStartingFromDate() { + return repaymentsStartingFromDate; } public LocalDate getInterestChargedFromDate() { @@ -200,12 +228,20 @@ public class LoanAccountData { return currency; } - public MoneyData getPrincipal() { - return principal; + public BigDecimal getPrincipal() { + return this.principal; } - public MoneyData getInArrearsTolerance() { - return inArrearsTolerance; + public BigDecimal getInArrearsTolerance() { + return this.inArrearsTolerance; + } + + public Integer getTermFrequency() { + return termFrequency; + } + + public EnumOptionData getTermPeriodFrequencyType() { + return termPeriodFrequencyType; } public Integer getNumberOfRepayments() { @@ -215,6 +251,10 @@ public class LoanAccountData { public Integer getRepaymentEvery() { return repaymentEvery; } + + public Integer getTransactionStrategyId() { + return transactionStrategyId; + } public BigDecimal getInterestRatePerPeriod() { return interestRatePerPeriod; @@ -244,14 +284,6 @@ public class LoanAccountData { return interestCalculationPeriodType; } - public Integer getLifeCycleStatusId() { - return lifeCycleStatusId; - } - - public String getLifeCycleStatusText() { - return lifeCycleStatusText; - } - public LocalDate getLifeCycleStatusDate() { return lifeCycleStatusDate; } @@ -283,4 +315,28 @@ public class LoanAccountData { public void setCharges(Collection charges) { this.charges = charges; } + + public Collection getProductOptions() { + return productOptions; + } + + public List getTermFrequencyTypeOptions() { + return termFrequencyTypeOptions; + } + + public List getRepaymentFrequencyTypeOptions() { + return repaymentFrequencyTypeOptions; + } + + public Collection getRepaymentStrategyOptions() { + return repaymentStrategyOptions; + } + + public List getInterestRateFrequencyTypeOptions() { + return interestRateFrequencyTypeOptions; + } + + public Collection getFundOptions() { + return fundOptions; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountSummaryData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountSummaryData.java index 13bb8ff0b..bc15d6e59 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountSummaryData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanAccountSummaryData.java @@ -1,5 +1,7 @@ package org.mifosng.platform.api.data; +import java.math.BigDecimal; + public class LoanAccountSummaryData { private MoneyData originalPrincipal; @@ -46,7 +48,8 @@ public class LoanAccountSummaryData { this.totalInArrears = totalInArrears; } - public boolean isWaiveAllowed(MoneyData tolerance) { + public boolean isWaiveAllowed(final CurrencyData currency, final BigDecimal toleranceAmount) { + MoneyData tolerance = MoneyData.of(currency, toleranceAmount); return this.totalOutstanding.isGreaterThanZero() && (tolerance.isGreaterThan(this.totalOutstanding) || tolerance.isEqualTo(this.totalOutstanding)); } 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 7389999d9..5b9557252 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 @@ -18,6 +18,7 @@ public class LoanBasicDetailsData { private final String loanProductDescription; private final Long fundId; private final String fundName; + private final EnumOptionData status; private final LocalDate submittedOnDate; private final LocalDate approvedOnDate; @@ -29,11 +30,14 @@ public class LoanBasicDetailsData { private final LocalDate expectedMaturityDate; private final CurrencyData currency; - private final MoneyData principal; - private final MoneyData inArrearsTolerance; + private final BigDecimal principal; + private final BigDecimal inArrearsTolerance; + private final Integer termFrequency; + private final EnumOptionData termPeriodFrequencyType; private final Integer numberOfRepayments; private final Integer repaymentEvery; + private final Integer transactionStrategyId; private final BigDecimal interestRatePerPeriod; private final BigDecimal annualInterestRate; @@ -43,8 +47,6 @@ public class LoanBasicDetailsData { private final EnumOptionData interestType; private final EnumOptionData interestCalculationPeriodType; - private final Integer lifeCycleStatusId; - private final String lifeCycleStatusText; private final LocalDate lifeCycleStatusDate; public LoanBasicDetailsData( @@ -64,8 +66,8 @@ public class LoanBasicDetailsData { final LocalDate expectedFirstRepaymentOnDate, final LocalDate interestChargedFromDate, final CurrencyData currency, - final MoneyData principal, - final MoneyData inArrearsTolerance, + final BigDecimal principal, + final BigDecimal inArrearsTolerance, final Integer numberOfRepayments, final Integer repaymentEvery, final BigDecimal interestRatePerPeriod, @@ -75,9 +77,11 @@ public class LoanBasicDetailsData { final EnumOptionData amortizationType, final EnumOptionData interestType, final EnumOptionData interestCalculationPeriodType, - final Integer lifeCycleStatusId, - final String lifeCycleStatusText, - final LocalDate lifeCycleStatusDate) { + final EnumOptionData status, + final LocalDate lifeCycleStatusDate, + final Integer termFrequency, + final EnumOptionData termPeriodFrequencyType, + final Integer transactionStrategyId) { this.id = id; this.externalId = externalId; this.clientId = clientId; @@ -107,9 +111,11 @@ public class LoanBasicDetailsData { this.amortizationType = amortizationType; this.interestType = interestType; this.interestCalculationPeriodType = interestCalculationPeriodType; - this.lifeCycleStatusId = lifeCycleStatusId; - this.lifeCycleStatusText = lifeCycleStatusText; + this.status = status; this.lifeCycleStatusDate = lifeCycleStatusDate; + this.termFrequency = termFrequency; + this.termPeriodFrequencyType = termPeriodFrequencyType; + this.transactionStrategyId = transactionStrategyId; } public int getMaxSubmittedOnOffsetFromToday() { @@ -236,6 +242,18 @@ public class LoanBasicDetailsData { public String getLoanProductDescription() { return loanProductDescription; } + + public EnumOptionData getStatus() { + return status; + } + + public Integer getTermFrequency() { + return termFrequency; + } + + public EnumOptionData getTermPeriodFrequencyType() { + return termPeriodFrequencyType; + } public LocalDate getSubmittedOnDate() { return submittedOnDate; @@ -273,11 +291,11 @@ public class LoanBasicDetailsData { return currency; } - public MoneyData getPrincipal() { + public BigDecimal getPrincipal() { return principal; } - public MoneyData getInArrearsTolerance() { + public BigDecimal getInArrearsTolerance() { return inArrearsTolerance; } @@ -317,15 +335,11 @@ public class LoanBasicDetailsData { return interestCalculationPeriodType; } - public Integer getLifeCycleStatusId() { - return lifeCycleStatusId; - } - - public String getLifeCycleStatusText() { - return lifeCycleStatusText; - } - public LocalDate getLifeCycleStatusDate() { return lifeCycleStatusDate; } + + public Integer getTransactionStrategyId() { + return transactionStrategyId; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java index fc4e3fe20..5724c7682 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java @@ -1,17 +1,17 @@ package org.mifosng.platform.api.data; -import java.io.Serializable; +/** + * Immutable data object used for basic loan product info for lookup situations. + * + * TODO - kw - this can be replace and the normal {@link LoanProductData} used where only id and name are populated as google gson does + * not return null attributes/parameters. + */ +public class LoanProductLookup { -public class LoanProductLookup implements Serializable { + private final Long id; + private final String name; - private Long id; - private String name; - - public LoanProductLookup() { - // - } - - public LoanProductLookup(Long id, String name) { + public LoanProductLookup(final Long id, final String name) { this.id = id; this.name = name; } @@ -20,15 +20,7 @@ public class LoanProductLookup implements Serializable { return id; } - public void setId(Long id) { - this.id = id; - } - public String getName() { return name; } - - public void setName(String name) { - this.name = name; - } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java index bb66e0406..f7da8a9d3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java @@ -151,9 +151,11 @@ public class GoogleGsonApiJsonSerializerService implements "expectedDisbursementDate", "actualDisbursementDate", "expectedFirstRepaymentOnDate", "interestChargedFromDate", "closedOnDate", "expectedMaturityDate", - "lifeCycleStatusId", "lifeCycleStatusText", + "status", "lifeCycleStatusDate", "summary", "repaymentSchedule", - "loanRepayments", "permissions", "convenienceData", "charges")); + "loanRepayments", "permissions", "convenienceData", "charges", + "productOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", + "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "transactionProcessingStrategyOptions", "chargeOptions")); private static final Set LOAN_TRANSACTION_DATA_PARAMETERS = new HashSet( Arrays.asList("id", "transactionType", "date", "principal", diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformService.java index a9a1ec67b..c27cd3e0f 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformService.java @@ -2,13 +2,13 @@ package org.mifosng.platform.loan.service; import java.util.Collection; +import org.mifosng.platform.api.data.CurrencyData; import org.mifosng.platform.api.data.LoanAccountSummaryData; import org.mifosng.platform.api.data.LoanBasicDetailsData; import org.mifosng.platform.api.data.LoanPermissionData; import org.mifosng.platform.api.data.LoanRepaymentPeriodData; -import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.LoanRepaymentTransactionData; -import org.mifosng.platform.api.data.MoneyData; +import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.NewLoanData; public interface LoanReadPlatformService { @@ -19,7 +19,7 @@ public interface LoanReadPlatformService { Collection retrieveLoanPayments(Long loanId); - LoanAccountSummaryData retrieveSummary(MoneyData principal, + LoanAccountSummaryData retrieveSummary(CurrencyData currency, Collection repaymentSchedule, Collection loanRepayments); 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 a62b0c880..0c190e600 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 @@ -17,8 +17,8 @@ import org.mifosng.platform.api.data.LoanPermissionData; import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.api.data.LoanProductLookup; import org.mifosng.platform.api.data.LoanRepaymentPeriodData; -import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.LoanRepaymentTransactionData; +import org.mifosng.platform.api.data.LoanTransactionData; import org.mifosng.platform.api.data.MoneyData; import org.mifosng.platform.api.data.NewLoanData; import org.mifosng.platform.charge.service.ChargeReadPlatformService; @@ -33,7 +33,6 @@ import org.mifosng.platform.infrastructure.JdbcSupport; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; import org.mifosng.platform.loan.domain.Loan; 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.LoanTransactionRepository; import org.mifosng.platform.loan.domain.LoanTransactionType; @@ -114,14 +113,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } @Override - public LoanAccountSummaryData retrieveSummary(MoneyData principal, - Collection repaymentSchedule, - Collection loanRepayments) { - - CurrencyData currencyData = new CurrencyData( - principal.getCurrencyCode(), principal.getDefaultName(), - principal.getDigitsAfterDecimal(), - principal.getDisplaySymbol(), principal.getNameCode()); + public LoanAccountSummaryData retrieveSummary( + final CurrencyData currencyData, + final Collection repaymentSchedule, + final Collection loanRepayments) { BigDecimal originalPrincipal = BigDecimal.ZERO; BigDecimal principalPaid = BigDecimal.ZERO; @@ -214,11 +209,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { LoanBasicDetailsData loanBasicDetails, boolean isWaiverAllowed, int repaymentAndWaiveCount) { - boolean pendingApproval = (loanBasicDetails.getLifeCycleStatusId() - .equals(100)); - boolean waitingForDisbursal = (loanBasicDetails.getLifeCycleStatusId() - .equals(200)); - boolean isActive = (loanBasicDetails.getLifeCycleStatusId().equals(300)); + boolean pendingApproval = (loanBasicDetails.getStatus().getId().equals(100L)); + boolean waitingForDisbursal = (loanBasicDetails.getStatus().getId().equals(200L)); + boolean isActive = (loanBasicDetails.getStatus().getId().equals(300L)); boolean waiveAllowed = isWaiverAllowed && isActive; boolean makeRepaymentAllowed = isActive; @@ -421,8 +414,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { + " l.principal_amount as principal, l.arrearstolerance_amount as inArrearsTolerance, l.number_of_repayments as numberOfRepayments, l.repay_every as repaymentEvery," + " l.nominal_interest_rate_per_period as interestRatePerPeriod, l.annual_nominal_interest_rate as annualInterestRate, " + " l.repayment_period_frequency_enum as repaymentFrequencyType, l.interest_period_frequency_enum as interestRateFrequencyType, " + + " l.term_frequency as termFrequency, l.term_period_frequency_enum as termPeriodFrequencyType, " + " l.amortization_method_enum as amortizationType, l.interest_method_enum as interestType, l.interest_calculated_in_period_enum as interestCalculationPeriodType," - + " l.loan_status_id as lifeCycleStatusId, " + + " l.loan_status_id as lifeCycleStatusId, l.loan_transaction_strategy_id as transactionStrategyId, " + " l.currency_code as currencyCode, l.currency_digits as currencyDigits, rc.`name` as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode" + " from m_loan l" + " join m_client c on c.id = l.client_id" @@ -471,45 +465,37 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { LocalDate expectedMaturityDate = JdbcSupport.getLocalDate(rs, "expectedMaturityDate"); - BigDecimal principalBD = rs.getBigDecimal("principal"); - MoneyData principal = MoneyData.of(currencyData, principalBD); - BigDecimal inArrearsToleranceBD = rs - .getBigDecimal("inArrearsTolerance"); - MoneyData inArrearsTolerance = MoneyData.of(currencyData, - inArrearsToleranceBD); + BigDecimal principal = rs.getBigDecimal("principal"); + BigDecimal inArrearsTolerance = rs.getBigDecimal("inArrearsTolerance"); - Integer numberOfRepayments = JdbcSupport.getInteger(rs, - "numberOfRepayments"); - Integer repaymentEvery = JdbcSupport.getInteger(rs, - "repaymentEvery"); - BigDecimal interestRatePerPeriod = rs - .getBigDecimal("interestRatePerPeriod"); - BigDecimal annualInterestRate = rs - .getBigDecimal("annualInterestRate"); + Integer numberOfRepayments = JdbcSupport.getInteger(rs,"numberOfRepayments"); + Integer repaymentEvery = JdbcSupport.getInteger(rs,"repaymentEvery"); + BigDecimal interestRatePerPeriod = rs.getBigDecimal("interestRatePerPeriod"); + BigDecimal annualInterestRate = rs.getBigDecimal("annualInterestRate"); - int repaymentFrequencyTypeInt = JdbcSupport.getInteger(rs, - "repaymentFrequencyType"); - int interestRateFrequencyTypeInt = JdbcSupport.getInteger(rs, - "interestRateFrequencyType"); - int amortizationTypeInt = JdbcSupport.getInteger(rs, - "amortizationType"); + Integer termFrequency = JdbcSupport.getInteger(rs,"termFrequency"); + Integer termPeriodFrequencyTypeInt = JdbcSupport.getInteger(rs,"termPeriodFrequencyType"); + EnumOptionData termPeriodFrequencyType = LoanEnumerations.termFrequencyType(termPeriodFrequencyTypeInt); + + int repaymentFrequencyTypeInt = JdbcSupport.getInteger(rs,"repaymentFrequencyType"); + EnumOptionData repaymentFrequencyType = LoanEnumerations.repaymentFrequencyType(repaymentFrequencyTypeInt); + + int interestRateFrequencyTypeInt = JdbcSupport.getInteger(rs,"interestRateFrequencyType"); + EnumOptionData interestRateFrequencyType = LoanEnumerations.interestRateFrequencyType(interestRateFrequencyTypeInt); + + Integer transactionStrategyId = JdbcSupport.getInteger(rs,"transactionStrategyId"); + + int amortizationTypeInt = JdbcSupport.getInteger(rs,"amortizationType"); int interestTypeInt = JdbcSupport.getInteger(rs, "interestType"); - int interestCalculationPeriodTypeInt = JdbcSupport.getInteger(rs, - "interestCalculationPeriodType"); - EnumOptionData repaymentFrequencyType = LoanEnumerations - .repaymentFrequencyType(repaymentFrequencyTypeInt); - EnumOptionData interestRateFrequencyType = LoanEnumerations - .interestRateFrequencyType(interestRateFrequencyTypeInt); - EnumOptionData amortizationType = LoanEnumerations - .amortizationType(amortizationTypeInt); - EnumOptionData interestType = LoanEnumerations - .interestType(interestTypeInt); - EnumOptionData interestCalculationPeriodType = LoanEnumerations - .interestCalculationPeriodType(interestCalculationPeriodTypeInt); + int interestCalculationPeriodTypeInt = JdbcSupport.getInteger(rs,"interestCalculationPeriodType"); + + EnumOptionData amortizationType = LoanEnumerations.amortizationType(amortizationTypeInt); + EnumOptionData interestType = LoanEnumerations.interestType(interestTypeInt); + EnumOptionData interestCalculationPeriodType = LoanEnumerations.interestCalculationPeriodType(interestCalculationPeriodTypeInt); Integer lifeCycleStatusId = JdbcSupport.getInteger(rs, "lifeCycleStatusId"); - String lifeCycleStatusText = LoanStatus.fromInt(lifeCycleStatusId).getCode(); - + EnumOptionData status = LoanEnumerations.status(lifeCycleStatusId); + LocalDate lifeCycleStatusDate = submittedOnDate; if (approvedOnDate != null) { lifeCycleStatusDate = approvedOnDate; @@ -523,7 +509,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { return new LoanBasicDetailsData(id, externalId, clientId, clientName, loanProductId, loanProductName, loanProductDescription, - fundId, fundName, closedOnDate, + fundId, fundName, + closedOnDate, submittedOnDate, approvedOnDate, expectedDisbursementDate, actualDisbursementDate, expectedMaturityDate, expectedFirstRepaymentOnDate, interestChargedFromDate, @@ -532,8 +519,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { repaymentEvery, interestRatePerPeriod, annualInterestRate, repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType, - interestCalculationPeriodType, lifeCycleStatusId, - lifeCycleStatusText, lifeCycleStatusDate); + interestCalculationPeriodType, + status, + lifeCycleStatusDate, termFrequency, termPeriodFrequencyType, transactionStrategyId); } } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanEnumerations.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanEnumerations.java index 129ccce15..1a7ca6f78 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanEnumerations.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanEnumerations.java @@ -4,6 +4,7 @@ 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; @@ -36,6 +37,30 @@ public class LoanEnumerations { return optionData; } + public static EnumOptionData termFrequencyType(final int id) { + return termFrequencyType(PeriodFrequencyType.fromInt(id)); + } + + public static EnumOptionData termFrequencyType(final PeriodFrequencyType type) { + final String codePrefix = "termFrequency."; + EnumOptionData optionData = null; + switch (type) { + case DAYS: + optionData = new EnumOptionData(PeriodFrequencyType.DAYS.getValue().longValue(), codePrefix + PeriodFrequencyType.DAYS.getCode(), "Days"); + break; + case WEEKS: + optionData = new EnumOptionData(PeriodFrequencyType.WEEKS.getValue().longValue(), codePrefix + PeriodFrequencyType.WEEKS.getCode(), "Weeks"); + break; + case MONTHS: + optionData = new EnumOptionData(PeriodFrequencyType.MONTHS.getValue().longValue(), codePrefix + PeriodFrequencyType.MONTHS.getCode(), "Months"); + break; + default: + optionData = new EnumOptionData(PeriodFrequencyType.INVALID.getValue().longValue(), PeriodFrequencyType.INVALID.getCode(), "Invalid"); + break; + } + return optionData; + } + public static EnumOptionData repaymentFrequencyType(final int id) { return repaymentFrequencyType(PeriodFrequencyType.fromInt(id)); } @@ -141,11 +166,11 @@ public class LoanEnumerations { return optionData; } - public static EnumOptionData transactionType(Integer id) { + public static EnumOptionData transactionType(final Integer id) { return transactionType(LoanTransactionType.fromInt(id)); } - public static EnumOptionData transactionType(LoanTransactionType type) { + public static EnumOptionData transactionType(final LoanTransactionType type) { EnumOptionData optionData = null; switch (type) { case DISBURSEMENT: @@ -166,4 +191,39 @@ public class LoanEnumerations { } return optionData; } + + public static EnumOptionData status(final Integer statusId) { + return status(LoanStatus.fromInt(statusId)); + } + + public static EnumOptionData status(final LoanStatus status) { + EnumOptionData optionData = null; + switch (status) { + case SUBMITED_AND_PENDING_APPROVAL: + optionData = new EnumOptionData(LoanStatus.SUBMITED_AND_PENDING_APPROVAL.getValue().longValue(), LoanStatus.SUBMITED_AND_PENDING_APPROVAL.getCode(), "Submitted and pending approval"); + break; + case APPROVED: + optionData = new EnumOptionData(LoanStatus.APPROVED.getValue().longValue(), LoanStatus.APPROVED.getCode(), "Approved"); + break; + case ACTIVE: + optionData = new EnumOptionData(LoanStatus.ACTIVE.getValue().longValue(), LoanStatus.ACTIVE.getCode(), "Active"); + break; + case REJECTED: + optionData = new EnumOptionData(LoanStatus.REJECTED.getValue().longValue(), LoanStatus.REJECTED.getCode(), "Rejected"); + break; + case WITHDRAWN_BY_CLIENT: + optionData = new EnumOptionData(LoanStatus.WITHDRAWN_BY_CLIENT.getValue().longValue(), LoanStatus.WITHDRAWN_BY_CLIENT.getCode(), "Withdrawn by applicant"); + break; + case CLOSED: + optionData = new EnumOptionData(LoanStatus.CLOSED.getValue().longValue(), LoanStatus.CLOSED.getCode(), "Closed"); + break; + case OVERPAID: + optionData = new EnumOptionData(LoanStatus.OVERPAID.getValue().longValue(), LoanStatus.OVERPAID.getCode(), "Overpaid"); + break; + default: + optionData = new EnumOptionData(LoanStatus.INVALID.getValue().longValue(), LoanStatus.INVALID.getCode(), "Invalid"); + break; + } + return optionData; + } } \ No newline at end of file