From 19b2a77127cb853c51be0195b8c7ba38dcab26f7 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Fri, 6 Jun 2025 11:13:39 +0200 Subject: [PATCH] FINERACT-2181: Fix integration test / unify getLoanRepaymentScheduleDetail() --- .../fineract/portfolio/loanaccount/domain/Loan.java | 10 +++------- .../loanaccount/mapper/LoanTermVariationsMapper.java | 2 +- .../service/LoanDownPaymentHandlerServiceImpl.java | 2 +- .../AdvancedPaymentScheduleTransactionProcessor.java | 2 +- ...dvancedPaymentScheduleTransactionProcessorTest.java | 3 +-- .../serialization/LoanApplicationValidator.java | 8 ++++---- ...plicationWritePlatformServiceJpaRepositoryImpl.java | 9 +++++---- .../loanaccount/service/LoanAssemblerImpl.java | 2 +- .../portfolio/loanaccount/service/LoanUtilService.java | 4 ++-- .../LoanWritePlatformServiceJpaRepositoryImpl.java | 6 +++--- .../LoanChargeWritePlatformServiceImplTest.java | 2 +- .../service/LoanDownPaymentHandlerServiceImplTest.java | 2 +- 12 files changed, 24 insertions(+), 28 deletions(-) diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index f3c76d057..f2ad4f94e 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -667,10 +667,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { return this.loanProduct; } - public LoanProductRelatedDetail repaymentScheduleDetail() { - return this.loanRepaymentScheduleDetail; - } - public void updateClient(final Client client) { this.client = client; } @@ -1347,7 +1343,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public Money getTotalOverpaidAsMoney() { - return Money.of(this.repaymentScheduleDetail().getCurrency(), this.totalOverpaid); + return Money.of(this.getLoanProductRelatedDetail().getCurrency(), this.totalOverpaid); } public void updateIsInterestRecalculationEnabled() { @@ -1512,7 +1508,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { public boolean isFeeCompoundingEnabledForInterestRecalculation() { boolean isEnabled = false; - if (this.repaymentScheduleDetail().isInterestRecalculationEnabled()) { + if (this.getLoanProductRelatedDetail().isInterestRecalculationEnabled()) { isEnabled = this.loanInterestRecalculationDetails.getInterestRecalculationCompoundingMethod().isFeeCompoundingEnabled(); } return isEnabled; @@ -1602,7 +1598,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } return numberOfInstallments; } - return this.repaymentScheduleDetail().getNumberOfRepayments() + adjustNumberOfRepayments(); + return this.getLoanProductRelatedDetail().getNumberOfRepayments() + adjustNumberOfRepayments(); } /* diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTermVariationsMapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTermVariationsMapper.java index 6d21260b5..7fd5591e7 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTermVariationsMapper.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTermVariationsMapper.java @@ -86,7 +86,7 @@ public class LoanTermVariationsMapper { CalendarHistoryDataWrapper calendarHistoryDataWrapper; RepaymentStartDateType repaymentStartDateType = loan.getLoanProduct().getRepaymentStartDateType(); boolean allowCompoundingOnEod = false; - if (loan.repaymentScheduleDetail().isInterestRecalculationEnabled()) { + if (loan.getLoanProductRelatedDetail().isInterestRecalculationEnabled()) { restCalendarInstance = scheduleGeneratorDTO.getCalendarInstanceForInterestRecalculation(); compoundingCalendarInstance = scheduleGeneratorDTO.getCompoundingCalendarInstance(); recalculationFrequencyType = loan.getLoanInterestRecalculationDetails().getRestFrequencyType(); diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java index 5e2004790..271756c40 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java @@ -179,7 +179,7 @@ public class LoanDownPaymentHandlerServiceImpl implements LoanDownPaymentHandler .reduce(BigDecimal.ZERO, BigDecimal::add); final BigDecimal totalPrincipalCredited = totalDisbursed.add(totalPrincipalAdjusted).add(totalCapitalizedIncome); if (totalPrincipalCredited.compareTo(loan.getSummary().getTotalPrincipalRepaid()) < 0 - && loan.repaymentScheduleDetail().getPrincipal().minus(totalDisbursed).isGreaterThanZero()) { + && loan.getLoanProductRelatedDetail().getPrincipal().minus(totalDisbursed).isGreaterThanZero()) { final String errorMessage = "The transaction amount cannot exceed threshold."; throw new InvalidLoanStateTransitionException("transaction", "amount.exceeds.threshold", errorMessage); } diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java index 4f6818c5b..61eb53fc8 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java @@ -1226,7 +1226,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep final MathContext mc = MoneyHelper.getMathContext(); Loan loan = disbursementTransaction.getLoan(); LoanProductRelatedDetail loanProductRelatedDetail = loan.getLoanRepaymentScheduleDetail(); - Integer installmentAmountInMultiplesOf = loan.getLoanProductRelatedDetail().getInstallmentAmountInMultiplesOf(); + Integer installmentAmountInMultiplesOf = loanProductRelatedDetail.getInstallmentAmountInMultiplesOf(); List installments = transactionCtx.getInstallments(); LocalDate transactionDate = disbursementTransaction.getTransactionDate(); MonetaryCurrency currency = transactionCtx.getCurrency(); diff --git a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java index 9cde84ea0..7efc6ad18 100644 --- a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java +++ b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java @@ -529,12 +529,11 @@ class AdvancedPaymentScheduleTransactionProcessorTest { LoanProductRelatedDetail loanProductRelatedDetail = mock(LoanProductRelatedDetail.class); org.apache.fineract.portfolio.loanproduct.domain.LoanProduct loanProduct = mock( org.apache.fineract.portfolio.loanproduct.domain.LoanProduct.class); - when(loanProduct.getInstallmentAmountInMultiplesOf()).thenReturn(null); + when(loanProductRelatedDetail.getInstallmentAmountInMultiplesOf()).thenReturn(null); when(loanProductRelatedDetail.isEnableDownPayment()).thenReturn(false); Loan loan = mock(Loan.class); when(loan.getLoanRepaymentScheduleDetail()).thenReturn(loanProductRelatedDetail); - when(loan.getLoanProduct()).thenReturn(loanProduct); when(loan.isInterestBearing()).thenReturn(true); LoanRepaymentScheduleInstallment installment1 = spy( diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java index 4473a137a..e29934554 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java @@ -215,8 +215,8 @@ public final class LoanApplicationValidator { } validateLoanTermAndRepaidEveryValues(loan.getTermFrequency(), loan.getTermPeriodFrequencyType().getValue(), - loan.repaymentScheduleDetail().getNumberOfRepayments(), loan.repaymentScheduleDetail().getRepayEvery(), - loan.repaymentScheduleDetail().getRepaymentPeriodFrequencyType().getValue(), loan); + loan.getLoanProductRelatedDetail().getNumberOfRepayments(), loan.getLoanProductRelatedDetail().getRepayEvery(), + loan.getLoanProductRelatedDetail().getRepaymentPeriodFrequencyType().getValue(), loan); } public void validateForModify(final Loan loan) { @@ -229,8 +229,8 @@ public final class LoanApplicationValidator { } validateLoanTermAndRepaidEveryValues(loan.getTermFrequency(), loan.getTermPeriodFrequencyType().getValue(), - loan.repaymentScheduleDetail().getNumberOfRepayments(), loan.repaymentScheduleDetail().getRepayEvery(), - loan.repaymentScheduleDetail().getRepaymentPeriodFrequencyType().getValue(), loan); + loan.getLoanProductRelatedDetail().getNumberOfRepayments(), loan.getLoanProductRelatedDetail().getRepayEvery(), + loan.getLoanProductRelatedDetail().getRepaymentPeriodFrequencyType().getValue(), loan); } public void validateForCreate(JsonCommand command) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index cbd6c829c..72835b441 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -233,12 +233,13 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa case DAILY -> CalendarFrequencyType.DAILY; case WEEKLY -> CalendarFrequencyType.WEEKLY; case MONTHLY -> CalendarFrequencyType.MONTHLY; - case SAME_AS_REPAYMENT_PERIOD -> CalendarFrequencyType.from(loan.repaymentScheduleDetail().getRepaymentPeriodFrequencyType()); + case SAME_AS_REPAYMENT_PERIOD -> + CalendarFrequencyType.from(loan.getLoanProductRelatedDetail().getRepaymentPeriodFrequencyType()); case INVALID -> CalendarFrequencyType.INVALID; }; if (recalculationFrequencyType == SAME_AS_REPAYMENT_PERIOD) { - frequency = loan.repaymentScheduleDetail().getRepayEvery(); + frequency = loan.getLoanProductRelatedDetail().getRepayEvery(); calendarStartDate = loan.getExpectedDisbursedOnLocalDate(); if (updatedRepeatsOnDay == null) { updatedRepeatsOnDay = calendarStartDate.get(ChronoField.DAY_OF_WEEK); @@ -400,12 +401,12 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa } } } else { - PeriodFrequencyType repaymentFrequencyType = loan.repaymentScheduleDetail().getRepaymentPeriodFrequencyType(); + PeriodFrequencyType repaymentFrequencyType = loan.getLoanProductRelatedDetail().getRepaymentPeriodFrequencyType(); if (repaymentFrequencyType == PeriodFrequencyType.MONTHS) { final String title = "loan_schedule_" + loan.getId(); final Integer typeId = CalendarType.COLLECTION.getValue(); final CalendarFrequencyType calendarFrequencyType = CalendarFrequencyType.MONTHLY; - final Integer interval = loan.repaymentScheduleDetail().getRepayEvery(); + final Integer interval = loan.getLoanProductRelatedDetail().getRepayEvery(); LocalDate startDate = loan.getExpectedFirstRepaymentOnDate(); if (startDate == null) { startDate = loan.getExpectedDisbursedOnLocalDate(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java index 272532567..23d1f21e0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java @@ -775,7 +775,7 @@ public class LoanAssemblerImpl implements LoanAssembler { changes.put(LoanApiConstants.fixedPrincipalPercentagePerInstallmentParamName, loan.getFixedPrincipalPercentagePerInstallment()); } - final LoanProductRelatedDetail productRelatedDetail = loan.repaymentScheduleDetail(); + final LoanProductRelatedDetail productRelatedDetail = loan.getLoanProductRelatedDetail(); if (loan.loanProduct().getLoanConfigurableAttributes() != null) { loanScheduleAssembler.updateProductRelatedDetails(productRelatedDetail, loan); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java index 0f0793ee0..123d71798 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java @@ -249,7 +249,7 @@ public class LoanUtilService { // immediately after disbursement date, // need to have minimum number of days gap between disbursement // and first repayment date. - final LoanProductRelatedDetail repaymentScheduleDetails = loan.repaymentScheduleDetail(); + final LoanProductRelatedDetail repaymentScheduleDetails = loan.getLoanProductRelatedDetail(); // Not expecting to be null if (repaymentScheduleDetails != null) { final Integer repayEvery = repaymentScheduleDetails.getRepayEvery(); @@ -273,7 +273,7 @@ public class LoanUtilService { private LocalDate generateCalculatedRepaymentStartDate(final CalendarHistoryDataWrapper calendarHistoryDataWrapper, LocalDate actualDisbursementDate, Loan loan) { - final LoanProductRelatedDetail repaymentScheduleDetails = loan.repaymentScheduleDetail(); + final LoanProductRelatedDetail repaymentScheduleDetails = loan.getLoanProductRelatedDetail(); final WorkingDays workingDays = this.workingDaysRepository.findOne(); LocalDate calculatedRepaymentsStartingFromDate = null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index bbd915081..0c7fbfe50 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -415,7 +415,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf regenerateScheduleOnDisbursement(command, loan, recalculateSchedule, scheduleGeneratorDTO, nextPossibleRepaymentDate, rescheduledRepaymentDate); - boolean downPaymentEnabled = loan.repaymentScheduleDetail().isEnableDownPayment(); + boolean downPaymentEnabled = loan.getLoanProductRelatedDetail().isEnableDownPayment(); if (loan.isInterestBearingAndInterestRecalculationEnabled() || downPaymentEnabled) { createAndSaveLoanScheduleArchive(loan, scheduleGeneratorDTO); } @@ -786,7 +786,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final ScheduleGeneratorDTO scheduleGeneratorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan, recalculateFrom); regenerateScheduleOnDisbursement(command, loan, recalculateSchedule, scheduleGeneratorDTO, nextPossibleRepaymentDate, rescheduledRepaymentDate); - boolean downPaymentEnabled = loan.repaymentScheduleDetail().isEnableDownPayment(); + boolean downPaymentEnabled = loan.getLoanProductRelatedDetail().isEnableDownPayment(); if (loan.isInterestBearingAndInterestRecalculationEnabled() || downPaymentEnabled) { createAndSaveLoanScheduleArchive(loan, scheduleGeneratorDTO); } @@ -2340,7 +2340,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loanDownPaymentTransactionValidator.validateAccountStatus(loan, LoanEvent.LOAN_EDIT_MULTI_DISBURSE_DATE); updateDisbursementDateAndAmountForTranche(loan, loanDisbursementDetails, command, changes, scheduleGeneratorDTO); } else { - loan.repaymentScheduleDetail().setPrincipal(loan.getPrincipalAmountForRepaymentSchedule()); + loan.getLoanProductRelatedDetail().setPrincipal(loan.getPrincipalAmountForRepaymentSchedule()); if (loan.isCumulativeSchedule() && loan.isInterestBearingAndInterestRecalculationEnabled()) { loanScheduleService.regenerateRepaymentScheduleWithInterestRecalculation(loan, scheduleGeneratorDTO); diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImplTest.java index 46dce0a0e..f482a412b 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImplTest.java @@ -177,7 +177,7 @@ class LoanChargeWritePlatformServiceImplTest { when(chargeDefinition.getChargeTimeType()).thenReturn(SPECIFIED_DUE_DATE); when(chargeDefinition.getCurrencyCode()).thenReturn(CURRENCY_CODE); when(loanChargeAssembler.createNewFromJson(loan, chargeDefinition, jsonCommand)).thenReturn(loanCharge); - when(loan.repaymentScheduleDetail()).thenReturn(loanRepaymentScheduleDetail); + when(loan.getLoanProductRelatedDetail()).thenReturn(loanRepaymentScheduleDetail); when(loanRepaymentScheduleDetail.getLoanScheduleType()).thenReturn(LoanScheduleType.CUMULATIVE); when(loan.getLoanRepaymentScheduleDetail()).thenReturn(loanRepaymentScheduleDetail); when(loan.hasCurrencyCodeOf(CURRENCY_CODE)).thenReturn(true); diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java index 231e1bad3..4b71bb82c 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java @@ -162,7 +162,7 @@ public class LoanDownPaymentHandlerServiceImplTest { when(loanRepaymentRelatedDetail.getInstallmentAmountInMultiplesOf()).thenReturn(10); when(loanForProcessing.getLoanRepaymentScheduleDetail()).thenReturn(loanRepaymentRelatedDetail); - when(loanForProcessing.repaymentScheduleDetail()).thenReturn(loanRepaymentRelatedDetail); + when(loanForProcessing.getLoanProductRelatedDetail()).thenReturn(loanRepaymentRelatedDetail); when(loanRepaymentRelatedDetail.isInterestRecalculationEnabled()).thenReturn(true); when(loanForProcessing.isInterestBearingAndInterestRecalculationEnabled()).thenReturn(true); when(loanRepaymentRelatedDetail.getDisbursedAmountPercentageForDownPayment()).thenReturn(BigDecimal.valueOf(10));