#317 flat installment amount for fixed installment amount
This commit is contained in:
+4
-4
@@ -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();
|
||||||
|
|||||||
+18
-11
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user