FINERACT-2181: ensure loan transactions are saved and linked to loan object consistently across business steps

This commit is contained in:
mark.vituska
2025-06-19 21:45:29 +02:00
committed by Arnold Gálovics
parent 62bb1e6509
commit 3829c4404f
3 changed files with 25 additions and 15 deletions
@@ -809,8 +809,9 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
} }
for (LoanTransaction newTransaction : newTransactions) { for (LoanTransaction newTransaction : newTransactions) {
loanAccountService.saveLoanTransactionWithDataIntegrityViolationChecks(newTransaction); LoanTransaction savedNewTransaction = loanAccountService.saveLoanTransactionWithDataIntegrityViolationChecks(newTransaction);
transactionIds.add(newTransaction.getId()); loan.addLoanTransaction(savedNewTransaction);
transactionIds.add(savedNewTransaction.getId());
} }
changes.put("transactions", transactionIds); changes.put("transactions", transactionIds);
changes.put("eventAmount", payPrincipal.getAmount().negate()); changes.put("eventAmount", payPrincipal.getAmount().negate());
@@ -274,16 +274,19 @@ public class LoanAccrualActivityProcessingServiceImpl implements LoanAccrualActi
transactionDate); transactionDate);
if (newAccrualActivityTransaction != null) { if (newAccrualActivityTransaction != null) {
makeAccrualActivityTransaction(loan, newAccrualActivityTransaction); LoanTransaction savedNewTransaction = makeAccrualActivityTransaction(loan, newAccrualActivityTransaction);
loan.addLoanTransaction(savedNewTransaction);
} }
} }
private void makeAccrualActivityTransaction(final @NonNull Loan loan, @NonNull LoanTransaction newAccrualActivityTransaction) { private LoanTransaction makeAccrualActivityTransaction(final @NonNull Loan loan,
@NonNull LoanTransaction newAccrualActivityTransaction) {
businessEventNotifierService.notifyPreBusinessEvent(new LoanTransactionAccrualActivityPreBusinessEvent(loan)); businessEventNotifierService.notifyPreBusinessEvent(new LoanTransactionAccrualActivityPreBusinessEvent(loan));
newAccrualActivityTransaction = loanAccountService LoanTransaction savedNewAccrualActivityTransaction = loanAccountService
.saveLoanTransactionWithDataIntegrityViolationChecks(newAccrualActivityTransaction); .saveLoanTransactionWithDataIntegrityViolationChecks(newAccrualActivityTransaction);
businessEventNotifierService businessEventNotifierService
.notifyPostBusinessEvent(new LoanTransactionAccrualActivityPostBusinessEvent(newAccrualActivityTransaction)); .notifyPostBusinessEvent(new LoanTransactionAccrualActivityPostBusinessEvent(savedNewAccrualActivityTransaction));
return savedNewAccrualActivityTransaction;
} }
} }
@@ -678,9 +678,9 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
// update repayment schedule portions // update repayment schedule portions
addTransactionMappings(transaction, accrualPeriod, adjustment); addTransactionMappings(transaction, accrualPeriod, adjustment);
loanTransactionRepository.save(transaction); LoanTransaction savedTransaction = loanTransactionRepository.save(transaction);
loan.addLoanTransaction(savedTransaction);
return transaction; return savedTransaction;
} }
private void mergeAccrualTransaction(@NotNull final LoanTransaction transaction, final AccrualPeriodData accrualPeriod, private void mergeAccrualTransaction(@NotNull final LoanTransaction transaction, final AccrualPeriodData accrualPeriod,
@@ -825,7 +825,8 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
} }
final LoanTransaction interestAccrualTransaction = LoanTransaction.accrueInterest(loan.getOffice(), loan, final LoanTransaction interestAccrualTransaction = LoanTransaction.accrueInterest(loan.getOffice(), loan,
interestApplied, loan.getDisbursementDate(), externalId); interestApplied, loan.getDisbursementDate(), externalId);
loanTransactionRepository.save(interestAccrualTransaction); LoanTransaction savedInterestAccrualTransaction = loanTransactionRepository.save(interestAccrualTransaction);
loan.addLoanTransaction(savedInterestAccrualTransaction);
} }
} else { } else {
Set<LoanChargePaidBy> chargePaidBies = accrualTransaction.getLoanChargesPaid(); Set<LoanChargePaidBy> chargePaidBies = accrualTransaction.getLoanChargesPaid();
@@ -940,12 +941,14 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
if (incomeTransaction.isEmpty()) { if (incomeTransaction.isEmpty()) {
LoanTransaction transaction = LoanTransaction.incomePosting(loan, loan.getOffice(), compoundingDetail.getEffectiveDate(), LoanTransaction transaction = LoanTransaction.incomePosting(loan, loan.getOffice(), compoundingDetail.getEffectiveDate(),
compoundingDetail.getAmount(), interest, fee, penalties, externalId); compoundingDetail.getAmount(), interest, fee, penalties, externalId);
loanTransactionRepository.save(transaction); LoanTransaction savedTransaction = loanTransactionRepository.save(transaction);
loan.addLoanTransaction(savedTransaction);
} else if (incomeTransaction.get().getAmount(loan.getCurrency()).getAmount().compareTo(compoundingDetail.getAmount()) != 0) { } else if (incomeTransaction.get().getAmount(loan.getCurrency()).getAmount().compareTo(compoundingDetail.getAmount()) != 0) {
incomeTransaction.get().reverse(); incomeTransaction.get().reverse();
LoanTransaction transaction = LoanTransaction.incomePosting(loan, loan.getOffice(), compoundingDetail.getEffectiveDate(), LoanTransaction transaction = LoanTransaction.incomePosting(loan, loan.getOffice(), compoundingDetail.getEffectiveDate(),
compoundingDetail.getAmount(), interest, fee, penalties, externalId); compoundingDetail.getAmount(), interest, fee, penalties, externalId);
loanTransactionRepository.save(transaction); LoanTransaction savedTransaction = loanTransactionRepository.save(transaction);
loan.addLoanTransaction(savedTransaction);
} }
} }
@@ -964,7 +967,8 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
LoanTransaction accrual = LoanTransaction.accrueTransaction(loan, loan.getOffice(), compoundingDetail.getEffectiveDate(), LoanTransaction accrual = LoanTransaction.accrueTransaction(loan, loan.getOffice(), compoundingDetail.getEffectiveDate(),
compoundingDetail.getAmount(), interest, fee, penalties, externalId); compoundingDetail.getAmount(), interest, fee, penalties, externalId);
updateLoanChargesPaidBy(loan, accrual, feeDetails, null); updateLoanChargesPaidBy(loan, accrual, feeDetails, null);
loanTransactionRepository.save(accrual); LoanTransaction savedAccrual = loanTransactionRepository.save(accrual);
loan.addLoanTransaction(savedAccrual);
} }
} }
} }
@@ -1025,7 +1029,8 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
} }
LoanTransaction finalIncomeTransaction = LoanTransaction.incomePosting(loan, loan.getOffice(), closedDate, amountToPost, LoanTransaction finalIncomeTransaction = LoanTransaction.incomePosting(loan, loan.getOffice(), closedDate, amountToPost,
interestToPost, feeToPost, penaltyToPost, externalId); interestToPost, feeToPost, penaltyToPost, externalId);
loanTransactionRepository.save(finalIncomeTransaction); LoanTransaction savedFinalIncomeTransaction = loanTransactionRepository.save(finalIncomeTransaction);
loan.addLoanTransaction(savedFinalIncomeTransaction);
if (loan.isPeriodicAccrualAccountingEnabledOnLoanProduct()) { if (loan.isPeriodicAccrualAccountingEnabledOnLoanProduct()) {
final LocalDate lastAccruedDate = loanTransactionRepository final LocalDate lastAccruedDate = loanTransactionRepository
@@ -1040,7 +1045,8 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
LoanTransaction finalAccrual = LoanTransaction.accrueTransaction(loan, loan.getOffice(), closedDate, amountToPost, LoanTransaction finalAccrual = LoanTransaction.accrueTransaction(loan, loan.getOffice(), closedDate, amountToPost,
interestToPost, feeToPost, penaltyToPost, externalId); interestToPost, feeToPost, penaltyToPost, externalId);
updateLoanChargesPaidBy(loan, finalAccrual, feeDetails, null); updateLoanChargesPaidBy(loan, finalAccrual, feeDetails, null);
loanTransactionRepository.save(finalAccrual); LoanTransaction savedFinalAccrual = loanTransactionRepository.save(finalAccrual);
loan.addLoanTransaction(savedFinalAccrual);
} }
} }