tidy up loan account data being returned breaking up into basic details, permissions, derived loan data and repayments.

This commit is contained in:
Keith Woodlock
2012-05-31 17:40:53 +01:00
parent bfe75a5c35
commit e0beb43f6f
47 changed files with 743 additions and 816 deletions
@@ -1,15 +0,0 @@
package org.mifosng.platform;
import java.util.Comparator;
import org.mifosng.data.LoanAccountData;
public class ClosedLoanComparator implements Comparator<LoanAccountData> {
@Override
public int compare(final LoanAccountData o1,
final LoanAccountData o2) {
return o1.getClosedOnDate().compareTo(o2.getClosedOnDate());
}
}
@@ -17,10 +17,10 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.joda.time.LocalDate;
import org.mifosng.data.ClientLoanAccountSummaryCollectionData;
import org.mifosng.platform.api.commands.ClientCommand;
import org.mifosng.platform.api.commands.NoteCommand;
import org.mifosng.platform.api.data.ClientData;
import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData;
import org.mifosng.platform.api.data.EntityIdentifier;
import org.mifosng.platform.api.data.NoteData;
import org.mifosng.platform.api.data.OfficeLookup;
@@ -18,9 +18,6 @@ import javax.ws.rs.core.UriInfo;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosng.data.LoanAccountData;
import org.mifosng.data.LoanRepaymentData;
import org.mifosng.data.LoanSchedule;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
import org.mifosng.platform.api.commands.LoanStateTransitionCommand;
@@ -28,6 +25,9 @@ import org.mifosng.platform.api.commands.LoanTransactionCommand;
import org.mifosng.platform.api.commands.SubmitLoanApplicationCommand;
import org.mifosng.platform.api.commands.UndoStateTransitionCommand;
import org.mifosng.platform.api.data.EntityIdentifier;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanRepaymentData;
import org.mifosng.platform.api.data.LoanSchedule;
import org.mifosng.platform.api.data.NewLoanData;
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService;
@@ -5,7 +5,7 @@ import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate;
import org.mifosng.data.LoanSchedule;
import org.mifosng.platform.api.data.LoanSchedule;
@XmlRootElement
public class SubmitLoanApplicationCommand {
@@ -0,0 +1,88 @@
package org.mifosng.platform.api.data;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.map.annotate.JsonFilter;
@XmlRootElement
@JsonFilter("myFilter")
public class ClientLoanAccountSummaryCollectionData {
private List<ClientLoanAccountSummaryData> pendingApprovalLoans = new ArrayList<ClientLoanAccountSummaryData>();
private List<ClientLoanAccountSummaryData> awaitingDisbursalLoans = new ArrayList<ClientLoanAccountSummaryData>();
private List<ClientLoanAccountSummaryData> openLoans = new ArrayList<ClientLoanAccountSummaryData>();
private List<ClientLoanAccountSummaryData> closedLoans = new ArrayList<ClientLoanAccountSummaryData>();
public ClientLoanAccountSummaryCollectionData() {
//
}
public ClientLoanAccountSummaryCollectionData(
final List<ClientLoanAccountSummaryData> pendingApprovalLoans,
final List<ClientLoanAccountSummaryData> awaitingDisbursalLoans,
final List<ClientLoanAccountSummaryData> openLoans,
final List<ClientLoanAccountSummaryData> closedLoans) {
this.pendingApprovalLoans = pendingApprovalLoans;
this.awaitingDisbursalLoans = awaitingDisbursalLoans;
this.openLoans = openLoans;
this.closedLoans = closedLoans;
}
public Integer getAnyLoanCount() {
return getPendingApprovalLoanCount() + getAwaitingDisbursalLoanCount()
+ getActiveLoanCount() + getClosedLoanCount();
}
public Integer getPendingApprovalLoanCount() {
return this.pendingApprovalLoans.size();
}
public Integer getAwaitingDisbursalLoanCount() {
return this.awaitingDisbursalLoans.size();
}
public Integer getActiveLoanCount() {
return this.openLoans.size();
}
public Integer getClosedLoanCount() {
return this.closedLoans.size();
}
public List<ClientLoanAccountSummaryData> getPendingApprovalLoans() {
return pendingApprovalLoans;
}
public void setPendingApprovalLoans(
List<ClientLoanAccountSummaryData> pendingApprovalLoans) {
this.pendingApprovalLoans = pendingApprovalLoans;
}
public List<ClientLoanAccountSummaryData> getAwaitingDisbursalLoans() {
return awaitingDisbursalLoans;
}
public void setAwaitingDisbursalLoans(
List<ClientLoanAccountSummaryData> awaitingDisbursalLoans) {
this.awaitingDisbursalLoans = awaitingDisbursalLoans;
}
public List<ClientLoanAccountSummaryData> getOpenLoans() {
return openLoans;
}
public void setOpenLoans(List<ClientLoanAccountSummaryData> openLoans) {
this.openLoans = openLoans;
}
public List<ClientLoanAccountSummaryData> getClosedLoans() {
return closedLoans;
}
public void setClosedLoans(List<ClientLoanAccountSummaryData> closedLoans) {
this.closedLoans = closedLoans;
}
}
@@ -0,0 +1,142 @@
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) {
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() {
return id;
}
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 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;
}
public void setLoanProductId(Long loanProductId) {
this.loanProductId = loanProductId;
}
public Integer getLoanStatusId() {
return loanStatusId;
}
public void setLoanStatusId(Integer loanStatusId) {
this.loanStatusId = loanStatusId;
}
}
@@ -5,7 +5,6 @@ import java.util.ArrayList;
import java.util.List;
import org.codehaus.jackson.map.annotate.JsonFilter;
import org.mifosng.data.CurrencyData;
@JsonFilter("myFilter")
public class ConfigurationData implements Serializable {
@@ -0,0 +1,91 @@
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;
private String name;
private int decimalPlaces;
private String displaySymbol;
private String nameCode;
public CurrencyData() {
//
}
public CurrencyData(final String code, final String name, final int decimalPlaces, String displaySymbol, String nameCode) {
this.code = code;
this.name = name;
this.decimalPlaces = decimalPlaces;
this.displaySymbol = displaySymbol;
this.nameCode = nameCode;
}
@Override
public boolean equals(Object obj) {
CurrencyData currencyData = (CurrencyData) obj;
return currencyData.code.equals(this.code);
}
@Override
public int hashCode() {
return this.code.hashCode();
}
public String getDisplayLabel() {
StringBuilder builder = new StringBuilder(this.name).append(' ');
if (this.displaySymbol != null && !"".equalsIgnoreCase(displaySymbol.trim())) {
builder.append('(').append(this.displaySymbol).append(')');
} else {
builder.append('[').append(this.code).append(']');
}
return builder.toString();
}
public String getName() {
return this.name;
}
public String getCode() {
return this.code;
}
public int getDecimalPlaces() {
return this.decimalPlaces;
}
public void setCode(final String code) {
this.code = code;
}
public void setName(final String name) {
this.name = name;
}
public void setDecimalPlaces(final int decimalPlaces) {
this.decimalPlaces = decimalPlaces;
}
public String getDisplaySymbol() {
return displaySymbol;
}
public void setDisplaySymbol(String displaySymbol) {
this.displaySymbol = displaySymbol;
}
public String getNameCode() {
return nameCode;
}
public void setNameCode(String nameCode) {
this.nameCode = nameCode;
}
}
@@ -0,0 +1,47 @@
package org.mifosng.platform.api.data;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class DerivedLoanData {
private LoanRepaymentScheduleData repaymentSchedule;
private LoanAccountSummaryData summary;
private List<LoanRepaymentData> loanRepayments;
public DerivedLoanData() {
//
}
public DerivedLoanData(LoanRepaymentScheduleData repaymentScheduleData, LoanAccountSummaryData summaryData, List<LoanRepaymentData> loanRepayments) {
this.repaymentSchedule = repaymentScheduleData;
this.summary = summaryData;
this.loanRepayments = loanRepayments;
}
public LoanRepaymentScheduleData getRepaymentSchedule() {
return repaymentSchedule;
}
public void setRepaymentSchedule(LoanRepaymentScheduleData repaymentSchedule) {
this.repaymentSchedule = repaymentSchedule;
}
public LoanAccountSummaryData getSummary() {
return summary;
}
public void setSummary(LoanAccountSummaryData summary) {
this.summary = summary;
}
public List<LoanRepaymentData> getLoanRepayments() {
return loanRepayments;
}
public void setLoanRepayments(List<LoanRepaymentData> loanRepayments) {
this.loanRepayments = loanRepayments;
}
}
@@ -0,0 +1,55 @@
package org.mifosng.platform.api.data;
import org.codehaus.jackson.map.annotate.JsonFilter;
@JsonFilter("loanFilter")
public class LoanAccountData {
private Long id;
private LoanBasicDetailsData basicDetails;
private DerivedLoanData loanData;
private LoanPermissionData permissions;
protected LoanAccountData() {
//
}
public LoanAccountData(Long id, LoanBasicDetailsData basicDetails, DerivedLoanData loanData, LoanPermissionData permissions) {
this.id = id;
this.basicDetails = basicDetails;
this.loanData = loanData;
this.permissions = permissions;
}
public LoanPermissionData getPermissions() {
return permissions;
}
public void setPermissions(LoanPermissionData permissions) {
this.permissions = permissions;
}
public LoanBasicDetailsData getBasicDetails() {
return basicDetails;
}
public void setBasicDetails(LoanBasicDetailsData basicDetails) {
this.basicDetails = basicDetails;
}
public DerivedLoanData getLoanData() {
return loanData;
}
public void setLoanData(DerivedLoanData loanData) {
this.loanData = loanData;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@@ -0,0 +1,133 @@
package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class LoanAccountSummaryData {
private MoneyData originalPrincipal;
private MoneyData originalInterest;
private MoneyData originalTotal;
private MoneyData principalPaid;
private MoneyData principalOutstanding;
private MoneyData interestPaid;
private MoneyData interestOutstanding;
private MoneyData totalPaid;
private MoneyData totalOutstanding;
private MoneyData totalInArrears;
private MoneyData totalWaived;
protected LoanAccountSummaryData() {
//
}
public LoanAccountSummaryData(MoneyData originalPrincipal,
MoneyData principalPaid, MoneyData principalOutstanding,
MoneyData originalInterest, MoneyData interestPaid,
MoneyData interestOutstanding, MoneyData originalTotal,
MoneyData totalPaid, MoneyData totalOutstanding, MoneyData totalInArrears, MoneyData totalWaived) {
this.originalPrincipal = originalPrincipal;
this.principalPaid = principalPaid;
this.principalOutstanding = principalOutstanding;
this.originalInterest = originalInterest;
this.interestPaid = interestPaid;
this.interestOutstanding = interestOutstanding;
this.originalTotal = originalTotal;
this.totalPaid = totalPaid;
this.totalOutstanding = totalOutstanding;
this.totalInArrears = totalInArrears;
this.totalWaived = totalWaived;
}
public boolean isWaiveAllowed(MoneyData tolerance) {
return tolerance.isGreaterThan(this.totalOutstanding) || tolerance.isEqualTo(this.totalOutstanding);
}
public MoneyData getOriginalPrincipal() {
return originalPrincipal;
}
public void setOriginalPrincipal(MoneyData originalPrincipal) {
this.originalPrincipal = originalPrincipal;
}
public MoneyData getOriginalInterest() {
return originalInterest;
}
public void setOriginalInterest(MoneyData originalInterest) {
this.originalInterest = originalInterest;
}
public MoneyData getOriginalTotal() {
return originalTotal;
}
public void setOriginalTotal(MoneyData originalTotal) {
this.originalTotal = originalTotal;
}
public MoneyData getPrincipalPaid() {
return principalPaid;
}
public void setPrincipalPaid(MoneyData principalPaid) {
this.principalPaid = principalPaid;
}
public MoneyData getPrincipalOutstanding() {
return principalOutstanding;
}
public void setPrincipalOutstanding(MoneyData principalOutstanding) {
this.principalOutstanding = principalOutstanding;
}
public MoneyData getInterestPaid() {
return interestPaid;
}
public void setInterestPaid(MoneyData interestPaid) {
this.interestPaid = interestPaid;
}
public MoneyData getInterestOutstanding() {
return interestOutstanding;
}
public void setInterestOutstanding(MoneyData interestOutstanding) {
this.interestOutstanding = interestOutstanding;
}
public MoneyData getTotalPaid() {
return totalPaid;
}
public void setTotalPaid(MoneyData totalPaid) {
this.totalPaid = totalPaid;
}
public MoneyData getTotalOutstanding() {
return totalOutstanding;
}
public void setTotalOutstanding(MoneyData totalOutstanding) {
this.totalOutstanding = totalOutstanding;
}
public MoneyData getTotalInArrears() {
return totalInArrears;
}
public void setTotalInArrears(MoneyData totalInArrears) {
this.totalInArrears = totalInArrears;
}
public MoneyData getTotalWaived() {
return totalWaived;
}
public void setTotalWaived(MoneyData totalWaived) {
this.totalWaived = totalWaived;
}
}
@@ -0,0 +1,363 @@
package org.mifosng.platform.api.data;
import java.math.BigDecimal;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.Months;
public class LoanBasicDetailsData {
private Long id;
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;
protected LoanBasicDetailsData() {
//
}
public LoanBasicDetailsData(Long id, String externalId,
String loanProductName, LocalDate closedOnDate,
LocalDate submittedOnDate, LocalDate approvedOnDate,
LocalDate expectedDisbursedOnLocalDate,
LocalDate acutalDisbursedOnLocalDate,
LocalDate expectedMaturityDate,
LocalDate expectedFirstRepaymentOnDate,
LocalDate interestChargedFromDate,
MoneyData principal, MoneyData inArrearsTolerance, Integer numberOfRepayments, Integer repaymentEvery,
BigDecimal interestRatePerPeriod, BigDecimal annualInterestRate,
EnumOptionData repaymentFrequencyType, EnumOptionData interestRateFrequencyType, EnumOptionData amortizationType,
EnumOptionData interestType, EnumOptionData interestCalculationPeriodType,
String lifeCycleStatusText, LocalDate lifeCycleStatusDate) {
this.id = id;
this.externalId = externalId;
this.loanProductName = loanProductName;
this.closedOnDate = closedOnDate;
this.submittedOnDate = submittedOnDate;
this.approvedOnDate = approvedOnDate;
this.expectedDisbursementDate = expectedDisbursedOnLocalDate;
actualDisbursementDate = acutalDisbursedOnLocalDate;
this.expectedMaturityDate = expectedMaturityDate;
this.expectedFirstRepaymentOnDate = expectedFirstRepaymentOnDate;
this.interestChargedFromDate = interestChargedFromDate;
this.principal = principal;
this.inArrearsTolerance = inArrearsTolerance;
this.numberOfRepayments = numberOfRepayments;
this.repaymentEvery = repaymentEvery;
this.interestRatePerPeriod = interestRatePerPeriod;
this.annualInterestRate = annualInterestRate;
this.repaymentFrequencyType = repaymentFrequencyType;
this.interestRateFrequencyType = interestRateFrequencyType;
this.amortizationType = amortizationType;
this.interestType = interestType;
this.interestCalculationPeriodType = interestCalculationPeriodType;
this.lifeCycleStatusText = lifeCycleStatusText;
this.lifeCycleStatusDate = lifeCycleStatusDate;
}
public int getMaxSubmittedOnOffsetFromToday() {
return Days.daysBetween(new DateTime(),
this.getSubmittedOnDate().toDateMidnight().toDateTime())
.getDays();
}
public int getMaxApprovedOnOffsetFromToday() {
int offset = 0;
if (this.getApprovedOnDate() != null) {
offset = Days.daysBetween(new DateTime(),
this.getApprovedOnDate().toDateMidnight().toDateTime())
.getDays();
}
return offset;
}
public int getMaxDisbursedOnOffsetFromToday() {
int offset = 0;
if (this.getActualDisbursementDate() != null) {
offset = Days.daysBetween(new DateTime(),
this.getActualDisbursementDate().toDateMidnight().toDateTime())
.getDays();
}
return offset;
}
public int getActualLoanTermInDays() {
LocalDate dateToUse = getExpectedDisbursementDate();
if (getActualDisbursementDate() != null) {
dateToUse = getActualDisbursementDate();
}
LocalDate closingDateToUse = getExpectedMaturityDate();
if (getClosedOnDate() != null) {
closingDateToUse = getClosedOnDate();
}
return Days.daysBetween(dateToUse.toDateMidnight().toDateTime(), closingDateToUse.toDateMidnight().toDateTime()).getDays();
}
public int getActualLoanTermInMonths() {
LocalDate dateToUse = getExpectedDisbursementDate();
if (getActualDisbursementDate() != null) {
dateToUse = getActualDisbursementDate();
}
LocalDate closingDateToUse = getExpectedMaturityDate();
if (getClosedOnDate() != null) {
closingDateToUse = getClosedOnDate();
}
return Months.monthsBetween(dateToUse.toDateMidnight().toDateTime(), closingDateToUse.toDateMidnight().toDateTime()).getMonths();
}
public int getLoanTermInDays() {
LocalDate dateToUse = getExpectedDisbursementDate();
if (getActualDisbursementDate() != null) {
dateToUse = getActualDisbursementDate();
}
LocalDate closingDateToUse = getExpectedMaturityDate();
return Days.daysBetween(dateToUse.toDateMidnight().toDateTime(), closingDateToUse.toDateMidnight().toDateTime()).getDays();
}
public int getLoanTermInMonths() {
LocalDate dateToUse = getExpectedDisbursementDate();
if (getActualDisbursementDate() != null) {
dateToUse = getActualDisbursementDate();
}
LocalDate closingDateToUse = getExpectedMaturityDate();
return Months.monthsBetween(dateToUse.toDateMidnight().toDateTime(), closingDateToUse.toDateMidnight().toDateTime()).getMonths();
}
public Long getId() {
return id;
}
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;
}
}
@@ -0,0 +1,110 @@
package org.mifosng.platform.api.data;
public class LoanPermissionData {
private boolean waiveAllowed;
private boolean makeRepaymentAllowed;
private boolean rejectAllowed;
private boolean withdrawnByApplicantAllowed;
private boolean undoApprovalAllowed;
private boolean disbursalAllowed;
private boolean undoDisbursalAllowed;
private boolean pendingApproval;
private boolean waitingForDisbursal;
protected LoanPermissionData() {
//
}
public LoanPermissionData(boolean waiveAllowed,
boolean makeRepaymentAllowed, boolean rejectAllowed,
boolean withdrawnByApplicantAllowed, boolean undoApprovalAllowed,
boolean undoDisbursalAllowed, boolean disbursalAllowed, boolean pendingApproval, boolean waitingForDisbursal) {
this.waiveAllowed = waiveAllowed;
this.makeRepaymentAllowed = makeRepaymentAllowed;
this.rejectAllowed = rejectAllowed;
this.withdrawnByApplicantAllowed = withdrawnByApplicantAllowed;
this.undoApprovalAllowed = undoApprovalAllowed;
this.undoDisbursalAllowed = undoDisbursalAllowed;
this.disbursalAllowed = disbursalAllowed;
this.pendingApproval = pendingApproval;
this.waitingForDisbursal = waitingForDisbursal;
}
public boolean isAnyActionOnLoanAllowed() {
return isRejectAllowed() || isWithdrawnByApplicantAllowed() || isPendingApproval() || isUndoDisbursalAllowed() || isMakeRepaymentAllowed();
}
public boolean isWaiveAllowed() {
return waiveAllowed;
}
public void setWaiveAllowed(boolean waiveAllowed) {
this.waiveAllowed = waiveAllowed;
}
public boolean isMakeRepaymentAllowed() {
return makeRepaymentAllowed;
}
public void setMakeRepaymentAllowed(boolean makeRepaymentAllowed) {
this.makeRepaymentAllowed = makeRepaymentAllowed;
}
public boolean isRejectAllowed() {
return rejectAllowed;
}
public void setRejectAllowed(boolean rejectAllowed) {
this.rejectAllowed = rejectAllowed;
}
public boolean isWithdrawnByApplicantAllowed() {
return withdrawnByApplicantAllowed;
}
public void setWithdrawnByApplicantAllowed(boolean withdrawnByApplicantAllowed) {
this.withdrawnByApplicantAllowed = withdrawnByApplicantAllowed;
}
public boolean isUndoApprovalAllowed() {
return undoApprovalAllowed;
}
public void setUndoApprovalAllowed(boolean undoApprovalAllowed) {
this.undoApprovalAllowed = undoApprovalAllowed;
}
public boolean isDisbursalAllowed() {
return disbursalAllowed;
}
public void setDisbursalAllowed(boolean disbursalAllowed) {
this.disbursalAllowed = disbursalAllowed;
}
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 isUndoDisbursalAllowed() {
return undoDisbursalAllowed;
}
public void setUndoDisbursalAllowed(boolean undoDisbursalAllowed) {
this.undoDisbursalAllowed = undoDisbursalAllowed;
}
}
@@ -7,8 +7,6 @@ import java.util.List;
import org.codehaus.jackson.map.annotate.JsonFilter;
import org.joda.time.DateTime;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.MoneyData;
@JsonFilter("myFilter")
public class LoanProductData implements Serializable {
@@ -0,0 +1,102 @@
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 {
private Long id;
private LocalDate date;
private MoneyData principal;
private MoneyData interest;
private MoneyData total;
private MoneyData totalWaived;
private MoneyData overpaid;
public LoanRepaymentData() {
//
}
public LoanRepaymentData(
Long id, final LocalDate date,
final MoneyData principal,
final MoneyData interest,
final MoneyData total, final MoneyData overpaid) {
this.id = id;
this.date = date;
this.principal = principal;
this.interest = interest;
this.total = total;
this.overpaid = overpaid;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public LocalDate getDate() {
return date;
}
public int getTransactionOffsetFromToday() {
return Days.daysBetween(new DateMidnight().toDateTime(), this.date.toDateMidnight().toDateTime()).getDays();
}
public void setDate(LocalDate date) {
this.date = date;
}
public MoneyData getPrincipal() {
return principal;
}
public void setPrincipal(MoneyData principal) {
this.principal = principal;
}
public MoneyData getInterest() {
return interest;
}
public void setInterest(MoneyData interest) {
this.interest = interest;
}
public MoneyData getTotal() {
return total;
}
public void setTotal(MoneyData total) {
this.total = total;
}
public MoneyData getOverpaid() {
return overpaid;
}
public void setOverpaid(MoneyData overpaid) {
this.overpaid = overpaid;
}
public boolean hasOverpaidComponent() {
return this.overpaid.isGreaterThanZero();
}
public MoneyData getTotalWaived() {
return totalWaived;
}
public void setTotalWaived(MoneyData totalWaived) {
this.totalWaived = totalWaived;
}
}
@@ -0,0 +1,235 @@
package org.mifosng.platform.api.data;
import javax.xml.bind.annotation.XmlRootElement;
import org.joda.time.LocalDate;
@XmlRootElement
public class LoanRepaymentPeriodData {
private Integer period;
private LocalDate date;
private MoneyData disbursed;
private MoneyData principal;
private MoneyData principalPaid;
private MoneyData principalOutstanding;
private MoneyData interest;
private MoneyData interestPaid;
private MoneyData interestOutstanding;
private MoneyData total;
private MoneyData totalPaid;
private MoneyData totalOutstanding;
private MoneyData totalWaived;
private MoneyData totalArrears;
private LocalDate arrearsFrom;
private LocalDate arrearsTo;
private LocalDate paidInFullOn;
private LocalDate lastAffectingPaymentOn;
private static CurrencyData currencyData(MoneyData moneyData) {
String code = moneyData.getCurrencyCode();
String name = moneyData.getDefaultName();
int decimalPlaces = moneyData.getDigitsAfterDecimal();
String displaySymbol = moneyData.getDisplaySymbol();
String nameCode = moneyData.getNameCode();
return new CurrencyData(code, name, decimalPlaces, displaySymbol, nameCode);
}
public LoanRepaymentPeriodData() {
//
}
public LoanRepaymentPeriodData(Integer period, LocalDate date,
MoneyData disbursed, MoneyData total) {
this.period = period;
this.date = date;
this.disbursed = disbursed;
this.principal = null;
this.principalPaid = null;
this.principalOutstanding = null;
this.interest = null;
this.interestPaid = null;
this.interestOutstanding = null;
this.total = total;
this.totalPaid = null;
this.totalOutstanding = total;
}
public LoanRepaymentPeriodData(Integer period, LocalDate date,
MoneyData disbursed, MoneyData principal,
MoneyData interest, MoneyData total,
MoneyData totalOutstanding) {
this.period = period;
this.date = date;
this.disbursed = disbursed;
this.principal = principal;
this.principalPaid = MoneyData.zero(currencyData(principal));
this.principalOutstanding = principal;
this.interest = interest;
this.interestPaid = MoneyData.zero(currencyData(principal));
this.interestOutstanding = interest;
this.total = total;
this.totalPaid = MoneyData.zero(currencyData(principal));
this.totalOutstanding = totalOutstanding;
}
public boolean isInArrearsWithToleranceOf(MoneyData arrearsTolerance, LocalDate asOf) {
boolean inArrears = false;
if (arrearsTolerance.isGreaterThanZero()) {
inArrears = this.totalOutstanding.isGreaterThan(arrearsTolerance);
} else {
inArrears = this.totalOutstanding.isGreaterThanZero();
}
return inArrears && this.date.isBefore(asOf);
}
public Integer getPeriod() {
return period;
}
public void setPeriod(Integer period) {
this.period = period;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public MoneyData getDisbursed() {
return disbursed;
}
public void setDisbursed(MoneyData disbursed) {
this.disbursed = disbursed;
}
public MoneyData getPrincipal() {
return principal;
}
public void setPrincipal(MoneyData principal) {
this.principal = principal;
}
public MoneyData getInterest() {
return interest;
}
public void setInterest(MoneyData interest) {
this.interest = interest;
}
public MoneyData getTotal() {
return total;
}
public void setTotal(MoneyData total) {
this.total = total;
}
public MoneyData getPrincipalPaid() {
return principalPaid;
}
public void setPrincipalPaid(MoneyData principalPaid) {
this.principalPaid = principalPaid;
}
public MoneyData getPrincipalOutstanding() {
return principalOutstanding;
}
public void setPrincipalOutstanding(MoneyData principalOutstanding) {
this.principalOutstanding = principalOutstanding;
}
public MoneyData getInterestPaid() {
return interestPaid;
}
public void setInterestPaid(MoneyData interestPaid) {
this.interestPaid = interestPaid;
}
public MoneyData getInterestOutstanding() {
return interestOutstanding;
}
public void setInterestOutstanding(MoneyData interestOutstanding) {
this.interestOutstanding = interestOutstanding;
}
public MoneyData getTotalPaid() {
return totalPaid;
}
public void setTotalPaid(MoneyData totalPaid) {
this.totalPaid = totalPaid;
}
public MoneyData getTotalOutstanding() {
return totalOutstanding;
}
public void setTotalOutstanding(MoneyData totalOutstanding) {
this.totalOutstanding = totalOutstanding;
}
public boolean isFullyPaid() {
return this.totalOutstanding.isZero();
}
public MoneyData getTotalArrears() {
return totalArrears;
}
public void setTotalArrears(MoneyData totalArrears) {
this.totalArrears = totalArrears;
}
public LocalDate getArrearsFrom() {
return arrearsFrom;
}
public void setArrearsFrom(LocalDate arrearsFrom) {
this.arrearsFrom = arrearsFrom;
}
public LocalDate getArrearsTo() {
return arrearsTo;
}
public void setArrearsTo(LocalDate arrearsTo) {
this.arrearsTo = arrearsTo;
}
public LocalDate getPaidInFullOn() {
return paidInFullOn;
}
public void setPaidInFullOn(LocalDate paidInFullOn) {
this.paidInFullOn = paidInFullOn;
}
public LocalDate getLastAffectingPaymentOn() {
return lastAffectingPaymentOn;
}
public void setLastAffectingPaymentOn(LocalDate lastAffectingPaymentOn) {
this.lastAffectingPaymentOn = lastAffectingPaymentOn;
}
public MoneyData getTotalWaived() {
return totalWaived;
}
public void setTotalWaived(MoneyData totalWaived) {
this.totalWaived = totalWaived;
}
}
@@ -0,0 +1,29 @@
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>();
public LoanRepaymentScheduleData() {
//
}
public LoanRepaymentScheduleData(
final List<LoanRepaymentPeriodData> periods) {
this.periods = periods;
}
public List<LoanRepaymentPeriodData> getPeriods() {
return periods;
}
public void setPeriods(List<LoanRepaymentPeriodData> periods) {
this.periods = periods;
}
}
@@ -0,0 +1,63 @@
package org.mifosng.platform.api.data;
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>();
private static CurrencyData currencyData(MoneyData moneyData) {
String code = moneyData.getCurrencyCode();
String name = moneyData.getDefaultName();
int decimalPlaces = moneyData.getDigitsAfterDecimal();
String displaySymbol = moneyData.getDisplaySymbol();
String nameCode = moneyData.getNameCode();
return new CurrencyData(code, name, decimalPlaces, displaySymbol, nameCode);
}
public LoanSchedule() {
//
}
public LoanSchedule(final List<ScheduledLoanInstallment> scheduledLoanInstallments) {
this.scheduledLoanInstallments = scheduledLoanInstallments;
}
public MoneyData getCumulativePrincipal() {
MoneyData cumulative = MoneyData.zero(currencyData(this.scheduledLoanInstallments.get(0).getPrincipalDue()));
for (ScheduledLoanInstallment installment : this.scheduledLoanInstallments) {
cumulative = cumulative.plus(installment.getPrincipalDue());
}
return cumulative;
}
public MoneyData getCumulativeInterest() {
MoneyData cumulative = MoneyData.zero(currencyData(this.scheduledLoanInstallments.get(0).getPrincipalDue()));
for (ScheduledLoanInstallment installment : this.scheduledLoanInstallments) {
cumulative = cumulative.plus(installment.getInterestDue());
}
return cumulative;
}
public MoneyData getCumulativeTotal() {
MoneyData cumulative = MoneyData.zero(currencyData(this.scheduledLoanInstallments.get(0).getPrincipalDue()));
for (ScheduledLoanInstallment installment : this.scheduledLoanInstallments) {
cumulative = cumulative.plus(installment.getTotalInstallmentDue());
}
return cumulative;
}
public List<ScheduledLoanInstallment> getScheduledLoanInstallments() {
return this.scheduledLoanInstallments;
}
public void setScheduledLoanInstallments(
final List<ScheduledLoanInstallment> scheduledLoanInstallments) {
this.scheduledLoanInstallments = scheduledLoanInstallments;
}
}
@@ -0,0 +1,188 @@
package org.mifosng.platform.api.data;
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;
private Integer digitsAfterDecimal;
private BigDecimal amount;
private String defaultName;
private String nameCode;
private String displaySymbol;
public static MoneyData of(final CurrencyData currency, final BigDecimal amount) {
return new MoneyData(currency.getCode(), currency.getDecimalPlaces(), currency.getName(), currency.getNameCode(), currency.getDisplaySymbol(), amount);
}
public static MoneyData zero(final CurrencyData currency) {
return new MoneyData(currency.getCode(), currency.getDecimalPlaces(), currency.getName(), currency.getNameCode(), currency.getDisplaySymbol(), BigDecimal.ZERO);
}
protected MoneyData() {
//
}
private MoneyData(final String currencyCode,
final int currencyDigitsAfterDecimal,
String defaultName, String nameCode, String displaySymbol,
final BigDecimal amount) {
this.currencyCode = currencyCode;
this.digitsAfterDecimal = currencyDigitsAfterDecimal;
this.defaultName = defaultName;
this.nameCode = nameCode;
this.displaySymbol = displaySymbol;
BigDecimal amountStripped = amount.stripTrailingZeros();
this.amount = amountStripped.setScale(this.digitsAfterDecimal,
RoundingMode.HALF_EVEN);
}
public MoneyData plus(final Iterable<? extends MoneyData> moniesToAdd) {
BigDecimal total = this.amount;
for (MoneyData moneyProvider : moniesToAdd) {
MoneyData money = this.checkCurrencyEqual(moneyProvider);
total = total.add(money.amount);
}
return MoneyData.of(currencyData(this), total);
}
public MoneyData plus(final MoneyData moneyToAdd) {
MoneyData toAdd = this.checkCurrencyEqual(moneyToAdd);
return this.plus(toAdd.getAmount());
}
public MoneyData plus(final BigDecimal amountToAdd) {
if (amountToAdd.compareTo(BigDecimal.ZERO) == 0) {
return this;
}
BigDecimal newAmount = this.amount.add(amountToAdd);
return MoneyData.of(currencyData(this), newAmount);
}
public MoneyData plus(final double amountToAdd) {
if (amountToAdd == 0) {
return this;
}
BigDecimal newAmount = this.amount.add(BigDecimal.valueOf(amountToAdd));
return MoneyData.of(currencyData(this), newAmount);
}
private static CurrencyData currencyData(MoneyData moneyData) {
String code = moneyData.getCurrencyCode();
String name = moneyData.getDefaultName();
int decimalPlaces = moneyData.getDigitsAfterDecimal();
String displaySymbol = moneyData.getDisplaySymbol();
String nameCode = moneyData.getNameCode();
return new CurrencyData(code, name, decimalPlaces, displaySymbol, nameCode);
}
private MoneyData checkCurrencyEqual(final MoneyData money) {
if (this.isSameCurrency(money) == false) {
throw new UnsupportedOperationException("currencies are different.");
}
return money;
}
public boolean isSameCurrency(final MoneyData money) {
return this.currencyCode.equals(money.getCurrencyCode());
}
public String getCurrencyCode() {
return this.currencyCode;
}
public BigDecimal getAmount() {
return this.amount;
}
public void setCurrencyCode(final String currencyCode) {
this.currencyCode = currencyCode;
}
public void setAmount(final BigDecimal amount) {
this.amount = amount;
}
public String getDefaultName() {
return defaultName;
}
public void setDefaultName(String defaultName) {
this.defaultName = defaultName;
}
public String getNameCode() {
return nameCode;
}
public void setNameCode(String nameCode) {
this.nameCode = nameCode;
}
public String getDisplaySymbol() {
return displaySymbol;
}
public void setDisplaySymbol(String displaySymbol) {
this.displaySymbol = displaySymbol;
}
public boolean isGreaterThanZero() {
return this.isGreaterThan(MoneyData.of(currencyData(this), BigDecimal.ZERO));
}
public boolean isGreaterThan(final MoneyData other) {
return this.compareTo(other) > 0;
}
public boolean isZero() {
return this.isEqualTo(MoneyData.zero(currencyData(this)));
}
public boolean isEqualTo(final MoneyData other) {
return this.compareTo(other) == 0;
}
@Override
public int compareTo(final MoneyData other) {
MoneyData otherMoney = other;
if (this.currencyCode.equals(otherMoney.currencyCode) == false) {
throw new UnsupportedOperationException(
"currencies arent different");
}
return this.amount.compareTo(otherMoney.amount);
}
@Override
public boolean equals(Object obj) {
MoneyData money = (MoneyData) obj;
return money.toString().equals(this.toString());
}
@Override
public int hashCode() {
return this.toString().hashCode();
}
@Override
public String toString() {
return new StringBuilder().append(this.amount.toPlainString()).toString();
}
public String getDisplaySymbolValue() {
return new StringBuilder().append(this.amount.toPlainString()).append(' ').append(this.displaySymbol).toString().trim();
}
public Integer getDigitsAfterDecimal() {
return digitsAfterDecimal;
}
public void setDigitsAfterDecimal(Integer digitsAfterDecimal) {
this.digitsAfterDecimal = digitsAfterDecimal;
}
}
@@ -6,7 +6,6 @@ import java.util.List;
import org.codehaus.jackson.map.annotate.JsonFilter;
import org.joda.time.LocalDate;
import org.mifosng.data.LoanSchedule;
@JsonFilter("myFilter")
public class NewLoanData implements Serializable {
@@ -0,0 +1,126 @@
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;
private LocalDate periodStart;
private LocalDate periodEnd;
private MoneyData principalDue;
private MoneyData interestDue;
private MoneyData totalInstallmentDue;
private MoneyData outStandingBalance;
public ScheduledLoanInstallment() {
//
}
public ScheduledLoanInstallment(final Integer installmentNumber,
final LocalDate periodStart, final LocalDate periodEnd,
final MoneyData principalDue,
final MoneyData interestDue,
final MoneyData totalInstallmentDue,
final MoneyData outStandingBalance) {
this.installmentNumber = installmentNumber;
this.periodStart = periodStart;
this.periodEnd = periodEnd;
this.principalDue = principalDue;
this.interestDue = interestDue;
this.totalInstallmentDue = totalInstallmentDue;
this.outStandingBalance = outStandingBalance;
}
public Integer getInstallmentNumber() {
return this.installmentNumber;
}
public LocalDate getPeriodStart() {
return this.periodStart;
}
public LocalDate getPeriodEnd() {
return this.periodEnd;
}
// @DateTimeFormat(pattern = "yyyy-MM-dd")
public void setDueDate(final LocalDate dueDate) {
this.periodEnd = dueDate;
}
public void setPrincipal(final BigDecimal principal) {
CurrencyData currencyData = currencyData(this.principalDue);
this.principalDue = MoneyData.of(currencyData, principal);
this.totalInstallmentDue = this.principalDue.plus(this.interestDue);
}
private CurrencyData currencyData(MoneyData moneyData) {
String code = moneyData.getCurrencyCode();
String name = moneyData.getDefaultName();
int decimalPlaces = moneyData.getDigitsAfterDecimal();
String displaySymbol = moneyData.getDisplaySymbol();
String nameCode = moneyData.getNameCode();
return new CurrencyData(code, name, decimalPlaces, displaySymbol, nameCode);
}
public void setInterest(final BigDecimal interest) {
CurrencyData currencyData = currencyData(this.principalDue);
this.interestDue = MoneyData.of(currencyData, interest);
this.totalInstallmentDue = this.principalDue.plus(this.interestDue);
}
public void setOutstanding(final BigDecimal outstanding) {
CurrencyData currencyData = currencyData(this.principalDue);
this.outStandingBalance = MoneyData.of(currencyData, outstanding);
}
public MoneyData getPrincipalDue() {
return this.principalDue;
}
public void setPrincipalDue(final MoneyData principalDue) {
this.principalDue = principalDue;
}
public MoneyData getInterestDue() {
return this.interestDue;
}
public void setInterestDue(final MoneyData interestDue) {
this.interestDue = interestDue;
}
public MoneyData getTotalInstallmentDue() {
return this.totalInstallmentDue;
}
public void setTotalInstallmentDue(final MoneyData totalInstallmentDue) {
this.totalInstallmentDue = totalInstallmentDue;
}
public MoneyData getOutStandingBalance() {
return this.outStandingBalance;
}
public void setOutStandingBalance(final MoneyData outStandingBalance) {
this.outStandingBalance = outStandingBalance;
}
public void setInstallmentNumber(final Integer installmentNumber) {
this.installmentNumber = installmentNumber;
}
public void setPeriodStart(final LocalDate periodStart) {
this.periodStart = periodStart;
}
public void setPeriodEnd(final LocalDate periodEnd) {
this.periodEnd = periodEnd;
}
}
@@ -2,8 +2,8 @@ package org.mifosng.platform.client.service;
import java.util.Collection;
import org.mifosng.data.ClientLoanAccountSummaryCollectionData;
import org.mifosng.platform.api.data.ClientData;
import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData;
import org.mifosng.platform.api.data.NoteData;
public interface ClientReadPlatformService {
@@ -11,10 +11,10 @@ import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.mifosng.data.ClientLoanAccountSummaryCollectionData;
import org.mifosng.data.ClientLoanAccountSummaryData;
import org.mifosng.platform.api.data.AppUserData;
import org.mifosng.platform.api.data.ClientData;
import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData;
import org.mifosng.platform.api.data.ClientLoanAccountSummaryData;
import org.mifosng.platform.api.data.NoteData;
import org.mifosng.platform.api.data.OfficeData;
import org.mifosng.platform.api.data.OfficeLookup;
@@ -3,8 +3,8 @@ package org.mifosng.platform.configuration.service;
import java.util.ArrayList;
import java.util.List;
import org.mifosng.data.CurrencyData;
import org.mifosng.platform.api.data.ConfigurationData;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.currency.service.CurrencyReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -2,7 +2,7 @@ package org.mifosng.platform.currency.service;
import java.util.List;
import org.mifosng.data.CurrencyData;
import org.mifosng.platform.api.data.CurrencyData;
public interface CurrencyReadPlatformService {
@@ -6,7 +6,7 @@ import java.util.List;
import javax.sql.DataSource;
import org.mifosng.data.CurrencyData;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.infrastructure.JdbcSupport;
import org.mifosng.platform.security.PlatformSecurityContext;
import org.mifosng.platform.user.domain.AppUser;
@@ -5,13 +5,13 @@ import java.util.Collections;
import java.util.List;
import org.joda.time.LocalDate;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.DerivedLoanData;
import org.mifosng.data.LoanAccountSummaryData;
import org.mifosng.data.LoanRepaymentData;
import org.mifosng.data.LoanRepaymentPeriodData;
import org.mifosng.data.LoanRepaymentScheduleData;
import org.mifosng.data.MoneyData;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.DerivedLoanData;
import org.mifosng.platform.api.data.LoanAccountSummaryData;
import org.mifosng.platform.api.data.LoanRepaymentData;
import org.mifosng.platform.api.data.LoanRepaymentPeriodData;
import org.mifosng.platform.api.data.LoanRepaymentScheduleData;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
import org.mifosng.platform.currency.domain.Money;
@@ -25,12 +25,16 @@ import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.DerivedLoanData;
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.LoanBasicDetailsData;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.client.domain.Client;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
import org.mifosng.platform.currency.domain.Money;
import org.mifosng.platform.infrastructure.AbstractAuditableCustom;
import org.mifosng.platform.loanproduct.service.LoanEnumerations;
import org.mifosng.platform.organisation.domain.Organisation;
import org.mifosng.platform.user.domain.AppUser;
@@ -86,7 +90,7 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
@Temporal(TemporalType.DATE)
@Column(name = "interest_calculated_from_date")
private Date interestCalculatedFromDate;
private Date interestChargedFromDate;
@Temporal(TemporalType.DATE)
@Column(name = "disbursedon_date")
@@ -173,7 +177,7 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
}
public void submitApplication(final LocalDate submittedOn, final LocalDate expectedDisbursementDate,
LocalDate repaymentsStartingFromDate, LocalDate interestCalculatedFromDate, LoanLifecycleStateMachine lifecycleStateMachine) {
LocalDate repaymentsStartingFromDate, LocalDate interestChargedFromDate, LoanLifecycleStateMachine lifecycleStateMachine) {
this.loanStatus = lifecycleStateMachine.transition(LoanEvent.LOAN_CREATED, this.loanStatus);
@@ -191,8 +195,8 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
this.expectedFirstRepaymentOnDate = repaymentsStartingFromDate.toDateMidnight().toDate();
}
if (interestCalculatedFromDate != null) {
this.interestCalculatedFromDate = interestCalculatedFromDate.toDateMidnight().toDate();
if (interestChargedFromDate != null) {
this.interestChargedFromDate = interestChargedFromDate.toDateMidnight().toDate();
}
if (new LocalDate(this.submittedOnDate).isAfter(new LocalDate())) {
@@ -724,6 +728,14 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
public Date getExpectedDisbursedOnDate() {
return this.expectedDisbursedOnDate;
}
public LocalDate getExpectedDisbursedOnLocalDate() {
LocalDate expectedDisbursementDate = null;
if (this.expectedDisbursedOnDate != null) {
expectedDisbursementDate = new LocalDate(this.expectedDisbursedOnDate);
}
return expectedDisbursementDate;
}
public LocalDate getExpectedFirstRepaymentOnDate() {
LocalDate firstRepaymentDate = null;
@@ -734,7 +746,7 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
}
public LocalDate getDisbursementDate() {
LocalDate disbursementDate = new LocalDate(this.expectedDisbursedOnDate);
LocalDate disbursementDate = getExpectedDisbursedOnLocalDate();
if (this.disbursedOnDate != null) {
disbursementDate = new LocalDate(this.disbursedOnDate);
}
@@ -923,19 +935,17 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
return this.loanRepaymentScheduleDetail.getCurrency();
}
public LocalDate getInterestCalculatedFromDate() {
LocalDate interestCalculatedFrom = null;
if (this.interestCalculatedFromDate != null) {
interestCalculatedFrom = new LocalDate(this.interestCalculatedFromDate);
public LocalDate getInterestChargedFromDate() {
LocalDate interestChargedFrom = null;
if (this.interestChargedFromDate != null) {
interestChargedFrom = new LocalDate(this.interestChargedFromDate);
}
return interestCalculatedFrom;
return interestChargedFrom;
}
public LocalDate getLoanStatusSinceDate() {
LocalDate statusSinceDate = new LocalDate(this.submittedOnDate);
LocalDate statusSinceDate = getSubmittedOnDate();
if (isApproved()) {
statusSinceDate = new LocalDate(this.approvedOnDate);
}
@@ -950,4 +960,30 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
return statusSinceDate;
}
public LoanBasicDetailsData toBasicDetailsData(CurrencyData currencyData) {
Money loanPrincipal = this.loanRepaymentScheduleDetail.getPrincipal();
MoneyData principal = MoneyData.of(currencyData, loanPrincipal.getAmount());
Money loanArrearsTolerance = this.loanRepaymentScheduleDetail.getInArrearsTolerance();
MoneyData tolerance = MoneyData.of(currencyData, loanArrearsTolerance.getAmount());
EnumOptionData repaymentFrequencyType = LoanEnumerations.repaymentFrequencyType(this.loanRepaymentScheduleDetail.getRepaymentPeriodFrequencyType());
EnumOptionData interestRateFrequencyType = LoanEnumerations.interestRateFrequencyType(this.loanRepaymentScheduleDetail.getInterestPeriodFrequencyType());
EnumOptionData amortizationType = LoanEnumerations.amortizationType(this.loanRepaymentScheduleDetail.getAmortizationMethod());
EnumOptionData interestType = LoanEnumerations.interestType(this.loanRepaymentScheduleDetail.getInterestMethod());
EnumOptionData interestCalculationPeriodType = LoanEnumerations.interestCalculationPeriodType(this.loanRepaymentScheduleDetail.getInterestCalculationPeriodMethod());
return new LoanBasicDetailsData(getId(), this.externalId, this.loanProduct.getName(),
getClosedOnDate(), getSubmittedOnDate(), getApprovedOnDate(), getExpectedDisbursedOnLocalDate(), getDisbursedOnDate(),
getExpectedMaturityDate(), getExpectedFirstRepaymentOnDate(), getInterestChargedFromDate(), principal, tolerance,
this.loanRepaymentScheduleDetail.getNumberOfRepayments(), this.loanRepaymentScheduleDetail.getRepayEvery(),
this.loanRepaymentScheduleDetail.getNominalInterestRatePerPeriod(), this.loanRepaymentScheduleDetail.getAnnualNominalInterestRate(),
repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType, interestCalculationPeriodType, getLoanStatusDisplayName(), getLoanStatusSinceDate());
}
public String getCurrencyCode() {
return this.loanRepaymentScheduleDetail.getPrincipal().getCurrencyCode();
}
}
@@ -2,7 +2,7 @@ package org.mifosng.platform.loan.domain;
import java.util.Comparator;
import org.mifosng.data.LoanRepaymentData;
import org.mifosng.platform.api.data.LoanRepaymentData;
public class LoanRepaymentDataComparator implements Comparator<LoanRepaymentData> {
@@ -1,8 +1,8 @@
package org.mifosng.platform.loan.service;
import org.joda.time.LocalDate;
import org.mifosng.data.LoanSchedule;
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
import org.mifosng.platform.api.data.LoanSchedule;
public interface CalculationPlatformService {
@@ -3,10 +3,10 @@ package org.mifosng.platform.loan.service;
import java.math.BigDecimal;
import org.joda.time.LocalDate;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.LoanSchedule;
import org.mifosng.data.MoneyData;
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.LoanSchedule;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.currency.domain.ApplicationCurrency;
import org.mifosng.platform.currency.domain.ApplicationCurrencyRepository;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
@@ -6,10 +6,10 @@ import static org.mifosng.platform.Specifications.productThatMatches;
import java.math.BigDecimal;
import java.util.List;
import org.mifosng.data.LoanSchedule;
import org.mifosng.data.MoneyData;
import org.mifosng.data.ScheduledLoanInstallment;
import org.mifosng.platform.api.commands.SubmitLoanApplicationCommand;
import org.mifosng.platform.api.data.LoanSchedule;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.api.data.ScheduledLoanInstallment;
import org.mifosng.platform.client.domain.Client;
import org.mifosng.platform.client.domain.ClientRepository;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
@@ -2,7 +2,7 @@ package org.mifosng.platform.loan.service;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter;
import org.mifosng.data.MoneyData;
import org.mifosng.platform.api.data.MoneyData;
/**
*
@@ -1,7 +1,7 @@
package org.mifosng.platform.loan.service;
import org.mifosng.data.LoanAccountData;
import org.mifosng.data.LoanRepaymentData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanRepaymentData;
import org.mifosng.platform.api.data.NewLoanData;
public interface LoanReadPlatformService {
@@ -7,14 +7,16 @@ import java.util.ArrayList;
import java.util.Collection;
import org.joda.time.LocalDate;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.DerivedLoanData;
import org.mifosng.data.LoanAccountData;
import org.mifosng.data.LoanRepaymentData;
import org.mifosng.data.MoneyData;
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;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.api.data.NewLoanData;
import org.mifosng.platform.client.service.ClientReadPlatformService;
import org.mifosng.platform.currency.domain.ApplicationCurrency;
@@ -66,16 +68,13 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
// need of loan information.
AppUser currentUser = context.authenticatedUser();
Loan loan = this.loanRepository.findOne(loansThatMatch(
currentUser.getOrganisation(), loanId));
Loan loan = this.loanRepository.findOne(loansThatMatch(currentUser.getOrganisation(), loanId));
if (loan == null) {
throw new LoanNotFoundException(loanId);
}
final String currencyCode = loan.getLoanRepaymentScheduleDetail()
.getPrincipal().getCurrencyCode();
ApplicationCurrency currency = this.applicationCurrencyRepository
.findOneByCode(currencyCode);
final String currencyCode = loan.getCurrencyCode();
ApplicationCurrency currency = this.applicationCurrencyRepository.findOneByCode(currencyCode);
if (currency == null) {
throw new CurrencyNotFoundException(currencyCode);
}
@@ -84,47 +83,23 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
currency.getName(), currency.getDecimalPlaces(),
currency.getDisplaySymbol(), currency.getNameCode());
LoanAccountData loanData = convertToData(loan, currencyData);
return loanData;
return convertToData(loan, currencyData);
}
private LoanAccountData convertToData(final Loan realLoan,
CurrencyData currencyData) {
private LoanAccountData convertToData(final Loan realLoan, CurrencyData currencyData) {
DerivedLoanData loanData = realLoan.deriveLoanData(currencyData);
LocalDate expectedDisbursementDate = null;
if (realLoan.getExpectedDisbursedOnDate() != null) {
expectedDisbursementDate = new LocalDate(
realLoan.getExpectedDisbursedOnDate());
}
Money loanPrincipal = realLoan.getLoanRepaymentScheduleDetail()
.getPrincipal();
MoneyData principal = MoneyData.of(currencyData,
loanPrincipal.getAmount());
Money loanArrearsTolerance = realLoan.getInArrearsTolerance();
MoneyData tolerance = MoneyData.of(currencyData,
loanArrearsTolerance.getAmount());
Money interestRebate = realLoan.getInterestRebateOwed();
MoneyData interestRebateOwed = MoneyData.of(currencyData,
interestRebate.getAmount());
boolean interestRebateOutstanding = false; // realLoan.isInterestRebateOutstanding(),
LoanBasicDetailsData basicDetails = realLoan.toBasicDetailsData(currencyData);
// permissions
boolean waiveAllowed = loanData.getSummary().isWaiveAllowed(tolerance)
boolean waiveAllowed = loanData.getSummary().isWaiveAllowed(basicDetails.getInArrearsTolerance())
&& realLoan.isNotClosed();
boolean undoDisbursalAllowed = realLoan.isDisbursed()
&& realLoan.isOpenWithNoRepaymentMade();
boolean makeRepaymentAllowed = realLoan.isDisbursed()
&& realLoan.isNotClosed();
LocalDate loanStatusDate = realLoan.getLoanStatusSinceDate();
boolean rejectAllowed = realLoan.isNotApproved()
&& realLoan.isNotDisbursed() && realLoan.isNotClosed();
boolean withdrawnByApplicantAllowed = realLoan.isNotDisbursed()
@@ -133,45 +108,51 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
&& 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 new LoanAccountData(realLoan.isClosed(), realLoan.isOpen(),
realLoan.isOpenWithRepaymentMade(), interestRebateOutstanding,
realLoan.isSubmittedAndPendingApproval(),
realLoan.isWaitingForDisbursal(), undoDisbursalAllowed,
makeRepaymentAllowed, rejectAllowed,
withdrawnByApplicantAllowed, undoApprovalAllowed,
disbursalAllowed, realLoan.getLoanStatusDisplayName(),
loanStatusDate, realLoan.getId(), realLoan.getExternalId(),
realLoan.getLoanProduct().getName(),
realLoan.getClosedOnDate(), realLoan.getSubmittedOnDate(),
realLoan.getApprovedOnDate(), expectedDisbursementDate,
realLoan.getDisbursedOnDate(),
realLoan.getExpectedMaturityDate(),
realLoan.getExpectedFirstRepaymentOnDate(),
realLoan.getInterestCalculatedFromDate(), principal, realLoan
.getLoanRepaymentScheduleDetail()
.getAnnualNominalInterestRate(), realLoan
.getLoanRepaymentScheduleDetail()
.getNominalInterestRatePerPeriod(), realLoan
.getLoanRepaymentScheduleDetail()
.getInterestPeriodFrequencyType().getValue(), realLoan
.getLoanRepaymentScheduleDetail()
.getInterestPeriodFrequencyType().toString(), realLoan
.getLoanRepaymentScheduleDetail().getInterestMethod()
.getValue(), realLoan.getLoanRepaymentScheduleDetail()
.getInterestMethod().toString(), realLoan
.getLoanRepaymentScheduleDetail()
.getAmortizationMethod().getValue(), realLoan
.getLoanRepaymentScheduleDetail()
.getAmortizationMethod().toString(), realLoan
.getLoanRepaymentScheduleDetail()
.getNumberOfRepayments(), realLoan
.getLoanRepaymentScheduleDetail().getRepayEvery(),
realLoan.getLoanRepaymentScheduleDetail()
.getRepaymentPeriodFrequencyType().getValue(), realLoan
.getLoanRepaymentScheduleDetail()
.getRepaymentPeriodFrequencyType().toString(),
tolerance, loanData, waiveAllowed, interestRebateOwed);
// return new LoanAccountData(realLoan.isClosed(), realLoan.isOpen(),
// realLoan.isOpenWithRepaymentMade(), interestRebateOutstanding,
// realLoan.isSubmittedAndPendingApproval(),
// realLoan.isWaitingForDisbursal(), undoDisbursalAllowed,
// makeRepaymentAllowed, rejectAllowed,
// withdrawnByApplicantAllowed, undoApprovalAllowed,
// disbursalAllowed, realLoan.getLoanStatusDisplayName(),
// loanStatusDate, realLoan.getId(), realLoan.getExternalId(),
// realLoan.getLoanProduct().getName(),
// realLoan.getClosedOnDate(), realLoan.getSubmittedOnDate(),
// realLoan.getApprovedOnDate(), expectedDisbursementDate,
// realLoan.getDisbursedOnDate(),
// realLoan.getExpectedMaturityDate(),
// realLoan.getExpectedFirstRepaymentOnDate(),
// realLoan.getInterestCalculatedFromDate(), principal, realLoan
// .getLoanRepaymentScheduleDetail()
// .getAnnualNominalInterestRate(), realLoan
// .getLoanRepaymentScheduleDetail()
// .getNominalInterestRatePerPeriod(), realLoan
// .getLoanRepaymentScheduleDetail()
// .getInterestPeriodFrequencyType().getValue(), realLoan
// .getLoanRepaymentScheduleDetail()
// .getInterestPeriodFrequencyType().toString(), realLoan
// .getLoanRepaymentScheduleDetail().getInterestMethod()
// .getValue(), realLoan.getLoanRepaymentScheduleDetail()
// .getInterestMethod().toString(), realLoan
// .getLoanRepaymentScheduleDetail()
// .getAmortizationMethod().getValue(), realLoan
// .getLoanRepaymentScheduleDetail()
// .getAmortizationMethod().toString(), realLoan
// .getLoanRepaymentScheduleDetail()
// .getNumberOfRepayments(), realLoan
// .getLoanRepaymentScheduleDetail().getRepayEvery(),
// realLoan.getLoanRepaymentScheduleDetail()
// .getRepaymentPeriodFrequencyType().getValue(), realLoan
// .getLoanRepaymentScheduleDetail()
// .getRepaymentPeriodFrequencyType().toString(),
// tolerance, loanData, waiveAllowed, interestRebateOwed);
}
@Override
@@ -21,7 +21,7 @@ public class LoanStateTransitionCommandValidator {
DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan.transition");
baseDataValidator.reset().parameter("loanId").value(command.getLoanId()).notNull();
baseDataValidator.reset().parameter("loanId").value(command.getLoanId()).notNull().greaterThanZero();
baseDataValidator.reset().parameter("eventDate").value(command.getEventLocalDate()).notNull();
baseDataValidator.reset().parameter("note").value(command.getNote()).notExceedingLengthOf(1000);
@@ -3,7 +3,7 @@ package org.mifosng.platform.loan.service;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.mifosng.platform.DataValidatorBuilder;
import org.mifosng.platform.api.commands.LoanTransactionCommand;
import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
@@ -17,27 +17,15 @@ public class LoanTransactionCommandValidator {
}
public void validate() {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
if (command.getLoanId() == null || command.getLoanId().doubleValue() <= 0) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.loan.id.is.invalid", "The parameter loanId is invalid.", "loanId", command.getLoanId());
dataValidationErrors.add(error);
}
DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("role");
if (command.getTransactionLocalDate() == null) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.loan.repayment.date.cannot.be.blank", "The parameter transactionDateFormatted cannot be blank.", "transactionDateFormatted");
dataValidationErrors.add(error);
}
if (command.getTransactionAmount() == null || command.getTransactionAmountValue().doubleValue() <= 0) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.loan.repayment.must.be.greater.than.zero", "The parameter transactionAmountFormatted less than zero.", "transactionAmountFormatted", command.getTransactionAmountValue());
dataValidationErrors.add(error);
}
if (StringUtils.isNotBlank(command.getNote()) && command.getNote().length() > 1000) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.note.exceeds.max.length", "The parameter comment exceeds max allowed size of {0}", "comment", 1000);
dataValidationErrors.add(error);
}
baseDataValidator.reset().parameter("loanid").value(command.getLoanId()).notNull().greaterThanZero();
baseDataValidator.reset().parameter("transactionDate").value(command.getTransactionLocalDate()).notNull();
baseDataValidator.reset().parameter("transactionAmount").value(command.getTransactionAmount()).notNull().positiveAmount();
baseDataValidator.reset().parameter("note").value(command.getNote()).notExceedingLengthOf(1000);
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
@@ -7,8 +7,6 @@ import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosng.data.LoanSchedule;
import org.mifosng.data.ScheduledLoanInstallment;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
import org.mifosng.platform.api.commands.LoanStateTransitionCommand;
@@ -16,6 +14,8 @@ import org.mifosng.platform.api.commands.LoanTransactionCommand;
import org.mifosng.platform.api.commands.SubmitLoanApplicationCommand;
import org.mifosng.platform.api.commands.UndoStateTransitionCommand;
import org.mifosng.platform.api.data.EntityIdentifier;
import org.mifosng.platform.api.data.LoanSchedule;
import org.mifosng.platform.api.data.ScheduledLoanInstallment;
import org.mifosng.platform.client.domain.Note;
import org.mifosng.platform.client.domain.NoteRepository;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
@@ -263,7 +263,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
if (loan.isRepaymentScheduleRegenerationRequiredForDisbursement(actualDisbursementDate)) {
LocalDate repaymentsStartingFromDate = loan.getExpectedFirstRepaymentOnDate();
LocalDate interestCalculatedFromDate = loan.getInterestCalculatedFromDate();
LocalDate interestCalculatedFromDate = loan.getInterestChargedFromDate();
Number principalAsDecimal = loan.getLoanRepaymentScheduleDetail().getPrincipal().getAmount();
String currencyCode = loan.getLoanRepaymentScheduleDetail().getPrincipal().getCurrencyCode();
@@ -27,7 +27,7 @@ public class SubmitLoanApplicationCommandValidator {
if (command.getSubmittedOnLocalDate() == null) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.loan.submitted.on.date.cannot.be.blank",
"The parameter submittedOnDate cannot be empty.", "submittedOnDateFormatted");
"The parameter submittedOnDate cannot be empty.", "submittedOnDate");
dataValidationErrors.add(error);
} else {
if (command.getSubmittedOnLocalDate().isAfter(command.getExpectedDisbursementLocalDate())) {
@@ -9,11 +9,11 @@ import java.util.List;
import javax.sql.DataSource;
import org.joda.time.DateTime;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.MoneyData;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.EnumOptionData;
import org.mifosng.platform.api.data.LoanProductData;
import org.mifosng.platform.api.data.LoanProductLookup;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.currency.service.CurrencyReadPlatformService;
import org.mifosng.platform.exceptions.LoanProductNotFoundException;
import org.mifosng.platform.infrastructure.JdbcSupport;
@@ -6,10 +6,10 @@ import java.util.List;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.LoanSchedule;
import org.mifosng.data.MoneyData;
import org.mifosng.data.ScheduledLoanInstallment;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.LoanSchedule;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.api.data.ScheduledLoanInstallment;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
import org.mifosng.platform.currency.domain.Money;
import org.mifosng.platform.loan.domain.AmortizationMethod;
@@ -7,10 +7,10 @@ import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.LoanSchedule;
import org.mifosng.data.MoneyData;
import org.mifosng.data.ScheduledLoanInstallment;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.LoanSchedule;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.api.data.ScheduledLoanInstallment;
import org.mifosng.platform.currency.domain.Money;
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
@@ -1,8 +1,8 @@
package org.mifosng.platform.loanschedule.domain;
import org.joda.time.LocalDate;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.LoanSchedule;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.LoanSchedule;
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
public interface LoanScheduleGenerator {
@@ -10,12 +10,12 @@ import java.util.List;
import org.joda.time.LocalDate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.DerivedLoanData;
import org.mifosng.data.LoanRepaymentData;
import org.mifosng.data.LoanRepaymentPeriodData;
import org.mifosng.data.LoanRepaymentScheduleData;
import org.mifosng.data.MoneyData;
import org.mifosng.platform.api.data.CurrencyData;
import org.mifosng.platform.api.data.DerivedLoanData;
import org.mifosng.platform.api.data.LoanRepaymentData;
import org.mifosng.platform.api.data.LoanRepaymentPeriodData;
import org.mifosng.platform.api.data.LoanRepaymentScheduleData;
import org.mifosng.platform.api.data.MoneyData;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
import org.mifosng.platform.currency.domain.Money;
import org.mockito.runners.MockitoJUnitRunner;