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") var curTabID = currentTab.prop("id")
offsetToSubmittedDate = data.basicDetails.maxSubmittedOnOffsetFromToday; offsetToSubmittedDate = data.convenienceData.maxSubmittedOnOffsetFromToday;
offsetToApprovalDate = data.basicDetails.maxApprovedOnOffsetFromToday; offsetToApprovalDate = data.convenienceData.maxApprovedOnOffsetFromToday;
offsetToDisbursalDate = data.basicDetails.maxDisbursedOnOffsetFromToday; offsetToDisbursalDate = data.convenienceData.maxDisbursedOnOffsetFromToday;
var $loantabs = $(".loantabs").tabs({ var $loantabs = $(".loantabs").tabs({
"show": function(event, ui) { "show": function(event, ui) {
@@ -715,7 +715,7 @@ $(document).ready(function() {
basicAuthKey: base64, basicAuthKey: base64,
datasetType: "portfolio_loan", datasetType: "portfolio_loan",
datasetPKValue: data.id, datasetPKValue: data.id,
datasetTypeDiv: "loanadditionaldata" + data.basicDetails.id, datasetTypeDiv: "loanadditionaldata" + data.id,
headingPrefix: "", headingPrefix: "",
headingClass: "", headingClass: "",
labelClass: "longrowlabel", labelClass: "longrowlabel",
@@ -371,7 +371,7 @@
<span class="longrowlabel"><spring:message code="label.client.account.pending.approval.loans"/> ({{=$ctx.number(pendingApprovalLoanCount)}}):</span> <span class="longrowlabel"><spring:message code="label.client.account.pending.approval.loans"/> ({{=$ctx.number(pendingApprovalLoanCount)}}):</span>
<span class="rowvalue"> <span class="rowvalue">
{{#each pendingApprovalLoans}} {{#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}} {{/each}}
</span> </span>
</div> </div>
@@ -382,7 +382,7 @@
<span class="longrowlabel"><spring:message code="label.client.account.pending.disbursal.loans"/> ({{=$ctx.number(awaitingDisbursalLoanCount)}}):</span> <span class="longrowlabel"><spring:message code="label.client.account.pending.disbursal.loans"/> ({{=$ctx.number(awaitingDisbursalLoanCount)}}):</span>
<span class="rowvalue"> <span class="rowvalue">
{{#each awaitingDisbursalLoans}} {{#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}} {{/each}}
</span> </span>
</div> </div>
@@ -393,7 +393,7 @@
<span class="longrowlabel"><spring:message code="label.client.account.active.loans"/> ({{=$ctx.number(activeLoanCount)}}):</span> <span class="longrowlabel"><spring:message code="label.client.account.active.loans"/> ({{=$ctx.number(activeLoanCount)}}):</span>
<span class="rowvalue"> <span class="rowvalue">
{{#each openLoans}} {{#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}} {{/each}}
</span> </span>
</div> </div>
@@ -404,7 +404,7 @@
<div class="longrowlabel"><spring:message code="label.client.account.closed.loans"/> ({{=$ctx.number(closedLoanCount)}}):</div> <div class="longrowlabel"><spring:message code="label.client.account.closed.loans"/> ({{=$ctx.number(closedLoanCount)}}):</div>
<div class="rowvalue"> <div class="rowvalue">
{{#each closedLoans}} {{#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}} {{/each}}
</div> </div>
</div> </div>
@@ -531,20 +531,19 @@
<ul> <ul>
<li><a href="#details{{=id}}" title="details"><spring:message code="tab.client.account.loan.details"/></a></li> <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> <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> <li><a href="#repayments{{=id}}" title="repayments"><spring:message code="tab.client.account.loan.repayments"/></a></li>
{{/if}} {{/if}}
</ul> </ul>
<!-- first loan tab --> <!-- first loan tab -->
{{#each basicDetails}}
<div id="details{{=id}}" style="margin-top: 5px;"> <div id="details{{=id}}" style="margin-top: 5px;">
<div class="row"> <div class="row">
<span class="longrowlabel"><spring:message code="label.client.account.loan.status"/></span> <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)}}) <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}} {{#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}}
{{/if}} {{/if}}
</span> </span>
@@ -651,11 +650,10 @@
<div id="loanadditionaldata{{=id}}"></div> <div id="loanadditionaldata{{=id}}"></div>
</div> </div>
{{/each}}
<!-- second loan tab --> <!-- second loan tab -->
<div id="schedule{{=basicDetails.id}}" style="margin-top: 5px;"> <div id="schedule{{=id}}" style="margin-top: 5px;">
<table id="summarytable{{=basicDetails.id}}" class="pretty displayschedule"> <table id="summarytable{{=id}}" class="pretty displayschedule">
<caption><spring:message code="tab.client.account.loan.schedule.table.summary.caption"/></caption> <caption><spring:message code="tab.client.account.loan.schedule.table.summary.caption"/></caption>
<thead> <thead>
<tr> <tr>
@@ -669,33 +667,33 @@
<tbody> <tbody>
<tr> <tr>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.principal"/></th> <th><spring:message code="tab.client.account.loan.schedule.table.column.heading.principal"/></th>
<td>{{=$ctx.money(loanData.summary.originalPrincipal)}}</td> <td>{{=$ctx.money(summary.originalPrincipal)}}</td>
<td>{{=$ctx.money(loanData.summary.principalPaid)}}</td> <td>{{=$ctx.money(summary.principalPaid)}}</td>
<td>&nbsp;</td> <td>&nbsp;</td>
<td>{{=$ctx.money(loanData.summary.principalOutstanding)}}</td> <td>{{=$ctx.money(summary.principalOutstanding)}}</td>
</tr> </tr>
<tr> <tr>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.interest"/></th> <th><spring:message code="tab.client.account.loan.schedule.table.column.heading.interest"/></th>
<td>{{=$ctx.money(loanData.summary.originalInterest)}}</td> <td>{{=$ctx.money(summary.originalInterest)}}</td>
<td>{{=$ctx.money(loanData.summary.interestPaid)}}</td> <td>{{=$ctx.money(summary.interestPaid)}}</td>
<td>&nbsp;</td> <td>&nbsp;</td>
<td>{{=$ctx.money(loanData.summary.interestOutstanding)}}</td> <td>{{=$ctx.money(summary.interestOutstanding)}}</td>
</tr> </tr>
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.total"/></th> <th><spring:message code="tab.client.account.loan.schedule.table.column.heading.total"/></th>
<th>{{=$ctx.money(loanData.summary.originalTotal)}}</th> <th>{{=$ctx.money(summary.originalTotal)}}</th>
<th>{{=$ctx.money(loanData.summary.totalPaid)}}</th> <th>{{=$ctx.money(summary.totalPaid)}}</th>
<th>{{=$ctx.money(loanData.summary.totalWaived)}}</th> <th>{{=$ctx.money(summary.totalWaived)}}</th>
<th>{{=$ctx.money(loanData.summary.totalOutstanding)}}</th> <th>{{=$ctx.money(summary.totalOutstanding)}}</th>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
<br/> <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> <caption><spring:message code="tab.client.account.loan.schedule.table.repaymentschedule.caption"/></caption>
<colgroup span="2"></colgroup> <colgroup span="2"></colgroup>
<colgroup span="3"> <colgroup span="3">
@@ -735,7 +733,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{{#each loanData.repaymentSchedule.periods}} {{#each repaymentSchedule.periods}}
<tr> <tr>
<td scope="row">{{=$ctx.number(period)}}</td> <td scope="row">{{=$ctx.number(period)}}</td>
<td>{{=$ctx.globalDate(date)}}</td> <td>{{=$ctx.globalDate(date)}}</td>
@@ -754,20 +752,20 @@
<tfoot> <tfoot>
<tr> <tr>
<th colspan="2"><spring:message code="tab.client.account.loan.schedule.table.column.heading.total"/></th> <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 class="lefthighlightcolheader">{{=$ctx.money(summary.originalPrincipal)}}</th>
<th>{{=$ctx.money(loanData.summary.principalPaid)}}</th> <th>{{=$ctx.money(summary.principalPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(loanData.summary.principalOutstanding)}}</th> <th class="righthighlightcolheader">{{=$ctx.money(summary.principalOutstanding)}}</th>
<th class="lefthighlightcolheader">{{=$ctx.money(loanData.summary.originalInterest)}}</th> <th class="lefthighlightcolheader">{{=$ctx.money(summary.originalInterest)}}</th>
<th>{{=$ctx.money(loanData.summary.interestPaid)}}</th> <th>{{=$ctx.money(summary.interestPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(loanData.summary.interestOutstanding)}}</th> <th class="righthighlightcolheader">{{=$ctx.money(summary.interestOutstanding)}}</th>
<th class="lefthighlightcolheader">{{=$ctx.money(loanData.summary.originalTotal)}}</th> <th class="lefthighlightcolheader">{{=$ctx.money(summary.originalTotal)}}</th>
<th>{{=$ctx.money(loanData.summary.totalPaid)}}</th> <th>{{=$ctx.money(summary.totalPaid)}}</th>
<th class="righthighlightcolheader">{{=$ctx.money(loanData.summary.totalOutstanding)}}</th> <th class="righthighlightcolheader">{{=$ctx.money(summary.totalOutstanding)}}</th>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
</div> </div>
{{#if loanData.loanRepayments}} {{#if loanRepayments}}
<!-- Third loan tab --> <!-- Third loan tab -->
<div id="repayments{{=id}}" style="margin-top: 5px;"> <div id="repayments{{=id}}" style="margin-top: 5px;">
<table id="newrepaymentsactivity{{=id}}" class="pretty displaypayments"> <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.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.principal.portion"/></th>
<th><spring:message code="tab.client.account.loan.schedule.table.column.heading.interest.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> <th><spring:message code="tab.client.account.loan.schedule.table.column.heading.action"/></th>
{{/if}} {{/if}}
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{{#each loanData.loanRepayments}} {{#each loanRepayments}}
<tr> <tr>
<td>{{=$ctx.globalDate(date)}}</td> <td>{{=$ctx.globalDate(date)}}</td>
<td>{{=$ctx.money(total)}}</td> <td>{{=$ctx.money(total)}}</td>
<td>{{=$ctx.money(principal)}}</td> <td>{{=$ctx.money(principal)}}</td>
<td>{{=$ctx.money(interest)}}</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> <td><button id="adjustrepaymentbtn{{=$parent.parent.parent.data.id}}_{{=id}}" class="adjustloanrepayment">Adjust</button></td>
{{/if}} {{/if}}
</tr> </tr>
@@ -2,54 +2,25 @@ package org.mifosng.platform.api.data;
import java.io.Serializable; import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate;
@XmlRootElement(name = "clientLoanAccountSummary")
public class ClientLoanAccountSummaryData implements Serializable { public class ClientLoanAccountSummaryData implements Serializable {
private Long id; private Long id;
private String externalId; private String externalId;
private Long loanProductId; private Long loanProductId;
private String loanProductName; private String loanProductName;
private Integer loanStatusId; 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() {
// //
} }
public ClientLoanAccountSummaryData(Long id, String externalId, public ClientLoanAccountSummaryData(Long id, String externalId,
Long productId, String loanProductName, Integer loanStatusId, Long productId, String loanProductName, Integer loanStatusId) {
String lifeCycleStatusText, boolean pendingApproval,
boolean waitingForDisbursal, boolean open, boolean closed) {
this.id = id; this.id = id;
this.externalId = externalId; this.externalId = externalId;
this.loanProductId = productId; this.loanProductId = productId;
this.loanProductName = loanProductName; this.loanProductName = loanProductName;
this.loanStatusId = loanStatusId; this.loanStatusId = loanStatusId;
this.lifeCycleStatusText = lifeCycleStatusText;
this.pendingApproval = pendingApproval;
this.waitingForDisbursal = waitingForDisbursal;
this.open = open;
this.closed = closed;
} }
public Long getId() { public Long getId() {
@@ -76,54 +47,6 @@ public class ClientLoanAccountSummaryData implements Serializable {
this.loanProductName = loanProductName; 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() { public Long getLoanProductId() {
return loanProductId; return loanProductId;
} }
@@ -2,9 +2,6 @@ package org.mifosng.platform.api.data;
import java.io.Serializable; import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "currency")
public class CurrencyData implements Serializable { public class CurrencyData implements Serializable {
private String code; private String code;
@@ -2,9 +2,6 @@ package org.mifosng.platform.api.data;
import java.util.List; import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class DerivedLoanData { public class DerivedLoanData {
private LoanRepaymentScheduleData repaymentSchedule; private LoanRepaymentScheduleData repaymentSchedule;
@@ -1,24 +1,109 @@
package org.mifosng.platform.api.data; package org.mifosng.platform.api.data;
import java.math.BigDecimal;
import java.util.List;
import org.codehaus.jackson.map.annotate.JsonFilter; import org.codehaus.jackson.map.annotate.JsonFilter;
import org.joda.time.LocalDate;
@JsonFilter("loanFilter") @JsonFilter("loanFilter")
public class LoanAccountData { public class LoanAccountData {
private Long id; private Long id;
private LoanBasicDetailsData basicDetails; private String externalId;
private DerivedLoanData loanData; 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 LoanPermissionData permissions;
private LoanConvenienceData convenienceData;
protected LoanAccountData() { protected LoanAccountData() {
// //
} }
public LoanAccountData(Long id, LoanBasicDetailsData basicDetails, DerivedLoanData loanData, LoanPermissionData permissions) { public LoanAccountData(LoanBasicDetailsData basicDetails,
this.id = id; LoanAccountSummaryData summary,
this.basicDetails = basicDetails; LoanRepaymentScheduleData repaymentSchedule,
this.loanData = loanData; List<LoanRepaymentData> loanRepayments, LoanPermissionData permissions) {
this.summary = summary;
this.repaymentSchedule = repaymentSchedule;
this.loanRepayments = loanRepayments;
this.permissions = permissions; 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() { public LoanPermissionData getPermissions() {
@@ -29,20 +114,28 @@ public class LoanAccountData {
this.permissions = permissions; this.permissions = permissions;
} }
public LoanBasicDetailsData getBasicDetails() { public LoanAccountSummaryData getSummary() {
return basicDetails; return summary;
} }
public void setBasicDetails(LoanBasicDetailsData basicDetails) { public void setSummary(LoanAccountSummaryData summary) {
this.basicDetails = basicDetails; this.summary = summary;
} }
public DerivedLoanData getLoanData() { public LoanRepaymentScheduleData getRepaymentSchedule() {
return loanData; return repaymentSchedule;
} }
public void setLoanData(DerivedLoanData loanData) { public void setRepaymentSchedule(LoanRepaymentScheduleData repaymentSchedule) {
this.loanData = loanData; this.repaymentSchedule = repaymentSchedule;
}
public List<LoanRepaymentData> getLoanRepayments() {
return loanRepayments;
}
public void setLoanRepayments(List<LoanRepaymentData> loanRepayments) {
this.loanRepayments = loanRepayments;
} }
public Long getId() { public Long getId() {
@@ -52,4 +145,191 @@ public class LoanAccountData {
public void setId(Long id) { public void setId(Long id) {
this.id = 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; package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class LoanAccountSummaryData { public class LoanAccountSummaryData {
private MoneyData originalPrincipal; 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; package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.map.annotate.JsonFilter; import org.codehaus.jackson.map.annotate.JsonFilter;
import org.joda.time.DateMidnight;
import org.joda.time.Days;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
@XmlRootElement
@JsonFilter("loanRepaymentFilter") @JsonFilter("loanRepaymentFilter")
public class LoanRepaymentData { public class LoanRepaymentData {
@@ -48,9 +43,9 @@ public class LoanRepaymentData {
return date; return date;
} }
public int getTransactionOffsetFromToday() { // public int getTransactionOffsetFromToday() {
return Days.daysBetween(new DateMidnight().toDateTime(), this.date.toDateMidnight().toDateTime()).getDays(); // return Days.daysBetween(new DateMidnight().toDateTime(), this.date.toDateMidnight().toDateTime()).getDays();
} // }
public void setDate(LocalDate date) { public void setDate(LocalDate date) {
this.date = date; this.date = date;
@@ -1,10 +1,7 @@
package org.mifosng.platform.api.data; package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
@XmlRootElement
public class LoanRepaymentPeriodData { public class LoanRepaymentPeriodData {
private Integer period; private Integer period;
@@ -3,9 +3,6 @@ package org.mifosng.platform.api.data;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class LoanRepaymentScheduleData { public class LoanRepaymentScheduleData {
private List<LoanRepaymentPeriodData> periods = new ArrayList<LoanRepaymentPeriodData>(); private List<LoanRepaymentPeriodData> periods = new ArrayList<LoanRepaymentPeriodData>();
@@ -4,9 +4,6 @@ import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "loanSchedule")
public class LoanSchedule implements Serializable { public class LoanSchedule implements Serializable {
private List<ScheduledLoanInstallment> scheduledLoanInstallments = new ArrayList<ScheduledLoanInstallment>(); private List<ScheduledLoanInstallment> scheduledLoanInstallments = new ArrayList<ScheduledLoanInstallment>();
@@ -4,9 +4,6 @@ import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class MoneyData implements Serializable, Comparable<MoneyData> { public class MoneyData implements Serializable, Comparable<MoneyData> {
private String currencyCode; private String currencyCode;
@@ -3,11 +3,8 @@ package org.mifosng.platform.api.data;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
@XmlRootElement(name = "installment")
public class ScheduledLoanInstallment implements Serializable { public class ScheduledLoanInstallment implements Serializable {
private Integer installmentNumber; 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()}); List<ClientLoanAccountSummaryData> results = this.jdbcTemplate.query(sql, rm, new Object[] {clientId, currentUser.getOrganisation().getId()});
if (results != null) { if (results != null) {
for (ClientLoanAccountSummaryData row : results) { for (ClientLoanAccountSummaryData row : results) {
if (row.isOpen()) {
LoanStatusMapper statusMapper = new LoanStatusMapper(row.getLoanStatusId());
if (statusMapper.isOpen()) {
openLoans.add(row); openLoans.add(row);
} else if (row.isWaitingForDisbursal()) { } else if (statusMapper.isAwaitingDisbursal()) {
awaitingDisbursalLoans.add(row); awaitingDisbursalLoans.add(row);
} else if (row.isPendingApproval()) { } else if (statusMapper.isPendingApproval()) {
pendingApprovalLoans.add(row); pendingApprovalLoans.add(row);
} else { } else {
closedLoans.add(row); closedLoans.add(row);
@@ -226,16 +229,16 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
Long productId = JdbcSupport.getLong(rs, "productId"); Long productId = JdbcSupport.getLong(rs, "productId");
String loanProductName = rs.getString("productName"); String loanProductName = rs.getString("productName");
Integer loanStatusId = JdbcSupport.getInteger(rs, "statusId"); 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); return new ClientLoanAccountSummaryData(id, externalId, productId, loanProductName, 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);
} }
} }
@@ -48,10 +48,7 @@ public class DerivedLoanDataProcessor {
} }
if (transaction.isWaiver()) { if (transaction.isWaiver()) {
LoanRepaymentData repaymentData = processWaiver( LoanRepaymentData repaymentData = processWaiver(transaction, scheduledRepaymentPeriod, currencyDetail);
transaction, scheduledRepaymentPeriod,
repaymentScheduleIndex, loanRepaymentPeriods,
arrearsTolerance, currencyDetail);
loanRepayments.add(repaymentData); loanRepayments.add(repaymentData);
} }
@@ -77,10 +74,7 @@ public class DerivedLoanDataProcessor {
} }
private LoanRepaymentData processWaiver(LoanTransaction transaction, private LoanRepaymentData processWaiver(LoanTransaction transaction,
LoanRepaymentPeriodData scheduledRepaymentPeriod, LoanRepaymentPeriodData scheduledRepaymentPeriod, CurrencyData currencyData) {
int repaymentScheduleIndex,
List<LoanRepaymentPeriodData> loanRepaymentPeriods,
Money arrearsTolerance, CurrencyData currencyData) {
MonetaryCurrency currency = new MonetaryCurrency(currencyData.getCode(), currencyData.getDecimalPlaces()); MonetaryCurrency currency = new MonetaryCurrency(currencyData.getCode(), currencyData.getDecimalPlaces());
Money totalToWaive = transaction.getAmount(currency); Money totalToWaive = transaction.getAmount(currency);
@@ -152,7 +146,7 @@ public class DerivedLoanDataProcessor {
LocalDate arrearsFrom = determineInArrearsFrom(currentRepaymentSchedule, loanRepaymentPeriods, repaymentIndex); LocalDate arrearsFrom = determineInArrearsFrom(currentRepaymentSchedule, loanRepaymentPeriods, repaymentIndex);
LocalDate arrearsTo = determineInArrearsTo(currentRepaymentSchedule, loanRepaymentPeriods, repaymentIndex); LocalDate arrearsTo = determineInArrearsTo(loanRepaymentPeriods, repaymentIndex);
currentRepaymentSchedule.setArrearsFrom(arrearsFrom); currentRepaymentSchedule.setArrearsFrom(arrearsFrom);
currentRepaymentSchedule.setArrearsTo(arrearsTo); currentRepaymentSchedule.setArrearsTo(arrearsTo);
@@ -165,7 +159,6 @@ public class DerivedLoanDataProcessor {
} }
private LocalDate determineInArrearsTo( private LocalDate determineInArrearsTo(
LoanRepaymentPeriodData currentRepaymentSchedule,
List<LoanRepaymentPeriodData> loanRepaymentPeriods, List<LoanRepaymentPeriodData> loanRepaymentPeriods,
int repaymentIndex) { int repaymentIndex) {
@@ -28,7 +28,12 @@ import org.joda.time.LocalDate;
import org.mifosng.platform.api.data.CurrencyData; import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.DerivedLoanData; import org.mifosng.platform.api.data.DerivedLoanData;
import org.mifosng.platform.api.data.EnumOptionData; 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.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.api.data.MoneyData;
import org.mifosng.platform.client.domain.Client; import org.mifosng.platform.client.domain.Client;
import org.mifosng.platform.currency.domain.MonetaryCurrency; import org.mifosng.platform.currency.domain.MonetaryCurrency;
@@ -975,4 +980,34 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
public String getCurrencyCode() { public String getCurrencyCode() {
return this.loanRepaymentScheduleDetail.getPrincipal().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; 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) { final LocalDate dueDate, final BigDecimal principal, final BigDecimal interest) {
this.loan = loan; this.loan = loan;
this.installmentNumber = installmentNumber; this.installmentNumber = installmentNumber;
@@ -94,7 +94,7 @@ public class LoanAssembler {
LoanRepaymentScheduleInstallment installment = new LoanRepaymentScheduleInstallment( LoanRepaymentScheduleInstallment installment = new LoanRepaymentScheduleInstallment(
loan, scheduledLoanInstallment.getInstallmentNumber(), loan, scheduledLoanInstallment.getInstallmentNumber(),
scheduledLoanInstallment.getPeriodStart(), // scheduledLoanInstallment.getPeriodStart(),
scheduledLoanInstallment.getPeriodEnd(), readPrincipalDue.getAmount(), scheduledLoanInstallment.getPeriodEnd(), readPrincipalDue.getAmount(),
readInterestDue.getAmount()); readInterestDue.getAmount());
loan.addRepaymentScheduleInstallment(installment); 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.CurrencyData;
import org.mifosng.platform.api.data.DerivedLoanData; import org.mifosng.platform.api.data.DerivedLoanData;
import org.mifosng.platform.api.data.LoanAccountData; 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.LoanProductData;
import org.mifosng.platform.api.data.LoanProductLookup; import org.mifosng.platform.api.data.LoanProductLookup;
import org.mifosng.platform.api.data.LoanRepaymentData; import org.mifosng.platform.api.data.LoanRepaymentData;
@@ -90,30 +88,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
DerivedLoanData loanData = realLoan.deriveLoanData(currencyData); DerivedLoanData loanData = realLoan.deriveLoanData(currencyData);
LoanBasicDetailsData basicDetails = realLoan.toBasicDetailsData(currencyData); return realLoan.toLoanAccountData(loanData.getSummary(), loanData.getRepaymentSchedule(), loanData.getLoanRepayments(), 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);
} }
@Override @Override
@@ -307,7 +307,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
LoanRepaymentScheduleInstallment installment = new LoanRepaymentScheduleInstallment( LoanRepaymentScheduleInstallment installment = new LoanRepaymentScheduleInstallment(
loan, scheduledLoanInstallment.getInstallmentNumber(), loan, scheduledLoanInstallment.getInstallmentNumber(),
scheduledLoanInstallment.getPeriodStart(), // scheduledLoanInstallment.getPeriodStart(),
scheduledLoanInstallment.getPeriodEnd(), principal.getAmount(), scheduledLoanInstallment.getPeriodEnd(), principal.getAmount(),
interest.getAmount()); interest.getAmount());
modifiedLoanRepaymentSchedule.add(installment); modifiedLoanRepaymentSchedule.add(installment);
@@ -8,7 +8,7 @@ public class LoanRepaymentScheduleInstallmentBuilder {
private Loan loan = null; private Loan loan = null;
private Integer installmentNumber = Integer.valueOf(1); private Integer installmentNumber = Integer.valueOf(1);
private LocalDate from = LocalDate.now(); // private LocalDate from = LocalDate.now();
private LocalDate dueDate = LocalDate.now(); private LocalDate dueDate = LocalDate.now();
private MonetaryCurrency currencyDetail = new MonetaryCurrencyBuilder().build(); private MonetaryCurrency currencyDetail = new MonetaryCurrencyBuilder().build();
private Money principal = new MoneyBuilder().build(); private Money principal = new MoneyBuilder().build();
@@ -21,7 +21,7 @@ public class LoanRepaymentScheduleInstallmentBuilder {
} }
public LoanRepaymentScheduleInstallment build() { 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) { public LoanRepaymentScheduleInstallmentBuilder withPrincipal(String withPrincipal) {