tidy up response for client account summary and retrieval of individual loan information.

This commit is contained in:
Keith Woodlock
2012-06-06 12:50:50 +01:00
parent 26c57c7ac0
commit e68f7f7589
22 changed files with 450 additions and 217 deletions
@@ -532,9 +532,9 @@ $(document).ready(function() {
var curTabID = currentTab.prop("id")
offsetToSubmittedDate = data.basicDetails.maxSubmittedOnOffsetFromToday;
offsetToApprovalDate = data.basicDetails.maxApprovedOnOffsetFromToday;
offsetToDisbursalDate = data.basicDetails.maxDisbursedOnOffsetFromToday;
offsetToSubmittedDate = data.convenienceData.maxSubmittedOnOffsetFromToday;
offsetToApprovalDate = data.convenienceData.maxApprovedOnOffsetFromToday;
offsetToDisbursalDate = data.convenienceData.maxDisbursedOnOffsetFromToday;
var $loantabs = $(".loantabs").tabs({
"show": function(event, ui) {
@@ -715,7 +715,7 @@ $(document).ready(function() {
basicAuthKey: base64,
datasetType: "portfolio_loan",
datasetPKValue: data.id,
datasetTypeDiv: "loanadditionaldata" + data.basicDetails.id,
datasetTypeDiv: "loanadditionaldata" + data.id,
headingPrefix: "",
headingClass: "",
labelClass: "longrowlabel",
@@ -371,7 +371,7 @@
<span class="longrowlabel"><spring:message code="label.client.account.pending.approval.loans"/> ({{=$ctx.number(pendingApprovalLoanCount)}}):</span>
<span class="rowvalue">
{{#each pendingApprovalLoans}}
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}?association=ALL" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
{{/each}}
</span>
</div>
@@ -382,7 +382,7 @@
<span class="longrowlabel"><spring:message code="label.client.account.pending.disbursal.loans"/> ({{=$ctx.number(awaitingDisbursalLoanCount)}}):</span>
<span class="rowvalue">
{{#each awaitingDisbursalLoans}}
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}?association=ALL" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
{{/each}}
</span>
</div>
@@ -393,7 +393,7 @@
<span class="longrowlabel"><spring:message code="label.client.account.active.loans"/> ({{=$ctx.number(activeLoanCount)}}):</span>
<span class="rowvalue">
{{#each openLoans}}
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}?association=ALL" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
{{/each}}
</span>
</div>
@@ -404,7 +404,7 @@
<div class="longrowlabel"><spring:message code="label.client.account.closed.loans"/> ({{=$ctx.number(closedLoanCount)}}):</div>
<div class="rowvalue">
{{#each closedLoans}}
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
<span class="loanaccount"><a href="${baseApiUrl}loans/{{=id}}?association=ALL" id="loan{{=id}}" class="openloanaccount" title="{{=loanProductName}}: &#35;{{=id}}">{{=loanProductName}}: &#35;{{=id}}</a></span>
{{/each}}
</div>
</div>
@@ -531,20 +531,19 @@
<ul>
<li><a href="#details{{=id}}" title="details"><spring:message code="tab.client.account.loan.details"/></a></li>
<li><a href="#schedule{{=id}}" title="schedule"><spring:message code="tab.client.account.loan.schedule"/></a></li>
{{#if loanData.loanRepayments}}
{{#if loanRepayments}}
<li><a href="#repayments{{=id}}" title="repayments"><spring:message code="tab.client.account.loan.repayments"/></a></li>
{{/if}}
</ul>
<!-- first loan tab -->
{{#each basicDetails}}
<div id="details{{=id}}" style="margin-top: 5px;">
<div class="row">
<span class="longrowlabel"><spring:message code="label.client.account.loan.status"/></span>
<span class="rowvalue">{{=lifeCycleStatusText}} (<spring:message code="label.client.account.loan.status.since"/> {{=$ctx.globalDate(lifeCycleStatusDate)}})
{{#if $ctx.numberGreaterThanZero($parent.data.loanData.summary.totalInArrears.amount)}}
{{#if $ctx.numberGreaterThanZero(summary.totalInArrears.amount)}}
{{#if actualDisbursementDate !== null}}
- <spring:message code="label.client.account.loan.status.arrears"/> {{=$ctx.moneyWithCurrency($parent.parent.parent.data.loanData.summary.totalInArrears)}}
- <spring:message code="label.client.account.loan.status.arrears"/> {{=$ctx.moneyWithCurrency($parent.parent.data.summary.totalInArrears)}}
{{/if}}
{{/if}}
</span>
@@ -651,11 +650,10 @@
<div id="loanadditionaldata{{=id}}"></div>
</div>
{{/each}}
<!-- second loan tab -->
<div id="schedule{{=basicDetails.id}}" style="margin-top: 5px;">
<table id="summarytable{{=basicDetails.id}}" class="pretty displayschedule">
<div id="schedule{{=id}}" style="margin-top: 5px;">
<table id="summarytable{{=id}}" class="pretty displayschedule">
<caption><spring:message code="tab.client.account.loan.schedule.table.summary.caption"/></caption>
<thead>
<tr>
@@ -669,33 +667,33 @@
<tbody>
<tr>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.principal"/></th>
<td>{{=$ctx.money(loanData.summary.originalPrincipal)}}</td>
<td>{{=$ctx.money(loanData.summary.principalPaid)}}</td>
<td>{{=$ctx.money(summary.originalPrincipal)}}</td>
<td>{{=$ctx.money(summary.principalPaid)}}</td>
<td>&nbsp;</td>
<td>{{=$ctx.money(loanData.summary.principalOutstanding)}}</td>
<td>{{=$ctx.money(summary.principalOutstanding)}}</td>
</tr>
<tr>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.interest"/></th>
<td>{{=$ctx.money(loanData.summary.originalInterest)}}</td>
<td>{{=$ctx.money(loanData.summary.interestPaid)}}</td>
<td>{{=$ctx.money(summary.originalInterest)}}</td>
<td>{{=$ctx.money(summary.interestPaid)}}</td>
<td>&nbsp;</td>
<td>{{=$ctx.money(loanData.summary.interestOutstanding)}}</td>
<td>{{=$ctx.money(summary.interestOutstanding)}}</td>
</tr>
</tbody>
<tfoot>
<tr>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.total"/></th>
<th>{{=$ctx.money(loanData.summary.originalTotal)}}</th>
<th>{{=$ctx.money(loanData.summary.totalPaid)}}</th>
<th>{{=$ctx.money(loanData.summary.totalWaived)}}</th>
<th>{{=$ctx.money(loanData.summary.totalOutstanding)}}</th>
<th>{{=$ctx.money(summary.originalTotal)}}</th>
<th>{{=$ctx.money(summary.totalPaid)}}</th>
<th>{{=$ctx.money(summary.totalWaived)}}</th>
<th>{{=$ctx.money(summary.totalOutstanding)}}</th>
</tr>
</tfoot>
</table>
<br/>
<table id="repaymentschedule_todate{{=basicDetails.id}}" class="pretty displayschedule">
<table id="repaymentschedule_todate{{=id}}" class="pretty displayschedule">
<caption><spring:message code="tab.client.account.loan.schedule.table.repaymentschedule.caption"/></caption>
<colgroup span="2"></colgroup>
<colgroup span="3">
@@ -735,7 +733,7 @@
</tr>
</thead>
<tbody>
{{#each loanData.repaymentSchedule.periods}}
{{#each repaymentSchedule.periods}}
<tr>
<td scope="row">{{=$ctx.number(period)}}</td>
<td>{{=$ctx.globalDate(date)}}</td>
@@ -754,20 +752,20 @@
<tfoot>
<tr>
<th colspan="2"><spring:message code="tab.client.account.loan.schedule.table.column.heading.total"/></th>
<th class="lefthighlightcolheader">{{=$ctx.money(loanData.summary.originalPrincipal)}}</th>
<th>{{=$ctx.money(loanData.summary.principalPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(loanData.summary.principalOutstanding)}}</th>
<th class="lefthighlightcolheader">{{=$ctx.money(loanData.summary.originalInterest)}}</th>
<th>{{=$ctx.money(loanData.summary.interestPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(loanData.summary.interestOutstanding)}}</th>
<th class="lefthighlightcolheader">{{=$ctx.money(loanData.summary.originalTotal)}}</th>
<th>{{=$ctx.money(loanData.summary.totalPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(loanData.summary.totalOutstanding)}}</th>
<th class="lefthighlightcolheader">{{=$ctx.money(summary.originalPrincipal)}}</th>
<th>{{=$ctx.money(summary.principalPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(summary.principalOutstanding)}}</th>
<th class="lefthighlightcolheader">{{=$ctx.money(summary.originalInterest)}}</th>
<th>{{=$ctx.money(summary.interestPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(summary.interestOutstanding)}}</th>
<th class="lefthighlightcolheader">{{=$ctx.money(summary.originalTotal)}}</th>
<th>{{=$ctx.money(summary.totalPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(summary.totalOutstanding)}}</th>
</tr>
</tfoot>
</table>
</div>
{{#if loanData.loanRepayments}}
{{#if loanRepayments}}
<!-- Third loan tab -->
<div id="repayments{{=id}}" style="margin-top: 5px;">
<table id="newrepaymentsactivity{{=id}}" class="pretty displaypayments">
@@ -778,19 +776,19 @@
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.amountpaid"/></th>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.principal.portion"/></th>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.interest.portion"/></th>
{{#if open}}
{{#if actualDisbursementDate !== null}}
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.action"/></th>
{{/if}}
</tr>
</thead>
<tbody>
{{#each loanData.loanRepayments}}
{{#each loanRepayments}}
<tr>
<td>{{=$ctx.globalDate(date)}}</td>
<td>{{=$ctx.money(total)}}</td>
<td>{{=$ctx.money(principal)}}</td>
<td>{{=$ctx.money(interest)}}</td>
{{#if $parent.parent.data.open}}
{{#if $parent.parent.data.actualDisbursementDate !== null}}
<td><button id="adjustrepaymentbtn{{=$parent.parent.parent.data.id}}_{{=id}}" class="adjustloanrepayment">Adjust</button></td>
{{/if}}
</tr>
@@ -2,54 +2,25 @@ package org.mifosng.platform.api.data;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate;
@XmlRootElement(name = "clientLoanAccountSummary")
public class ClientLoanAccountSummaryData implements Serializable {
private Long id;
private String externalId;
private Long loanProductId;
private String loanProductName;
private Integer loanStatusId;
private boolean pendingApproval;
private boolean waitingForDisbursal;
private boolean open;
private boolean closed;
private String lifeCycleStatusText;
private LocalDate lifeCycleStatusDate;
// private LocalDate submittedOnDate;
// private LocalDate approvedOnDate;
// private LocalDate expectedDisbursementDate;
// private LocalDate actualDisbursementDate;
// private LocalDate expectedFirstRepaymentOnDate;
// private LocalDate interestCalculatedFromDate;
// private LocalDate expectedMaturityDate;
// private LocalDate closedOnDate;
public ClientLoanAccountSummaryData() {
//
}
public ClientLoanAccountSummaryData(Long id, String externalId,
Long productId, String loanProductName, Integer loanStatusId,
String lifeCycleStatusText, boolean pendingApproval,
boolean waitingForDisbursal, boolean open, boolean closed) {
Long productId, String loanProductName, Integer loanStatusId) {
this.id = id;
this.externalId = externalId;
this.loanProductId = productId;
this.loanProductName = loanProductName;
this.loanStatusId = loanStatusId;
this.lifeCycleStatusText = lifeCycleStatusText;
this.pendingApproval = pendingApproval;
this.waitingForDisbursal = waitingForDisbursal;
this.open = open;
this.closed = closed;
}
public Long getId() {
@@ -76,54 +47,6 @@ public class ClientLoanAccountSummaryData implements Serializable {
this.loanProductName = loanProductName;
}
public boolean isPendingApproval() {
return pendingApproval;
}
public void setPendingApproval(boolean pendingApproval) {
this.pendingApproval = pendingApproval;
}
public boolean isWaitingForDisbursal() {
return waitingForDisbursal;
}
public void setWaitingForDisbursal(boolean waitingForDisbursal) {
this.waitingForDisbursal = waitingForDisbursal;
}
public boolean isOpen() {
return open;
}
public void setOpen(boolean open) {
this.open = open;
}
public boolean isClosed() {
return closed;
}
public void setClosed(boolean closed) {
this.closed = closed;
}
public String getLifeCycleStatusText() {
return lifeCycleStatusText;
}
public void setLifeCycleStatusText(String lifeCycleStatusText) {
this.lifeCycleStatusText = lifeCycleStatusText;
}
public LocalDate getLifeCycleStatusDate() {
return lifeCycleStatusDate;
}
public void setLifeCycleStatusDate(LocalDate lifeCycleStatusDate) {
this.lifeCycleStatusDate = lifeCycleStatusDate;
}
public Long getLoanProductId() {
return loanProductId;
}
@@ -2,9 +2,6 @@ package org.mifosng.platform.api.data;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "currency")
public class CurrencyData implements Serializable {
private String code;
@@ -2,9 +2,6 @@ package org.mifosng.platform.api.data;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class DerivedLoanData {
private LoanRepaymentScheduleData repaymentSchedule;
@@ -1,24 +1,109 @@
package org.mifosng.platform.api.data;
import java.math.BigDecimal;
import java.util.List;
import org.codehaus.jackson.map.annotate.JsonFilter;
import org.joda.time.LocalDate;
@JsonFilter("loanFilter")
public class LoanAccountData {
private Long id;
private LoanBasicDetailsData basicDetails;
private DerivedLoanData loanData;
private String externalId;
private String loanProductName;
private LocalDate submittedOnDate;
private LocalDate approvedOnDate;
private LocalDate expectedDisbursementDate;
private LocalDate actualDisbursementDate;
private LocalDate expectedFirstRepaymentOnDate;
private LocalDate interestChargedFromDate;
private LocalDate closedOnDate;
private LocalDate expectedMaturityDate;
private MoneyData principal;
private MoneyData inArrearsTolerance;
private Integer numberOfRepayments;
private Integer repaymentEvery;
private BigDecimal interestRatePerPeriod;
private BigDecimal annualInterestRate;
private EnumOptionData repaymentFrequencyType;
private EnumOptionData interestRateFrequencyType;
private EnumOptionData amortizationType;
private EnumOptionData interestType;
private EnumOptionData interestCalculationPeriodType;
private String lifeCycleStatusText;
private LocalDate lifeCycleStatusDate;
private LoanAccountSummaryData summary;
private LoanRepaymentScheduleData repaymentSchedule;
private List<LoanRepaymentData> loanRepayments;
private LoanPermissionData permissions;
private LoanConvenienceData convenienceData;
protected LoanAccountData() {
//
}
public LoanAccountData(Long id, LoanBasicDetailsData basicDetails, DerivedLoanData loanData, LoanPermissionData permissions) {
this.id = id;
this.basicDetails = basicDetails;
this.loanData = loanData;
public LoanAccountData(LoanBasicDetailsData basicDetails,
LoanAccountSummaryData summary,
LoanRepaymentScheduleData repaymentSchedule,
List<LoanRepaymentData> loanRepayments, LoanPermissionData permissions) {
this.summary = summary;
this.repaymentSchedule = repaymentSchedule;
this.loanRepayments = loanRepayments;
this.permissions = permissions;
int maxSubmittedOnOffsetFromToday = basicDetails.getMaxSubmittedOnOffsetFromToday();
int maxApprovedOnOffsetFromToday = basicDetails.getMaxApprovedOnOffsetFromToday();
int maxDisbursedOnOffsetFromToday = basicDetails.getMaxDisbursedOnOffsetFromToday();
int expectedLoanTermInDays = basicDetails.getLoanTermInDays();
int expectedLoanTermInMonths = basicDetails.getLoanTermInMonths();
int actualLoanTermInDays = basicDetails.getActualLoanTermInDays();
int actualLoanTermInMonths = basicDetails.getActualLoanTermInMonths();
this.convenienceData = new LoanConvenienceData(maxSubmittedOnOffsetFromToday, maxApprovedOnOffsetFromToday, maxDisbursedOnOffsetFromToday,
expectedLoanTermInDays, actualLoanTermInDays, expectedLoanTermInMonths, actualLoanTermInMonths);
this.id = basicDetails.getId();
this.externalId = basicDetails.getExternalId();
this.loanProductName = basicDetails.getLoanProductName();
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.expectedFirstRepaymentOnDate = basicDetails.getExpectedFirstRepaymentOnDate();
this.interestChargedFromDate = basicDetails.getInterestChargedFromDate();
this.principal = basicDetails.getPrincipal();
this.inArrearsTolerance = basicDetails.getInArrearsTolerance();
this.numberOfRepayments = basicDetails.getNumberOfRepayments();
this.repaymentEvery = basicDetails.getRepaymentEvery();
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.lifeCycleStatusText = basicDetails.getLifeCycleStatusText();
this.lifeCycleStatusDate = basicDetails.getLifeCycleStatusDate();
}
public LoanConvenienceData getConvenienceData() {
return convenienceData;
}
public void setConvenienceData(LoanConvenienceData convenienceData) {
this.convenienceData = convenienceData;
}
public LoanPermissionData getPermissions() {
@@ -28,21 +113,29 @@ public class LoanAccountData {
public void setPermissions(LoanPermissionData permissions) {
this.permissions = permissions;
}
public LoanBasicDetailsData getBasicDetails() {
return basicDetails;
public LoanAccountSummaryData getSummary() {
return summary;
}
public void setBasicDetails(LoanBasicDetailsData basicDetails) {
this.basicDetails = basicDetails;
public void setSummary(LoanAccountSummaryData summary) {
this.summary = summary;
}
public DerivedLoanData getLoanData() {
return loanData;
public LoanRepaymentScheduleData getRepaymentSchedule() {
return repaymentSchedule;
}
public void setLoanData(DerivedLoanData loanData) {
this.loanData = loanData;
public void setRepaymentSchedule(LoanRepaymentScheduleData repaymentSchedule) {
this.repaymentSchedule = repaymentSchedule;
}
public List<LoanRepaymentData> getLoanRepayments() {
return loanRepayments;
}
public void setLoanRepayments(List<LoanRepaymentData> loanRepayments) {
this.loanRepayments = loanRepayments;
}
public Long getId() {
@@ -52,4 +145,191 @@ public class LoanAccountData {
public void setId(Long id) {
this.id = id;
}
public String getExternalId() {
return externalId;
}
public void setExternalId(String externalId) {
this.externalId = externalId;
}
public String getLoanProductName() {
return loanProductName;
}
public void setLoanProductName(String loanProductName) {
this.loanProductName = loanProductName;
}
public LocalDate getSubmittedOnDate() {
return submittedOnDate;
}
public void setSubmittedOnDate(LocalDate submittedOnDate) {
this.submittedOnDate = submittedOnDate;
}
public LocalDate getApprovedOnDate() {
return approvedOnDate;
}
public void setApprovedOnDate(LocalDate approvedOnDate) {
this.approvedOnDate = approvedOnDate;
}
public LocalDate getExpectedDisbursementDate() {
return expectedDisbursementDate;
}
public void setExpectedDisbursementDate(LocalDate expectedDisbursementDate) {
this.expectedDisbursementDate = expectedDisbursementDate;
}
public LocalDate getActualDisbursementDate() {
return actualDisbursementDate;
}
public void setActualDisbursementDate(LocalDate actualDisbursementDate) {
this.actualDisbursementDate = actualDisbursementDate;
}
public LocalDate getExpectedFirstRepaymentOnDate() {
return expectedFirstRepaymentOnDate;
}
public void setExpectedFirstRepaymentOnDate(
LocalDate expectedFirstRepaymentOnDate) {
this.expectedFirstRepaymentOnDate = expectedFirstRepaymentOnDate;
}
public LocalDate getInterestChargedFromDate() {
return interestChargedFromDate;
}
public void setInterestChargedFromDate(LocalDate interestChargedFromDate) {
this.interestChargedFromDate = interestChargedFromDate;
}
public LocalDate getClosedOnDate() {
return closedOnDate;
}
public void setClosedOnDate(LocalDate closedOnDate) {
this.closedOnDate = closedOnDate;
}
public LocalDate getExpectedMaturityDate() {
return expectedMaturityDate;
}
public void setExpectedMaturityDate(LocalDate expectedMaturityDate) {
this.expectedMaturityDate = expectedMaturityDate;
}
public MoneyData getPrincipal() {
return principal;
}
public void setPrincipal(MoneyData principal) {
this.principal = principal;
}
public MoneyData getInArrearsTolerance() {
return inArrearsTolerance;
}
public void setInArrearsTolerance(MoneyData inArrearsTolerance) {
this.inArrearsTolerance = inArrearsTolerance;
}
public Integer getNumberOfRepayments() {
return numberOfRepayments;
}
public void setNumberOfRepayments(Integer numberOfRepayments) {
this.numberOfRepayments = numberOfRepayments;
}
public Integer getRepaymentEvery() {
return repaymentEvery;
}
public void setRepaymentEvery(Integer repaymentEvery) {
this.repaymentEvery = repaymentEvery;
}
public BigDecimal getInterestRatePerPeriod() {
return interestRatePerPeriod;
}
public void setInterestRatePerPeriod(BigDecimal interestRatePerPeriod) {
this.interestRatePerPeriod = interestRatePerPeriod;
}
public BigDecimal getAnnualInterestRate() {
return annualInterestRate;
}
public void setAnnualInterestRate(BigDecimal annualInterestRate) {
this.annualInterestRate = annualInterestRate;
}
public EnumOptionData getRepaymentFrequencyType() {
return repaymentFrequencyType;
}
public void setRepaymentFrequencyType(EnumOptionData repaymentFrequencyType) {
this.repaymentFrequencyType = repaymentFrequencyType;
}
public EnumOptionData getInterestRateFrequencyType() {
return interestRateFrequencyType;
}
public void setInterestRateFrequencyType(
EnumOptionData interestRateFrequencyType) {
this.interestRateFrequencyType = interestRateFrequencyType;
}
public EnumOptionData getAmortizationType() {
return amortizationType;
}
public void setAmortizationType(EnumOptionData amortizationType) {
this.amortizationType = amortizationType;
}
public EnumOptionData getInterestType() {
return interestType;
}
public void setInterestType(EnumOptionData interestType) {
this.interestType = interestType;
}
public EnumOptionData getInterestCalculationPeriodType() {
return interestCalculationPeriodType;
}
public void setInterestCalculationPeriodType(
EnumOptionData interestCalculationPeriodType) {
this.interestCalculationPeriodType = interestCalculationPeriodType;
}
public String getLifeCycleStatusText() {
return lifeCycleStatusText;
}
public void setLifeCycleStatusText(String lifeCycleStatusText) {
this.lifeCycleStatusText = lifeCycleStatusText;
}
public LocalDate getLifeCycleStatusDate() {
return lifeCycleStatusDate;
}
public void setLifeCycleStatusDate(LocalDate lifeCycleStatusDate) {
this.lifeCycleStatusDate = lifeCycleStatusDate;
}
}
@@ -1,8 +1,6 @@
package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class LoanAccountSummaryData {
private MoneyData originalPrincipal;
@@ -0,0 +1,54 @@
package org.mifosng.platform.api.data;
public class LoanConvenienceData {
private final int maxSubmittedOnOffsetFromToday;
private final int maxApprovedOnOffsetFromToday;
private final int maxDisbursedOnOffsetFromToday;
private final int expectedLoanTermInDays;
private final int actualLoanTermInDays;
private final int expectedLoanTermInMonths;
private final int actualLoanTermInMonths;
public LoanConvenienceData(int maxSubmittedOnOffsetFromToday,
int maxApprovedOnOffsetFromToday,
int maxDisbursedOnOffsetFromToday, int expectedLoanTermInDays,
int actualLoanTermInDays, int expectedLoanTermInMonths,
int actualLoanTermInMonths) {
this.maxSubmittedOnOffsetFromToday = maxSubmittedOnOffsetFromToday;
this.maxApprovedOnOffsetFromToday = maxApprovedOnOffsetFromToday;
this.maxDisbursedOnOffsetFromToday = maxDisbursedOnOffsetFromToday;
this.expectedLoanTermInDays = expectedLoanTermInDays;
this.actualLoanTermInDays = actualLoanTermInDays;
this.expectedLoanTermInMonths = expectedLoanTermInMonths;
this.actualLoanTermInMonths = actualLoanTermInMonths;
}
public int getMaxSubmittedOnOffsetFromToday() {
return maxSubmittedOnOffsetFromToday;
}
public int getMaxApprovedOnOffsetFromToday() {
return maxApprovedOnOffsetFromToday;
}
public int getMaxDisbursedOnOffsetFromToday() {
return maxDisbursedOnOffsetFromToday;
}
public int getExpectedLoanTermInDays() {
return expectedLoanTermInDays;
}
public int getActualLoanTermInDays() {
return actualLoanTermInDays;
}
public int getExpectedLoanTermInMonths() {
return expectedLoanTermInMonths;
}
public int getActualLoanTermInMonths() {
return actualLoanTermInMonths;
}
}
@@ -1,13 +1,8 @@
package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.map.annotate.JsonFilter;
import org.joda.time.DateMidnight;
import org.joda.time.Days;
import org.joda.time.LocalDate;
@XmlRootElement
@JsonFilter("loanRepaymentFilter")
public class LoanRepaymentData {
@@ -48,9 +43,9 @@ public class LoanRepaymentData {
return date;
}
public int getTransactionOffsetFromToday() {
return Days.daysBetween(new DateMidnight().toDateTime(), this.date.toDateMidnight().toDateTime()).getDays();
}
// public int getTransactionOffsetFromToday() {
// return Days.daysBetween(new DateMidnight().toDateTime(), this.date.toDateMidnight().toDateTime()).getDays();
// }
public void setDate(LocalDate date) {
this.date = date;
@@ -1,10 +1,7 @@
package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate;
@XmlRootElement
public class LoanRepaymentPeriodData {
private Integer period;
@@ -3,9 +3,6 @@ package org.mifosng.platform.api.data;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class LoanRepaymentScheduleData {
private List<LoanRepaymentPeriodData> periods = new ArrayList<LoanRepaymentPeriodData>();
@@ -4,9 +4,6 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "loanSchedule")
public class LoanSchedule implements Serializable {
private List<ScheduledLoanInstallment> scheduledLoanInstallments = new ArrayList<ScheduledLoanInstallment>();
@@ -4,9 +4,6 @@ import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class MoneyData implements Serializable, Comparable<MoneyData> {
private String currencyCode;
@@ -3,11 +3,8 @@ package org.mifosng.platform.api.data;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate;
@XmlRootElement(name = "installment")
public class ScheduledLoanInstallment implements Serializable {
private Integer installmentNumber;
@@ -185,11 +185,14 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
List<ClientLoanAccountSummaryData> results = this.jdbcTemplate.query(sql, rm, new Object[] {clientId, currentUser.getOrganisation().getId()});
if (results != null) {
for (ClientLoanAccountSummaryData row : results) {
if (row.isOpen()) {
LoanStatusMapper statusMapper = new LoanStatusMapper(row.getLoanStatusId());
if (statusMapper.isOpen()) {
openLoans.add(row);
} else if (row.isWaitingForDisbursal()) {
} else if (statusMapper.isAwaitingDisbursal()) {
awaitingDisbursalLoans.add(row);
} else if (row.isPendingApproval()) {
} else if (statusMapper.isPendingApproval()) {
pendingApprovalLoans.add(row);
} else {
closedLoans.add(row);
@@ -226,16 +229,16 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
Long productId = JdbcSupport.getLong(rs, "productId");
String loanProductName = rs.getString("productName");
Integer loanStatusId = JdbcSupport.getInteger(rs, "statusId");
String lifeCycleStatusText = rs.getString("statusName");
// String lifeCycleStatusText = rs.getString("statusName");
//
// LoanStatusMapper statusMapper = new LoanStatusMapper(loanStatusId);
//
// boolean pendingApproval = statusMapper.isPendingApproval();
// boolean waitingForDisbursal = statusMapper.isAwaitingDisbursal();
// boolean open = statusMapper.isOpen();
// boolean closed = statusMapper.isClosed();
LoanStatusMapper statusMapper = new LoanStatusMapper(loanStatusId);
boolean pendingApproval = statusMapper.isPendingApproval();
boolean waitingForDisbursal = statusMapper.isAwaitingDisbursal();
boolean open = statusMapper.isOpen();
boolean closed = statusMapper.isClosed();
return new ClientLoanAccountSummaryData(id, externalId, productId, loanProductName, loanStatusId, lifeCycleStatusText, pendingApproval, waitingForDisbursal, open, closed);
return new ClientLoanAccountSummaryData(id, externalId, productId, loanProductName, loanStatusId);
}
}
@@ -48,10 +48,7 @@ public class DerivedLoanDataProcessor {
}
if (transaction.isWaiver()) {
LoanRepaymentData repaymentData = processWaiver(
transaction, scheduledRepaymentPeriod,
repaymentScheduleIndex, loanRepaymentPeriods,
arrearsTolerance, currencyDetail);
LoanRepaymentData repaymentData = processWaiver(transaction, scheduledRepaymentPeriod, currencyDetail);
loanRepayments.add(repaymentData);
}
@@ -77,10 +74,7 @@ public class DerivedLoanDataProcessor {
}
private LoanRepaymentData processWaiver(LoanTransaction transaction,
LoanRepaymentPeriodData scheduledRepaymentPeriod,
int repaymentScheduleIndex,
List<LoanRepaymentPeriodData> loanRepaymentPeriods,
Money arrearsTolerance, CurrencyData currencyData) {
LoanRepaymentPeriodData scheduledRepaymentPeriod, CurrencyData currencyData) {
MonetaryCurrency currency = new MonetaryCurrency(currencyData.getCode(), currencyData.getDecimalPlaces());
Money totalToWaive = transaction.getAmount(currency);
@@ -152,7 +146,7 @@ public class DerivedLoanDataProcessor {
LocalDate arrearsFrom = determineInArrearsFrom(currentRepaymentSchedule, loanRepaymentPeriods, repaymentIndex);
LocalDate arrearsTo = determineInArrearsTo(currentRepaymentSchedule, loanRepaymentPeriods, repaymentIndex);
LocalDate arrearsTo = determineInArrearsTo(loanRepaymentPeriods, repaymentIndex);
currentRepaymentSchedule.setArrearsFrom(arrearsFrom);
currentRepaymentSchedule.setArrearsTo(arrearsTo);
@@ -165,7 +159,6 @@ public class DerivedLoanDataProcessor {
}
private LocalDate determineInArrearsTo(
LoanRepaymentPeriodData currentRepaymentSchedule,
List<LoanRepaymentPeriodData> loanRepaymentPeriods,
int repaymentIndex) {
@@ -28,7 +28,12 @@ import org.joda.time.LocalDate;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.DerivedLoanData;
import org.mifosng.platform.api.data.EnumOptionData;
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.LoanRepaymentData;
import org.mifosng.platform.api.data.LoanRepaymentScheduleData;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.client.domain.Client;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
@@ -975,4 +980,34 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
public String getCurrencyCode() {
return this.loanRepaymentScheduleDetail.getPrincipal().getCurrencyCode();
}
public LoanAccountData toLoanAccountData(LoanAccountSummaryData summary, LoanRepaymentScheduleData repaymentSchedule,
List<LoanRepaymentData> loanRepayments,
CurrencyData currencyData) {
LoanBasicDetailsData basicDetails = toBasicDetailsData(currencyData);
// permissions
boolean waiveAllowed = summary.isWaiveAllowed(basicDetails.getInArrearsTolerance())
&& isNotClosed();
boolean undoDisbursalAllowed = isDisbursed()
&& isOpenWithNoRepaymentMade();
boolean makeRepaymentAllowed = isDisbursed()
&& isNotClosed();
boolean rejectAllowed = isNotApproved()
&& isNotDisbursed() && isNotClosed();
boolean withdrawnByApplicantAllowed = isNotDisbursed()
&& isNotClosed();
boolean undoApprovalAllowed = isApproved()
&& isNotClosed();
boolean disbursalAllowed = isApproved()
&& isNotDisbursed() && isNotClosed();
LoanPermissionData permissions = new LoanPermissionData(waiveAllowed, makeRepaymentAllowed, rejectAllowed, withdrawnByApplicantAllowed,
undoApprovalAllowed, undoDisbursalAllowed, disbursalAllowed, isSubmittedAndPendingApproval(),
isWaitingForDisbursal());
return new LoanAccountData(basicDetails, summary, repaymentSchedule, loanRepayments, permissions);
}
}
@@ -65,7 +65,7 @@ public class LoanRepaymentScheduleInstallment extends AbstractAuditableCustom<Ap
this.completed = false;
}
public LoanRepaymentScheduleInstallment(final Loan loan, final Integer installmentNumber, final LocalDate from,
public LoanRepaymentScheduleInstallment(final Loan loan, final Integer installmentNumber,
final LocalDate dueDate, final BigDecimal principal, final BigDecimal interest) {
this.loan = loan;
this.installmentNumber = installmentNumber;
@@ -94,7 +94,7 @@ public class LoanAssembler {
LoanRepaymentScheduleInstallment installment = new LoanRepaymentScheduleInstallment(
loan, scheduledLoanInstallment.getInstallmentNumber(),
scheduledLoanInstallment.getPeriodStart(),
// scheduledLoanInstallment.getPeriodStart(),
scheduledLoanInstallment.getPeriodEnd(), readPrincipalDue.getAmount(),
readInterestDue.getAmount());
loan.addRepaymentScheduleInstallment(installment);
@@ -11,8 +11,6 @@ import org.mifosng.platform.api.data.ClientData;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.DerivedLoanData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanBasicDetailsData;
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.LoanRepaymentData;
@@ -89,31 +87,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
private LoanAccountData convertToData(final Loan realLoan, CurrencyData currencyData) {
DerivedLoanData loanData = realLoan.deriveLoanData(currencyData);
LoanBasicDetailsData basicDetails = realLoan.toBasicDetailsData(currencyData);
// permissions
boolean waiveAllowed = loanData.getSummary().isWaiveAllowed(basicDetails.getInArrearsTolerance())
&& realLoan.isNotClosed();
boolean undoDisbursalAllowed = realLoan.isDisbursed()
&& realLoan.isOpenWithNoRepaymentMade();
boolean makeRepaymentAllowed = realLoan.isDisbursed()
&& realLoan.isNotClosed();
boolean rejectAllowed = realLoan.isNotApproved()
&& realLoan.isNotDisbursed() && realLoan.isNotClosed();
boolean withdrawnByApplicantAllowed = realLoan.isNotDisbursed()
&& realLoan.isNotClosed();
boolean undoApprovalAllowed = realLoan.isApproved()
&& realLoan.isNotClosed();
boolean disbursalAllowed = realLoan.isApproved()
&& realLoan.isNotDisbursed() && realLoan.isNotClosed();
LoanPermissionData permissions = new LoanPermissionData(waiveAllowed, makeRepaymentAllowed, rejectAllowed, withdrawnByApplicantAllowed,
undoApprovalAllowed, undoDisbursalAllowed, disbursalAllowed, realLoan.isSubmittedAndPendingApproval(),
realLoan.isWaitingForDisbursal());
return new LoanAccountData(realLoan.getId(), basicDetails, loanData, permissions);
return realLoan.toLoanAccountData(loanData.getSummary(), loanData.getRepaymentSchedule(), loanData.getLoanRepayments(), currencyData);
}
@Override
@@ -307,7 +307,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
LoanRepaymentScheduleInstallment installment = new LoanRepaymentScheduleInstallment(
loan, scheduledLoanInstallment.getInstallmentNumber(),
scheduledLoanInstallment.getPeriodStart(),
// scheduledLoanInstallment.getPeriodStart(),
scheduledLoanInstallment.getPeriodEnd(), principal.getAmount(),
interest.getAmount());
modifiedLoanRepaymentSchedule.add(installment);
@@ -8,7 +8,7 @@ public class LoanRepaymentScheduleInstallmentBuilder {
private Loan loan = null;
private Integer installmentNumber = Integer.valueOf(1);
private LocalDate from = LocalDate.now();
// private LocalDate from = LocalDate.now();
private LocalDate dueDate = LocalDate.now();
private MonetaryCurrency currencyDetail = new MonetaryCurrencyBuilder().build();
private Money principal = new MoneyBuilder().build();
@@ -21,7 +21,7 @@ public class LoanRepaymentScheduleInstallmentBuilder {
}
public LoanRepaymentScheduleInstallment build() {
return new LoanRepaymentScheduleInstallment(loan, installmentNumber, from, dueDate, principal.getAmount(), interest.getAmount());
return new LoanRepaymentScheduleInstallment(loan, installmentNumber, dueDate, principal.getAmount(), interest.getAmount());
}
public LoanRepaymentScheduleInstallmentBuilder withPrincipal(String withPrincipal) {