#317 flat installment amount for fixed installment amount

This commit is contained in:
nazeer1100126
2017-04-21 13:03:25 +05:30
parent 8baf9f4cd0
commit b059bb6206
2 changed files with 22 additions and 15 deletions
@@ -37,14 +37,14 @@ public class FlatInterestLoanScheduleGenerator extends AbstractLoanScheduleGener
@SuppressWarnings("unused") TreeMap<LocalDate, Money> principalVariation,
@SuppressWarnings("unused") Map<LocalDate, Money> compoundingMap, LocalDate periodStartDate, LocalDate periodEndDate,
@SuppressWarnings("unused") Collection<LoanTermVariationsData> termVariations) {
Money principalForThisInstallment = loanApplicationTerms.calculateTotalPrincipalForPeriod(calculator, outstandingBalance,
periodNumber, mc, null);
final PrincipalInterest result = loanApplicationTerms.calculateTotalInterestForPeriod(calculator,
interestCalculationGraceOnRepaymentPeriodFraction, periodNumber, mc, cumulatingInterestPaymentDueToGrace,
outstandingBalance, periodStartDate, periodEndDate);
Money interestForThisInstallment = result.interest();
Money principalForThisInstallment = loanApplicationTerms.calculateTotalPrincipalForPeriod(calculator, outstandingBalance,
periodNumber, mc, interestForThisInstallment);
// update cumulative fields for principal & interest
final Money interestBroughtForwardDueToGrace = result.interestPaymentDueToGrace();
@@ -600,7 +600,7 @@ public final class LoanApplicationTerms {
switch (this.interestMethod) {
case FLAT:
principalForInstallment = calculateTotalPrincipalPerPeriodWithoutGrace(mc, periodNumber);
principalForInstallment = calculateTotalPrincipalPerPeriodWithoutGrace(mc, periodNumber, interestForThisInstallment);
break;
case DECLINING_BALANCE:
switch (this.amortizationMethod) {
@@ -878,19 +878,26 @@ public final class LoanApplicationTerms {
return interestPerInstallment;
}
private Money calculateTotalPrincipalPerPeriodWithoutGrace(final MathContext mc, final int periodNumber) {
private Money calculateTotalPrincipalPerPeriodWithoutGrace(final MathContext mc, final int periodNumber, Money interestForThisInstallment) {
final int totalRepaymentsWithCapitalPayment = calculateNumberOfRepaymentsWithPrincipalPayment();
Money principalPerPeriod = this.principal.minus(totalPrincipalAccounted).dividedBy(totalRepaymentsWithCapitalPayment, mc.getRoundingMode()).plus(
this.adjustPrincipalForFlatLoans);
if (isPrincipalGraceApplicableForThisPeriod(periodNumber)) {
principalPerPeriod = principalPerPeriod.zero();
}
if (!isPrincipalGraceApplicableForThisPeriod(periodNumber) && currentPeriodFixedPrincipalAmount != null) {
this.adjustPrincipalForFlatLoans = this.adjustPrincipalForFlatLoans.plus(principalPerPeriod.minus(
currentPeriodFixedPrincipalAmount).dividedBy(this.actualNumberOfRepayments - periodNumber, mc.getRoundingMode()));
principalPerPeriod = this.principal.zero().plus(currentPeriodFixedPrincipalAmount);
Money principalPerPeriod = null;
if (getFixedEmiAmount() == null) {
principalPerPeriod = this.principal.minus(totalPrincipalAccounted).dividedBy(totalRepaymentsWithCapitalPayment, mc.getRoundingMode()).plus(
this.adjustPrincipalForFlatLoans);
if (isPrincipalGraceApplicableForThisPeriod(periodNumber)) {
principalPerPeriod = principalPerPeriod.zero();
}
if (!isPrincipalGraceApplicableForThisPeriod(periodNumber) && currentPeriodFixedPrincipalAmount != null) {
this.adjustPrincipalForFlatLoans = this.adjustPrincipalForFlatLoans.plus(principalPerPeriod.minus(
currentPeriodFixedPrincipalAmount).dividedBy(this.actualNumberOfRepayments - periodNumber, mc.getRoundingMode()));
principalPerPeriod = this.principal.zero().plus(currentPeriodFixedPrincipalAmount);
}
}else{
principalPerPeriod = Money.of(this.getCurrency(), getFixedEmiAmount()).minus(interestForThisInstallment);
return principalPerPeriod;
}
return principalPerPeriod;
}