FINERACT-2276: Deprecate findExistingTransactionIds and fetch only the ids from database instead

This commit is contained in:
mariiaKraievska
2025-05-26 11:40:10 +02:00
committed by Adam Saghy
parent 88105c3cac
commit 13e4c8b55d
19 changed files with 77 additions and 60 deletions
@@ -760,13 +760,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom<Long> {
return maturityDate; return maturityDate;
} }
public List<Long> findExistingTransactionIds() {
return getLoanTransactions().stream() //
.filter(loanTransaction -> loanTransaction.getId() != null) //
.map(LoanTransaction::getId) //
.collect(Collectors.toList());
}
public List<Long> findExistingReversedTransactionIds() { public List<Long> findExistingReversedTransactionIds() {
return getLoanTransactions().stream() // return getLoanTransactions().stream() //
.filter(LoanTransaction::isReversed) // .filter(LoanTransaction::isReversed) //
@@ -98,4 +98,11 @@ public interface LoanTransactionRepository extends JpaRepository<LoanTransaction
""") """)
Optional<LocalDate> findLastTransactionDateForReprocessing(@Param("loan") Loan loan); Optional<LocalDate> findLastTransactionDateForReprocessing(@Param("loan") Loan loan);
@Query("""
SELECT lt.id FROM LoanTransaction lt
WHERE lt.loan = :loan
AND lt.id IS NOT NULL
""")
List<Long> findTransactionIdsByLoan(@Param("loan") Loan loan);
} }
@@ -51,6 +51,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleIns
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleProcessingWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleProcessingWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTrancheDisbursementCharge; import org.apache.fineract.portfolio.loanaccount.domain.LoanTrancheDisbursementCharge;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.domain.SingleLoanChargeRepaymentScheduleProcessingWrapper; import org.apache.fineract.portfolio.loanaccount.domain.SingleLoanChargeRepaymentScheduleProcessingWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.MoneyHolder; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.MoneyHolder;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.TransactionCtx; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.TransactionCtx;
@@ -63,6 +64,7 @@ public class LoanChargeService {
private final LoanTransactionProcessingService loanTransactionProcessingService; private final LoanTransactionProcessingService loanTransactionProcessingService;
private final LoanLifecycleStateMachine loanLifecycleStateMachine; private final LoanLifecycleStateMachine loanLifecycleStateMachine;
private final LoanBalanceService loanBalanceService; private final LoanBalanceService loanBalanceService;
private final LoanTransactionRepository loanTransactionRepository;
public void recalculateAllCharges(final Loan loan) { public void recalculateAllCharges(final Loan loan) {
Set<LoanCharge> charges = loan.getActiveCharges(); Set<LoanCharge> charges = loan.getActiveCharges();
@@ -101,7 +103,7 @@ public class LoanChargeService {
public void makeChargePayment(final Loan loan, final Long chargeId, final List<Long> existingTransactionIds, public void makeChargePayment(final Loan loan, final Long chargeId, final List<Long> existingTransactionIds,
final List<Long> existingReversedTransactionIds, final LoanTransaction paymentTransaction, final Integer installmentNumber) { final List<Long> existingReversedTransactionIds, final LoanTransaction paymentTransaction, final Integer installmentNumber) {
loanChargeValidator.validateChargePaymentNotInFuture(paymentTransaction); loanChargeValidator.validateChargePaymentNotInFuture(paymentTransaction);
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
LoanCharge charge = null; LoanCharge charge = null;
for (final LoanCharge loanCharge : loan.getCharges()) { for (final LoanCharge loanCharge : loan.getCharges()) {
@@ -25,6 +25,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanEvent; import org.apache.fineract.portfolio.loanaccount.domain.LoanEvent;
import org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachine; import org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachine;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.MoneyHolder; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.MoneyHolder;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.TransactionCtx; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.TransactionCtx;
import org.apache.fineract.portfolio.loanaccount.serialization.LoanRefundValidator; import org.apache.fineract.portfolio.loanaccount.serialization.LoanRefundValidator;
@@ -35,10 +36,11 @@ public class LoanRefundService {
private final LoanRefundValidator loanRefundValidator; private final LoanRefundValidator loanRefundValidator;
private final LoanTransactionProcessingService loadTransactionProcessingService; private final LoanTransactionProcessingService loadTransactionProcessingService;
private final LoanLifecycleStateMachine loanLifecycleStateMachine; private final LoanLifecycleStateMachine loanLifecycleStateMachine;
private final LoanTransactionRepository loanTransactionRepository;
public void makeRefund(final Loan loan, final LoanTransaction loanTransaction, final List<Long> existingTransactionIds, public void makeRefund(final Loan loan, final LoanTransaction loanTransaction, final List<Long> existingTransactionIds,
final List<Long> existingReversedTransactionIds) { final List<Long> existingReversedTransactionIds) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
loanRefundValidator.validateTransferRefund(loan, loanTransaction); loanRefundValidator.validateTransferRefund(loan, loanTransaction);
@@ -59,7 +61,7 @@ public class LoanRefundService {
public void makeRefundForActiveLoan(final Loan loan, final LoanTransaction loanTransaction, final List<Long> existingTransactionIds, public void makeRefundForActiveLoan(final Loan loan, final LoanTransaction loanTransaction, final List<Long> existingTransactionIds,
final List<Long> existingReversedTransactionIds) { final List<Long> existingReversedTransactionIds) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
handleRefundTransaction(loan, loanTransaction); handleRefundTransaction(loan, loanTransaction);
@@ -69,7 +71,7 @@ public class LoanRefundService {
final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) { final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) {
loanRefundValidator.validateCreditBalanceRefund(loan, newCreditBalanceRefundTransaction); loanRefundValidator.validateCreditBalanceRefund(loan, newCreditBalanceRefundTransaction);
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
loan.getLoanTransactions().add(newCreditBalanceRefundTransaction); loan.getLoanTransactions().add(newCreditBalanceRefundTransaction);
@@ -26,6 +26,7 @@ import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.portfolio.loanaccount.data.ScheduleGeneratorDTO; import org.apache.fineract.portfolio.loanaccount.data.ScheduleGeneratorDTO;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge; import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleDTO; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleDTO;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
@@ -40,6 +41,7 @@ public class LoanScheduleService {
private final LoanMapper loanMapper; private final LoanMapper loanMapper;
private final LoanTransactionProcessingService loanTransactionProcessingService; private final LoanTransactionProcessingService loanTransactionProcessingService;
private final LoanScheduleComponent loanSchedule; private final LoanScheduleComponent loanSchedule;
private final LoanTransactionRepository loanTransactionRepository;
/** /**
* Ability to regenerate the repayment schedule based on the loans current details/state. * Ability to regenerate the repayment schedule based on the loans current details/state.
@@ -69,7 +71,7 @@ public class LoanScheduleService {
public void recalculateScheduleFromLastTransaction(final Loan loan, final ScheduleGeneratorDTO generatorDTO, public void recalculateScheduleFromLastTransaction(final Loan loan, final ScheduleGeneratorDTO generatorDTO,
final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) { final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
if (!loan.isProgressiveSchedule()) { if (!loan.isProgressiveSchedule()) {
if (loan.isInterestBearingAndInterestRecalculationEnabled() && !loan.isChargedOff()) { if (loan.isInterestBearingAndInterestRecalculationEnabled() && !loan.isChargedOff()) {
@@ -69,7 +69,8 @@ public class SingleLoanChargeRepaymentScheduleProcessingWrapperTest {
private ArgumentCaptor<Money> penaltyChargesWrittenOff = ArgumentCaptor.forClass(Money.class); private ArgumentCaptor<Money> penaltyChargesWrittenOff = ArgumentCaptor.forClass(Money.class);
private final LoanChargeService loanChargeService = new LoanChargeService(mock(LoanChargeValidator.class), private final LoanChargeService loanChargeService = new LoanChargeService(mock(LoanChargeValidator.class),
mock(LoanTransactionProcessingService.class), mock(LoanLifecycleStateMachine.class), mock(LoanBalanceService.class)); mock(LoanTransactionProcessingService.class), mock(LoanLifecycleStateMachine.class), mock(LoanBalanceService.class),
mock(LoanTransactionRepository.class));
@BeforeAll @BeforeAll
public static void init() { public static void init() {
@@ -60,7 +60,7 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
public CommandProcessingResult addCapitalizedIncome(final Long loanId, final JsonCommand command) { public CommandProcessingResult addCapitalizedIncome(final Long loanId, final JsonCommand command) {
loanTransactionValidator.validateCapitalizedIncome(command, loanId); loanTransactionValidator.validateCapitalizedIncome(command, loanId);
final Loan loan = loanAssembler.assembleFrom(loanId); final Loan loan = loanAssembler.assembleFrom(loanId);
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
final Map<String, Object> changes = new LinkedHashMap<>(); final Map<String, Object> changes = new LinkedHashMap<>();
// Create payment details // Create payment details
@@ -444,7 +444,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
private void handlePayDisbursementTransaction(final Loan loan, final Long chargeId, final LoanTransaction chargesPayment, private void handlePayDisbursementTransaction(final Loan loan, final Long chargeId, final LoanTransaction chargesPayment,
final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) { final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
LoanCharge charge = null; LoanCharge charge = null;
for (final LoanCharge loanCharge : loan.getCharges()) { for (final LoanCharge loanCharge : loan.getCharges()) {
@@ -767,7 +767,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
final List<Long> existingTransactionIds = new ArrayList<>(); final List<Long> existingTransactionIds = new ArrayList<>();
final List<Long> existingReversedTransactionIds = new ArrayList<>(); final List<Long> existingReversedTransactionIds = new ArrayList<>();
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
final ScheduleGeneratorDTO scheduleGeneratorDTO = null; final ScheduleGeneratorDTO scheduleGeneratorDTO = null;
final LoanRepaymentScheduleInstallment foreCloseDetail = loanBalanceService.fetchLoanForeclosureDetail(loan, foreClosureDate); final LoanRepaymentScheduleInstallment foreCloseDetail = loanBalanceService.fetchLoanForeclosureDetail(loan, foreClosureDate);
@@ -988,7 +988,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
final List<Long> existingTransactionIds = new ArrayList<>(); final List<Long> existingTransactionIds = new ArrayList<>();
final List<Long> existingReversedTransactionIds = new ArrayList<>(); final List<Long> existingReversedTransactionIds = new ArrayList<>();
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
final LoanTransaction interestRefundTransaction = LoanTransaction.interestRefund(loan, loan.getOffice(), refundAmount, final LoanTransaction interestRefundTransaction = LoanTransaction.interestRefund(loan, loan.getOffice(), refundAmount,
@@ -1076,7 +1076,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
private void makeRepayment(final Loan loan, final LoanTransaction repaymentTransaction, final List<Long> existingTransactionIds, private void makeRepayment(final Loan loan, final LoanTransaction repaymentTransaction, final List<Long> existingTransactionIds,
final List<Long> existingReversedTransactionIds, final ScheduleGeneratorDTO scheduleGeneratorDTO) { final List<Long> existingReversedTransactionIds, final ScheduleGeneratorDTO scheduleGeneratorDTO) {
loanChargeValidator.validateRepaymentTypeTransactionNotBeforeAChargeRefund(loan, repaymentTransaction, "created"); loanChargeValidator.validateRepaymentTypeTransactionNotBeforeAChargeRefund(loan, repaymentTransaction, "created");
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
loanDownPaymentHandlerService.handleRepaymentOrRecoveryOrWaiverTransaction(loan, repaymentTransaction, null, scheduleGeneratorDTO); loanDownPaymentHandlerService.handleRepaymentOrRecoveryOrWaiverTransaction(loan, repaymentTransaction, null, scheduleGeneratorDTO);
@@ -54,6 +54,7 @@ import org.apache.fineract.portfolio.account.service.AccountTransfersWritePlatfo
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.guarantor.GuarantorConstants; import org.apache.fineract.portfolio.loanaccount.guarantor.GuarantorConstants;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.Guarantor; import org.apache.fineract.portfolio.loanaccount.guarantor.domain.Guarantor;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.GuarantorFundingDetails; import org.apache.fineract.portfolio.loanaccount.guarantor.domain.GuarantorFundingDetails;
@@ -87,6 +88,7 @@ public class GuarantorDomainServiceImpl implements GuarantorDomainService {
private final ConfigurationDomainService configurationDomainService; private final ConfigurationDomainService configurationDomainService;
private final ExternalIdFactory externalIdFactory; private final ExternalIdFactory externalIdFactory;
private final LoanRepository loanRepository; private final LoanRepository loanRepository;
private final LoanTransactionRepository loanTransactionRepository;
@PostConstruct @PostConstruct
public void addListeners() { public void addListeners() {
@@ -583,7 +585,7 @@ public class GuarantorDomainServiceImpl implements GuarantorDomainService {
@Override @Override
public void onBusinessEvent(LoanUndoDisbursalBusinessEvent event) { public void onBusinessEvent(LoanUndoDisbursalBusinessEvent event) {
Loan loan = event.get(); Loan loan = event.get();
List<Long> reversedTransactions = new ArrayList<>(loan.findExistingTransactionIds()); List<Long> reversedTransactions = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
reverseTransaction(reversedTransactions); reverseTransaction(reversedTransactions);
} }
} }
@@ -60,6 +60,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRescheduleRequestToT
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleDTO; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleDTO;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator;
@@ -120,6 +121,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
private final LoanTermVariationsMapper loanTermVariationsMapper; private final LoanTermVariationsMapper loanTermVariationsMapper;
private final LoanAccountingBridgeMapper loanAccountingBridgeMapper; private final LoanAccountingBridgeMapper loanAccountingBridgeMapper;
private final LoanScheduleComponent loanSchedule; private final LoanScheduleComponent loanSchedule;
private final LoanTransactionRepository loanTransactionRepository;
/** /**
* create a new instance of the LoanRescheduleRequest object from the JsonCommand object and persist * create a new instance of the LoanRescheduleRequest object from the JsonCommand object and persist
@@ -355,7 +357,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
changes.put("approvedByUserId", appUser.getId()); changes.put("approvedByUserId", appUser.getId());
Loan loan = loanRescheduleRequest.getLoan(); Loan loan = loanRescheduleRequest.getLoan();
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
ScheduleGeneratorDTO scheduleGeneratorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan, ScheduleGeneratorDTO scheduleGeneratorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan,
@@ -245,7 +245,7 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
if (isProgressiveAccrual(loan)) { if (isProgressiveAccrual(loan)) {
return; return;
} }
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
processIncomePostingAndAccruals(loan); processIncomePostingAndAccruals(loan);
this.loanRepositoryWrapper.saveAndFlush(loan); this.loanRepositoryWrapper.saveAndFlush(loan);
@@ -59,7 +59,7 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L
@Override @Override
@Transactional @Transactional
public void processCapitalizedIncomeAmortizationOnLoanChargeOff(@NotNull final Loan loan) { public void processCapitalizedIncomeAmortizationOnLoanChargeOff(@NotNull final Loan loan) {
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
LocalDate transactionDate = loan.getChargedOffOnDate(); LocalDate transactionDate = loan.getChargedOffOnDate();
@@ -105,7 +105,7 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L
@Transactional @Transactional
public void processCapitalizedIncomeAmortizationOnLoanUndoChargeOff(@NotNull final LoanTransaction loanTransaction) { public void processCapitalizedIncomeAmortizationOnLoanUndoChargeOff(@NotNull final LoanTransaction loanTransaction) {
final Loan loan = loanTransaction.getLoan(); final Loan loan = loanTransaction.getLoan();
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
loan.getLoanTransactions().stream().filter(LoanTransaction::isCapitalizedIncomeAmortization) loan.getLoanTransactions().stream().filter(LoanTransaction::isCapitalizedIncomeAmortization)
@@ -219,7 +219,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
// apply this charge // apply this charge
validateAddingNewChargeAllowed(loanDisburseDetails); validateAddingNewChargeAllowed(loanDisburseDetails);
} }
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
boolean isAppliedOnBackDate = false; boolean isAppliedOnBackDate = false;
@@ -841,7 +841,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
if (optPenaltyCharge.isEmpty()) { if (optPenaltyCharge.isEmpty()) {
return; return;
} }
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
boolean runInterestRecalculation = false; boolean runInterestRecalculation = false;
LocalDate recalculateFrom = DateUtils.getBusinessLocalDate(); LocalDate recalculateFrom = DateUtils.getBusinessLocalDate();
@@ -903,7 +903,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
private LoanTransaction applyChargeAdjustment(final Loan loan, final LoanCharge loanCharge, final BigDecimal transactionAmount, private LoanTransaction applyChargeAdjustment(final Loan loan, final LoanCharge loanCharge, final BigDecimal transactionAmount,
final LocalDate transactionDate, final ExternalId txnExternalId, PaymentDetail paymentDetail) { final LocalDate transactionDate, final ExternalId txnExternalId, PaymentDetail paymentDetail) {
businessEventNotifierService.notifyPreBusinessEvent(new LoanChargeAdjustmentPreBusinessEvent(loan)); businessEventNotifierService.notifyPreBusinessEvent(new LoanChargeAdjustmentPreBusinessEvent(loan));
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
LoanTransaction loanChargeAdjustmentTransaction = LoanTransaction.chargeAdjustment(loan, transactionAmount, transactionDate, LoanTransaction loanChargeAdjustmentTransaction = LoanTransaction.chargeAdjustment(loan, transactionAmount, transactionDate,
@@ -952,7 +952,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
private void undoInstalmentFee(Map<String, Object> changes, Loan loan, LoanTransaction loanTransaction, private void undoInstalmentFee(Map<String, Object> changes, Loan loan, LoanTransaction loanTransaction,
LoanChargePaidBy loanChargePaidBy) { LoanChargePaidBy loanChargePaidBy) {
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
LoanCharge loanCharge = loanChargePaidBy.getLoanCharge(); LoanCharge loanCharge = loanChargePaidBy.getLoanCharge();
final Integer installmentNumber = loanChargePaidBy.getInstallmentNumber(); final Integer installmentNumber = loanChargePaidBy.getInstallmentNumber();
@@ -1008,7 +1008,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
private void undoSpecifiedDueDateCharge(final Map<String, Object> changes, final Loan loan, final LoanTransaction loanTransaction, private void undoSpecifiedDueDateCharge(final Map<String, Object> changes, final Loan loan, final LoanTransaction loanTransaction,
final LoanChargePaidBy loanChargePaidBy) { final LoanChargePaidBy loanChargePaidBy) {
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
LoanCharge loanCharge = loanChargePaidBy.getLoanCharge(); LoanCharge loanCharge = loanChargePaidBy.getLoanCharge();
BigDecimal amountWaived = loanCharge.getAmountWaived(loan.getCurrency()).getAmount(); BigDecimal amountWaived = loanCharge.getAmountWaived(loan.getCurrency()).getAmount();
@@ -1226,7 +1226,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
public Loan runScheduleRecalculation(Loan loan, final LocalDate recalculateFrom) { public Loan runScheduleRecalculation(Loan loan, final LocalDate recalculateFrom) {
if (loan.isInterestBearingAndInterestRecalculationEnabled() && !loan.isChargedOff()) { if (loan.isInterestBearingAndInterestRecalculationEnabled() && !loan.isChargedOff()) {
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
ScheduleGeneratorDTO generatorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan, recalculateFrom); ScheduleGeneratorDTO generatorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan, recalculateFrom);
loanScheduleService.handleRegenerateRepaymentScheduleWithInterestRecalculation(loan, generatorDTO); loanScheduleService.handleRegenerateRepaymentScheduleWithInterestRecalculation(loan, generatorDTO);
loanAccrualsProcessingService.reprocessExistingAccruals(loan); loanAccrualsProcessingService.reprocessExistingAccruals(loan);
@@ -1488,7 +1488,7 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
loan.updateSummaryWithTotalFeeChargesDueAtDisbursement(loan.deriveSumTotalOfChargesDueAtDisbursement()); loan.updateSummaryWithTotalFeeChargesDueAtDisbursement(loan.deriveSumTotalOfChargesDueAtDisbursement());
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
final LoanTransaction waiveLoanChargeTransaction = LoanTransaction.waiveLoanCharge(loan, loan.getOffice(), amountWaived, final LoanTransaction waiveLoanChargeTransaction = LoanTransaction.waiveLoanCharge(loan, loan.getOffice(), amountWaived,
@@ -395,10 +395,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
LoanTransaction disbursementTransaction = null; LoanTransaction disbursementTransaction = null;
if (isAccountTransfer) { if (isAccountTransfer) {
disburseLoanToSavings(loan, command, amountToDisburse, paymentDetail); disburseLoanToSavings(loan, command, amountToDisburse, paymentDetail);
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
} else { } else {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
disbursementTransaction = LoanTransaction.disbursement(loan, amountToDisburse, paymentDetail, actualDisbursementDate, disbursementTransaction = LoanTransaction.disbursement(loan, amountToDisburse, paymentDetail, actualDisbursementDate,
txnExternalId, loan.getTotalOverpaidAsMoney()); txnExternalId, loan.getTotalOverpaidAsMoney());
@@ -769,11 +769,11 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final ExternalId txnExternalId = externalIdFactory.createFromCommand(command, LoanApiConstants.externalIdParameterName); final ExternalId txnExternalId = externalIdFactory.createFromCommand(command, LoanApiConstants.externalIdParameterName);
if (isAccountTransfer) { if (isAccountTransfer) {
disburseLoanToSavings(loan, command, disburseAmount, paymentDetail); disburseLoanToSavings(loan, command, disburseAmount, paymentDetail);
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
} else { } else {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
LoanTransaction disbursementTransaction = LoanTransaction.disbursement(loan, disburseAmount, paymentDetail, LoanTransaction disbursementTransaction = LoanTransaction.disbursement(loan, disburseAmount, paymentDetail,
actualDisbursementDate, txnExternalId, loan.getTotalOverpaidAsMoney()); actualDisbursementDate, txnExternalId, loan.getTotalOverpaidAsMoney());
@@ -1042,7 +1042,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
businessEventNotifierService.notifyPreBusinessEvent(new LoanTransactionInterestPaymentWaiverPreBusinessEvent(loan)); businessEventNotifierService.notifyPreBusinessEvent(new LoanTransactionInterestPaymentWaiverPreBusinessEvent(loan));
// save already existing transaction ids // save already existing transaction ids
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
final String noteText = command.stringValueOfParameterNamed("note"); final String noteText = command.stringValueOfParameterNamed("note");
@@ -1314,7 +1314,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
} }
checkClientOrGroupActive(loan); checkClientOrGroupActive(loan);
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
businessEventNotifierService.notifyPreBusinessEvent(new LoanChargebackTransactionBusinessEvent(loanTransaction)); businessEventNotifierService.notifyPreBusinessEvent(new LoanChargebackTransactionBusinessEvent(loanTransaction));
@@ -1753,7 +1753,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
businessEventNotifierService.notifyPreBusinessEvent(new LoanInitiateTransferBusinessEvent(loan)); businessEventNotifierService.notifyPreBusinessEvent(new LoanInitiateTransferBusinessEvent(loan));
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
ExternalId externalId = externalIdFactory.create(); ExternalId externalId = externalIdFactory.create();
final LoanTransaction newTransferTransaction = LoanTransaction.initiateTransfer(loan.getOffice(), loan, transferDate, externalId); final LoanTransaction newTransferTransaction = LoanTransaction.initiateTransfer(loan.getOffice(), loan, transferDate, externalId);
@@ -1773,7 +1773,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
public LoanTransaction acceptLoanTransfer(final Loan loan, final LocalDate transferDate, final Office acceptedInOffice, public LoanTransaction acceptLoanTransfer(final Loan loan, final LocalDate transferDate, final Office acceptedInOffice,
final Staff loanOfficer) { final Staff loanOfficer) {
businessEventNotifierService.notifyPreBusinessEvent(new LoanAcceptTransferBusinessEvent(loan)); businessEventNotifierService.notifyPreBusinessEvent(new LoanAcceptTransferBusinessEvent(loan));
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
ExternalId externalId = externalIdFactory.create(); ExternalId externalId = externalIdFactory.create();
final LoanTransaction newTransferAcceptanceTransaction = LoanTransaction.approveTransfer(acceptedInOffice, loan, transferDate, final LoanTransaction newTransferAcceptanceTransaction = LoanTransaction.approveTransfer(acceptedInOffice, loan, transferDate,
@@ -1802,7 +1802,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
public LoanTransaction withdrawLoanTransfer(final Loan loan, final LocalDate transferDate) { public LoanTransaction withdrawLoanTransfer(final Loan loan, final LocalDate transferDate) {
businessEventNotifierService.notifyPreBusinessEvent(new LoanWithdrawTransferBusinessEvent(loan)); businessEventNotifierService.notifyPreBusinessEvent(new LoanWithdrawTransferBusinessEvent(loan));
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loanTransactionRepository.findTransactionIdsByLoan(loan));
final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); final List<Long> existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds());
ExternalId externalId = externalIdFactory.create(); ExternalId externalId = externalIdFactory.create();
@@ -2329,7 +2329,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private CommandProcessingResult processLoanDisbursementDetail(Loan loan, Long loanId, JsonCommand command, private CommandProcessingResult processLoanDisbursementDetail(Loan loan, Long loanId, JsonCommand command,
LoanDisbursementDetails loanDisbursementDetails) { LoanDisbursementDetails loanDisbursementDetails) {
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
final Map<String, Object> changes = new LinkedHashMap<>(); final Map<String, Object> changes = new LinkedHashMap<>();
LocalDate recalculateFrom = null; LocalDate recalculateFrom = null;
@@ -2804,7 +2804,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
loan.markAsChargedOff(transactionDate, currentUser, null); loan.markAsChargedOff(transactionDate, currentUser, null);
} }
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
final LoanTransaction chargeOffTransaction = LoanTransaction.chargeOff(loan, transactionDate, txnExternalId); final LoanTransaction chargeOffTransaction = LoanTransaction.chargeOff(loan, transactionDate, txnExternalId);
@@ -2863,7 +2863,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
this.loanTransactionValidator.validateUndoChargeOff(command.json()); this.loanTransactionValidator.validateUndoChargeOff(command.json());
final Long loanId = command.getLoanId(); final Long loanId = command.getLoanId();
final Loan loan = this.loanAssembler.assembleFrom(loanId); final Loan loan = this.loanAssembler.assembleFrom(loanId);
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
checkClientOrGroupActive(loan); checkClientOrGroupActive(loan);
if (!loan.isOpen()) { if (!loan.isOpen()) {
@@ -2947,7 +2947,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
// Create note // Create note
createNote(loan, command, changes); createNote(loan, command, changes);
// Initial transaction ids for journal entry generation // Initial transaction ids for journal entry generation
final List<Long> existingTransactionIds = loan.findExistingTransactionIds(); final List<Long> existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan);
final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds(); final List<Long> existingReversedTransactionIds = loan.findExistingReversedTransactionIds();
// Create refund transaction(s) // Create refund transaction(s)
Pair<LoanTransaction, LoanTransaction> refundTransactions = loanAccountDomainService.makeRefund(loan, scheduleGeneratorDTO, Pair<LoanTransaction, LoanTransaction> refundTransactions = loanAccountDomainService.makeRefund(loan, scheduleGeneratorDTO,
@@ -3058,7 +3058,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final Map<String, Object> actualChanges = new LinkedHashMap<>(); final Map<String, Object> actualChanges = new LinkedHashMap<>();
final LoanStatus currentStatus = loan.getStatus(); final LoanStatus currentStatus = loan.getStatus();
final LoanStatus statusEnum = this.loanLifecycleStateMachine.dryTransition(LoanEvent.LOAN_DISBURSAL_UNDO, loan); final LoanStatus statusEnum = this.loanLifecycleStateMachine.dryTransition(LoanEvent.LOAN_DISBURSAL_UNDO, loan);
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
if (!statusEnum.hasStateOf(currentStatus)) { if (!statusEnum.hasStateOf(currentStatus)) {
this.loanLifecycleStateMachine.transition(LoanEvent.LOAN_DISBURSAL_UNDO, loan); this.loanLifecycleStateMachine.transition(LoanEvent.LOAN_DISBURSAL_UNDO, loan);
@@ -3170,7 +3170,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
loanLifecycleStateMachine.transition(LoanEvent.WRITE_OFF_OUTSTANDING, loan); loanLifecycleStateMachine.transition(LoanEvent.WRITE_OFF_OUTSTANDING, loan);
changes.put(PARAM_STATUS, LoanEnumerations.status(loan.getLoanStatus())); changes.put(PARAM_STATUS, LoanEnumerations.status(loan.getLoanStatus()));
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
final String txnExternalId = command.stringValueOfParameterNamedAllowingNull(EXTERNAL_ID); final String txnExternalId = command.stringValueOfParameterNamedAllowingNull(EXTERNAL_ID);
@@ -3234,7 +3234,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private Optional<LoanTransaction> close(final Loan loan, final JsonCommand command, final Map<String, Object> changes, private Optional<LoanTransaction> close(final Loan loan, final JsonCommand command, final Map<String, Object> changes,
final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds, final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds,
final ScheduleGeneratorDTO scheduleGeneratorDTO) { final ScheduleGeneratorDTO scheduleGeneratorDTO) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
final LocalDate closureDate = command.localDateValueOfParameterNamed(TRANSACTION_DATE); final LocalDate closureDate = command.localDateValueOfParameterNamed(TRANSACTION_DATE);
@@ -3349,7 +3349,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final LoanTransaction lastDisbursalTransaction = loanTransactions.get(loanTransactions.size() - 1); final LoanTransaction lastDisbursalTransaction = loanTransactions.get(loanTransactions.size() - 1);
final LocalDate lastTransactionDate = lastDisbursalTransaction.getTransactionDate(); final LocalDate lastTransactionDate = lastDisbursalTransaction.getTransactionDate();
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
loanTransactions = loan.retrieveListOfTransactionsExcludeAccruals(); loanTransactions = loan.retrieveListOfTransactionsExcludeAccruals();
@@ -3384,7 +3384,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private void waiveInterest(final Loan loan, final LoanTransaction waiveInterestTransaction, final List<Long> existingTransactionIds, private void waiveInterest(final Loan loan, final LoanTransaction waiveInterestTransaction, final List<Long> existingTransactionIds,
final List<Long> existingReversedTransactionIds, final ScheduleGeneratorDTO scheduleGeneratorDTO) { final List<Long> existingReversedTransactionIds, final ScheduleGeneratorDTO scheduleGeneratorDTO) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
loanDownPaymentHandlerService.handleRepaymentOrRecoveryOrWaiverTransaction(loan, waiveInterestTransaction, null, loanDownPaymentHandlerService.handleRepaymentOrRecoveryOrWaiverTransaction(loan, waiveInterestTransaction, null,
@@ -3392,7 +3392,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
} }
private void undoWrittenOff(final Loan loan, final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) { private void undoWrittenOff(final Loan loan, final List<Long> existingTransactionIds, final List<Long> existingReversedTransactionIds) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
final LoanTransaction writeOffTransaction = loan.findWriteOffTransaction(); final LoanTransaction writeOffTransaction = loan.findWriteOffTransaction();
loanChargeValidator.validateRepaymentTypeTransactionNotBeforeAChargeRefund(writeOffTransaction.getLoan(), writeOffTransaction, loanChargeValidator.validateRepaymentTypeTransactionNotBeforeAChargeRefund(writeOffTransaction.getLoan(), writeOffTransaction,
@@ -238,7 +238,7 @@ public class LoanAdjustmentServiceImpl implements LoanAdjustmentService {
final LoanTransaction transactionForAdjustment, final List<Long> existingTransactionIds, final LoanTransaction transactionForAdjustment, final List<Long> existingTransactionIds,
final List<Long> existingReversedTransactionIds, final ScheduleGeneratorDTO scheduleGeneratorDTO, final List<Long> existingReversedTransactionIds, final ScheduleGeneratorDTO scheduleGeneratorDTO,
final ExternalId reversalExternalId) { final ExternalId reversalExternalId) {
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loanTransactionRepository.findTransactionIdsByLoan(loan));
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
loanTransactionValidator.validateActivityNotBeforeClientOrGroupTransferDate(loan, LoanEvent.LOAN_REPAYMENT_OR_WAIVER, loanTransactionValidator.validateActivityNotBeforeClientOrGroupTransferDate(loan, LoanEvent.LOAN_REPAYMENT_OR_WAIVER,
@@ -467,17 +467,20 @@ public class LoanAccountConfiguration {
@ConditionalOnMissingBean(LoanChargeService.class) @ConditionalOnMissingBean(LoanChargeService.class)
public LoanChargeService loanChargeService(final LoanChargeValidator loanChargeValidator, public LoanChargeService loanChargeService(final LoanChargeValidator loanChargeValidator,
final LoanTransactionProcessingService loanTransactionProcessingService, final LoanTransactionProcessingService loanTransactionProcessingService,
final LoanLifecycleStateMachine loanLifecycleStateMachine, final LoanBalanceService loanBalanceService) { final LoanLifecycleStateMachine loanLifecycleStateMachine, final LoanBalanceService loanBalanceService,
return new LoanChargeService(loanChargeValidator, loanTransactionProcessingService, loanLifecycleStateMachine, loanBalanceService); final LoanTransactionRepository loanTransactionRepository) {
return new LoanChargeService(loanChargeValidator, loanTransactionProcessingService, loanLifecycleStateMachine, loanBalanceService,
loanTransactionRepository);
} }
@Bean @Bean
@ConditionalOnMissingBean(LoanScheduleService.class) @ConditionalOnMissingBean(LoanScheduleService.class)
public LoanScheduleService loanScheduleService(final LoanChargeService loanChargeService, public LoanScheduleService loanScheduleService(final LoanChargeService loanChargeService,
final ReprocessLoanTransactionsService reprocessLoanTransactionsService, final LoanMapper loanMapper, final ReprocessLoanTransactionsService reprocessLoanTransactionsService, final LoanMapper loanMapper,
final LoanTransactionProcessingService loanTransactionProcessingService, LoanScheduleComponent loanSchedule) { final LoanTransactionProcessingService loanTransactionProcessingService, LoanScheduleComponent loanSchedule,
final LoanTransactionRepository loanTransactionRepository) {
return new LoanScheduleService(loanChargeService, reprocessLoanTransactionsService, loanMapper, loanTransactionProcessingService, return new LoanScheduleService(loanChargeService, reprocessLoanTransactionsService, loanMapper, loanTransactionProcessingService,
loanSchedule); loanSchedule, loanTransactionRepository);
} }
@Bean @Bean
@@ -490,8 +493,9 @@ public class LoanAccountConfiguration {
@ConditionalOnMissingBean(LoanRefundService.class) @ConditionalOnMissingBean(LoanRefundService.class)
public LoanRefundService loanRefundService(final LoanRefundValidator loanRefundValidator, public LoanRefundService loanRefundService(final LoanRefundValidator loanRefundValidator,
final LoanTransactionProcessingService loanTransactionProcessingService, final LoanTransactionProcessingService loanTransactionProcessingService,
final LoanLifecycleStateMachine loanLifecycleStateMachine) { final LoanLifecycleStateMachine loanLifecycleStateMachine, final LoanTransactionRepository loanTransactionRepository) {
return new LoanRefundService(loanRefundValidator, loanTransactionProcessingService, loanLifecycleStateMachine); return new LoanRefundService(loanRefundValidator, loanTransactionProcessingService, loanLifecycleStateMachine,
loanTransactionRepository);
} }
@Bean @Bean
@@ -92,6 +92,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleIns
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.serialization.LoanChargeValidator; import org.apache.fineract.portfolio.loanaccount.serialization.LoanChargeValidator;
import org.apache.fineract.portfolio.loanaccount.service.LoanBalanceService; import org.apache.fineract.portfolio.loanaccount.service.LoanBalanceService;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService;
@@ -128,7 +129,8 @@ public class LoanAccountDelinquencyRangeEventSerializerTest {
private AvroDateTimeMapper mapper; private AvroDateTimeMapper mapper;
private final LoanChargeService loanChargeService = new LoanChargeService(mock(LoanChargeValidator.class), private final LoanChargeService loanChargeService = new LoanChargeService(mock(LoanChargeValidator.class),
mock(LoanTransactionProcessingService.class), mock(LoanLifecycleStateMachine.class), mock(LoanBalanceService.class)); mock(LoanTransactionProcessingService.class), mock(LoanLifecycleStateMachine.class), mock(LoanBalanceService.class),
mock(LoanTransactionRepository.class));
private MockedStatic<MoneyHelper> moneyHelper = Mockito.mockStatic(MoneyHelper.class); private MockedStatic<MoneyHelper> moneyHelper = Mockito.mockStatic(MoneyHelper.class);
@@ -234,7 +234,7 @@ class LoanAdjustmentServiceImplTest {
when(loan.getLoanTransactions()).thenReturn(loanTransactions); when(loan.getLoanTransactions()).thenReturn(loanTransactions);
// Mock methods called inside adjustExistingTransaction // Mock methods called inside adjustExistingTransaction
when(loan.findExistingTransactionIds()).thenReturn(Collections.emptyList()); when(loanTransactionRepository.findTransactionIdsByLoan(loan)).thenReturn(Collections.emptyList());
when(loan.findExistingReversedTransactionIds()).thenReturn(Collections.emptyList()); when(loan.findExistingReversedTransactionIds()).thenReturn(Collections.emptyList());
doNothing().when(loanTransactionValidator).validateActivityNotBeforeClientOrGroupTransferDate(any(), any(), any()); doNothing().when(loanTransactionValidator).validateActivityNotBeforeClientOrGroupTransferDate(any(), any(), any());
when(loan.isClosedWrittenOff()).thenReturn(false); when(loan.isClosedWrittenOff()).thenReturn(false);
@@ -279,7 +279,7 @@ class LoanAdjustmentServiceImplTest {
LoanTransaction unrelatedTransaction = mock(LoanTransaction.class); LoanTransaction unrelatedTransaction = mock(LoanTransaction.class);
// Mock methods called inside adjustExistingTransaction // Mock methods called inside adjustExistingTransaction
when(loan.findExistingTransactionIds()).thenReturn(Collections.emptyList()); when(loanTransactionRepository.findTransactionIdsByLoan(loan)).thenReturn(Collections.emptyList());
when(loan.findExistingReversedTransactionIds()).thenReturn(Collections.emptyList()); when(loan.findExistingReversedTransactionIds()).thenReturn(Collections.emptyList());
doNothing().when(loanTransactionValidator).validateActivityNotBeforeClientOrGroupTransferDate(any(), any(), any()); doNothing().when(loanTransactionValidator).validateActivityNotBeforeClientOrGroupTransferDate(any(), any(), any());
when(loan.isClosedWrittenOff()).thenReturn(false); when(loan.isClosedWrittenOff()).thenReturn(false);
@@ -192,7 +192,7 @@ class LoanChargeWritePlatformServiceImplTest {
when(loanAccountService.saveAndFlushLoanWithDataIntegrityViolationChecks(any())).thenReturn(loan); when(loanAccountService.saveAndFlushLoanWithDataIntegrityViolationChecks(any())).thenReturn(loan);
List<Long> existingTransactionIds = new ArrayList<>(); List<Long> existingTransactionIds = new ArrayList<>();
List<Long> existingReversedTransactionIds = new ArrayList<>(); List<Long> existingReversedTransactionIds = new ArrayList<>();
when(loan.findExistingTransactionIds()).thenReturn(existingTransactionIds); when(loanTransactionRepository.findTransactionIdsByLoan(loan)).thenReturn(existingTransactionIds);
when(loan.findExistingReversedTransactionIds()).thenReturn(existingReversedTransactionIds); when(loan.findExistingReversedTransactionIds()).thenReturn(existingReversedTransactionIds);
when(loan.getLoanCharges()).thenReturn(new HashSet<>()); when(loan.getLoanCharges()).thenReturn(new HashSet<>());