From fd45f43f3685cbb4d7d2d88cd5b25295d0baa2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?CsengeS=C3=B3ti?= Date: Tue, 22 Apr 2025 18:03:07 +0200 Subject: [PATCH] FINERACT-2235: fix loan list assotiations flag for loans without summary --- .../loanaccount/api/LoansApiResource.java | 26 ++++---- .../loan/LoanApiIntegrationTest.java | 65 +++++++++++++++++++ 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java index 6e3a24403..04dde0975 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java @@ -495,18 +495,20 @@ public class LoansApiResource { final Set associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters()); if (associationParameters.contains(DataTableApiConstant.summaryAssociateParamName)) { loanBasicDetails.getPageItems().forEach(i -> { - Collection disbursementData = this.loanReadPlatformService.retrieveLoanDisbursementDetails(i.getId()); - final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData( - i.getTimeline().getExpectedDisbursementDate(), i.getTimeline().getActualDisbursementDate(), i.getCurrency(), - i.getPrincipal(), i.getInArrearsTolerance(), i.getFeeChargesAtDisbursementCharged()); - final LoanScheduleData repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(i.getId(), - repaymentScheduleRelatedData, disbursementData, i.isInterestRecalculationEnabled(), - LoanScheduleType.fromEnumOptionData(i.getLoanScheduleType())); - LoanSummaryDataProvider loanSummaryDataProvider = loanSummaryProviderDelegate - .resolveLoanSummaryDataProvider(i.getTransactionProcessingStrategyCode()); - i.setSummary(loanSummaryDataProvider.withTransactionAmountsSummary(i.getId(), i.getSummary(), repaymentSchedule, - loanSummaryBalancesRepository.retrieveLoanSummaryBalancesByTransactionType(i.getId(), - LoanApiConstants.LOAN_SUMMARY_TRANSACTION_TYPES))); + if (i.getSummary() != null) { + Collection disbursementData = this.loanReadPlatformService.retrieveLoanDisbursementDetails(i.getId()); + final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData( + i.getTimeline().getExpectedDisbursementDate(), i.getTimeline().getActualDisbursementDate(), i.getCurrency(), + i.getPrincipal(), i.getInArrearsTolerance(), i.getFeeChargesAtDisbursementCharged()); + final LoanScheduleData repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(i.getId(), + repaymentScheduleRelatedData, disbursementData, i.isInterestRecalculationEnabled(), + LoanScheduleType.fromEnumOptionData(i.getLoanScheduleType())); + LoanSummaryDataProvider loanSummaryDataProvider = loanSummaryProviderDelegate + .resolveLoanSummaryDataProvider(i.getTransactionProcessingStrategyCode()); + i.setSummary(loanSummaryDataProvider.withTransactionAmountsSummary(i.getId(), i.getSummary(), repaymentSchedule, + loanSummaryBalancesRepository.retrieveLoanSummaryBalancesByTransactionType(i.getId(), + LoanApiConstants.LOAN_SUMMARY_TRANSACTION_TYPES))); + } }); } final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/LoanApiIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/LoanApiIntegrationTest.java index 6724346b7..60c25468a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/LoanApiIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/LoanApiIntegrationTest.java @@ -213,4 +213,69 @@ public class LoanApiIntegrationTest extends BaseLoanIntegrationTest { assertThat(totalUnpaidPayableDueInterest).isEqualByComparingTo(BigDecimal.valueOf(509.59)); }); } + + @Test + public void test_retrieveLoansWithSummaryWithoutDisbursement_Works() { + AtomicLong createdLoanId = new AtomicLong(); + + runAt("01 January 2023", () -> { + // Create Client + Long clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId(); + + int numberOfRepayments = 3; + int repaymentEvery = 1; + + // Create Loan Product + PostLoanProductsRequest product = createOnePeriod30DaysLongNoInterestPeriodicAccrualProduct() // + .numberOfRepayments(numberOfRepayments) // + .repaymentEvery(repaymentEvery) // + .installmentAmountInMultiplesOf(null) // + .repaymentFrequencyType(RepaymentFrequencyType.MONTHS.longValue()) // + .interestType(InterestType.DECLINING_BALANCE)// + .interestRatePerPeriod(10.0)// + .interestCalculationPeriodType(InterestCalculationPeriodType.DAILY)// + .interestRecalculationCompoundingMethod(InterestRecalculationCompoundingMethod.NONE)// + .rescheduleStrategyMethod(RescheduleStrategyMethod.ADJUST_LAST_UNPAID_PERIOD)// + .isInterestRecalculationEnabled(true)// + .recalculationRestFrequencyInterval(1)// + .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY)// + .rescheduleStrategyMethod(RescheduleStrategyMethod.REDUCE_EMI_AMOUNT)// + .allowPartialPeriodInterestCalcualtion(false)// + .disallowExpectedDisbursements(false)// + .allowApprovedDisbursedAmountsOverApplied(false)// + .overAppliedNumber(null)// + .overAppliedCalculationType(null)// + .multiDisburseLoan(null);// + + PostLoanProductsResponse loanProductResponse = loanProductHelper.createLoanProduct(product); + Long loanProductId = loanProductResponse.getResourceId(); + + // Apply and Approve Loan + double amount = 5000.0; + + PostLoansRequest applicationRequest = applyLoanRequest(clientId, loanProductId, "01 January 2023", amount, numberOfRepayments)// + .repaymentEvery(repaymentEvery)// + .interestRatePerPeriod(BigDecimal.valueOf(10.0))// + .loanTermFrequency(numberOfRepayments)// + .repaymentFrequencyType(RepaymentFrequencyType.MONTHS)// + .loanTermFrequencyType(RepaymentFrequencyType.MONTHS)// + .interestType(InterestType.DECLINING_BALANCE)// + .interestCalculationPeriodType(InterestCalculationPeriodType.DAILY);// + + PostLoansResponse postLoansResponse = loanTransactionHelper.applyLoan(applicationRequest); + + PostLoansLoanIdResponse approvedLoanResult = loanTransactionHelper.approveLoan(postLoansResponse.getResourceId(), + approveLoanRequest(amount, "01 January 2023")); + + Long loanId = approvedLoanResult.getLoanId(); + createdLoanId.getAndSet(loanId); + }); + runAt("01 February 2023", () -> { + long loanId = createdLoanId.get(); + GetLoansLoanIdResponse loanResponse = loanTransactionHelper.getLoanDetails(loanId); + GetLoansResponse loansLoanIdResponse = loanTransactionHelper.retrieveAllLoans(loanResponse.getAccountNo(), "summary", null); + assertThat(loansLoanIdResponse.getPageItems()).isNotNull(); + assertThat(loansLoanIdResponse.getPageItems().iterator().next().getSummary()).isNull(); + }); + } }