From bd37ad14ff07b3fa279409118405fc9939e6df04 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Tue, 29 Oct 2024 14:45:39 +0100 Subject: [PATCH] WIP --- .../data/ProgressiveLoanInterestScheduleModel.java | 8 ++++++++ .../loanaccount/loanschedule/data/RepaymentPeriod.java | 5 +++++ .../loanproduct/calc/ProgressiveEMICalculator.java | 8 ++++++++ 3 files changed, 21 insertions(+) diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/ProgressiveLoanInterestScheduleModel.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/ProgressiveLoanInterestScheduleModel.java index 70b0ca0a83e..12ce18aa8e7 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/ProgressiveLoanInterestScheduleModel.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/ProgressiveLoanInterestScheduleModel.java @@ -30,6 +30,7 @@ import java.util.function.Consumer; import lombok.Data; import lombok.experimental.Accessors; +import org.apache.fineract.infrastructure.core.service.MathUtil; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRelatedDetail; @@ -196,4 +197,11 @@ void insertInterestPeriod(final RepaymentPeriod repaymentPeriod, final LocalDate public Money getZero() { return Money.zero(loanProductRelatedDetail.getCurrency(), mc); } + + public Money getTotalOutstandingBalance() { + Money totalDisbursedAmount = repaymentPeriods.stream().flatMap(rp->rp.getInterestPeriods().stream().map(InterestPeriod::getDisbursementAmount)).reduce(getZero(), Money::plus); + Money totalPrincipalPaidAmount = repaymentPeriods.stream().map(RepaymentPeriod::getPaidPrincipal).reduce(getZero(), Money::plus); + + return MathUtil.negativeToZero(totalDisbursedAmount.minus(totalPrincipalPaidAmount, mc)); + } } diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java index 2a393522704..94d36a5f5ee 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java @@ -46,6 +46,9 @@ public class RepaymentPeriod { @Setter @Getter private Money emi; + @Setter + @Getter + private Money originalEmi; @Getter private Money paidPrincipal; @Getter @@ -62,6 +65,7 @@ public RepaymentPeriod(RepaymentPeriod previous, LocalDate fromDate, LocalDate d this.fromDate = fromDate; this.dueDate = dueDate; this.emi = emi; + this.originalEmi = emi; this.mc = mc; this.interestPeriods = new ArrayList<>(); // There is always at least 1 interest period, by default with same from-due date as repayment period @@ -76,6 +80,7 @@ public RepaymentPeriod(RepaymentPeriod previous, RepaymentPeriod repaymentPeriod this.fromDate = repaymentPeriod.fromDate; this.dueDate = repaymentPeriod.dueDate; this.emi = repaymentPeriod.emi; + this.originalEmi = repaymentPeriod.originalEmi; this.interestPeriods = new ArrayList<>(); this.paidPrincipal = repaymentPeriod.paidPrincipal; this.paidInterest = repaymentPeriod.paidInterest; diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java index 97b1d3bcc1b..a1c1447ee33 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java @@ -173,6 +173,11 @@ public PayableDetails getPayableDetails(final ProgressiveLoanInterestScheduleMod calculateOutstandingBalance(scheduleModelCopy); calculateLastUnpaidRepaymentPeriodEMI(scheduleModelCopy); + boolean multiplePeriodIsUnpaid = scheduleModelCopy.repaymentPeriods().stream().filter(rp -> !rp.isFullyPaid()).count() > 1L; + if(multiplePeriodIsUnpaid) { + repaymentPeriod.setEmi(repaymentPeriod.getOriginalEmi()); + } + return new PayableDetails(repaymentPeriod.getEmi(), repaymentPeriod.getDuePrincipal(), repaymentPeriod.getDueInterest(), interestPeriod.getOutstandingLoanBalance().add(interestPeriod.getDisbursementAmount(), mc)); } @@ -245,6 +250,7 @@ private void checkAndAdjustEmiIfNeededOnRelatedRepaymentPeriods(final Progressiv if (!period.getDueDate().isBefore(relatedPeriodsFirstDueDate) && !adjustedEqualMonthlyInstallmentValue.isLessThan(period.getTotalPaidAmount())) { period.setEmi(adjustedEqualMonthlyInstallmentValue); + period.setOriginalEmi(adjustedEqualMonthlyInstallmentValue); } }); calculateOutstandingBalance(newScheduleModel); @@ -265,6 +271,7 @@ private void checkAndAdjustEmiIfNeededOnRelatedRepaymentPeriods(final Progressiv } final RepaymentPeriod newRepaymentPeriod = relatedPeriodFromNewModelIterator.next(); relatedRepaymentPeriod.setEmi(newRepaymentPeriod.getEmi()); + relatedRepaymentPeriod.setOriginalEmi(newRepaymentPeriod.getEmi()); }); calculateOutstandingBalance(scheduleModel); } @@ -401,6 +408,7 @@ void calculateEMIOnPeriods(final List repaymentPeriods, final P repaymentPeriods.forEach(period -> { if (!finalEqualMonthlyInstallment.isLessThan(period.getTotalPaidAmount())) { period.setEmi(finalEqualMonthlyInstallment); + period.setOriginalEmi(finalEqualMonthlyInstallment); } }); }