From 07839951b9a89c30e20fcb0b6c666957a276d2e3 Mon Sep 17 00:00:00 2001 From: mariiaKraievska Date: Mon, 26 May 2025 11:52:57 +0300 Subject: [PATCH] FINERACT-2278: Rework raiseBusinessEventForAccrualTransactions to not use loan.getLoanTransactions() --- .../domain/LoanTransactionRepository.java | 20 ++++++++++++++++ ...alTransactionBusinessEventServiceImpl.java | 24 ++++++++++++------- .../starter/LoanAccountConfiguration.java | 5 ++-- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRepository.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRepository.java index 24256ea15..c4dc6bd60 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRepository.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRepository.java @@ -37,6 +37,26 @@ public interface LoanTransactionRepository extends JpaRepository findByIdAndLoanId(Long transactionId, Long loanId); + @Query(""" + SELECT lt FROM LoanTransaction lt + WHERE lt.loan.id = :loanId + AND lt.typeOf IN :transactionTypes + AND lt.id NOT IN :existingTransactionIds + AND lt.reversed = false + """) + List findNewTransactionsByLoanIdAndTypeAndNotInIds(@Param("loanId") Long loanId, + @Param("transactionTypes") List transactionTypes, + @Param("existingTransactionIds") List existingTransactionIds); + + @Query(""" + SELECT lt FROM LoanTransaction lt + WHERE lt.loan.id = :loanId + AND lt.typeOf IN :transactionTypes + AND lt.reversed = false + """) + List findNewTransactionsByLoanIdAndType(@Param("loanId") Long loanId, + @Param("transactionTypes") List transactionTypes); + @Query(""" SELECT new org.apache.fineract.portfolio.loanaccount.data.LoanScheduleDelinquencyData( lt.loan.id, diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualTransactionBusinessEventServiceImpl.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualTransactionBusinessEventServiceImpl.java index bf96b21a6..608d98a2a 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualTransactionBusinessEventServiceImpl.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualTransactionBusinessEventServiceImpl.java @@ -26,22 +26,28 @@ import org.apache.fineract.infrastructure.event.business.domain.loan.transaction import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; +import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; @RequiredArgsConstructor public class LoanAccrualTransactionBusinessEventServiceImpl implements LoanAccrualTransactionBusinessEventService { private final BusinessEventNotifierService businessEventNotifierService; + private final LoanTransactionRepository loanTransactionRepository; @Override - public void raiseBusinessEventForAccrualTransactions(Loan loan, List existingTransactionIds) { - for (final LoanTransaction transaction : loan.getLoanTransactions()) { - if (transaction.isNotReversed() && (transaction.isAccrual() || transaction.isAccrualAdjustment()) - && !existingTransactionIds.contains(transaction.getId())) { - LoanTransactionBusinessEvent businessEvent = transaction.isAccrual() - ? new LoanAccrualTransactionCreatedBusinessEvent(transaction) - : new LoanAccrualAdjustmentTransactionBusinessEvent(transaction); - businessEventNotifierService.notifyPostBusinessEvent(businessEvent); - } + public void raiseBusinessEventForAccrualTransactions(final Loan loan, final List existingTransactionIds) { + final List transactionTypes = List.of(LoanTransactionType.ACCRUAL, LoanTransactionType.ACCRUAL_ADJUSTMENT); + final List transactions = existingTransactionIds.isEmpty() + ? loanTransactionRepository.findNewTransactionsByLoanIdAndType(loan.getId(), transactionTypes) + : loanTransactionRepository.findNewTransactionsByLoanIdAndTypeAndNotInIds(loan.getId(), transactionTypes, + existingTransactionIds); + + for (final LoanTransaction transaction : transactions) { + final LoanTransactionBusinessEvent businessEvent = transaction.isAccrual() + ? new LoanAccrualTransactionCreatedBusinessEvent(transaction) + : new LoanAccrualAdjustmentTransactionBusinessEvent(transaction); + businessEventNotifierService.notifyPostBusinessEvent(businessEvent); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java index 8b26a7589..615c81a04 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java @@ -196,9 +196,8 @@ public class LoanAccountConfiguration { @Bean @ConditionalOnMissingBean(LoanAccrualTransactionBusinessEventService.class) public LoanAccrualTransactionBusinessEventService loanAccrualTransactionBusinessEventService( - - BusinessEventNotifierService businessEventNotifierService) { - return new LoanAccrualTransactionBusinessEventServiceImpl(businessEventNotifierService); + final BusinessEventNotifierService businessEventNotifierService, final LoanTransactionRepository loanTransactionRepository) { + return new LoanAccrualTransactionBusinessEventServiceImpl(businessEventNotifierService, loanTransactionRepository); } @Bean