update loan creation and retrieval.

This commit is contained in:
Keith Woodlock
2012-12-21 15:28:39 +00:00
parent e4ee41174d
commit c99053d2a4
7 changed files with 767 additions and 764 deletions
+106 -105
View File
@@ -626,7 +626,7 @@ Request Body:
</code> </code>
<code class="method-response"> <code class="method-response">
{ {
"entityId":23 "resourceId":23
} }
</code> </code>
</div> </div>
@@ -644,7 +644,7 @@ Request Body:
</code> </code>
<code class="method-response"> <code class="method-response">
{ {
"entityId":26 "resourceId":26
} }
</code> </code>
</div> </div>
@@ -666,7 +666,7 @@ Request Body:
"joiningDate": "09 June 2006" "joiningDate": "09 June 2006"
} }
</code> </code>
<code class="method-response">{ "entityId": 23}</code> <code class="method-response">{ "resourceId": 23}</code>
</div> </div>
</div> </div>
@@ -794,7 +794,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 40 "resourceId": 40
} }
</code> </code>
</div> </div>
@@ -848,7 +848,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 20 "resourceId": 20
} }
</code> </code>
</div> </div>
@@ -1150,70 +1150,67 @@ Request Body:
<div class="method-example"> <div class="method-example">
<code class="method-declaration">GET https://Domain Name/api/v1/loans/{loanId}</code> <code class="method-declaration">GET https://Domain Name/api/v1/loans/{loanId}</code>
<code class="method-response">{ <code class="method-response">{
"id" : 1, {
"externalId" : null, "id": 1,
"loanProductName" : "Agricultural Loan", "clientId": 1,
"submittedOnDate" : [ 2009, 1, 5 ], "clientName": "Willie O'Meara",
"approvedOnDate" : [ 2009, 1, 8 ], "loanProductId": 1,
"expectedDisbursementDate" : [ 2009, 1, 15 ], "loanProductName": "Agricultural Loan",
"actualDisbursementDate" : [ 2009, 1, 15 ], "loanProductDescription": "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)",
"expectedFirstRepaymentOnDate" : null, "status": {
"interestChargedFromDate" : null, "id": 100,
"closedOnDate" : [ 2009, 11, 13 ], "code": "loanStatusType.submitted.and.pending.approval",
"expectedMaturityDate" : [ 2009, 11, 15 ], "value": "Submitted and pending approval"
"principal" : {
"currencyCode" : "XOF",
"digitsAfterDecimal" : 0,
"amount" : 100000,
"defaultName" : "CFA Franc BCEAO",
"nameCode" : "currency.XOF",
"displaySymbol" : "CFA",
"zero" : false,
"greaterThanZero" : true,
"displaySymbolValue" : "100000 CFA"
}, },
"inArrearsTolerance" : { "currency": {
"currencyCode" : "XOF", "code": "XOF",
"digitsAfterDecimal" : 0, "name": "CFA Franc BCEAO",
"amount" : 1000, "decimalPlaces": 0,
"defaultName" : "CFA Franc BCEAO", "displaySymbol": "CFA",
"nameCode" : "currency.XOF", "nameCode": "currency.XOF",
"displaySymbol" : "CFA", "displayLabel": "CFA Franc BCEAO (CFA)"
"zero" : false,
"greaterThanZero" : true,
"displaySymbolValue" : "1000 CFA"
}, },
"numberOfRepayments" : 1, "principal": 100000,
"repaymentEvery" : 10, "termFrequency": 12,
"interestRatePerPeriod" : 1.75, "termPeriodFrequencyType": {
"annualInterestRate" : 21.0, "id": 2,
"repaymentFrequencyType" : { "code": "termFrequency.periodFrequencyType.months",
"id" : 2, "value": "Months"
"code" : "repaymentFrequency.periodFrequencyType.months",
"value" : "Months"
}, },
"interestRateFrequencyType" : { "numberOfRepayments": 12,
"id" : 2, "repaymentEvery": 1,
"code" : "interestRateFrequency.periodFrequencyType.months", "repaymentFrequencyType": {
"value" : "Per month" "id": 2,
"code": "repaymentFrequency.periodFrequencyType.months",
"value": "Months"
}, },
"amortizationType" : { "transactionProcessingStrategyId": 1,
"id" : 1, "amortizationType": {
"code" : "amortizationType.equal.installments", "id": 1,
"value" : "Equal installments" "code": "amortizationType.equal.installments",
"value": "Equal installments"
}, },
"interestType" : { "interestRatePerPeriod": 2,
"id" : 0, "interestRateFrequencyType": {
"code" : "interestType.declining.balance", "id": 2,
"value" : "Declining Balance" "code": "interestRateFrequency.periodFrequencyType.months",
"value": "Per month"
}, },
"interestCalculationPeriodType" : { "annualInterestRate": 24,
"id" : 1, "interestType": {
"code" : "interestCalculationPeriodType.same.as.repayment.period", "id": 0,
"value" : "Same as repayment period" "code": "interestType.declining.balance",
"value": "Declining Balance"
}, },
"lifeCycleStatusText" : "Closed", "interestCalculationPeriodType": {
"lifeCycleStatusDate" : [ 2009, 11, 13 ] "id": 1,
"code": "interestCalculationPeriodType.same.as.repayment.period",
"value": "Same as repayment period"
},
"submittedOnDate": [2011,9,20],
"expectedDisbursementDate": [2011,9,20],
"expectedMaturityDate": [2012,9,20],
"lifeCycleStatusDate": [2011,9,20]
} }
</code> </code>
</div> </div>
@@ -1235,9 +1232,9 @@ Request Body:
<br> <br>
<table class=matrixHeading> <table class=matrixHeading>
<tr class="matrixHeadingBG"><td><div class="mifosXHeading2">Mandatory Fields</div></td></tr> <tr class="matrixHeadingBG"><td><div class="mifosXHeading2">Mandatory Fields</div></td></tr>
<tr class=alt><td>clientId, productId, inArrearsTolerance, submittedOnDate, principal, <tr class=alt><td>clientId, productId, principal, loanTermFrequency, loanTermFrequencyType, numberOfRepayments,
repaymentFrequencyType, repaymentEvery, numberOfRepayments, interestRatePerPeriod, interestRateFrequencyType, amortizationType, repaymentEvery, repaymentFrequencyType, interestRatePerPeriod, interestRateFrequencyType, amortizationType,
interestType, interestCalculationPeriodType, expectedDisbursementDate</td></tr> interestType, interestCalculationPeriodType, expectedDisbursementDate, submittedOnDate, transactionProcessingStrategyId</td></tr>
</table> </table>
</div> </div>
<div class="method-example"> <div class="method-example">
@@ -1246,26 +1243,29 @@ Request Body:
Content-Type: application/json Content-Type: application/json
Request Body: Request Body:
{ {
"clientId": 1, "dateFormat": "dd MMMM yyyy",
"productId": 1, "locale": "en_GB",
"locale": "en_GB", "clientId": 1,
"principal": "100,000.00", "productId": 1,
"inArrearsTolerance": "1,000.00", "principal": "100,000.00",
"repaymentFrequencyType": 2, "loanTermFrequency": 12,
"repaymentEvery": "1", "loanTermFrequencyType": 2,
"numberOfRepayments": "12", "numberOfRepayments": 12,
"interestRatePerPeriod": "1.75", "repaymentEvery": 1,
"interestRateFrequencyType": 2, "repaymentFrequencyType": 2,
"amortizationType": 1, "interestRatePerPeriod": 2,
"interestCalculationPeriodType": 1, "interestRateFrequencyType": 2,
"interestType": 0, "amortizationType": 1,
"dateFormat": "dd MMMM yyyy", "interestType": 0,
"expectedDisbursementDate": "01 July 2007", "interestCalculationPeriodType": 1,
"submittedOnDate": "25 June 2007" "expectedDisbursementDate": "20 September 2011",
"submittedOnDate": "20 September 2011",
"transactionProcessingStrategyId": 1
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 42 "resourceId": 42
} }
</code> </code>
</div> </div>
@@ -1274,7 +1274,7 @@ Request Body:
<a id="loans_approve_etc" name="loans_approve_etc" class="old-syle-anchor">&nbsp;</a> <a id="loans_approve_etc" name="loans_approve_etc" class="old-syle-anchor">&nbsp;</a>
<div class="method-section"> <div class="method-section">
<div class="method-description"> <div class="method-description">
<h4>Approve, Undo Approval, Disburse, Undo Disbursal, Reject a Loan or Withdraw a Loan Application</h4> <h4>Approve, Undo Approval, Disburse, Undo Disbursal, Reject or Withdraw a Loan Application</h4>
<h5>Arguments</h5> <h5>Arguments</h5>
<dl class="argument-list"> <dl class="argument-list">
<dt>command</dt> <dt>command</dt>
@@ -1302,8 +1302,9 @@ Request Body:
"eventDate": "07 May 2012", "eventDate": "07 May 2012",
"note": "and event note is added" "note": "and event note is added"
} </code> } </code>
<code class="method-response">{ <code class="method-response">
"entityId": 37 {
"resourceId": 37
} }
</code> </code>
</div> </div>
@@ -1323,7 +1324,7 @@ Content-Type: application/json
No Request Body: No Request Body:
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -1403,7 +1404,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 37 "resourceId": 37
} }
</code> </code>
</div> </div>
@@ -1465,7 +1466,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 16 "resourceId": 16
} }
</code> </code>
</div> </div>
@@ -1618,7 +1619,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 9 "resourceId": 9
} }
</code> </code>
</div> </div>
@@ -1639,7 +1640,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -2105,7 +2106,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 9 "resourceId": 9
} }
</code> </code>
</div> </div>
@@ -2128,7 +2129,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -2299,7 +2300,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": null "resourceId": null
} }
</code> </code>
</div> </div>
@@ -2323,7 +2324,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": null "resourceId": null
} }
</code> </code>
</div> </div>
@@ -2361,7 +2362,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -2439,7 +2440,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -2469,7 +2470,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -2493,7 +2494,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -2516,7 +2517,7 @@ Request Body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 1 "resourceId": 1
} }
</code> </code>
</div> </div>
@@ -2992,7 +2993,7 @@ Request body:
</code> </code>
<code class="method-response"> <code class="method-response">
{ {
"entityId": 11 "resourceId": 11
} }
</code> </code>
</div> </div>
@@ -3019,7 +3020,7 @@ Request body:
</code> </code>
<code class="method-response"> <code class="method-response">
{ {
"entityId": 3 "resourceId": 3
} }
</code> </code>
</div> </div>
@@ -3038,7 +3039,7 @@ Content-Type: application/json
No Request Body No Request Body
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 20 "resourceId": 20
} }
</code> </code>
</div> </div>
@@ -3131,7 +3132,7 @@ Request body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 8 "resourceId": 8
} }
</code> </code>
</div> </div>
@@ -3152,7 +3153,7 @@ Request body:
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 8 "resourceId": 8
} }
</code> </code>
</div> </div>
@@ -3218,7 +3219,7 @@ ALL_FUNCTIONS_READ: "true"
} }
</code> </code>
<code class="method-response">{ <code class="method-response">{
"entityId": 8 "resourceId": 8
} }
</code> </code>
</div> </div>
@@ -5,20 +5,20 @@ package org.mifosplatform.audit.api;
*/ */
public class ProcessingResultLookup { public class ProcessingResultLookup {
private final Long id; private final Long id;
private final String processingResult; private final String processingResult;
public ProcessingResultLookup(final Long id, final String processingResult) { public ProcessingResultLookup(final Long id, final String processingResult) {
this.id = id; this.id = id;
this.processingResult = processingResult; this.processingResult = processingResult;
} }
public Long getId() { public Long getId() {
return this.id; return this.id;
} }
public String getProcessingResult() { public String getProcessingResult() {
return this.processingResult; return this.processingResult;
} }
} }
@@ -0,0 +1,48 @@
package org.mifosplatform.infrastructure.security.data;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.time.StopWatch;
/**
* Immutable data object representing platform API request used for
* logging/debugging.
*/
public class PlatformRequestLog {
@SuppressWarnings("unused")
private long startTime;
@SuppressWarnings("unused")
private long totalTime;
@SuppressWarnings("unused")
private final String method;
@SuppressWarnings("unused")
private String url;
@SuppressWarnings("unused")
private Map<String, String> parameters;
public static PlatformRequestLog from(final StopWatch task, final HttpServletRequest request) throws IOException {
final String requestUrl = request.getRequestURL().toString();
@SuppressWarnings("unchecked")
Map<String, String> parameters = new HashMap<String, String>(request.getParameterMap());
parameters.remove("password");
parameters.remove("_");
return new PlatformRequestLog(task.getStartTime(), task.getTime(), request.getMethod(), requestUrl, parameters);
}
private PlatformRequestLog(final long startTime, final long time, final String method, final String requestUrl,
final Map<String, String> parameters) {
this.startTime = startTime;
this.totalTime = time;
this.method = method;
this.url = requestUrl;
this.parameters = parameters;
}
}
@@ -9,10 +9,15 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.time.StopWatch;
import org.mifosplatform.infrastructure.core.domain.MifosPlatformTenant; import org.mifosplatform.infrastructure.core.domain.MifosPlatformTenant;
import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer;
import org.mifosplatform.infrastructure.core.service.ThreadLocalContextUtil; import org.mifosplatform.infrastructure.core.service.ThreadLocalContextUtil;
import org.mifosplatform.infrastructure.security.data.PlatformRequestLog;
import org.mifosplatform.infrastructure.security.exception.InvalidTenantIdentiferException; import org.mifosplatform.infrastructure.security.exception.InvalidTenantIdentiferException;
import org.mifosplatform.infrastructure.security.service.TenantDetailsService; import org.mifosplatform.infrastructure.security.service.TenantDetailsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
@@ -36,9 +41,14 @@ import org.springframework.security.web.authentication.www.BasicAuthenticationFi
*/ */
public class TenantAwareBasicAuthenticationFilter extends BasicAuthenticationFilter { public class TenantAwareBasicAuthenticationFilter extends BasicAuthenticationFilter {
private final static Logger logger = LoggerFactory.getLogger(TenantAwareBasicAuthenticationFilter.class);
@Autowired @Autowired
private TenantDetailsService tenantDetailsService; private TenantDetailsService tenantDetailsService;
@Autowired
private ToApiJsonSerializer<PlatformRequestLog> toApiJsonSerializer;
private String tenantRequestHeader = "X-Mifos-Platform-TenantId"; private String tenantRequestHeader = "X-Mifos-Platform-TenantId";
private boolean exceptionIfHeaderMissing = true; private boolean exceptionIfHeaderMissing = true;
@@ -53,6 +63,9 @@ public class TenantAwareBasicAuthenticationFilter extends BasicAuthenticationFil
HttpServletRequest request = (HttpServletRequest) req; HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res; HttpServletResponse response = (HttpServletResponse) res;
StopWatch task = new StopWatch();
task.start();
try { try {
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
@@ -83,7 +96,9 @@ public class TenantAwareBasicAuthenticationFilter extends BasicAuthenticationFil
response.addHeader("WWW-Authenticate", "Basic realm=\"" + "Mifos Platform API" + "\""); response.addHeader("WWW-Authenticate", "Basic realm=\"" + "Mifos Platform API" + "\"");
response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
} finally { } finally {
task.stop();
final PlatformRequestLog log = PlatformRequestLog.from(task, request);
logger.info(toApiJsonSerializer.serialize(log));
} }
} }
} }
@@ -117,6 +117,12 @@ public class LoanApplicationCommand {
.longGreaterThanZero(); .longGreaterThanZero();
} }
if (this.clientId == null && this.groupId == null) {
baseDataValidator.reset().parameter("clientId").value(this.clientId).notNull().integerGreaterThanZero();
}
baseDataValidator.reset().parameter("productId").value(this.productId).notNull().integerGreaterThanZero();
if (this.submittedOnDate == null) { if (this.submittedOnDate == null) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.loan.submitted.on.date.cannot.be.blank", ApiParameterError error = ApiParameterError.parameterError("validation.msg.loan.submitted.on.date.cannot.be.blank",
"The parameter submittedOnDate cannot be empty.", "submittedOnDate"); "The parameter submittedOnDate cannot be empty.", "submittedOnDate");
@@ -20,174 +20,155 @@ import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrateg
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class LoanAccountData { public class LoanAccountData {
// basic loan details // basic loan details
private final Long id; private final Long id;
private final String externalId; private final String externalId;
private final Long clientId; private final Long clientId;
private final String clientName; private final String clientName;
private final Long groupId; private final Long groupId;
private final String groupName; private final String groupName;
private final Long loanProductId; private final Long loanProductId;
private final String loanProductName; private final String loanProductName;
private final String loanProductDescription; private final String loanProductDescription;
private final EnumOptionData status; private final EnumOptionData status;
private final Long fundId; private final Long fundId;
private final String fundName; private final String fundName;
private final Long loanOfficerId; private final Long loanOfficerId;
private final String loanOfficerName; private final String loanOfficerName;
private final CurrencyData currency; private final CurrencyData currency;
private final BigDecimal principal; private final BigDecimal principal;
private final BigDecimal inArrearsTolerance; private final BigDecimal inArrearsTolerance;
private final Integer termFrequency; private final Integer termFrequency;
private final EnumOptionData termPeriodFrequencyType; private final EnumOptionData termPeriodFrequencyType;
private final Integer numberOfRepayments; private final Integer numberOfRepayments;
private final Integer repaymentEvery; private final Integer repaymentEvery;
private final EnumOptionData repaymentFrequencyType; private final EnumOptionData repaymentFrequencyType;
private final Integer transactionStrategyId; private final Integer transactionProcessingStrategyId;
private final EnumOptionData amortizationType; private final EnumOptionData amortizationType;
private final BigDecimal interestRatePerPeriod; private final BigDecimal interestRatePerPeriod;
private final EnumOptionData interestRateFrequencyType; private final EnumOptionData interestRateFrequencyType;
private final BigDecimal annualInterestRate; private final BigDecimal annualInterestRate;
private final EnumOptionData interestType; private final EnumOptionData interestType;
private final EnumOptionData interestCalculationPeriodType; private final EnumOptionData interestCalculationPeriodType;
private final LocalDate submittedOnDate; private final LocalDate submittedOnDate;
private final LocalDate approvedOnDate; private final LocalDate approvedOnDate;
private final LocalDate expectedDisbursementDate; private final LocalDate expectedDisbursementDate;
private final LocalDate actualDisbursementDate; private final LocalDate actualDisbursementDate;
private final LocalDate repaymentsStartingFromDate; private final LocalDate repaymentsStartingFromDate;
private final LocalDate interestChargedFromDate; private final LocalDate interestChargedFromDate;
private final LocalDate closedOnDate; private final LocalDate closedOnDate;
private final LocalDate expectedMaturityDate; private final LocalDate expectedMaturityDate;
private final LocalDate lifeCycleStatusDate; private final LocalDate lifeCycleStatusDate;
// associations // associations
private final LoanScheduleData repaymentSchedule; private final LoanScheduleData repaymentSchedule;
private final Collection<LoanTransactionData> transactions; private final Collection<LoanTransactionData> transactions;
private final Collection<LoanChargeData> charges; private final Collection<LoanChargeData> charges;
private final LoanPermissionData permissions; private final LoanPermissionData permissions;
private final LoanConvenienceData convenienceData; private final LoanConvenienceData convenienceData;
private final GuarantorData guarantorData; private final GuarantorData guarantorData;
// template // template
private final Collection<StaffData> loanOfficerOptions; private final Collection<StaffData> loanOfficerOptions;
private final Collection<LoanProductData> productOptions; private final Collection<LoanProductData> productOptions;
private final Collection<EnumOptionData> termFrequencyTypeOptions; private final Collection<EnumOptionData> termFrequencyTypeOptions;
private final Collection<EnumOptionData> repaymentFrequencyTypeOptions; private final Collection<EnumOptionData> repaymentFrequencyTypeOptions;
private final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions; private final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions;
private final Collection<EnumOptionData> interestRateFrequencyTypeOptions; private final Collection<EnumOptionData> interestRateFrequencyTypeOptions;
private final Collection<EnumOptionData> amortizationTypeOptions; private final Collection<EnumOptionData> amortizationTypeOptions;
private final Collection<EnumOptionData> interestTypeOptions; private final Collection<EnumOptionData> interestTypeOptions;
private final Collection<EnumOptionData> interestCalculationPeriodTypeOptions; private final Collection<EnumOptionData> interestCalculationPeriodTypeOptions;
private final Collection<FundData> fundOptions; private final Collection<FundData> fundOptions;
private final Collection<ChargeData> chargeOptions; private final Collection<ChargeData> chargeOptions;
private final ChargeData chargeTemplate; private final ChargeData chargeTemplate;
public LoanAccountData( public LoanAccountData(final LoanBasicDetailsData basicDetails, final boolean convenienceDataRequired,
final LoanBasicDetailsData basicDetails, final LoanScheduleData repaymentSchedule, final Collection<LoanTransactionData> transactions,
final boolean convenienceDataRequired, final LoanPermissionData permissions, final Collection<LoanChargeData> charges,
final LoanScheduleData repaymentSchedule, final Collection<LoanProductData> productOptions, final Collection<EnumOptionData> termFrequencyTypeOptions,
final Collection<LoanTransactionData> transactions, final Collection<EnumOptionData> repaymentFrequencyTypeOptions,
final LoanPermissionData permissions, final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions,
final Collection<LoanChargeData> charges, final Collection<EnumOptionData> interestRateFrequencyTypeOptions, final Collection<EnumOptionData> amortizationTypeOptions,
final Collection<LoanProductData> productOptions, final Collection<EnumOptionData> interestTypeOptions, final Collection<EnumOptionData> interestCalculationPeriodTypeOptions,
final Collection<EnumOptionData> termFrequencyTypeOptions, final Collection<FundData> fundOptions, final Collection<ChargeData> chargeOptions, final ChargeData chargeTemplate,
final Collection<EnumOptionData> repaymentFrequencyTypeOptions, final Collection<StaffData> loanOfficerOptions, final GuarantorData guarantorData) {
final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions, this.repaymentSchedule = repaymentSchedule;
final Collection<EnumOptionData> interestRateFrequencyTypeOptions, this.transactions = transactions;
final Collection<EnumOptionData> amortizationTypeOptions, this.permissions = permissions;
final Collection<EnumOptionData> interestTypeOptions,
final Collection<EnumOptionData> interestCalculationPeriodTypeOptions,
final Collection<FundData> fundOptions,
final Collection<ChargeData> chargeOptions,
final ChargeData chargeTemplate,
final Collection<StaffData> loanOfficerOptions,
final GuarantorData guarantorData) {
this.repaymentSchedule = repaymentSchedule;
this.transactions = transactions;
this.permissions = permissions;
this.charges = charges; this.charges = charges;
this.productOptions = productOptions; this.productOptions = productOptions;
this.termFrequencyTypeOptions = termFrequencyTypeOptions; this.termFrequencyTypeOptions = termFrequencyTypeOptions;
this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions; this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions;
this.repaymentStrategyOptions = repaymentStrategyOptions; this.repaymentStrategyOptions = repaymentStrategyOptions;
this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions; this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions;
this.amortizationTypeOptions = amortizationTypeOptions; this.amortizationTypeOptions = amortizationTypeOptions;
this.interestTypeOptions = interestTypeOptions; this.interestTypeOptions = interestTypeOptions;
this.interestCalculationPeriodTypeOptions = interestCalculationPeriodTypeOptions; this.interestCalculationPeriodTypeOptions = interestCalculationPeriodTypeOptions;
this.fundOptions = fundOptions; this.fundOptions = fundOptions;
this.chargeOptions = chargeOptions; this.chargeOptions = chargeOptions;
this.chargeTemplate = chargeTemplate; this.chargeTemplate = chargeTemplate;
this.loanOfficerOptions = loanOfficerOptions; this.loanOfficerOptions = loanOfficerOptions;
this.guarantorData = guarantorData; this.guarantorData = guarantorData;
if (convenienceDataRequired) { if (convenienceDataRequired) {
int maxSubmittedOnOffsetFromToday = basicDetails int maxSubmittedOnOffsetFromToday = basicDetails.getMaxSubmittedOnOffsetFromToday();
.getMaxSubmittedOnOffsetFromToday(); int maxApprovedOnOffsetFromToday = basicDetails.getMaxApprovedOnOffsetFromToday();
int maxApprovedOnOffsetFromToday = basicDetails int maxDisbursedOnOffsetFromToday = basicDetails.getMaxDisbursedOnOffsetFromToday();
.getMaxApprovedOnOffsetFromToday(); int expectedLoanTermInDays = basicDetails.getLoanTermInDays();
int maxDisbursedOnOffsetFromToday = basicDetails int expectedLoanTermInMonths = basicDetails.getLoanTermInMonths();
.getMaxDisbursedOnOffsetFromToday(); int actualLoanTermInDays = basicDetails.getActualLoanTermInDays();
int expectedLoanTermInDays = basicDetails.getLoanTermInDays(); int actualLoanTermInMonths = basicDetails.getActualLoanTermInMonths();
int expectedLoanTermInMonths = basicDetails.getLoanTermInMonths();
int actualLoanTermInDays = basicDetails.getActualLoanTermInDays();
int actualLoanTermInMonths = basicDetails.getActualLoanTermInMonths();
this.convenienceData = new LoanConvenienceData( this.convenienceData = new LoanConvenienceData(maxSubmittedOnOffsetFromToday, maxApprovedOnOffsetFromToday,
maxSubmittedOnOffsetFromToday, maxApprovedOnOffsetFromToday, maxDisbursedOnOffsetFromToday, expectedLoanTermInDays, actualLoanTermInDays, expectedLoanTermInMonths,
maxDisbursedOnOffsetFromToday, expectedLoanTermInDays, actualLoanTermInMonths);
actualLoanTermInDays, expectedLoanTermInMonths, } else {
actualLoanTermInMonths); this.convenienceData = null;
} else { }
this.convenienceData = null;
}
this.id = basicDetails.getId(); this.id = basicDetails.getId();
this.externalId = basicDetails.getExternalId(); this.externalId = basicDetails.getExternalId();
this.clientId = basicDetails.getClientId(); this.clientId = basicDetails.getClientId();
this.clientName = basicDetails.getClientName(); this.clientName = basicDetails.getClientName();
this.groupId = basicDetails.getGroupId(); this.groupId = basicDetails.getGroupId();
this.groupName = basicDetails.getGroupName(); this.groupName = basicDetails.getGroupName();
this.loanProductId = basicDetails.getLoanProductId(); this.loanProductId = basicDetails.getLoanProductId();
this.loanProductName = basicDetails.getLoanProductName(); this.loanProductName = basicDetails.getLoanProductName();
this.loanProductDescription = basicDetails.getLoanProductDescription(); this.loanProductDescription = basicDetails.getLoanProductDescription();
this.fundId = basicDetails.getFundId(); this.fundId = basicDetails.getFundId();
this.fundName = basicDetails.getFundName(); this.fundName = basicDetails.getFundName();
this.loanOfficerId = basicDetails.getLoanOfficerId(); this.loanOfficerId = basicDetails.getLoanOfficerId();
this.loanOfficerName = basicDetails.getLoanOfficerName(); this.loanOfficerName = basicDetails.getLoanOfficerName();
this.submittedOnDate = basicDetails.getSubmittedOnDate();
this.approvedOnDate = basicDetails.getApprovedOnDate();
this.expectedDisbursementDate = basicDetails.getExpectedDisbursementDate();
this.actualDisbursementDate = basicDetails.getActualDisbursementDate();
this.closedOnDate = basicDetails.getClosedOnDate();
this.expectedMaturityDate = basicDetails.getExpectedMaturityDate();
this.repaymentsStartingFromDate = basicDetails.getRepaymentsStartingFromDate();
this.interestChargedFromDate = basicDetails.getInterestChargedFromDate();
this.submittedOnDate = basicDetails.getSubmittedOnDate(); this.currency = basicDetails.getCurrency();
this.approvedOnDate = basicDetails.getApprovedOnDate(); this.principal = basicDetails.getPrincipal();
this.expectedDisbursementDate = basicDetails this.inArrearsTolerance = basicDetails.getInArrearsTolerance();
.getExpectedDisbursementDate();
this.actualDisbursementDate = basicDetails.getActualDisbursementDate();
this.closedOnDate = basicDetails.getClosedOnDate();
this.expectedMaturityDate = basicDetails.getExpectedMaturityDate();
this.repaymentsStartingFromDate = basicDetails.getRepaymentsStartingFromDate();
this.interestChargedFromDate = basicDetails.getInterestChargedFromDate();
this.currency = basicDetails.getCurrency(); this.termFrequency = basicDetails.getTermFrequency();
this.principal = basicDetails.getPrincipal(); this.termPeriodFrequencyType = basicDetails.getTermPeriodFrequencyType();
this.inArrearsTolerance = basicDetails.getInArrearsTolerance(); this.numberOfRepayments = basicDetails.getNumberOfRepayments();
this.repaymentEvery = basicDetails.getRepaymentEvery();
this.transactionProcessingStrategyId = basicDetails.getTransactionStrategyId();
this.interestRatePerPeriod = basicDetails.getInterestRatePerPeriod();
this.annualInterestRate = basicDetails.getAnnualInterestRate();
this.repaymentFrequencyType = basicDetails.getRepaymentFrequencyType();
this.interestRateFrequencyType = basicDetails.getInterestRateFrequencyType();
this.amortizationType = basicDetails.getAmortizationType();
this.interestType = basicDetails.getInterestType();
this.interestCalculationPeriodType = basicDetails.getInterestCalculationPeriodType();
this.termFrequency = basicDetails.getTermFrequency(); this.status = basicDetails.getStatus();
this.termPeriodFrequencyType = basicDetails.getTermPeriodFrequencyType(); this.lifeCycleStatusDate = basicDetails.getLifeCycleStatusDate();
this.numberOfRepayments = basicDetails.getNumberOfRepayments(); }
this.repaymentEvery = basicDetails.getRepaymentEvery();
this.transactionStrategyId = basicDetails.getTransactionStrategyId();
this.interestRatePerPeriod = basicDetails.getInterestRatePerPeriod();
this.annualInterestRate = basicDetails.getAnnualInterestRate();
this.repaymentFrequencyType = basicDetails.getRepaymentFrequencyType();
this.interestRateFrequencyType = basicDetails
.getInterestRateFrequencyType();
this.amortizationType = basicDetails.getAmortizationType();
this.interestType = basicDetails.getInterestType();
this.interestCalculationPeriodType = basicDetails
.getInterestCalculationPeriodType();
this.status = basicDetails.getStatus();
this.lifeCycleStatusDate = basicDetails.getLifeCycleStatusDate();
}
} }