FINERACT-1840: Fee income is not realised if the loan got fully repaid (#2902)

Co-authored-by: Jose Alberto Hernandez <alberto@MacBook-Pro.local>
This commit is contained in:
José Alberto Hernández
2023-01-21 23:25:28 -06:00
committed by GitHub
co-authored by Jose Alberto Hernandez
parent 4479196c3e
commit f3d7c042a4
@@ -547,13 +547,21 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
@Override @Override
public void recalculateAccruals(Loan loan, boolean isInterestCalculationHappened) { public void recalculateAccruals(Loan loan, boolean isInterestCalculationHappened) {
LocalDate accruedTill = loan.getAccruedTill(); LocalDate accruedTill = loan.getAccruedTill();
if (!loan.isPeriodicAccrualAccountingEnabledOnLoanProduct() || !isInterestCalculationHappened || accruedTill == null || loan.isNpa() final LocalDate businessDate = DateUtils.getBusinessLocalDate();
|| !loan.getStatus().isActive()) { if (loan.isPeriodicAccrualAccountingEnabledOnLoanProduct() // Loan Product with Accrual Accounting
return; && isInterestCalculationHappened // Loan Product with Interest Recalculation enabled
// Loan Account accrued till is not equal to the Business Date
&& (accruedTill == null || !accruedTill.equals(businessDate)) && !loan.isNpa() // Loan Account is not
// NPA
) {
// Loan Account is Active OR is Recently Closed with Obligations Met
if (loan.getStatus().isActive() || (loan.getStatus().isClosedObligationsMet() && loan.getClosedOnDate().equals(businessDate))) {
if (accruedTill == null) {
accruedTill = businessDate;
} }
boolean isOrganisationDateEnabled = this.configurationDomainService.isOrganisationstartDateEnabled(); boolean isOrganisationDateEnabled = this.configurationDomainService.isOrganisationstartDateEnabled();
LocalDate organisationStartDate = DateUtils.getBusinessLocalDate(); LocalDate organisationStartDate = businessDate;
if (isOrganisationDateEnabled) { if (isOrganisationDateEnabled) {
organisationStartDate = this.configurationDomainService.retrieveOrganisationStartDate(); organisationStartDate = this.configurationDomainService.retrieveOrganisationStartDate();
} }
@@ -573,7 +581,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
for (LoanRepaymentScheduleInstallment installment : installments) { for (LoanRepaymentScheduleInstallment installment : installments) {
if (installment.getDueDate().isAfter(loan.getMaturityDate())) { if (installment.getDueDate().isAfter(loan.getMaturityDate())) {
accruedTill = DateUtils.getBusinessLocalDate(); accruedTill = businessDate;
} }
if (!isOrganisationDateEnabled || organisationStartDate.isBefore(installment.getDueDate())) { if (!isOrganisationDateEnabled || organisationStartDate.isBefore(installment.getDueDate())) {
generateLoanScheduleAccrualData(accruedTill, loanScheduleAccrualList, loanId, officeId, accrualStartDate, generateLoanScheduleAccrualData(accruedTill, loanScheduleAccrualList, loanId, officeId, accrualStartDate,
@@ -590,7 +598,8 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
throw new GeneralPlatformDomainRuleException(globalisationMessageCode, e.getMessage(), e); throw new GeneralPlatformDomainRuleException(globalisationMessageCode, e.getMessage(), e);
} }
} }
}
}
} }
private void generateLoanScheduleAccrualData(final LocalDate accruedTill, private void generateLoanScheduleAccrualData(final LocalDate accruedTill,