FINERACT-2059: Support reverse-replay of Re-age transaction

This commit is contained in:
Adam Saghy
2024-03-27 12:52:42 +01:00
parent ae6dde0224
commit 6458094a5e
9 changed files with 295 additions and 25 deletions
@@ -28,6 +28,10 @@ import org.springframework.dao.EmptyResultDataAccessException;
*/
public class LoanTransactionNotFoundException extends AbstractPlatformResourceNotFoundException {
public LoanTransactionNotFoundException(final String msg) {
super("error.msg.loan.transaction.not.found", msg);
}
public LoanTransactionNotFoundException(final Long id) {
super("error.msg.loan.transaction.id.invalid", "Transaction with identifier " + id + " does not exist", id);
}
@@ -51,6 +51,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeParamet
import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgingParameterRepository;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.MoneyHolder;
import org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionNotFoundException;
import org.apache.fineract.portfolio.loanaccount.service.LoanAssembler;
import org.apache.fineract.portfolio.note.domain.Note;
import org.apache.fineract.portfolio.note.domain.NoteRepository;
@@ -80,11 +81,10 @@ public class LoanReAgingServiceImpl {
changes.put(LoanReAgingApiConstants.dateFormatParameterName, command.dateFormat());
LoanTransaction reAgeTransaction = createReAgeTransaction(loan, command);
// important to do a flush before creating the reage parameter since it needs the ID
loanTransactionRepository.saveAndFlush(reAgeTransaction);
LoanReAgeParameter reAgeParameter = createReAgeParameter(reAgeTransaction, command);
reAgingParameterRepository.saveAndFlush(reAgeParameter);
reAgeTransaction.setLoanReAgeParameter(reAgeParameter);
loanTransactionRepository.saveAndFlush(reAgeTransaction);
final LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = loanRepaymentScheduleTransactionProcessorFactory
.determineProcessor(loan.transactionProcessingStrategy());
@@ -119,7 +119,7 @@ public class LoanReAgingServiceImpl {
LoanTransaction reAgeTransaction = findLatestNonReversedReAgeTransaction(loan);
if (reAgeTransaction == null) {
// TODO: when validations implemented; throw exception if there isn't a reage transaction available
throw new LoanTransactionNotFoundException("Re-Age transaction for loan was not found");
}
reverseReAgeTransaction(reAgeTransaction, command);
loanTransactionRepository.saveAndFlush(reAgeTransaction);
@@ -177,8 +177,7 @@ public class LoanReAgingServiceImpl {
LocalDate startDate = command.dateValueOfParameterNamed(LoanReAgingApiConstants.startDate);
Integer numberOfInstallments = command.integerValueOfParameterNamed(LoanReAgingApiConstants.numberOfInstallments);
Integer periodFrequencyNumber = command.integerValueOfParameterNamed(LoanReAgingApiConstants.frequencyNumber);
return new LoanReAgeParameter(reAgeTransaction.getId(), periodFrequencyType, periodFrequencyNumber, startDate,
numberOfInstallments);
return new LoanReAgeParameter(reAgeTransaction, periodFrequencyType, periodFrequencyNumber, startDate, numberOfInstallments);
}
private void reProcessLoanTransactions(Loan loan) {
@@ -118,6 +118,7 @@
<class>org.apache.fineract.portfolio.loanaccount.domain.LoanCreditAllocationRule</class>
<class>org.apache.fineract.portfolio.loanproduct.domain.CreditAllocationTransactionType</class>
<class>org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationTypeListConverter</class>
<class>org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeParameter</class>
<!-- Fineract Savings module -->
<class>org.apache.fineract.interoperation.domain.InteropIdentifier</class>
<class>org.apache.fineract.portfolio.interestratechart.domain.InterestIncentives</class>