WIP on support loan charges on loan schedule.

This commit is contained in:
Keith Woodlock
2012-09-18 15:15:33 +01:00
parent 6bd2d078a3
commit 3adfd9c073
3 changed files with 143 additions and 0 deletions
@@ -0,0 +1,72 @@
package org.mifosng.platform.api;
import java.math.BigDecimal;
/**
* Immutable data object to represent aspects of a loan schedule such as:
*
* <ul>
* <li>summary information - the totals for each part of schedule monitored</li>
* <li>repayment schedule - the principal due, outstanding balance and cost of loan items such as interest and charges</li>
* </ul>
*/
public class NewLoanScheduleData {
/**
* The cumulative total of all money (principal) disbursed to the loan applicant.
*/
private final BigDecimal principalDisbursed;
private final BigDecimal principalPaid;
private final BigDecimal principalOutstanding;
/**
* The total interest expected on any principal disbursed.
*/
private final BigDecimal interestExpected;
private final BigDecimal interestPaid;
private final BigDecimal interestWaived;
private final BigDecimal interestOutstanding;
/**
* The cumulative total of all charges applied on the loan to date.
*/
private final BigDecimal chargesToDate;
private final BigDecimal chargesPaid;
private final BigDecimal chargesOutstanding;
/**
* The cumulative total of all costs on the loan.
* Costs tracked are:
* <ul>
* <li>Interest</li>
* <li>Charges (fees and penalties)</li>
* </ul>
*/
private final BigDecimal totalCostOfLoan;
/**
* The sum of <code>principalDisbursed</code> and <code>totalCostOfLoan</code>.
*/
private final BigDecimal totalExpectedRepayment;
private final BigDecimal totalInArrears;
public NewLoanScheduleData() {
this.principalDisbursed = null;
this.principalPaid = null;
this.principalOutstanding = null;
this.interestExpected = null;
this.interestPaid = null;
this.interestWaived = null;
this.interestOutstanding = null;
this.chargesToDate = null;
this.chargesPaid = null;
this.chargesOutstanding = null;
this.totalCostOfLoan = null;
this.totalExpectedRepayment = null;
this.totalInArrears = null;
}
}
@@ -0,0 +1,8 @@
package org.mifosng.platform.api.data;
/**
* Immutable data object that represents a period of a loan schedule.
*/
public class LoanSchedulePeriodData {
}
@@ -0,0 +1,63 @@
package org.mifosng.platform.loan.service;
import java.math.BigDecimal;
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
import org.mifosng.platform.exceptions.LoanProductNotFoundException;
import org.mifosng.platform.loan.domain.AmortizationMethod;
import org.mifosng.platform.loan.domain.InterestCalculationPeriodMethod;
import org.mifosng.platform.loan.domain.InterestMethod;
import org.mifosng.platform.loan.domain.LoanProduct;
import org.mifosng.platform.loan.domain.LoanProductRelatedDetail;
import org.mifosng.platform.loan.domain.LoanProductRepository;
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
import org.mifosng.platform.loanschedule.domain.AprCalculator;
import org.springframework.stereotype.Service;
@Service
public class LoanProductRelatedDetailAssembler {
private final LoanProductRepository loanProductRepository;
private final AprCalculator aprCalculator;
public LoanProductRelatedDetailAssembler(
final LoanProductRepository loanProductRepository,
final AprCalculator aprCalculator) {
this.loanProductRepository = loanProductRepository;
this.aprCalculator = aprCalculator;
}
public LoanProductRelatedDetail assembleFrom(final CalculateLoanScheduleCommand command) {
final BigDecimal principalAmount = command.getPrincipal();
final BigDecimal defaultNominalInterestRatePerPeriod = command.getInterestRatePerPeriod();
final PeriodFrequencyType interestPeriodFrequencyType = PeriodFrequencyType.fromInt(command.getInterestRateFrequencyType());
final InterestMethod interestMethod = InterestMethod.fromInt(command.getInterestType());
final InterestCalculationPeriodMethod interestCalculationPeriodMethod = InterestCalculationPeriodMethod.fromInt(command.getInterestCalculationPeriodType());
final Integer defaultNumberOfInstallments = command.getNumberOfRepayments();
final Integer repayEvery = command.getRepaymentEvery();
final PeriodFrequencyType repaymentFrequencyType = PeriodFrequencyType.fromInt(command.getRepaymentFrequencyType());
final AmortizationMethod amortizationMethod = AmortizationMethod.fromInt(command.getAmortizationType());
final BigDecimal defaultAnnualNominalInterestRate = this.aprCalculator.calculateFrom(interestPeriodFrequencyType, defaultNominalInterestRatePerPeriod);
final LoanProduct loanProduct = this.loanProductRepository.findOne(command.getProductId());
if (loanProduct == null) {
throw new LoanProductNotFoundException(command.getProductId());
}
final MonetaryCurrency currency = loanProduct.getCurrency();
// in arrerars tolerance isnt relevant when auto-calculating a loan schedule
final BigDecimal inArrearsTolerance = BigDecimal.ZERO;
return new LoanProductRelatedDetail(currency, principalAmount,
defaultNominalInterestRatePerPeriod, interestPeriodFrequencyType, defaultAnnualNominalInterestRate,
interestMethod, interestCalculationPeriodMethod,
repayEvery, repaymentFrequencyType, defaultNumberOfInstallments, amortizationMethod,
inArrearsTolerance);
}
}