FINERACT-2278: Rework raiseBusinessEventForAccrualTransactions to not use loan.getLoanTransactions()

This commit is contained in:
mariiaKraievska
2025-05-26 16:24:56 +02:00
committed by Adam Saghy
parent 8b86229a3e
commit 07839951b9
3 changed files with 37 additions and 12 deletions
@@ -37,6 +37,26 @@ public interface LoanTransactionRepository extends JpaRepository<LoanTransaction
Optional<LoanTransaction> 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<LoanTransaction> findNewTransactionsByLoanIdAndTypeAndNotInIds(@Param("loanId") Long loanId,
@Param("transactionTypes") List<LoanTransactionType> transactionTypes,
@Param("existingTransactionIds") List<Long> existingTransactionIds);
@Query("""
SELECT lt FROM LoanTransaction lt
WHERE lt.loan.id = :loanId
AND lt.typeOf IN :transactionTypes
AND lt.reversed = false
""")
List<LoanTransaction> findNewTransactionsByLoanIdAndType(@Param("loanId") Long loanId,
@Param("transactionTypes") List<LoanTransactionType> transactionTypes);
@Query("""
SELECT new org.apache.fineract.portfolio.loanaccount.data.LoanScheduleDelinquencyData(
lt.loan.id,
@@ -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<Long> 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<Long> existingTransactionIds) {
final List<LoanTransactionType> transactionTypes = List.of(LoanTransactionType.ACCRUAL, LoanTransactionType.ACCRUAL_ADJUSTMENT);
final List<LoanTransaction> 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);
}
}
}
@@ -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