diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index ae95098bf..6d5b75086 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -30,6 +30,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; +import java.util.ListIterator; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -2006,7 +2007,16 @@ public class Loan extends AbstractPersistable { private LocalDate determineExpectedMaturityDate() { final int numberOfInstallments = this.repaymentScheduleInstallments.size(); - return this.repaymentScheduleInstallments.get(numberOfInstallments - 1).getDueDate(); + LocalDate maturityDate = this.repaymentScheduleInstallments.get(numberOfInstallments - 1).getDueDate(); + ListIterator iterator = this.repaymentScheduleInstallments.listIterator(numberOfInstallments); + while(iterator.hasPrevious()){ + LoanRepaymentScheduleInstallment loanRepaymentScheduleInstallment = iterator.previous(); + if(!loanRepaymentScheduleInstallment.isRecalculatedInterestComponent()){ + maturityDate = loanRepaymentScheduleInstallment.getDueDate(); + break; + } + } + return maturityDate; } public Map loanApplicationRejection(final AppUser currentUser, final JsonCommand command, diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java index 437e7e6a0..ba0788f96 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java @@ -461,6 +461,9 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { Set loanCharges = loan.charges(); for (LoanRepaymentScheduleInstallment installment : installments) { + if (installment.getDueDate().isAfter(loan.getMaturityDate())) { + accruedTill = DateUtils.getLocalDateOfTenant(); + } if(!isOrganisationDateEnabled || new LocalDate(organisationStartDate).isBefore(installment.getDueDate())){ generateLoanScheduleAccrualData(accruedTill, loanScheduleAccrualDatas, loanId, officeId, accrualStartDate, repaymentFrequency, repayEvery, interestCalculatedFrom, loanProductId, currency, currencyData, loanCharges, installment); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 639836a1b..61303388f 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -312,6 +312,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf checkForProductMixRestrictions(loan); LocalDate recalculateFrom = null; + if (loan.repaymentScheduleDetail().isInterestRecalculationEnabled()) { + recalculateFrom = actualDisbursementDate; + } ScheduleGeneratorDTO scheduleGeneratorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan, recalculateFrom); // validate actual disbursement date against meeting date