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

adamsaghy 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 c236ee04ef FINERACT-2080: Refactoring Loan entity
c236ee04ef is described below

commit c236ee04eff5c96e7ae66c7ef8d01ac3c35b3033
Author: Harsh-Srivastav123 
<[email protected]>
AuthorDate: Mon Mar 10 03:53:35 2025 +0530

    FINERACT-2080: Refactoring Loan entity
    
    FINERACT-2080: Refactoring Loan entity
---
 .../portfolio/loanaccount/domain/Loan.java         | 30 ++++++++++++++--------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
index 87f89ef7b9..feccefffca 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
@@ -1585,10 +1585,16 @@ public class Loan extends 
AbstractAuditableWithUTCDateTimeCustom<Long> {
     }
 
     public boolean doPostLoanTransactionChecks(final LocalDate 
transactionDate, final LoanLifecycleStateMachine loanLifecycleStateMachine) {
+        boolean statusChanged = checkAndHandleLoanStatus(transactionDate, 
loanLifecycleStateMachine);
+        resetOverpaidDateIfNeeded();
+        return statusChanged;
+    }
+
+    private boolean checkAndHandleLoanStatus(final LocalDate transactionDate, 
final LoanLifecycleStateMachine loanLifecycleStateMachine) {
         boolean statusChanged = false;
         boolean isOverpaid = MathUtil.isGreaterThanZero(totalOverpaid);
+
         if (isOverpaid) {
-            // FIXME - kw - update account balance to negative amount.
             handleLoanOverpayment(transactionDate, loanLifecycleStateMachine);
             statusChanged = true;
         } else if (this.summary.isRepaidInFull(getCurrency())) {
@@ -1597,10 +1603,14 @@ public class Loan extends 
AbstractAuditableWithUTCDateTimeCustom<Long> {
         } else {
             
loanLifecycleStateMachine.transition(LoanEvent.LOAN_REPAYMENT_OR_WAIVER, this);
         }
+
+        return statusChanged;
+    }
+
+    private void resetOverpaidDateIfNeeded() {
         if (MathUtil.isEmpty(totalOverpaid)) {
             this.overpaidOnDate = null;
         }
-        return statusChanged;
     }
 
     private void handleLoanRepaymentInFull(final LocalDate transactionDate, 
final LoanLifecycleStateMachine loanLifecycleStateMachine) {
@@ -2453,14 +2463,12 @@ public class Loan extends 
AbstractAuditableWithUTCDateTimeCustom<Long> {
     }
 
     public LocalDate getLastUserTransactionDate() {
-        LocalDate currentTransactionDate = getDisbursementDate();
-        for (final LoanTransaction previousTransaction : 
this.loanTransactions) {
-            if (!(previousTransaction.isReversed() || 
previousTransaction.isAccrualRelated() || previousTransaction.isIncomePosting())
-                    && DateUtils.isBefore(currentTransactionDate, 
previousTransaction.getTransactionDate())) {
-                currentTransactionDate = 
previousTransaction.getTransactionDate();
-            }
-        }
-        return currentTransactionDate;
+        return 
this.loanTransactions.stream().filter(this::isUserTransaction).map(LoanTransaction::getTransactionDate)
+                .filter(date -> DateUtils.isBefore(getDisbursementDate(), 
date)).max(LocalDate::compareTo).orElse(getDisbursementDate());
+    }
+
+    private boolean isUserTransaction(LoanTransaction transaction) {
+        return !(transaction.isReversed() || transaction.isAccrualRelated() || 
transaction.isIncomePosting());
     }
 
     public LocalDate getLastRepaymentDate() {
@@ -3564,7 +3572,7 @@ public class Loan extends 
AbstractAuditableWithUTCDateTimeCustom<Long> {
 
     public boolean isChargeOffOnDate(final LocalDate onDate) {
         final LoanTransaction chargeOffTransaction = 
findChargedOffTransaction();
-        return (chargeOffTransaction == null) ? false : 
(chargeOffTransaction.getDateOf().compareTo(onDate) <= 0);
+        return chargeOffTransaction != null && 
chargeOffTransaction.getDateOf().compareTo(onDate) <= 0;
     }
 
     public boolean hasMonetaryActivityAfter(final LocalDate transactionDate) {

Reply via email to