This is an automated email from the ASF dual-hosted git repository.

victorromero pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new f3d7c042a FINERACT-1840: Fee income is not realised if the loan got 
fully repaid (#2902)
f3d7c042a is described below

commit f3d7c042a453d2532e65685661dea1b699341bde
Author: José Alberto Hernández 
<[email protected]>
AuthorDate: Sat Jan 21 23:25:28 2023 -0600

    FINERACT-1840: Fee income is not realised if the loan got fully repaid 
(#2902)
    
    Co-authored-by: Jose Alberto Hernandez <[email protected]>
---
 .../domain/LoanAccountDomainServiceJpa.java        | 89 ++++++++++++----------
 1 file changed, 49 insertions(+), 40 deletions(-)

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 6db221125..d503a8e68 100644
--- 
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
@@ -547,50 +547,59 @@ public class LoanAccountDomainServiceJpa implements 
LoanAccountDomainService {
     @Override
     public void recalculateAccruals(Loan loan, boolean 
isInterestCalculationHappened) {
         LocalDate accruedTill = loan.getAccruedTill();
-        if (!loan.isPeriodicAccrualAccountingEnabledOnLoanProduct() || 
!isInterestCalculationHappened || accruedTill == null || loan.isNpa()
-                || !loan.getStatus().isActive()) {
-            return;
-        }
-
-        boolean isOrganisationDateEnabled = 
this.configurationDomainService.isOrganisationstartDateEnabled();
-        LocalDate organisationStartDate = DateUtils.getBusinessLocalDate();
-        if (isOrganisationDateEnabled) {
-            organisationStartDate = 
this.configurationDomainService.retrieveOrganisationStartDate();
-        }
-        Collection<LoanScheduleAccrualData> loanScheduleAccrualList = new 
ArrayList<>();
-        List<LoanRepaymentScheduleInstallment> installments = 
loan.getRepaymentScheduleInstallments();
-        Long loanId = loan.getId();
-        Long officeId = loan.getOfficeId();
-        LocalDate accrualStartDate = null;
-        PeriodFrequencyType repaymentFrequency = 
loan.repaymentScheduleDetail().getRepaymentPeriodFrequencyType();
-        Integer repayEvery = loan.repaymentScheduleDetail().getRepayEvery();
-        LocalDate interestCalculatedFrom = loan.getInterestChargedFromDate();
-        Long loanProductId = loan.productId();
-        MonetaryCurrency currency = loan.getCurrency();
-        ApplicationCurrency applicationCurrency = 
this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency);
-        CurrencyData currencyData = applicationCurrency.toData();
-        Set<LoanCharge> loanCharges = loan.getActiveCharges();
+        final LocalDate businessDate = DateUtils.getBusinessLocalDate();
+        if (loan.isPeriodicAccrualAccountingEnabledOnLoanProduct() // Loan 
Product with Accrual Accounting
+                && 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;
+                }
 
-        for (LoanRepaymentScheduleInstallment installment : installments) {
-            if (installment.getDueDate().isAfter(loan.getMaturityDate())) {
-                accruedTill = DateUtils.getBusinessLocalDate();
-            }
-            if (!isOrganisationDateEnabled || 
organisationStartDate.isBefore(installment.getDueDate())) {
-                generateLoanScheduleAccrualData(accruedTill, 
loanScheduleAccrualList, loanId, officeId, accrualStartDate,
-                        repaymentFrequency, repayEvery, 
interestCalculatedFrom, loanProductId, currency, currencyData, loanCharges,
-                        installment);
-            }
-        }
+                boolean isOrganisationDateEnabled = 
this.configurationDomainService.isOrganisationstartDateEnabled();
+                LocalDate organisationStartDate = businessDate;
+                if (isOrganisationDateEnabled) {
+                    organisationStartDate = 
this.configurationDomainService.retrieveOrganisationStartDate();
+                }
+                Collection<LoanScheduleAccrualData> loanScheduleAccrualList = 
new ArrayList<>();
+                List<LoanRepaymentScheduleInstallment> installments = 
loan.getRepaymentScheduleInstallments();
+                Long loanId = loan.getId();
+                Long officeId = loan.getOfficeId();
+                LocalDate accrualStartDate = null;
+                PeriodFrequencyType repaymentFrequency = 
loan.repaymentScheduleDetail().getRepaymentPeriodFrequencyType();
+                Integer repayEvery = 
loan.repaymentScheduleDetail().getRepayEvery();
+                LocalDate interestCalculatedFrom = 
loan.getInterestChargedFromDate();
+                Long loanProductId = loan.productId();
+                MonetaryCurrency currency = loan.getCurrency();
+                ApplicationCurrency applicationCurrency = 
this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency);
+                CurrencyData currencyData = applicationCurrency.toData();
+                Set<LoanCharge> loanCharges = loan.getActiveCharges();
+
+                for (LoanRepaymentScheduleInstallment installment : 
installments) {
+                    if 
(installment.getDueDate().isAfter(loan.getMaturityDate())) {
+                        accruedTill = businessDate;
+                    }
+                    if (!isOrganisationDateEnabled || 
organisationStartDate.isBefore(installment.getDueDate())) {
+                        generateLoanScheduleAccrualData(accruedTill, 
loanScheduleAccrualList, loanId, officeId, accrualStartDate,
+                                repaymentFrequency, repayEvery, 
interestCalculatedFrom, loanProductId, currency, currencyData, loanCharges,
+                                installment);
+                    }
+                }
 
-        if (!loanScheduleAccrualList.isEmpty()) {
-            try {
-                
this.loanAccrualPlatformService.addPeriodicAccruals(accruedTill, 
loanScheduleAccrualList);
-            } catch (MultiException e) {
-                String globalisationMessageCode = 
"error.msg.accrual.exception";
-                throw new 
GeneralPlatformDomainRuleException(globalisationMessageCode, e.getMessage(), e);
+                if (!loanScheduleAccrualList.isEmpty()) {
+                    try {
+                        
this.loanAccrualPlatformService.addPeriodicAccruals(accruedTill, 
loanScheduleAccrualList);
+                    } catch (MultiException e) {
+                        String globalisationMessageCode = 
"error.msg.accrual.exception";
+                        throw new 
GeneralPlatformDomainRuleException(globalisationMessageCode, e.getMessage(), e);
+                    }
+                }
             }
         }
-
     }
 
     private void generateLoanScheduleAccrualData(final LocalDate accruedTill,

Reply via email to