diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FlatInterestLoanScheduleGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FlatInterestLoanScheduleGenerator.java index 5f3d8d7c0..bd66242aa 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FlatInterestLoanScheduleGenerator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FlatInterestLoanScheduleGenerator.java @@ -37,14 +37,14 @@ public class FlatInterestLoanScheduleGenerator extends AbstractLoanScheduleGener @SuppressWarnings("unused") TreeMap principalVariation, @SuppressWarnings("unused") Map compoundingMap, LocalDate periodStartDate, LocalDate periodEndDate, @SuppressWarnings("unused") Collection 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(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java index b7aaf1271..fba0a39be 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java @@ -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; }