#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") TreeMap<LocalDate, Money> principalVariation,
@SuppressWarnings("unused") Map<LocalDate, Money> compoundingMap, LocalDate periodStartDate, LocalDate periodEndDate, @SuppressWarnings("unused") Map<LocalDate, Money> compoundingMap, LocalDate periodStartDate, LocalDate periodEndDate,
@SuppressWarnings("unused") Collection<LoanTermVariationsData> termVariations) { @SuppressWarnings("unused") Collection<LoanTermVariationsData> termVariations) {
Money principalForThisInstallment = loanApplicationTerms.calculateTotalPrincipalForPeriod(calculator, outstandingBalance,
periodNumber, mc, null);
final PrincipalInterest result = loanApplicationTerms.calculateTotalInterestForPeriod(calculator, final PrincipalInterest result = loanApplicationTerms.calculateTotalInterestForPeriod(calculator,
interestCalculationGraceOnRepaymentPeriodFraction, periodNumber, mc, cumulatingInterestPaymentDueToGrace, interestCalculationGraceOnRepaymentPeriodFraction, periodNumber, mc, cumulatingInterestPaymentDueToGrace,
outstandingBalance, periodStartDate, periodEndDate); outstandingBalance, periodStartDate, periodEndDate);
Money interestForThisInstallment = result.interest(); Money interestForThisInstallment = result.interest();
Money principalForThisInstallment = loanApplicationTerms.calculateTotalPrincipalForPeriod(calculator, outstandingBalance,
periodNumber, mc, interestForThisInstallment);
// update cumulative fields for principal & interest // update cumulative fields for principal & interest
final Money interestBroughtForwardDueToGrace = result.interestPaymentDueToGrace(); final Money interestBroughtForwardDueToGrace = result.interestPaymentDueToGrace();
@@ -600,7 +600,7 @@ public final class LoanApplicationTerms {
switch (this.interestMethod) { switch (this.interestMethod) {
case FLAT: case FLAT:
principalForInstallment = calculateTotalPrincipalPerPeriodWithoutGrace(mc, periodNumber); principalForInstallment = calculateTotalPrincipalPerPeriodWithoutGrace(mc, periodNumber, interestForThisInstallment);
break; break;
case DECLINING_BALANCE: case DECLINING_BALANCE:
switch (this.amortizationMethod) { switch (this.amortizationMethod) {
@@ -878,19 +878,26 @@ public final class LoanApplicationTerms {
return interestPerInstallment; 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(); final int totalRepaymentsWithCapitalPayment = calculateNumberOfRepaymentsWithPrincipalPayment();
Money principalPerPeriod = this.principal.minus(totalPrincipalAccounted).dividedBy(totalRepaymentsWithCapitalPayment, mc.getRoundingMode()).plus( Money principalPerPeriod = null;
this.adjustPrincipalForFlatLoans); if (getFixedEmiAmount() == null) {
if (isPrincipalGraceApplicableForThisPeriod(periodNumber)) { principalPerPeriod = this.principal.minus(totalPrincipalAccounted).dividedBy(totalRepaymentsWithCapitalPayment, mc.getRoundingMode()).plus(
principalPerPeriod = principalPerPeriod.zero(); this.adjustPrincipalForFlatLoans);
} if (isPrincipalGraceApplicableForThisPeriod(periodNumber)) {
if (!isPrincipalGraceApplicableForThisPeriod(periodNumber) && currentPeriodFixedPrincipalAmount != null) { principalPerPeriod = principalPerPeriod.zero();
this.adjustPrincipalForFlatLoans = this.adjustPrincipalForFlatLoans.plus(principalPerPeriod.minus( }
currentPeriodFixedPrincipalAmount).dividedBy(this.actualNumberOfRepayments - periodNumber, mc.getRoundingMode())); if (!isPrincipalGraceApplicableForThisPeriod(periodNumber) && currentPeriodFixedPrincipalAmount != null) {
principalPerPeriod = this.principal.zero().plus(currentPeriodFixedPrincipalAmount); 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; return principalPerPeriod;
} }