FINERACT-2080: separate LoanRepaymentScheduleTransactionProcessorFactory from loan

This commit is contained in:
budaidev
2025-04-03 10:50:50 +02:00
committed by Adam Saghy
parent 741cdb1e42
commit 16e70527ea
22 changed files with 284 additions and 216 deletions
@@ -30,7 +30,6 @@ import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.infrastructure.core.service.MathUtil;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
@@ -49,19 +48,32 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleM
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleParams;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePlan;
import org.apache.fineract.portfolio.loanaccount.loanschedule.exception.MultiDisbursementOutstandingAmoutException;
import org.apache.fineract.portfolio.loanaccount.service.LoanTransactionProcessingService;
import org.apache.fineract.portfolio.loanproduct.calc.EMICalculator;
import org.apache.fineract.portfolio.loanproduct.calc.data.OutstandingDetails;
import org.apache.fineract.portfolio.loanproduct.calc.data.ProgressiveLoanInterestScheduleModel;
import org.apache.fineract.portfolio.loanproduct.domain.RepaymentStartDateType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class ProgressiveLoanScheduleGenerator implements LoanScheduleGenerator {
private final ScheduledDateGenerator scheduledDateGenerator;
private final EMICalculator emiCalculator;
private LoanTransactionProcessingService loanTransactionProcessingService;
public ProgressiveLoanScheduleGenerator(ScheduledDateGenerator scheduledDateGenerator, EMICalculator emiCalculator) {
this.scheduledDateGenerator = scheduledDateGenerator;
this.emiCalculator = emiCalculator;
}
@Autowired(required = false)
public void setLoanTransactionProcessingService(LoanTransactionProcessingService loanTransactionProcessingService) {
this.loanTransactionProcessingService = loanTransactionProcessingService;
}
public LoanSchedulePlan generate(final MathContext mc, final LoanRepaymentScheduleModelData modelData) {
LoanApplicationTerms loanApplicationTerms = LoanApplicationTerms.assembleFrom(modelData, mc);
return LoanSchedulePlan.from(generate(mc, loanApplicationTerms, null, null));
@@ -208,7 +220,8 @@ public class ProgressiveLoanScheduleGenerator implements LoanScheduleGenerator {
@Override
public Money getPeriodInterestTillDate(@NotNull LoanRepaymentScheduleInstallment installment, @NotNull LocalDate targetDate) {
Loan loan = installment.getLoan();
LoanRepaymentScheduleTransactionProcessor transactionProcessor = loan.getTransactionProcessor();
LoanRepaymentScheduleTransactionProcessor transactionProcessor = loanTransactionProcessingService
.getTransactionProcessor(loan.getTransactionProcessingStrategyCode());
if (!(transactionProcessor instanceof AdvancedPaymentScheduleTransactionProcessor processor)) {
throw new IllegalStateException("Expected an AdvancedPaymentScheduleTransactionProcessor");
}
@@ -19,6 +19,7 @@
package org.apache.fineract.portfolio.loanaccount.loanschedule.domain;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import java.math.BigDecimal;
import java.math.MathContext;
@@ -32,9 +33,13 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleP
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePlanDisbursementPeriod;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePlanDownPaymentPeriod;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePlanRepaymentPeriod;
import org.apache.fineract.portfolio.loanaccount.service.LoanTransactionProcessingService;
import org.apache.fineract.portfolio.loanproduct.calc.ProgressiveEMICalculator;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class LoanScheduleGeneratorTest {
private static final ProgressiveEMICalculator emiCalculator = new ProgressiveEMICalculator();
@@ -49,6 +54,7 @@ class LoanScheduleGeneratorTest {
private static final LocalDate DISBURSEMENT_DATE = LocalDate.of(2024, 1, 15);
private static final MathContext mc = new MathContext(12, RoundingMode.HALF_EVEN);
private static final BigDecimal DOWN_PAYMENT_PORTION = BigDecimal.valueOf(25);
private static final LoanTransactionProcessingService loanTransactionProcessingService = mock(LoanTransactionProcessingService.class);
@Test
void testGenerateLoanSchedule() {
@@ -58,6 +64,7 @@ class LoanScheduleGeneratorTest {
ScheduledDateGenerator scheduledDateGenerator = new DefaultScheduledDateGenerator();
ProgressiveLoanScheduleGenerator generator = new ProgressiveLoanScheduleGenerator(scheduledDateGenerator, emiCalculator);
generator.setLoanTransactionProcessingService(loanTransactionProcessingService);
LoanSchedulePlan loanSchedule = generator.generate(mc, modelData);
@@ -94,6 +101,7 @@ class LoanScheduleGeneratorTest {
ScheduledDateGenerator scheduledDateGenerator = new DefaultScheduledDateGenerator();
ProgressiveLoanScheduleGenerator generator = new ProgressiveLoanScheduleGenerator(scheduledDateGenerator, emiCalculator);
generator.setLoanTransactionProcessingService(loanTransactionProcessingService);
LoanSchedulePlan loanSchedule = generator.generate(mc, modelData);