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) {