From 84f7c9218f28ecccd85df535a31a68929998f655 Mon Sep 17 00:00:00 2001 From: Jose Alberto Hernandez Date: Tue, 15 Jul 2025 08:11:23 -0500 Subject: [PATCH] FINERACT-2232: Capitalized Income - Fetch amortization details --- .../fineract/client/util/FineractClient.java | 3 + .../loanaccount/domain/LoanRepository.java | 3 + .../domain/LoanRepositoryWrapper.java | 4 ++ .../api/LoanDeferredIncomeApiResource.java | 59 +++++++++++++++++ .../data/CapitalizedIncomeDetails.java | 38 +++++++++++ .../data/LoanDeferredIncomeData.java | 36 ++++++++++ .../CapitalizedIncomeBalanceReadService.java | 27 ++++++++ ...pitalizedIncomeBalanceReadServiceImpl.java | 65 +++++++++++++++++++ .../ProgressiveLoanAccountConfiguration.java | 9 +++ .../LoanCapitalizedIncomeTest.java | 23 +++++++ .../common/loans/LoanTransactionHelper.java | 5 ++ 11 files changed, 272 insertions(+) create mode 100644 fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDeferredIncomeApiResource.java create mode 100644 fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/CapitalizedIncomeDetails.java create mode 100644 fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanDeferredIncomeData.java create mode 100644 fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadService.java create mode 100644 fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadServiceImpl.java diff --git a/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java b/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java index 6465a0a41..307304dfd 100644 --- a/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java +++ b/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java @@ -88,6 +88,7 @@ import org.apache.fineract.client.services.LoanAccountLockApi; import org.apache.fineract.client.services.LoanChargesApi; import org.apache.fineract.client.services.LoanCobCatchUpApi; import org.apache.fineract.client.services.LoanCollateralApi; +import org.apache.fineract.client.services.LoanDeferredIncomeDataApi; import org.apache.fineract.client.services.LoanDisbursementDetailsApi; import org.apache.fineract.client.services.LoanInterestPauseApi; import org.apache.fineract.client.services.LoanProductsApi; @@ -230,6 +231,7 @@ public final class FineractClient { public final LoanChargesApi loanCharges; public final LoanCobCatchUpApi loanCobCatchUpApi; public final LoanCollateralApi loanCollaterals; + public final LoanDeferredIncomeDataApi loanDeferredIncome; public final LoanProductsApi loanProducts; public final LoanReschedulingApi loanSchedules; public final LoansPointInTimeApi loansPointInTimeApi; @@ -359,6 +361,7 @@ public final class FineractClient { loanCharges = retrofit.create(LoanChargesApi.class); loanCobCatchUpApi = retrofit.create(LoanCobCatchUpApi.class); loanCollaterals = retrofit.create(LoanCollateralApi.class); + loanDeferredIncome = retrofit.create(LoanDeferredIncomeDataApi.class); loanProducts = retrofit.create(LoanProductsApi.class); loanSchedules = retrofit.create(LoanReschedulingApi.class); loansPointInTimeApi = retrofit.create(LoansPointInTimeApi.class); diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java index 7e0a3afd2..a4bfa9ed4 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java @@ -268,4 +268,7 @@ public interface LoanRepository extends JpaRepository, JpaSpecificat @Query(FIND_LOAN_BY_EXTERNAL_ID) Optional findByExternalId(@Param("externalId") ExternalId externalId); + + @Query("select loan.loanRepaymentScheduleDetail.enableIncomeCapitalization from Loan loan where loan.id = :loanId") + Boolean isEnabledCapitalizedIncome(Long loanId); } diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java index b00ecca58..7943c9571 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java @@ -309,4 +309,8 @@ public class LoanRepositoryWrapper { public boolean existsByLoanId(Long loanId) { return repository.existsById(loanId); } + + public boolean isEnabledCapitalizedIncome(Long loanId) { + return repository.isEnabledCapitalizedIncome(loanId); + } } diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDeferredIncomeApiResource.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDeferredIncomeApiResource.java new file mode 100644 index 000000000..4feb7aa59 --- /dev/null +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDeferredIncomeApiResource.java @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.loanaccount.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.UriInfo; +import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.portfolio.loanaccount.data.LoanDeferredIncomeData; +import org.apache.fineract.portfolio.loanaccount.service.CapitalizedIncomeBalanceReadService; +import org.springframework.stereotype.Component; + +@Path("/v1/loans/{loanId}/deferredincome") +@Component +@Tag(name = "Loan Deferred Income data", description = "Loan deferred income like Capitalized Income to fetch the Deferred Income related informations") +@RequiredArgsConstructor +public class LoanDeferredIncomeApiResource { + + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "LOAN"; + private final PlatformSecurityContext context; + private final CapitalizedIncomeBalanceReadService capitalizedIncomeBalanceReadService; + + @GET + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + @Operation(summary = "Fetch the Capitalized Income related informations") + public LoanDeferredIncomeData fetchDeferredIncomeDetails(@PathParam("loanId") @Parameter(description = "loanId") final Long loanId, + @Context final UriInfo uriInfo) { + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); + + return capitalizedIncomeBalanceReadService.fetchLoanDeferredIncomeData(loanId); + } + +} diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/CapitalizedIncomeDetails.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/CapitalizedIncomeDetails.java new file mode 100644 index 000000000..1fabf897e --- /dev/null +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/CapitalizedIncomeDetails.java @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.loanaccount.data; + +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@AllArgsConstructor +@ToString +@Getter +@Setter +public class CapitalizedIncomeDetails { + + private BigDecimal amount; + private BigDecimal amortizedAmount; + private BigDecimal unrecognizedAmount; + private BigDecimal amountAdjustment; + private BigDecimal chargedOffAmount; +} diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanDeferredIncomeData.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanDeferredIncomeData.java new file mode 100644 index 000000000..393f1cf83 --- /dev/null +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanDeferredIncomeData.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.loanaccount.data; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@AllArgsConstructor +@NoArgsConstructor +@ToString +@Getter +@Setter +public class LoanDeferredIncomeData { + + private List capitalizedIncomeData; +} diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadService.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadService.java new file mode 100644 index 000000000..fbfe6ec28 --- /dev/null +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadService.java @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.loanaccount.service; + +import org.apache.fineract.portfolio.loanaccount.data.LoanDeferredIncomeData; + +public interface CapitalizedIncomeBalanceReadService { + + LoanDeferredIncomeData fetchLoanDeferredIncomeData(Long loanId); + +} diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadServiceImpl.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadServiceImpl.java new file mode 100644 index 000000000..a0fd975a9 --- /dev/null +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeBalanceReadServiceImpl.java @@ -0,0 +1,65 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.loanaccount.service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; +import org.apache.fineract.infrastructure.core.service.MathUtil; +import org.apache.fineract.portfolio.loanaccount.data.CapitalizedIncomeDetails; +import org.apache.fineract.portfolio.loanaccount.data.LoanDeferredIncomeData; +import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeBalance; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; +import org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +public class CapitalizedIncomeBalanceReadServiceImpl implements CapitalizedIncomeBalanceReadService { + + private final LoanRepositoryWrapper loanRepository; + private final LoanCapitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository; + + @Override + @Transactional + public LoanDeferredIncomeData fetchLoanDeferredIncomeData(final Long loanId) { + if (loanRepository.isEnabledCapitalizedIncome(loanId)) { + + List capitalizedIncomeData = new ArrayList<>(); + List capitalizedIncomeBalances = capitalizedIncomeBalanceRepository.findAllByLoanId(loanId); + for (final LoanCapitalizedIncomeBalance capitalizedIncomeBalance : capitalizedIncomeBalances) { + final BigDecimal amortizedAmount = capitalizedIncomeBalance.getAmount() // + .subtract(MathUtil.nullToZero(capitalizedIncomeBalance.getUnrecognizedAmount())) // + .subtract(MathUtil.nullToZero(capitalizedIncomeBalance.getAmountAdjustment())) // + .subtract(MathUtil.nullToZero(capitalizedIncomeBalance.getChargedOffAmount())); + + capitalizedIncomeData.add(new CapitalizedIncomeDetails(capitalizedIncomeBalance.getAmount(), amortizedAmount, + capitalizedIncomeBalance.getUnrecognizedAmount(), // + capitalizedIncomeBalance.getAmountAdjustment(), // + capitalizedIncomeBalance.getChargedOffAmount())); + } + + return new LoanDeferredIncomeData(capitalizedIncomeData); + } + throw new GeneralPlatformDomainRuleException("error.msg.loan.is.not.enabled.capitalized.income", + "Loan: " + loanId + " is not enabled Capitalized Income feature", loanId); + } + +} diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java index e0e44f49b..ff73f069d 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java @@ -27,6 +27,8 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepositor import org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeeBalanceRepository; import org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository; import org.apache.fineract.portfolio.loanaccount.serialization.LoanTransactionValidator; +import org.apache.fineract.portfolio.loanaccount.service.CapitalizedIncomeBalanceReadService; +import org.apache.fineract.portfolio.loanaccount.service.CapitalizedIncomeBalanceReadServiceImpl; import org.apache.fineract.portfolio.loanaccount.service.CapitalizedIncomeBalanceService; import org.apache.fineract.portfolio.loanaccount.service.CapitalizedIncomeBalanceServiceImpl; import org.apache.fineract.portfolio.loanaccount.service.CapitalizedIncomePlatformService; @@ -77,4 +79,11 @@ public class ProgressiveLoanAccountConfiguration { LoanCapitalizedIncomeBalanceRepository loanCapitalizedIncomeBalanceRepository) { return new CapitalizedIncomeBalanceServiceImpl(loanCapitalizedIncomeBalanceRepository); } + + @Bean + @ConditionalOnMissingBean(CapitalizedIncomeBalanceReadService.class) + public CapitalizedIncomeBalanceReadService capitalizedIncomeBalanceReadService(LoanRepositoryWrapper loanRepository, + LoanCapitalizedIncomeBalanceRepository loanCapitalizedIncomeBalanceRepository) { + return new CapitalizedIncomeBalanceReadServiceImpl(loanRepository, loanCapitalizedIncomeBalanceRepository); + } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java index 162fb7530..a0ef86715 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java @@ -18,6 +18,7 @@ */ package org.apache.fineract.integrationtests; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -26,8 +27,10 @@ import java.math.RoundingMode; import java.time.LocalDate; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; +import org.apache.fineract.client.models.CapitalizedIncomeDetails; import org.apache.fineract.client.models.GetLoansLoanIdResponse; import org.apache.fineract.client.models.GetLoansLoanIdTransactions; +import org.apache.fineract.client.models.LoanDeferredIncomeData; import org.apache.fineract.client.models.PostClientsResponse; import org.apache.fineract.client.models.PostLoanProductsRequest; import org.apache.fineract.client.models.PostLoanProductsResponse; @@ -37,6 +40,7 @@ import org.apache.fineract.client.models.PostLoansResponse; import org.apache.fineract.client.util.CallFailedRuntimeException; import org.apache.fineract.integrationtests.common.BusinessStepHelper; import org.apache.fineract.integrationtests.common.ClientHelper; +import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.externalevents.LoanAdjustTransactionBusinessEvent; import org.apache.fineract.integrationtests.common.externalevents.LoanBusinessEvent; import org.apache.fineract.integrationtests.common.externalevents.LoanTransactionBusinessEvent; @@ -85,6 +89,12 @@ public class LoanCapitalizedIncomeTest extends BaseLoanIntegrationTest { transaction(50.0, "Capitalized Income", "01 January 2024"), // transaction(0.55, "Capitalized Income Amortization", "01 January 2024") // ); + final LoanDeferredIncomeData loanDeferredIncomeData = loanTransactionHelper.fetchDeferredIncomeDetails(loanId); + assertTrue(loanDeferredIncomeData.getCapitalizedIncomeData().size() > 0); + final CapitalizedIncomeDetails capitalizedIncomeData = loanDeferredIncomeData.getCapitalizedIncomeData().get(0); + assertNotNull(capitalizedIncomeData); + assertEquals(50.0, Utils.getDoubleValue(capitalizedIncomeData.getAmount())); + assertEquals(0.55, Utils.getDoubleValue(capitalizedIncomeData.getAmortizedAmount())); }); runAt("3 January 2024", () -> { Long loanId = loanIdRef.get(); @@ -97,6 +107,13 @@ public class LoanCapitalizedIncomeTest extends BaseLoanIntegrationTest { transaction(0.03, "Accrual", "02 January 2024"), // transaction(0.55, "Capitalized Income Amortization", "02 January 2024") // ); + final LoanDeferredIncomeData loanDeferredIncomeData = loanTransactionHelper.fetchDeferredIncomeDetails(loanId); + assertTrue(loanDeferredIncomeData.getCapitalizedIncomeData().size() > 0); + final CapitalizedIncomeDetails capitalizedIncomeData = loanDeferredIncomeData.getCapitalizedIncomeData().get(0); + assertNotNull(capitalizedIncomeData); + assertEquals(50.0, Utils.getDoubleValue(capitalizedIncomeData.getAmount())); + assertEquals(1.1, Utils.getDoubleValue(capitalizedIncomeData.getAmortizedAmount())); + assertEquals(48.90, Utils.getDoubleValue(capitalizedIncomeData.getUnrecognizedAmount())); verifyJournalEntries(loanId, // journalEntry(100, loansReceivableAccount, "DEBIT"), // @@ -181,6 +198,12 @@ public class LoanCapitalizedIncomeTest extends BaseLoanIntegrationTest { transaction(50.0, "Capitalized Income", "01 January 2024"), // transaction(50.0, "Capitalized Income Adjustment", "01 April 2024") // ); + final LoanDeferredIncomeData loanDeferredIncomeData = loanTransactionHelper.fetchDeferredIncomeDetails(loanId); + assertTrue(loanDeferredIncomeData.getCapitalizedIncomeData().size() > 0); + final CapitalizedIncomeDetails capitalizedIncomeData = loanDeferredIncomeData.getCapitalizedIncomeData().get(0); + assertNotNull(capitalizedIncomeData); + assertEquals(50.0, Utils.getDoubleValue(capitalizedIncomeData.getAmount())); + assertEquals(50.0, Utils.getDoubleValue(capitalizedIncomeData.getAmountAdjustment())); verifyJournalEntries(loanId, // journalEntry(100, loansReceivableAccount, "DEBIT"), // diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java index 96ac70a24..d26ce5458 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java @@ -68,6 +68,7 @@ import org.apache.fineract.client.models.GetLoansLoanIdTransactionsTemplateRespo import org.apache.fineract.client.models.GetLoansLoanIdTransactionsTransactionIdResponse; import org.apache.fineract.client.models.GetLoansResponse; import org.apache.fineract.client.models.InterestPauseRequestDto; +import org.apache.fineract.client.models.LoanDeferredIncomeData; import org.apache.fineract.client.models.PaymentTypeData; import org.apache.fineract.client.models.PostAddAndDeleteDisbursementDetailRequest; import org.apache.fineract.client.models.PostLoanProductsRequest; @@ -3046,6 +3047,10 @@ public class LoanTransactionHelper { .ok(FineractClientHelper.getFineractClient().loanTransactions.executeLoanTransaction(loanId, request, "undo-charge-off")); } + public LoanDeferredIncomeData fetchDeferredIncomeDetails(Long loanId) { + return Calls.ok(FineractClientHelper.getFineractClient().loanDeferredIncome.fetchDeferredIncomeDetails(loanId)); + } + // TODO: Rewrite to use fineract-client instead! // Example: org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long, // org.apache.fineract.client.models.PostLoansLoanIdRequest)