mifosx-58: wip - integrate charges at time of disbursement into loan create and modify flows. suppress non-relevant warnings for unused parameters in overiding classes.
This commit is contained in:
@@ -9,6 +9,7 @@ import org.mifosng.platform.client.domain.Client;
|
||||
import org.mifosng.platform.loan.domain.Loan;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class Specifications {
|
||||
|
||||
public static Specification<Loan> loansThatMatch(final Client client) {
|
||||
|
||||
@@ -303,17 +303,10 @@ public class LoansApiResource {
|
||||
@Produces({MediaType.APPLICATION_JSON})
|
||||
public String modifyLoanApplication(
|
||||
@PathParam("loanId") final Long loanId,
|
||||
// @QueryParam("command") final String commandParam,
|
||||
// @Context final UriInfo uriInfo,
|
||||
final String jsonRequestBody) {
|
||||
|
||||
final LoanApplicationCommand command = this.apiDataConversionService.convertJsonToLoanApplicationCommand(loanId, jsonRequestBody);
|
||||
|
||||
// if (is(commandParam, "calculateLoanSchedule")) {
|
||||
// CalculateLoanScheduleCommand calculateLoanScheduleCommand = command.toCalculateLoanScheduleCommand();
|
||||
// return calculateLoanSchedule(uriInfo, calculateLoanScheduleCommand);
|
||||
// }
|
||||
|
||||
final EntityIdentifier identifier = this.loanWritePlatformService.modifyLoanApplication(command);
|
||||
|
||||
return this.apiJsonSerializerService.serializeEntityIdentifier(identifier);
|
||||
|
||||
@@ -153,7 +153,7 @@ public class ReportsApiResource {
|
||||
if (!parameterType) {
|
||||
AppUser currentUser = context.authenticatedUser();
|
||||
if (currentUser.hasNotPermissionForReport(reportName)) {
|
||||
// TODO - message isnt passing back the message in the string in
|
||||
// FIXME - JW - message isnt passing back the message in the string in
|
||||
// the json just a generalised not authorised message
|
||||
throw new NoAuthorizationException(
|
||||
"Not Authorised to Run Report: " + reportName);
|
||||
|
||||
+7
-1
@@ -28,6 +28,7 @@ public class CalculateLoanScheduleCommand {
|
||||
private final LocalDate expectedDisbursementDate;
|
||||
private final LocalDate repaymentsStartingFromDate;
|
||||
private final LocalDate interestChargedFromDate;
|
||||
private final LoanChargeCommand[] charges;
|
||||
|
||||
public CalculateLoanScheduleCommand(
|
||||
final Long productId,
|
||||
@@ -36,7 +37,7 @@ public class CalculateLoanScheduleCommand {
|
||||
final Integer repaymentEvery, final Integer repaymentFrequency, final Integer numberOfRepayments, Integer amortizationMethod,
|
||||
final Integer loanTermFrequency, final Integer loanTermFrequencyType,
|
||||
final LocalDate expectedDisbursementDate,
|
||||
final LocalDate repaymentsStartingFromDate, final LocalDate interestCalculatedFromDate) {
|
||||
final LocalDate repaymentsStartingFromDate, final LocalDate interestCalculatedFromDate, final LoanChargeCommand[] charges) {
|
||||
|
||||
this.productId = productId;
|
||||
this.principal = principal;
|
||||
@@ -54,6 +55,7 @@ public class CalculateLoanScheduleCommand {
|
||||
this.expectedDisbursementDate = expectedDisbursementDate;
|
||||
this.repaymentsStartingFromDate = repaymentsStartingFromDate;
|
||||
this.interestChargedFromDate= interestCalculatedFromDate;
|
||||
this.charges = charges;
|
||||
}
|
||||
|
||||
public Long getProductId() {
|
||||
@@ -115,4 +117,8 @@ public class CalculateLoanScheduleCommand {
|
||||
public LocalDate getInterestChargedFromDate() {
|
||||
return interestChargedFromDate;
|
||||
}
|
||||
|
||||
public LoanChargeCommand[] getCharges() {
|
||||
return charges;
|
||||
}
|
||||
}
|
||||
+6
-4
@@ -96,10 +96,12 @@ public class LoanApplicationCommand {
|
||||
}
|
||||
|
||||
public CalculateLoanScheduleCommand toCalculateLoanScheduleCommand() {
|
||||
return new CalculateLoanScheduleCommand(productId,
|
||||
principal, interestRatePerPeriod, interestRateFrequencyType, interestType, interestCalculationPeriodType, repaymentEvery, repaymentFrequencyType, numberOfRepayments, amortizationType,
|
||||
return new CalculateLoanScheduleCommand(this.productId,
|
||||
this.principal, this.interestRatePerPeriod, this.interestRateFrequencyType,
|
||||
this.interestType, this.interestCalculationPeriodType, this.repaymentEvery,
|
||||
this.repaymentFrequencyType, this.numberOfRepayments, this.amortizationType,
|
||||
this.loanTermFrequency, this.loanTermFrequencyType,
|
||||
expectedDisbursementDate, repaymentsStartingFromDate, interestChargedFromDate);
|
||||
this.expectedDisbursementDate, this.repaymentsStartingFromDate, this.interestChargedFromDate, this.charges);
|
||||
}
|
||||
|
||||
public Long getLoanId() {
|
||||
@@ -200,7 +202,7 @@ public class LoanApplicationCommand {
|
||||
|
||||
public LoanProductCommand toLoanProductCommand() {
|
||||
|
||||
// TODO - FIX UP FOR CHARGES.
|
||||
// FIXME - KW - CHARGE - FIX UP FOR CHARGES - take look at loan product charges also and align usage with other loan areas.
|
||||
return new LoanProductCommand(modifiedParameters, this.productId, null, null,
|
||||
this.fundId, this.transactionProcessingStrategyId,
|
||||
null, null,
|
||||
|
||||
+6
-23
@@ -1,17 +1,11 @@
|
||||
package org.mifosng.platform.api.data;
|
||||
|
||||
import java.io.Serializable;
|
||||
public class DepositProductLookup {
|
||||
|
||||
public class DepositProductLookup implements Serializable {
|
||||
|
||||
private Long id;
|
||||
private String name;
|
||||
|
||||
public DepositProductLookup() {
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public DepositProductLookup(Long id, String name) {
|
||||
private final Long id;
|
||||
private final String name;
|
||||
|
||||
public DepositProductLookup(final Long id, final String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
@@ -20,18 +14,7 @@ public class DepositProductLookup implements Serializable {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+12
-8
@@ -39,13 +39,16 @@ public class LoanSchedulePeriodData {
|
||||
private final BigDecimal totalWaivedForPeriod;
|
||||
private final BigDecimal totalOutstandingForPeriod;
|
||||
|
||||
public static LoanSchedulePeriodData disbursement(final LocalDate disbursementDate, final BigDecimal principalDisbursed) {
|
||||
public static LoanSchedulePeriodData disbursementOnlyPeriod(
|
||||
final LocalDate disbursementDate,
|
||||
final BigDecimal principalDisbursed,
|
||||
final BigDecimal chargesDueAtTimeOfDisbursement) {
|
||||
Integer periodNumber = Integer.valueOf(0);
|
||||
LocalDate from = null;
|
||||
return new LoanSchedulePeriodData(periodNumber, from, disbursementDate, principalDisbursed);
|
||||
return new LoanSchedulePeriodData(periodNumber, from, disbursementDate, principalDisbursed, chargesDueAtTimeOfDisbursement);
|
||||
}
|
||||
|
||||
public static LoanSchedulePeriodData repaymentPeriod(final Integer periodNumber,
|
||||
public static LoanSchedulePeriodData repaymentOnlyPeriod(final Integer periodNumber,
|
||||
final LocalDate fromDate, final LocalDate dueDate, final BigDecimal principalDue,
|
||||
final BigDecimal principalOutstanding, final BigDecimal interestDueOnPrincipalOutstanding, final BigDecimal totalDueForPeriod) {
|
||||
|
||||
@@ -84,7 +87,8 @@ public class LoanSchedulePeriodData {
|
||||
final Integer periodNumber,
|
||||
final LocalDate fromDate,
|
||||
final LocalDate dueDate,
|
||||
final BigDecimal principalDisbursed) {
|
||||
final BigDecimal principalDisbursed,
|
||||
final BigDecimal chargesDueAtTimeOfDisbursement) {
|
||||
this.period = periodNumber;
|
||||
this.fromDate = fromDate;
|
||||
this.dueDate = dueDate;
|
||||
@@ -106,12 +110,12 @@ public class LoanSchedulePeriodData {
|
||||
this.interestWaived = null;
|
||||
this.interestOutstanding = null;
|
||||
|
||||
this.chargesDue = BigDecimal.ZERO;
|
||||
this.chargesDue = chargesDueAtTimeOfDisbursement;
|
||||
this.chargesPaid = null;
|
||||
this.chargesOutstanding = null;
|
||||
this.chargesOutstanding = chargesDueAtTimeOfDisbursement;
|
||||
|
||||
this.totalOriginalDueForPeriod = null;
|
||||
this.totalDueForPeriod = null;
|
||||
this.totalOriginalDueForPeriod = chargesDueAtTimeOfDisbursement;
|
||||
this.totalDueForPeriod = chargesDueAtTimeOfDisbursement;
|
||||
this.totalPaidForPeriod = BigDecimal.ZERO;
|
||||
this.totalWaivedForPeriod = null;
|
||||
this.totalOutstandingForPeriod = null;
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ import org.springframework.stereotype.Component;
|
||||
public class AccessDeniedExceptionMapper implements ExceptionMapper<AccessDeniedException> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(AccessDeniedException exception) {
|
||||
public Response toResponse(@SuppressWarnings("unused") AccessDeniedException exception) {
|
||||
// Status code 403 really reads as: "Authenticated - but not authorized":
|
||||
return Response.status(Status.FORBIDDEN).entity(ApiGlobalErrorResponse.unAuthorized()).type(MediaType.APPLICATION_JSON).build();
|
||||
}
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ import org.springframework.stereotype.Component;
|
||||
public class BadCredentialsExceptionMapper implements ExceptionMapper<BadCredentialsException> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(BadCredentialsException exception) {
|
||||
public Response toResponse(@SuppressWarnings("unused") BadCredentialsException exception) {
|
||||
return Response.status(Status.UNAUTHORIZED).entity(ApiGlobalErrorResponse.unAuthenticated()).type(MediaType.APPLICATION_JSON).build();
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -19,7 +19,7 @@ import org.springframework.stereotype.Component;
|
||||
public class InvalidJsonExceptionMapper implements ExceptionMapper<InvalidJsonException> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(final InvalidJsonException exception) {
|
||||
public Response toResponse(@SuppressWarnings("unused") final InvalidJsonException exception) {
|
||||
|
||||
String globalisationMessageCode = "error.msg.invalid.request.body";
|
||||
String defaultUserMessage = "The JSON provided in the body of the request is invalid or missing.";
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ import org.springframework.stereotype.Component;
|
||||
public class InvalidTenantIdentifierExceptionMapper implements ExceptionMapper<InvalidTenantIdentiferException> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(final InvalidTenantIdentiferException e) {
|
||||
public Response toResponse(@SuppressWarnings("unused") final InvalidTenantIdentiferException e) {
|
||||
return Response.status(Status.UNAUTHORIZED).entity(ApiGlobalErrorResponse.invalidTenantIdentifier()).type(MediaType.APPLICATION_JSON).build();
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -21,7 +21,7 @@ import com.google.gson.stream.MalformedJsonException;
|
||||
public class MalformedJsonExceptionMapper implements ExceptionMapper<MalformedJsonException> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(final MalformedJsonException exception) {
|
||||
public Response toResponse(@SuppressWarnings("unused") final MalformedJsonException exception) {
|
||||
|
||||
String globalisationMessageCode = "error.msg.invalid.request.body";
|
||||
String defaultUserMessage = "The JSON provided in the body of the request is invalid or missing.";
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ import org.springframework.stereotype.Component;
|
||||
public class NoAuthorizationExceptionMapper implements ExceptionMapper<NoAuthorizationException> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(NoAuthorizationException exception) {
|
||||
public Response toResponse(@SuppressWarnings("unused") NoAuthorizationException exception) {
|
||||
// Status code 403 really reads as: "Authenticated - but not authorized":
|
||||
return Response.status(Status.FORBIDDEN).entity(ApiGlobalErrorResponse.unAuthorized()).type(MediaType.APPLICATION_JSON).build();
|
||||
}
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ import org.springframework.stereotype.Component;
|
||||
public class UnAuthenticatedUserExceptionMapper implements ExceptionMapper<UnAuthenticatedUserException> {
|
||||
|
||||
@Override
|
||||
public Response toResponse(UnAuthenticatedUserException exception) {
|
||||
public Response toResponse(@SuppressWarnings("unused") UnAuthenticatedUserException exception) {
|
||||
// Status code 401 really reads as: "Unauthenticated":
|
||||
return Response.status(Status.UNAUTHORIZED).entity(ApiGlobalErrorResponse.unAuthenticated()).type(MediaType.APPLICATION_JSON).build();
|
||||
}
|
||||
|
||||
+1
@@ -14,6 +14,7 @@ import com.google.gson.JsonSerializer;
|
||||
*/
|
||||
public class JodaDateTimeAdapter implements JsonSerializer<DateTime> {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext context) {
|
||||
|
||||
|
||||
+1
@@ -15,6 +15,7 @@ import com.google.gson.JsonSerializer;
|
||||
*/
|
||||
public class JodaLocalDateAdapter implements JsonSerializer<LocalDate> {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
public JsonElement serialize(LocalDate src, Type typeOfSrc, JsonSerializationContext context) {
|
||||
|
||||
|
||||
+1
@@ -18,6 +18,7 @@ public class ParameterListExclusionStrategy implements ExclusionStrategy {
|
||||
return parameterNamesToSkip.contains(f.getName());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
public boolean shouldSkipClass(Class<?> clazz) {
|
||||
return false;
|
||||
|
||||
+2
-2
@@ -163,7 +163,7 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
|
||||
|
||||
|
||||
@Override
|
||||
public ChargeData mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
public ChargeData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
|
||||
Long id = rs.getLong("id");
|
||||
String name = rs.getString("name");
|
||||
BigDecimal amount = rs.getBigDecimal("amount");
|
||||
@@ -205,7 +205,7 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoanChargeData mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
public LoanChargeData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
|
||||
Long id = rs.getLong("id");
|
||||
Long chargeId = rs.getLong("chargeId");
|
||||
String name = rs.getString("name");
|
||||
|
||||
+5
-5
@@ -118,7 +118,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientData mapRow(final ResultSet rs, final int rowNum)
|
||||
public ClientData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long officeId = JdbcSupport.getLong(rs, "officeId");
|
||||
@@ -147,7 +147,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientLookup mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
public ClientLookup mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
|
||||
Long id = rs.getLong("id");
|
||||
String firstname = rs.getString("firstname");
|
||||
String lastname = rs.getString("lastname");
|
||||
@@ -238,7 +238,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
|
||||
|
||||
@Override
|
||||
public ClientAccountSummaryData mapRow(final ResultSet rs,
|
||||
final int rowNum) throws SQLException {
|
||||
@SuppressWarnings("unused") final int rowNum) throws SQLException {
|
||||
|
||||
Long id = JdbcSupport.getLong(rs, "id");
|
||||
String externalId = rs.getString("externalId");
|
||||
@@ -265,7 +265,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
|
||||
|
||||
@Override
|
||||
public ClientAccountSummaryData mapRow(final ResultSet rs,
|
||||
final int rowNum) throws SQLException {
|
||||
@SuppressWarnings("unused") final int rowNum) throws SQLException {
|
||||
|
||||
Long id = JdbcSupport.getLong(rs, "id");
|
||||
String externalId = rs.getString("externalId");
|
||||
@@ -341,7 +341,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
|
||||
}
|
||||
|
||||
@Override
|
||||
public NoteData mapRow(final ResultSet rs, final int rowNum)
|
||||
public NoteData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = JdbcSupport.getLong(rs, "id");
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ public class CurrencyReadPlatformServiceImpl implements CurrencyReadPlatformServ
|
||||
private static final class CurrencyMapper implements RowMapper<CurrencyData> {
|
||||
|
||||
@Override
|
||||
public CurrencyData mapRow(final ResultSet rs, final int rowNum)
|
||||
public CurrencyData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
String code = rs.getString("code");
|
||||
|
||||
+2
-5
@@ -4,10 +4,7 @@ public class DepositProductNotFoundException extends
|
||||
AbstractPlatformResourceNotFoundException {
|
||||
|
||||
public DepositProductNotFoundException(Long id) {
|
||||
super("error.msg.depositproduct.id.invalid", "Deposit product with identifier " + id + " does not exist", id);
|
||||
// TODO Auto-generated constructor stub
|
||||
super("error.msg.depositproduct.id.invalid",
|
||||
"Deposit product with identifier " + id + " does not exist", id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ public class FundReadPlatformServiceImpl implements FundReadPlatformService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public FundData mapRow(final ResultSet rs, final int rowNum)
|
||||
public FundData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
|
||||
+2
-2
@@ -80,7 +80,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public GroupData mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
public GroupData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
String name = rs.getString("name");
|
||||
@@ -110,7 +110,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientLookup mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
public ClientLookup mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
|
||||
Long id = rs.getLong("id");
|
||||
String firstname = rs.getString("firstname");
|
||||
String lastname = rs.getString("lastname");
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ public class JdbcTenantDetailsService implements TenantDetailsService {
|
||||
private static final class TenantMapper implements RowMapper<MifosPlatformTenant> {
|
||||
|
||||
@Override
|
||||
public MifosPlatformTenant mapRow(final ResultSet rs, final int rowNum) throws SQLException {
|
||||
public MifosPlatformTenant mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
String name = rs.getString("name");
|
||||
|
||||
+4
@@ -25,6 +25,7 @@ public class AdhikarLoanRepaymentScheduleTransactionProcessor extends AbstractLo
|
||||
* For creocore, early is defined as any date before the installment due
|
||||
* date
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected boolean isTransactionInAdvanceOfInstallment(
|
||||
final int currentInstallmentIndex,
|
||||
@@ -39,6 +40,7 @@ public class AdhikarLoanRepaymentScheduleTransactionProcessor extends AbstractLo
|
||||
/**
|
||||
* For early/'in advance' repayments, pays off principal component only.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected Money handleTransactionThatIsPaymentInAdvanceOfInstallment(
|
||||
final LoanRepaymentScheduleInstallment currentInstallment,
|
||||
@@ -53,6 +55,7 @@ public class AdhikarLoanRepaymentScheduleTransactionProcessor extends AbstractLo
|
||||
* For late repayments, pay off in the same way as on-time payments,
|
||||
* interest first then principal.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected Money handleTransactionThatIsALateRepaymentOfInstallment(
|
||||
final LoanRepaymentScheduleInstallment currentInstallment,
|
||||
@@ -135,6 +138,7 @@ public class AdhikarLoanRepaymentScheduleTransactionProcessor extends AbstractLo
|
||||
return transactionAmountRemaining;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected void onLoanOverpayment(final LoanTransaction loanTransaction,
|
||||
final Money loanOverPaymentAmount) {
|
||||
|
||||
+4
@@ -25,6 +25,7 @@ public class CreocoreLoanRepaymentScheduleTransactionProcessor extends
|
||||
* For creocore, early is defined as any date before the installment due
|
||||
* date
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected boolean isTransactionInAdvanceOfInstallment(
|
||||
final int currentInstallmentIndex,
|
||||
@@ -40,6 +41,7 @@ public class CreocoreLoanRepaymentScheduleTransactionProcessor extends
|
||||
* For early/'in advance' repayments, pay off in the same way as on-time payments,
|
||||
* interest first then principal.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected Money handleTransactionThatIsPaymentInAdvanceOfInstallment(
|
||||
final LoanRepaymentScheduleInstallment currentInstallment,
|
||||
@@ -54,6 +56,7 @@ public class CreocoreLoanRepaymentScheduleTransactionProcessor extends
|
||||
* For late repayments, pay off in the same way as on-time payments,
|
||||
* interest first then principal.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected Money handleTransactionThatIsALateRepaymentOfInstallment(
|
||||
final LoanRepaymentScheduleInstallment currentInstallment,
|
||||
@@ -95,6 +98,7 @@ public class CreocoreLoanRepaymentScheduleTransactionProcessor extends
|
||||
return transactionAmountRemaining;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
protected void onLoanOverpayment(final LoanTransaction loanTransaction,
|
||||
final Money loanOverPaymentAmount) {
|
||||
|
||||
+2
@@ -9,6 +9,8 @@ import org.joda.time.LocalDate;
|
||||
import org.mifosng.platform.currency.domain.MonetaryCurrency;
|
||||
import org.mifosng.platform.currency.domain.Money;
|
||||
|
||||
// FIXME - KW - this might be deprecated now
|
||||
@SuppressWarnings("unused")
|
||||
public class DailyEquivalentFlatInterestRebateCalculator implements
|
||||
InterestRebateCalculator {
|
||||
|
||||
|
||||
+1
@@ -18,6 +18,7 @@ import org.mifosng.platform.currency.domain.Money;
|
||||
*
|
||||
* If the entire principal of an installment is paid in advance then the interest component is waived.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class HeavensFamilyLoanRepaymentScheduleTransactionProcessor extends AbstractLoanRepaymentScheduleTransactionProcessor {
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,6 +2,8 @@ package org.mifosng.platform.loan.domain;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
@@ -13,6 +15,7 @@ import org.mifosng.platform.api.commands.LoanChargeCommand;
|
||||
import org.mifosng.platform.charge.domain.Charge;
|
||||
import org.mifosng.platform.charge.domain.ChargeCalculationType;
|
||||
import org.mifosng.platform.charge.domain.ChargeTimeType;
|
||||
import org.mifosng.platform.currency.domain.Money;
|
||||
import org.springframework.data.jpa.domain.AbstractPersistable;
|
||||
|
||||
@Entity
|
||||
@@ -23,7 +26,6 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
||||
@JoinColumn(name = "loan_id", referencedColumnName = "id", nullable=false)
|
||||
private Loan loan;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@ManyToOne(optional = false)
|
||||
@JoinColumn(name = "charge_id", referencedColumnName = "id", nullable=false)
|
||||
private Charge charge;
|
||||
@@ -92,7 +94,7 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
||||
return ChargeTimeType.fromInt(this.chargeTime).equals(ChargeTimeType.DISBURSEMENT);
|
||||
}
|
||||
|
||||
public BigDecimal calculateMonetaryAmount() {
|
||||
public BigDecimal calculateMonetaryAmount(final Money principalDisbursed) {
|
||||
BigDecimal calculatedAmount = BigDecimal.ZERO;
|
||||
|
||||
if (ChargeCalculationType.fromInt(chargeCalculation).equals(ChargeCalculationType.FLAT)) {
|
||||
@@ -104,13 +106,22 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
||||
amountAsPercentageFactor = this.amount.divide(BigDecimal.valueOf(Double.valueOf("100")));
|
||||
}
|
||||
|
||||
calculatedAmount = this.loan.getPrincpal().multiplyRetainScale(amountAsPercentageFactor, RoundingMode.HALF_EVEN).getAmount();
|
||||
calculatedAmount = principalDisbursed.multiplyRetainScale(amountAsPercentageFactor, RoundingMode.HALF_EVEN).getAmount();
|
||||
}
|
||||
|
||||
return calculatedAmount;
|
||||
}
|
||||
|
||||
public BigDecimal calculateMonetaryAmount() {
|
||||
return calculateMonetaryAmount(this.loan.getPrincpal());
|
||||
}
|
||||
|
||||
private boolean isGreaterThanZero(final BigDecimal value) {
|
||||
return value.compareTo(BigDecimal.ZERO) == 1;
|
||||
}
|
||||
|
||||
public LoanChargeCommand toData() {
|
||||
Set<String> modifiedParameters = new HashSet<String>();
|
||||
return new LoanChargeCommand(modifiedParameters, this.getId(), this.charge.getId(), this.amount, this.chargeTime, this.chargeCalculation);
|
||||
}
|
||||
}
|
||||
+1
@@ -15,6 +15,7 @@ import org.mifosng.platform.currency.domain.Money;
|
||||
* means, recalculate the interest component based on the how much principal is outstanding at a point in time;
|
||||
* but this isnt trying to model that option only the basic one for now.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class MifosStyleLoanRepaymentScheduleTransactionProcessor extends
|
||||
AbstractLoanRepaymentScheduleTransactionProcessor {
|
||||
|
||||
|
||||
+14
-6
@@ -1,5 +1,7 @@
|
||||
package org.mifosng.platform.loan.service;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.LocalDate;
|
||||
import org.mifosng.platform.api.LoanScheduleNewData;
|
||||
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
|
||||
@@ -11,6 +13,7 @@ import org.mifosng.platform.exceptions.CurrencyNotFoundException;
|
||||
import org.mifosng.platform.exceptions.LoanNotFoundException;
|
||||
import org.mifosng.platform.loan.domain.InterestMethod;
|
||||
import org.mifosng.platform.loan.domain.Loan;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.mifosng.platform.loan.domain.LoanPayoffSummary;
|
||||
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
|
||||
import org.mifosng.platform.loan.domain.LoanRepository;
|
||||
@@ -30,18 +33,21 @@ public class CalculationPlatformServiceImpl implements CalculationPlatformServic
|
||||
private final ApplicationCurrencyRepository applicationCurrencyRepository;
|
||||
private final PlatformSecurityContext context;
|
||||
private final LoanProductRelatedDetailAssembler loanProductRelatedDetailAssembler;
|
||||
private final LoanChargeAssembler loanChargeAssembler;
|
||||
|
||||
@Autowired
|
||||
public CalculationPlatformServiceImpl(
|
||||
final PlatformSecurityContext context,
|
||||
final LoanRepository loanRepository,
|
||||
final ApplicationCurrencyRepository applicationCurrencyRepository,
|
||||
final LoanProductRelatedDetailAssembler loanProductRelatedDetailAssembler) {
|
||||
final LoanProductRelatedDetailAssembler loanProductRelatedDetailAssembler,
|
||||
final LoanChargeAssembler loanChargeAssembler) {
|
||||
this.context = context;
|
||||
this.loanRepository = loanRepository;
|
||||
this.applicationCurrencyRepository = applicationCurrencyRepository;
|
||||
this.loanScheduleFactory = new DefaultLoanScheduleGeneratorFactory();
|
||||
this.loanProductRelatedDetailAssembler = loanProductRelatedDetailAssembler;
|
||||
this.loanChargeAssembler = loanChargeAssembler;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -49,24 +55,26 @@ public class CalculationPlatformServiceImpl implements CalculationPlatformServic
|
||||
|
||||
context.authenticatedUser();
|
||||
|
||||
CalculateLoanScheduleCommandValidator validator = new CalculateLoanScheduleCommandValidator(command);
|
||||
final CalculateLoanScheduleCommandValidator validator = new CalculateLoanScheduleCommandValidator(command);
|
||||
validator.validate();
|
||||
|
||||
LoanProductRelatedDetail loanScheduleRelatedDetails = this.loanProductRelatedDetailAssembler.assembleFrom(command);
|
||||
final LoanProductRelatedDetail loanScheduleRelatedDetails = this.loanProductRelatedDetailAssembler.assembleFrom(command);
|
||||
|
||||
final Integer loanTermFrequency = command.getLoanTermFrequency();
|
||||
final PeriodFrequencyType loanTermFrequencyType = PeriodFrequencyType.fromInt(command.getLoanTermFrequencyType());
|
||||
final InterestMethod interestMethod = InterestMethod.fromInt(command.getInterestType());
|
||||
|
||||
LoanScheduleGenerator loanScheduleGenerator = this.loanScheduleFactory.create(interestMethod);
|
||||
final LoanScheduleGenerator loanScheduleGenerator = this.loanScheduleFactory.create(interestMethod);
|
||||
|
||||
ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneByCode(loanScheduleRelatedDetails.getCurrency().getCode());
|
||||
final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneByCode(loanScheduleRelatedDetails.getCurrency().getCode());
|
||||
|
||||
final Set<LoanCharge> loanCharges = this.loanChargeAssembler.assembleFrom(command.getCharges());
|
||||
|
||||
return loanScheduleGenerator.generate(applicationCurrency,
|
||||
loanScheduleRelatedDetails, loanTermFrequency,
|
||||
loanTermFrequencyType, command.getExpectedDisbursementDate(),
|
||||
command.getRepaymentsStartingFromDate(),
|
||||
command.getInterestChargedFromDate());
|
||||
command.getInterestChargedFromDate(), loanCharges);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package org.mifosng.platform.loan.service;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.mifosng.platform.api.commands.LoanChargeCommand;
|
||||
import org.mifosng.platform.charge.domain.Charge;
|
||||
import org.mifosng.platform.charge.domain.ChargeRepository;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class LoanChargeAssembler {
|
||||
|
||||
private ChargeRepository chargeRepository;
|
||||
|
||||
@Autowired
|
||||
public LoanChargeAssembler(final ChargeRepository chargeRepository) {
|
||||
this.chargeRepository = chargeRepository;
|
||||
}
|
||||
|
||||
public Set<LoanCharge> assembleFrom(final LoanChargeCommand[] charges) {
|
||||
|
||||
final Set<LoanCharge> loanCharges = new HashSet<LoanCharge>();
|
||||
|
||||
// FIXME - KW - what if loanChargeCommands contains the actual loanCharge id, use loanChargeRepository to fetch it then.
|
||||
if (charges != null) {
|
||||
for (LoanChargeCommand loanChargeCommand : charges) {
|
||||
Charge chargeDefinition = this.chargeRepository.findOne(loanChargeCommand.getChargeId());
|
||||
LoanCharge loanCharge = LoanCharge.createNew(chargeDefinition, loanChargeCommand);
|
||||
loanCharges.add(loanCharge);
|
||||
}
|
||||
}
|
||||
|
||||
return loanCharges;
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -99,7 +99,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
|
||||
final LoanScheduleMapper rm = new LoanScheduleMapper(disbursement);
|
||||
final String sql = "select " + rm.loanScheduleSchema() + " where l.id = ? order by ls.loan_id, ls.installment";
|
||||
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursement(disbursement.disbursementDate(), disbursement.amount());
|
||||
// FIXME - KW - pass through total chargesDueAtTimeOfDisbursementFigure
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursementOnlyPeriod(disbursement.disbursementDate(), disbursement.amount(), BigDecimal.ZERO);
|
||||
|
||||
final Collection<LoanSchedulePeriodData> repaymentSchedulePeriods = this.jdbcTemplate.query(sql, rm, new Object[] { loanId });
|
||||
|
||||
|
||||
+10
-1
@@ -12,6 +12,7 @@ import org.mifosng.platform.api.LoanScheduleNewData;
|
||||
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
|
||||
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
|
||||
import org.mifosng.platform.api.commands.LoanApplicationCommand;
|
||||
import org.mifosng.platform.api.commands.LoanChargeCommand;
|
||||
import org.mifosng.platform.api.commands.LoanStateTransitionCommand;
|
||||
import org.mifosng.platform.api.commands.LoanTransactionCommand;
|
||||
import org.mifosng.platform.api.commands.UndoStateTransitionCommand;
|
||||
@@ -342,13 +343,21 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
||||
Integer interestMethod = loan.repaymentScheduleDetail().getInterestMethod().getValue();
|
||||
Integer interestCalculationInPeriod = loan.repaymentScheduleDetail().getInterestCalculationPeriodMethod().getValue();
|
||||
|
||||
Set<LoanCharge> loanCharges = loan.getCharges();
|
||||
List<LoanChargeCommand> commands = new ArrayList<LoanChargeCommand>();
|
||||
for (LoanCharge loanCharge : loanCharges) {
|
||||
commands.add(loanCharge.toData());
|
||||
}
|
||||
|
||||
LoanChargeCommand[] loanChargeCommands = commands.toArray(new LoanChargeCommand[commands.size()]);
|
||||
|
||||
CalculateLoanScheduleCommand calculateCommand = new CalculateLoanScheduleCommand(
|
||||
loan.loanProduct().getId(),
|
||||
principalAsDecimal,
|
||||
interestRatePerPeriod, interestRateFrequencyMethod, interestMethod, interestCalculationInPeriod,
|
||||
repaidEvery, selectedRepaymentFrequency, numberOfInstallments, selectedAmortizationMethod,
|
||||
loanTermFrequency, loanTermFrequencyType,
|
||||
actualDisbursementDate, repaymentsStartingFromDate, interestCalculatedFromDate);
|
||||
actualDisbursementDate, repaymentsStartingFromDate, interestCalculatedFromDate, loanChargeCommands);
|
||||
|
||||
LoanScheduleNewData loanSchedule = this.calculationPlatformService.calculateLoanScheduleNew(calculateCommand);
|
||||
|
||||
|
||||
+2
-2
@@ -167,7 +167,7 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoanProductData mapRow(final ResultSet rs, final int rowNum)
|
||||
public LoanProductData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
@@ -246,7 +246,7 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoanProductLookup mapRow(final ResultSet rs, final int rowNum)
|
||||
public LoanProductLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
|
||||
+4
-1
@@ -2,10 +2,12 @@ package org.mifosng.platform.loanschedule.domain;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.LocalDate;
|
||||
import org.mifosng.platform.api.LoanScheduleNewData;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrency;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
|
||||
|
||||
public interface AmortizationLoanScheduleGenerator {
|
||||
@@ -18,5 +20,6 @@ public interface AmortizationLoanScheduleGenerator {
|
||||
LocalDate interestCalculatedFrom,
|
||||
BigDecimal periodInterestRateForRepaymentPeriod,
|
||||
LocalDate idealDisbursementDateBasedOnFirstRepaymentDate,
|
||||
List<LocalDate> scheduledDates);
|
||||
List<LocalDate> scheduledDates,
|
||||
Set<LoanCharge> loanCharges);
|
||||
}
|
||||
+5
-2
@@ -2,11 +2,13 @@ package org.mifosng.platform.loanschedule.domain;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.LocalDate;
|
||||
import org.mifosng.platform.api.LoanScheduleNewData;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrency;
|
||||
import org.mifosng.platform.loan.domain.AmortizationMethod;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
|
||||
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
|
||||
|
||||
@@ -41,7 +43,8 @@ public class DecliningBalanceMethodLoanScheduleGenerator implements LoanSchedule
|
||||
final PeriodFrequencyType loanTermFrequencyType,
|
||||
final LocalDate disbursementDate,
|
||||
final LocalDate firstRepaymentDate,
|
||||
final LocalDate interestCalculatedFrom) {
|
||||
final LocalDate interestCalculatedFrom,
|
||||
final Set<LoanCharge> loanCharges) {
|
||||
|
||||
// 1. generate valid set of 'due dates' based on some of the 'loan attributes'
|
||||
final List<LocalDate> scheduledDates = this.scheduledDateGenerator.generate(loanScheduleInfo, disbursementDate, firstRepaymentDate);
|
||||
@@ -61,6 +64,6 @@ public class DecliningBalanceMethodLoanScheduleGenerator implements LoanSchedule
|
||||
interestCalculatedFrom,
|
||||
periodInterestRateForRepaymentPeriod,
|
||||
idealDisbursementDateBasedOnFirstRepaymentDate,
|
||||
scheduledDates);
|
||||
scheduledDates, loanCharges);
|
||||
}
|
||||
}
|
||||
+18
-5
@@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.Days;
|
||||
import org.joda.time.LocalDate;
|
||||
@@ -13,6 +14,7 @@ import org.mifosng.platform.api.data.LoanSchedulePeriodData;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrency;
|
||||
import org.mifosng.platform.currency.domain.MonetaryCurrency;
|
||||
import org.mifosng.platform.currency.domain.Money;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
|
||||
|
||||
/**
|
||||
@@ -33,7 +35,8 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort
|
||||
final LocalDate interestCalculatedFrom,
|
||||
final BigDecimal periodInterestRateForRepaymentPeriod,
|
||||
final LocalDate idealDisbursementDateBasedOnFirstRepaymentDate,
|
||||
final List<LocalDate> scheduledDates) {
|
||||
final List<LocalDate> scheduledDates,
|
||||
final Set<LoanCharge> loanCharges) {
|
||||
|
||||
final Collection<LoanSchedulePeriodData> periods = new ArrayList<LoanSchedulePeriodData>();
|
||||
|
||||
@@ -44,6 +47,7 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort
|
||||
|
||||
Money totalInterestDue = totalRepaymentDueForLoanTerm.minus(loanScheduleInfo.getPrincipal());
|
||||
Money outstandingBalance = loanScheduleInfo.getPrincipal();
|
||||
Money principalDisbursed = loanScheduleInfo.getPrincipal();
|
||||
Money totalPrincipal = Money.zero(monetaryCurrency);
|
||||
Money totalInterest = Money.zero(monetaryCurrency);
|
||||
|
||||
@@ -54,16 +58,25 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort
|
||||
scheduledDates,
|
||||
idealDisbursementDateBasedOnFirstRepaymentDate);
|
||||
|
||||
BigDecimal chargesDueAtTimeOfDisbursement = BigDecimal.ZERO;
|
||||
for (LoanCharge loanCharge : loanCharges) {
|
||||
// FIXME - KW - right now only charges at disbursement are supported.
|
||||
if (loanCharge.isDueAtDisbursement()) {
|
||||
chargesDueAtTimeOfDisbursement = chargesDueAtTimeOfDisbursement.add(loanCharge.calculateMonetaryAmount(principalDisbursed));
|
||||
}
|
||||
}
|
||||
|
||||
BigDecimal cumulativeChargesToDate = chargesDueAtTimeOfDisbursement;
|
||||
|
||||
// create entries of disbursement period on loan schedule
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursement(disbursementDate, loanScheduleInfo.getPrincipal().getAmount());
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursementOnlyPeriod(disbursementDate, principalDisbursed.getAmount(), chargesDueAtTimeOfDisbursement);
|
||||
periods.add(disbursementPeriod);
|
||||
|
||||
int loanTermInDays = Integer.valueOf(0);
|
||||
BigDecimal cumulativePrincipalDisbursed = loanScheduleInfo.getPrincipal().getAmount();
|
||||
BigDecimal cumulativePrincipalDue = BigDecimal.ZERO;
|
||||
BigDecimal cumulativeInterestExpected = BigDecimal.ZERO;
|
||||
BigDecimal cumulativeChargesToDate = BigDecimal.ZERO;
|
||||
BigDecimal totalExpectedRepayment = BigDecimal.ZERO;
|
||||
BigDecimal totalExpectedRepayment = chargesDueAtTimeOfDisbursement;
|
||||
|
||||
LocalDate startDate = disbursementDate;
|
||||
int periodNumber = 1;
|
||||
@@ -110,7 +123,7 @@ public class EqualInstallmentsAmortizationLoanScheduleGenerator implements Amort
|
||||
|
||||
outstandingBalance = outstandingBalance.minus(principalForInstallment);
|
||||
|
||||
LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentPeriod(periodNumber, startDate,
|
||||
LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber, startDate,
|
||||
scheduledDueDate,
|
||||
principalForInstallment.getAmount(),
|
||||
outstandingBalance.getAmount(),
|
||||
|
||||
+26
-12
@@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.Days;
|
||||
import org.joda.time.LocalDate;
|
||||
@@ -13,6 +14,7 @@ import org.mifosng.platform.api.data.LoanSchedulePeriodData;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrency;
|
||||
import org.mifosng.platform.currency.domain.MonetaryCurrency;
|
||||
import org.mifosng.platform.currency.domain.Money;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
|
||||
|
||||
public class EqualPrincipalAmortizationLoanScheduleGenerator implements AmortizationLoanScheduleGenerator {
|
||||
@@ -22,13 +24,15 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza
|
||||
|
||||
@Override
|
||||
public LoanScheduleNewData generate(
|
||||
ApplicationCurrency currency,
|
||||
LoanProductRelatedDetail loanScheduleInfo,
|
||||
LocalDate disbursementDate, LocalDate firstRepaymentDate,
|
||||
LocalDate interestCalculatedFrom,
|
||||
BigDecimal periodInterestRateForRepaymentPeriod,
|
||||
LocalDate idealDisbursementDateBasedOnFirstRepaymentDate,
|
||||
List<LocalDate> scheduledDates) {
|
||||
final ApplicationCurrency currency,
|
||||
final LoanProductRelatedDetail loanScheduleInfo,
|
||||
final LocalDate disbursementDate,
|
||||
final LocalDate firstRepaymentDate,
|
||||
final LocalDate interestCalculatedFrom,
|
||||
final BigDecimal periodInterestRateForRepaymentPeriod,
|
||||
final LocalDate idealDisbursementDateBasedOnFirstRepaymentDate,
|
||||
final List<LocalDate> scheduledDates,
|
||||
final Set<LoanCharge> loanCharges) {
|
||||
|
||||
final Collection<LoanSchedulePeriodData> periods = new ArrayList<LoanSchedulePeriodData>();
|
||||
|
||||
@@ -37,22 +41,32 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza
|
||||
Money totalDuePerInstallment = Money.zero(monetaryCurrency);
|
||||
|
||||
Money outstandingBalance = loanScheduleInfo.getPrincipal();
|
||||
Money principalDisbursed = loanScheduleInfo.getPrincipal();
|
||||
Money totalPrincipal = Money.zero(monetaryCurrency);
|
||||
Money totalInterest = Money.zero(monetaryCurrency);
|
||||
|
||||
double interestCalculationGraceOnRepaymentPeriodFraction = this.paymentPeriodsInOneYearCalculator.calculateRepaymentPeriodAsAFractionOfDays(loanScheduleInfo.getRepaymentPeriodFrequencyType(),
|
||||
loanScheduleInfo.getRepayEvery(), interestCalculatedFrom, scheduledDates, idealDisbursementDateBasedOnFirstRepaymentDate);
|
||||
|
||||
BigDecimal chargesDueAtTimeOfDisbursement = BigDecimal.ZERO;
|
||||
for (LoanCharge loanCharge : loanCharges) {
|
||||
// FIXME - KW - right now only charges at disbursement are supported.
|
||||
if (loanCharge.isDueAtDisbursement()) {
|
||||
chargesDueAtTimeOfDisbursement = chargesDueAtTimeOfDisbursement.add(loanCharge.calculateMonetaryAmount(principalDisbursed));
|
||||
}
|
||||
}
|
||||
|
||||
BigDecimal cumulativeChargesToDate = chargesDueAtTimeOfDisbursement;
|
||||
|
||||
// create entries of disbursement period on loan schedule
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursement(disbursementDate, loanScheduleInfo.getPrincipal().getAmount());
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursementOnlyPeriod(disbursementDate, principalDisbursed.getAmount(), chargesDueAtTimeOfDisbursement);
|
||||
periods.add(disbursementPeriod);
|
||||
|
||||
int loanTermInDays = Integer.valueOf(0);
|
||||
BigDecimal cumulativePrincipalDisbursed = loanScheduleInfo.getPrincipal().getAmount();
|
||||
BigDecimal cumulativePrincipalDisbursed = principalDisbursed.getAmount();
|
||||
BigDecimal cumulativePrincipalDue = BigDecimal.ZERO;
|
||||
BigDecimal cumulativeInterestExpected = BigDecimal.ZERO;
|
||||
BigDecimal cumulativeChargesToDate = BigDecimal.ZERO;
|
||||
BigDecimal totalExpectedRepayment = BigDecimal.ZERO;
|
||||
BigDecimal totalExpectedRepayment = chargesDueAtTimeOfDisbursement;
|
||||
|
||||
LocalDate startDate = disbursementDate;
|
||||
int periodNumber = 1;
|
||||
@@ -90,7 +104,7 @@ public class EqualPrincipalAmortizationLoanScheduleGenerator implements Amortiza
|
||||
|
||||
outstandingBalance = outstandingBalance.minus(principalForInstallment);
|
||||
|
||||
LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentPeriod(periodNumber, startDate,
|
||||
LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber, startDate,
|
||||
scheduledDueDate,
|
||||
principalForInstallment.getAmount(),
|
||||
outstandingBalance.getAmount(),
|
||||
|
||||
+20
-7
@@ -6,6 +6,7 @@ import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.Days;
|
||||
import org.joda.time.LocalDate;
|
||||
@@ -15,6 +16,7 @@ import org.mifosng.platform.api.data.LoanSchedulePeriodData;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrency;
|
||||
import org.mifosng.platform.currency.domain.MonetaryCurrency;
|
||||
import org.mifosng.platform.currency.domain.Money;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
|
||||
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
|
||||
|
||||
@@ -31,7 +33,8 @@ public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator {
|
||||
final PeriodFrequencyType loanTermFrequencyType,
|
||||
final LocalDate disbursementDate,
|
||||
final LocalDate firstRepaymentDate,
|
||||
final LocalDate interestCalculatedFrom) {
|
||||
final LocalDate interestCalculatedFrom,
|
||||
final Set<LoanCharge> loanCharges) {
|
||||
|
||||
final Collection<LoanSchedulePeriodData> periods = new ArrayList<LoanSchedulePeriodData>();
|
||||
|
||||
@@ -56,19 +59,29 @@ public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator {
|
||||
RoundingMode.HALF_EVEN);
|
||||
|
||||
Money outstandingBalance = loanScheduleInfo.getPrincipal();
|
||||
Money principalDisbursed = loanScheduleInfo.getPrincipal();
|
||||
Money totalPrincipal = Money.zero(outstandingBalance.getCurrency());
|
||||
Money totalInterest = Money.zero(outstandingBalance.getCurrency());
|
||||
|
||||
|
||||
BigDecimal chargesDueAtTimeOfDisbursement = BigDecimal.ZERO;
|
||||
for (LoanCharge loanCharge : loanCharges) {
|
||||
// FIXME - KW - right now only charges at disbursement are supported.
|
||||
if (loanCharge.isDueAtDisbursement()) {
|
||||
chargesDueAtTimeOfDisbursement = chargesDueAtTimeOfDisbursement.add(loanCharge.calculateMonetaryAmount(principalDisbursed));
|
||||
}
|
||||
}
|
||||
|
||||
BigDecimal cumulativeChargesToDate = chargesDueAtTimeOfDisbursement;
|
||||
|
||||
// create entries of disbursement period on loan schedule
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursement(disbursementDate, loanScheduleInfo.getPrincipal().getAmount());
|
||||
final LoanSchedulePeriodData disbursementPeriod = LoanSchedulePeriodData.disbursementOnlyPeriod(disbursementDate, principalDisbursed.getAmount(), chargesDueAtTimeOfDisbursement);
|
||||
periods.add(disbursementPeriod);
|
||||
|
||||
int loanTermInDays = Integer.valueOf(0);
|
||||
BigDecimal cumulativePrincipalDisbursed = loanScheduleInfo.getPrincipal().getAmount();
|
||||
BigDecimal cumulativePrincipalDisbursed = principalDisbursed.getAmount();
|
||||
BigDecimal cumulativePrincipalDue = BigDecimal.ZERO;
|
||||
BigDecimal cumulativeInterestExpected = BigDecimal.ZERO;
|
||||
BigDecimal cumulativeChargesToDate = BigDecimal.ZERO;
|
||||
BigDecimal totalExpectedRepayment = BigDecimal.ZERO;
|
||||
BigDecimal totalExpectedRepayment = chargesDueAtTimeOfDisbursement;
|
||||
|
||||
LocalDate startDate = disbursementDate;
|
||||
int periodNumber = 1;
|
||||
@@ -98,7 +111,7 @@ public class FlatMethodLoanScheduleGenerator implements LoanScheduleGenerator {
|
||||
Money totalInstallmentDue = principalPerInstallment.plus(interestPerInstallment);
|
||||
outstandingBalance = outstandingBalance.minus(principalPerInstallment);
|
||||
|
||||
LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentPeriod(periodNumber, startDate,
|
||||
LoanSchedulePeriodData installment = LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber, startDate,
|
||||
scheduledDueDate,
|
||||
principalPerInstallment.getAmount(),
|
||||
outstandingBalance.getAmount(),
|
||||
|
||||
+4
-1
@@ -1,8 +1,11 @@
|
||||
package org.mifosng.platform.loanschedule.domain;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.LocalDate;
|
||||
import org.mifosng.platform.api.LoanScheduleNewData;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrency;
|
||||
import org.mifosng.platform.loan.domain.LoanCharge;
|
||||
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
|
||||
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
|
||||
|
||||
@@ -12,6 +15,6 @@ public interface LoanScheduleGenerator {
|
||||
LoanProductRelatedDetail loanScheduleInfo,
|
||||
Integer loanTermFrequency,
|
||||
PeriodFrequencyType loanTermFrequencyType,
|
||||
LocalDate disbursementDate, LocalDate firstRepaymentDate, LocalDate interestCalculatedFrom);
|
||||
LocalDate disbursementDate, LocalDate firstRepaymentDate, LocalDate interestCalculatedFrom, Set<LoanCharge> loanCharges);
|
||||
|
||||
}
|
||||
+3
-3
@@ -51,7 +51,7 @@ public class OfficeReadPlatformServiceImpl implements OfficeReadPlatformService
|
||||
}
|
||||
|
||||
@Override
|
||||
public OfficeData mapRow(final ResultSet rs, final int rowNum)
|
||||
public OfficeData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
@@ -79,7 +79,7 @@ public class OfficeReadPlatformServiceImpl implements OfficeReadPlatformService
|
||||
}
|
||||
|
||||
@Override
|
||||
public OfficeLookup mapRow(final ResultSet rs, final int rowNum)
|
||||
public OfficeLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
@@ -106,7 +106,7 @@ public class OfficeReadPlatformServiceImpl implements OfficeReadPlatformService
|
||||
}
|
||||
|
||||
@Override
|
||||
public OfficeTransactionData mapRow(final ResultSet rs, final int rowNum)
|
||||
public OfficeTransactionData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
|
||||
+2
-2
@@ -165,7 +165,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead
|
||||
}
|
||||
|
||||
@Override
|
||||
public DepositAccountData mapRow(ResultSet rs, int rowNum)
|
||||
public DepositAccountData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
@@ -229,7 +229,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead
|
||||
}
|
||||
|
||||
@Override
|
||||
public DepositAccountTransactionData mapRow(ResultSet rs, int rowNum)
|
||||
public DepositAccountTransactionData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long transactionId = rs.getLong("transactionId");
|
||||
|
||||
+2
-2
@@ -79,7 +79,7 @@ public class DepositProductReadPlatformServiceImpl implements DepositProductRead
|
||||
}
|
||||
|
||||
@Override
|
||||
public DepositProductData mapRow(ResultSet rs, int rowNum)
|
||||
public DepositProductData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
@@ -125,7 +125,7 @@ public class DepositProductReadPlatformServiceImpl implements DepositProductRead
|
||||
}
|
||||
|
||||
@Override
|
||||
public DepositProductLookup mapRow(final ResultSet rs, final int rowNum)
|
||||
public DepositProductLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
|
||||
+3
-3
@@ -77,7 +77,7 @@ public class SavingProductReadPlatformServiceImpl implements
|
||||
} catch (EmptyResultDataAccessException e) {
|
||||
throw new LoanProductNotFoundException(savingProductId);
|
||||
}
|
||||
} // TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public SavingProductData retrieveNewSavingProductDetails() {
|
||||
@@ -98,7 +98,7 @@ public class SavingProductReadPlatformServiceImpl implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public SavingProductData mapRow(ResultSet rs, int rowNum)
|
||||
public SavingProductData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
@@ -132,7 +132,7 @@ public class SavingProductReadPlatformServiceImpl implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public SavingProductLookup mapRow(final ResultSet rs, final int rowNum)
|
||||
public SavingProductLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public StaffData mapRow(final ResultSet rs, final int rowNum)
|
||||
public StaffData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
|
||||
+1
-1
@@ -120,7 +120,7 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic
|
||||
}
|
||||
|
||||
@Override
|
||||
public AppUserData mapRow(final ResultSet rs, final int rowNum)
|
||||
public AppUserData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = rs.getLong("id");
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ public class PermissionReadPlatformServiceImpl implements PermissionReadPlatform
|
||||
private static final class PermissionMapper implements RowMapper<PermissionData> {
|
||||
|
||||
@Override
|
||||
public PermissionData mapRow(final ResultSet rs, final int rowNum) throws SQLException {
|
||||
public PermissionData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
|
||||
|
||||
Long id = JdbcSupport.getLong(rs, "id");
|
||||
String name = rs.getString("name");
|
||||
|
||||
+1
-1
@@ -56,7 +56,7 @@ public class RoleReadPlatformServiceImpl implements RoleReadPlatformService {
|
||||
protected static final class RoleMapper implements RowMapper<RoleData> {
|
||||
|
||||
@Override
|
||||
public RoleData mapRow(final ResultSet rs, final int rowNum)
|
||||
public RoleData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long id = JdbcSupport.getLong(rs, "id");
|
||||
|
||||
Reference in New Issue
Block a user