MIFOSX-232: align loan account api data with loan product data.

This commit is contained in:
Keith Woodlock
2013-03-08 14:11:48 +00:00
parent e3f03f1de3
commit 7ad92a0330
7 changed files with 126 additions and 82 deletions
@@ -153,27 +153,6 @@ public class LoansApiResource {
// template
final Collection<LoanProductData> productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup();
final Collection<EnumOptionData> loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions();
final Collection<EnumOptionData> repaymentFrequencyTypeOptions = dropdownReadPlatformService
.retrieveRepaymentFrequencyTypeOptions();
final Collection<EnumOptionData> interestRateFrequencyTypeOptions = dropdownReadPlatformService
.retrieveInterestRateFrequencyTypeOptions();
final Collection<EnumOptionData> amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions();
final Collection<EnumOptionData> interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions();
final Collection<EnumOptionData> interestCalculationPeriodTypeOptions = dropdownReadPlatformService
.retrieveLoanInterestRateCalculatedInPeriodOptions();
final Collection<FundData> fundOptions = this.fundReadPlatformService.retrieveAllFunds();
final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions = this.dropdownReadPlatformService
.retreiveTransactionProcessingStrategies();
final Collection<CodeValueData> loanPurposeOptions = this.codeValueReadPlatformService.retrieveCodeValuesByCode("LoanPurpose");
final Collection<CodeValueData> loanCollateralOptions = this.codeValueReadPlatformService
.retrieveCodeValuesByCode("LoanCollateral");
final boolean feeChargesOnly = false;
final Collection<ChargeData> chargeOptions = this.chargeReadPlatformService.retrieveLoanApplicableCharges(feeChargesOnly);
final ChargeData chargeTemplate = this.loanChargeReadPlatformService.retrieveLoanChargeTemplate();
// associations
final LoanScheduleData repaymentSchedule = null;
@@ -181,12 +160,50 @@ public class LoansApiResource {
final Collection<LoanCollateralData> collateral = null;
final Collection<GuarantorData> guarantors = null;
// options
Collection<EnumOptionData> loanTermFrequencyTypeOptions = null;
Collection<EnumOptionData> repaymentFrequencyTypeOptions = null;
Collection<EnumOptionData> interestRateFrequencyTypeOptions = null;
Collection<EnumOptionData> amortizationTypeOptions = null;
Collection<EnumOptionData> interestTypeOptions = null;
Collection<EnumOptionData> interestCalculationPeriodTypeOptions = null;
Collection<FundData> fundOptions = null;
Collection<TransactionProcessingStrategyData> repaymentStrategyOptions = null;
Collection<StaffData> allowedLoanOfficers = null;
Collection<CodeValueData> loanPurposeOptions = null;
Collection<CodeValueData> loanCollateralOptions = null;
Collection<ChargeData> chargeOptions = null;
ChargeData chargeTemplate = null;
if (productId != null) {
loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions();
repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions();
interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions();
amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions();
interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions();
interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions();
fundOptions = this.fundReadPlatformService.retrieveAllFunds();
repaymentStrategyOptions = this.dropdownReadPlatformService.retreiveTransactionProcessingStrategies();
loanPurposeOptions = this.codeValueReadPlatformService.retrieveCodeValuesByCode("LoanPurpose");
loanCollateralOptions = this.codeValueReadPlatformService.retrieveCodeValuesByCode("LoanCollateral");
final boolean feeChargesOnly = false;
chargeOptions = this.chargeReadPlatformService.retrieveLoanApplicableCharges(feeChargesOnly);
// chargeTemplate =
// this.loanChargeReadPlatformService.retrieveLoanChargeTemplate();
}
LoanAccountData newLoanAccount = null;
if (clientId != null) {
final LoanAccountData loanBasicDetails = this.loanReadPlatformService.retrieveClientAndProductDetails(clientId, productId);
final LoanAccountData loanBasicDetails = this.loanReadPlatformService.retrieveTemplateWithClientAndProductDetails(clientId,
productId);
final Collection<LoanChargeData> charges = loanBasicDetails.charges();
final Long officeId = loanBasicDetails.officeId();
final Collection<StaffData> allowedLoanOfficers = this.staffReadPlatformService.retrieveAllLoanOfficersByOffice(officeId);
if (productId != null) {
final Long officeId = loanBasicDetails.officeId();
allowedLoanOfficers = this.staffReadPlatformService.retrieveAllLoanOfficersByOffice(officeId);
}
newLoanAccount = LoanAccountData.associationsAndTemplate(loanBasicDetails, repaymentSchedule, loanRepayments, charges,
collateral, guarantors, productOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions,
@@ -195,10 +212,13 @@ public class LoansApiResource {
loanPurposeOptions, loanCollateralOptions);
} else if (groupId != null) {
final LoanAccountData loanBasicDetails = this.loanReadPlatformService.retrieveGroupAndProductDetails(groupId, productId);
final LoanAccountData loanBasicDetails = this.loanReadPlatformService.retrieveTemplateWithGroupAndProductDetails(groupId,
productId);
final Collection<LoanChargeData> charges = loanBasicDetails.charges();
final Long officeId = loanBasicDetails.officeId();
final Collection<StaffData> allowedLoanOfficers = this.staffReadPlatformService.retrieveAllLoanOfficersByOffice(officeId);
if (productId != null) {
final Long officeId = loanBasicDetails.officeId();
allowedLoanOfficers = this.staffReadPlatformService.retrieveAllLoanOfficersByOffice(officeId);
}
newLoanAccount = LoanAccountData.associationsAndTemplate(loanBasicDetails, repaymentSchedule, loanRepayments, charges,
collateral, guarantors, productOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions,
@@ -22,6 +22,7 @@ import org.mifosplatform.portfolio.loanaccount.guarantor.data.GuarantorData;
import org.mifosplatform.portfolio.loanaccount.loanschedule.data.LoanScheduleData;
import org.mifosplatform.portfolio.loanproduct.data.LoanProductData;
import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData;
import org.springframework.util.CollectionUtils;
/**
* Immutable data object representing loan account data.
@@ -30,10 +31,16 @@ import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrateg
public class LoanAccountData {
// basic loan details
// identity
private final Long id;
private final String accountNo;
private final LoanStatusEnumData status;
private final String externalId;
// status
private final LoanStatusEnumData status;
// related to
private final Long clientId;
private final String clientName;
private final Long clientOfficeId;
@@ -49,27 +56,31 @@ public class LoanAccountData {
private final String loanPurposeName;
private final Long loanOfficerId;
private final String loanOfficerName;
// terms
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 Long transactionProcessingStrategyId;
private final EnumOptionData amortizationType;
private final BigDecimal interestRatePerPeriod;
private final EnumOptionData interestRateFrequencyType;
private final BigDecimal annualInterestRate;
private final EnumOptionData interestType;
private final EnumOptionData interestCalculationPeriodType;
// settings
private final EnumOptionData amortizationType;
private final EnumOptionData interestType;
private final EnumOptionData interestCalculationPeriodType;
private final BigDecimal inArrearsTolerance;
private final Long transactionProcessingStrategyId;
private final LocalDate expectedFirstRepaymentOnDate;
private final LocalDate interestChargedFromDate;
// timeline
private final LoanApplicationTimelineData timeline;
// totals
private final LoanSummaryData summary;
@@ -81,22 +92,20 @@ public class LoanAccountData {
private final Collection<GuarantorData> guarantors;
// template
private final Collection<StaffData> loanOfficerOptions;
private final Collection<LoanProductData> productOptions;
private final Collection<StaffData> loanOfficerOptions;
private final Collection<CodeValueData> loanPurposeOptions;
private final Collection<FundData> fundOptions;
private final Collection<EnumOptionData> termFrequencyTypeOptions;
private final Collection<EnumOptionData> repaymentFrequencyTypeOptions;
private final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions;
private final Collection<EnumOptionData> interestRateFrequencyTypeOptions;
private final Collection<EnumOptionData> amortizationTypeOptions;
private final Collection<EnumOptionData> interestTypeOptions;
private final Collection<EnumOptionData> interestCalculationPeriodTypeOptions;
private final Collection<FundData> fundOptions;
private final Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions;
private final Collection<ChargeData> chargeOptions;
private final Collection<CodeValueData> loanPurposeOptions;
private final Collection<CodeValueData> loanCollateralOptions;
private final ChargeData chargeTemplate;
@Transient
private BigDecimal feeChargesAtDisbursementCharged;
@@ -153,7 +162,7 @@ public class LoanAccountData {
final Collection<LoanProductData> productOptions = null;
final Collection<EnumOptionData> termFrequencyTypeOptions = null;
final Collection<EnumOptionData> repaymentFrequencyTypeOptions = null;
final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions = null;
final Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions = null;
final Collection<EnumOptionData> interestRateFrequencyTypeOptions = null;
final Collection<EnumOptionData> amortizationTypeOptions = null;
final Collection<EnumOptionData> interestTypeOptions = null;
@@ -171,9 +180,9 @@ public class LoanAccountData {
interestRatePerPeriod, interestRateFrequencyType, annualInterestRate, interestType, interestCalculationPeriodType,
expectedFirstRepaymentOnDate, interestChargedFromDate, timeline, summary, feeChargesDueAtDisbursementCharged,
repaymentSchedule, transactions, charges, collateral, guarantors, productOptions, termFrequencyTypeOptions,
repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions,
interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions,
loanPurposeOptions, loanCollateralOptions);
repaymentFrequencyTypeOptions, transactionProcessingStrategyOptions, interestRateFrequencyTypeOptions,
amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions,
chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions);
}
/**
@@ -429,7 +438,7 @@ public class LoanAccountData {
final Collection<LoanCollateralData> collateral, final Collection<GuarantorData> guarantors,
final Collection<LoanProductData> productOptions, final Collection<EnumOptionData> termFrequencyTypeOptions,
final Collection<EnumOptionData> repaymentFrequencyTypeOptions,
final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions,
final Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions,
final Collection<EnumOptionData> interestRateFrequencyTypeOptions, final Collection<EnumOptionData> amortizationTypeOptions,
final Collection<EnumOptionData> interestTypeOptions, final Collection<EnumOptionData> interestCalculationPeriodTypeOptions,
final Collection<FundData> fundOptions, final Collection<ChargeData> chargeOptions, final ChargeData chargeTemplate,
@@ -443,7 +452,7 @@ public class LoanAccountData {
acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType,
acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.interestChargedFromDate, acc.timeline,
acc.summary, acc.feeChargesAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, guarantors,
productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions,
productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, transactionProcessingStrategyOptions,
interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions,
fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions);
}
@@ -476,23 +485,16 @@ public class LoanAccountData {
final Integer numberOfRepayments,
final Integer repaymentEvery,
final EnumOptionData repaymentFrequencyType, //
final Long transactionProcessingStrategyId,
final EnumOptionData amortizationType,
final BigDecimal interestRatePerPeriod,
final EnumOptionData interestRateFrequencyType,
final BigDecimal annualInterestRate,
final EnumOptionData interestType,
final EnumOptionData interestCalculationPeriodType,
final LocalDate expectedFirstRepaymentOnDate,
final LocalDate interestChargedFromDate,
final LoanApplicationTimelineData timeline,
final LoanSummaryData summary, //
final Long transactionProcessingStrategyId, final EnumOptionData amortizationType, final BigDecimal interestRatePerPeriod,
final EnumOptionData interestRateFrequencyType, final BigDecimal annualInterestRate, final EnumOptionData interestType,
final EnumOptionData interestCalculationPeriodType, final LocalDate expectedFirstRepaymentOnDate,
final LocalDate interestChargedFromDate, final LoanApplicationTimelineData timeline, final LoanSummaryData summary,
final BigDecimal feeChargesDueAtDisbursementCharged, final LoanScheduleData repaymentSchedule,
final Collection<LoanTransactionData> transactions, final Collection<LoanChargeData> charges,
final Collection<LoanCollateralData> collateral, final Collection<GuarantorData> guarantors,
final Collection<LoanProductData> productOptions, final Collection<EnumOptionData> termFrequencyTypeOptions,
final Collection<EnumOptionData> repaymentFrequencyTypeOptions,
final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions,
final Collection<TransactionProcessingStrategyData> transactionProcessingStrategyOptions,
final Collection<EnumOptionData> interestRateFrequencyTypeOptions, final Collection<EnumOptionData> amortizationTypeOptions,
final Collection<EnumOptionData> interestTypeOptions, final Collection<EnumOptionData> interestCalculationPeriodTypeOptions,
final Collection<FundData> fundOptions, final Collection<ChargeData> chargeOptions, final ChargeData chargeTemplate,
@@ -550,17 +552,46 @@ public class LoanAccountData {
this.productOptions = productOptions;
this.termFrequencyTypeOptions = termFrequencyTypeOptions;
this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions;
this.repaymentStrategyOptions = repaymentStrategyOptions;
this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions;
this.amortizationTypeOptions = amortizationTypeOptions;
this.interestTypeOptions = interestTypeOptions;
this.interestCalculationPeriodTypeOptions = interestCalculationPeriodTypeOptions;
this.fundOptions = fundOptions;
this.chargeOptions = chargeOptions;
this.chargeTemplate = chargeTemplate;
this.loanOfficerOptions = loanOfficerOptions;
this.loanPurposeOptions = loanPurposeOptions;
this.loanCollateralOptions = loanCollateralOptions;
if (CollectionUtils.isEmpty(transactionProcessingStrategyOptions)) {
this.transactionProcessingStrategyOptions = null;
} else {
this.transactionProcessingStrategyOptions = transactionProcessingStrategyOptions;
}
if (CollectionUtils.isEmpty(fundOptions)) {
this.fundOptions = null;
} else {
this.fundOptions = fundOptions;
}
if (CollectionUtils.isEmpty(chargeOptions)) {
this.chargeOptions = null;
} else {
this.chargeOptions = chargeOptions;
}
if (CollectionUtils.isEmpty(loanOfficerOptions)) {
this.loanOfficerOptions = null;
} else {
this.loanOfficerOptions = loanOfficerOptions;
}
if (CollectionUtils.isEmpty(loanPurposeOptions)) {
this.loanPurposeOptions = null;
} else {
this.loanPurposeOptions = loanPurposeOptions;
}
if (CollectionUtils.isEmpty(loanCollateralOptions)) {
this.loanCollateralOptions = null;
} else {
this.loanCollateralOptions = loanCollateralOptions;
}
}
public RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData() {
@@ -20,9 +20,9 @@ public interface LoanReadPlatformService {
Collection<LoanTransactionData> retrieveLoanTransactions(Long loanId);
LoanAccountData retrieveClientAndProductDetails(Long clientId, Long productId);
LoanAccountData retrieveTemplateWithClientAndProductDetails(Long clientId, Long productId);
LoanAccountData retrieveGroupAndProductDetails(Long groupId, Long productId);
LoanAccountData retrieveTemplateWithGroupAndProductDetails(Long groupId, Long productId);
LoanTransactionData retrieveLoanTransactionTemplate(Long loanId);
@@ -136,7 +136,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
}
@Override
public LoanAccountData retrieveClientAndProductDetails(final Long clientId, final Long productId) {
public LoanAccountData retrieveTemplateWithClientAndProductDetails(final Long clientId, final Long productId) {
context.authenticatedUser();
@@ -154,7 +154,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
}
@Override
public LoanAccountData retrieveGroupAndProductDetails(final Long groupId, final Long productId) {
public LoanAccountData retrieveTemplateWithGroupAndProductDetails(final Long groupId, final Long productId) {
context.authenticatedUser();
@@ -156,11 +156,9 @@ public class LoanProductData {
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;
@@ -180,7 +178,6 @@ public class LoanProductData {
this.amortizationTypeOptions = null;
this.interestTypeOptions = null;
this.interestCalculationPeriodTypeOptions = null;
// this.loanTermFrequencyTypeOptions = null;
this.repaymentFrequencyTypeOptions = null;
this.interestRateFrequencyTypeOptions = null;
@@ -15,7 +15,6 @@ import javax.ws.rs.core.UriInfo;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.search.SearchConstants.SEARCH_RESPONSE_PARAMETERS;
import org.mifosplatform.portfolio.search.data.SearchConditions;
import org.mifosplatform.portfolio.search.data.SearchData;
@@ -31,15 +30,14 @@ public class SearchApiResource {
private final Set<String> searchResponseParameters = SEARCH_RESPONSE_PARAMETERS.getAllValues();
private final PlatformSecurityContext context;
private final SearchReadPlatformService searchReadPlatformService;
private final ToApiJsonSerializer<SearchData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper;
@Autowired
public SearchApiResource(final PlatformSecurityContext context, final SearchReadPlatformService searchReadPlatformService, final ToApiJsonSerializer<SearchData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper) {
public SearchApiResource(final SearchReadPlatformService searchReadPlatformService,
final ToApiJsonSerializer<SearchData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper) {
this.context = context;
this.searchReadPlatformService = searchReadPlatformService;
this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper;
@@ -49,16 +47,14 @@ public class SearchApiResource {
@GET
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String searchData(@Context final UriInfo uriInfo, @QueryParam("query") final String query, @QueryParam("resource") final String resource) {
public String searchData(@Context final UriInfo uriInfo, @QueryParam("query") final String query,
@QueryParam("resource") final String resource) {
// FIXME - Do we need to validate for permissions
SearchConditions searchConditions = new SearchConditions(query, resource);
final SearchConditions searchConditions = new SearchConditions(query, resource);
final Collection<SearchData> searchResults = this.searchReadPlatformService.retriveMatchingData(searchConditions);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return this.toApiJsonSerializer.serialize(settings, searchResults, searchResponseParameters);
}
}
}
@@ -5,7 +5,7 @@ import java.util.Collection;
import org.mifosplatform.portfolio.search.data.SearchConditions;
import org.mifosplatform.portfolio.search.data.SearchData;
public interface SearchReadPlatformService {
Collection<SearchData> retriveMatchingData(SearchConditions searchConditions);
}