FINERACT-2421: Allow multiple interest rate schedule adjustments same date

This commit is contained in:
Jose Alberto Hernandez
2026-01-27 15:04:30 +01:00
committed by Adam Saghy
parent f40ce6d9f6
commit 532190a649
5 changed files with 33 additions and 42 deletions
@@ -74,6 +74,7 @@ import org.apache.fineract.portfolio.loanaccount.rescheduleloan.RescheduleLoansA
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestDataValidator;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequestRepository;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanTermVariationsRepository;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.exception.LoanRescheduleRequestNotFoundException;
import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualsProcessingService;
import org.apache.fineract.portfolio.loanaccount.service.LoanAssembler;
@@ -117,6 +118,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
private final LoanScheduleComponent loanSchedule;
private final LoanTransactionRepository loanTransactionRepository;
private final LoanLifecycleStateMachine loanLifecycleStateMachine;
private final LoanTermVariationsRepository loanTermVariationsRepository;
/**
* create a new instance of the LoanRescheduleRequest object from the JsonCommand object and persist
@@ -399,6 +401,17 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
hasInterestRateChange = true;
}
}
if (hasInterestRateChange && loan.isProgressiveSchedule()) {
final LocalDate termApplicableFromDate = rescheduleFromDate;
LoanTermVariations previousLoanTermVariations = activeLoanTermVariations.stream()
.filter(lt -> lt.getTermType().isInterestRateFromInstallment() //
&& lt.getTermApplicableFrom().equals(termApplicableFromDate))
.findFirst().orElse(null);
if (previousLoanTermVariations != null) {
previousLoanTermVariations.markAsInactive();
loanTermVariationsRepository.save(previousLoanTermVariations);
}
}
BigDecimal annualNominalInterestRate = null;
List<LoanTermVariationsData> loanTermVariations = new ArrayList<>();
loanTermVariationsMapper.constructLoanTermVariations(scheduleGeneratorDTO.getFloatingRateDTO(), annualNominalInterestRate,