This is an automated email from the ASF dual-hosted git repository. adamsaghy pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/fineract.git
commit e7b6722e543528496a74d9c758f01da14bcd7efa Author: adam.magyari <[email protected]> AuthorDate: Wed May 7 17:26:51 2025 +0200 FINERACT-2181: Add missing swagger definition for addAndDeleteDisbursementDetail request --- .../portfolio/loanaccount/domain/Loan.java | 2 +- .../api/LoanDisbursementDetailApiResource.java | 4 ++ .../LoanDisbursementDetailApiResourceSwagger.java | 55 ++++++++++++++++++++++ .../ProgressiveLoanTrancheTest.java | 13 +++-- .../common/loans/LoanTransactionHelper.java | 11 +++++ 5 files changed, 77 insertions(+), 8 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 74ee83eb8a..47b4bb5b17 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 @@ -1162,7 +1162,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom<Long> { boolean isInRightStatus = actualLoanStatus.isActive() || actualLoanStatus.isApproved() || actualLoanStatus.isClosedObligationsMet() || actualLoanStatus.isOverpaid(); boolean notDisbursedTrancheExists = loanProduct.isDisallowExpectedDisbursements() - || disbursementDetails.stream().anyMatch(it -> it.actualDisbursementDate() == null); + || disbursementDetails.stream().anyMatch(it -> it.actualDisbursementDate() == null && !it.isReversed()); return this.loanProduct.isMultiDisburseLoan() && isInRightStatus && isDisbursementAllowed() && notDisbursedTrancheExists; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java index 306abb2cd8..7dd270f9ff 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java @@ -18,6 +18,9 @@ */ package org.apache.fineract.portfolio.loanaccount.api; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.GET; @@ -80,6 +83,7 @@ public class LoanDisbursementDetailApiResource { @Path("editDisbursements") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) + @RequestBody(required = true, content = @Content(schema = @Schema(implementation = LoanDisbursementDetailApiResourceSwagger.PostAddAndDeleteDisbursementDetailRequest.class))) public String addAndDeleteDisbursementDetail(@PathParam("loanId") final Long loanId, final String apiRequestBodyAsJson) { CommandWrapper commandRequest = new CommandWrapperBuilder().addAndDeleteDisbursementDetails(loanId).withJson(apiRequestBodyAsJson) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResourceSwagger.java new file mode 100644 index 0000000000..93d3e986af --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResourceSwagger.java @@ -0,0 +1,55 @@ +/** + * 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.media.Schema; +import java.util.List; + +public final class LoanDisbursementDetailApiResourceSwagger { + + private LoanDisbursementDetailApiResourceSwagger() {} + + @Schema(description = "PostAddAndDeleteDisbursementDetailRequest") + public static final class PostAddAndDeleteDisbursementDetailRequest { + + private PostAddAndDeleteDisbursementDetailRequest() {} + + @Schema(example = "dd MMMM yyyy") + public String dateFormat; + @Schema(example = "de_DE") + public String locale; + @Schema(example = "1000") + public Double approvedLoanAmount; + + public List<DisbursementDetail> disbursementData; + + } + + public static final class DisbursementDetail { + + private DisbursementDetail() {} + + @Schema(example = "1") + public Long id; + @Schema(example = "1 January 2024") + public String expectedDisbursementDate; + @Schema(example = "100") + public Double principal; + } +} diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ProgressiveLoanTrancheTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ProgressiveLoanTrancheTest.java index 029fe4706b..3ea51ae45d 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ProgressiveLoanTrancheTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ProgressiveLoanTrancheTest.java @@ -20,9 +20,9 @@ package org.apache.fineract.integrationtests; import java.math.BigDecimal; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicReference; +import org.apache.fineract.client.models.DisbursementDetail; import org.apache.fineract.client.models.GetLoansLoanIdDisbursementDetails; import org.apache.fineract.client.models.GetLoansLoanIdResponse; import org.apache.fineract.client.models.PostClientsResponse; @@ -64,15 +64,14 @@ public class ProgressiveLoanTrancheTest extends BaseLoanIntegrationTest { final GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId); - List<HashMap> tranches = new ArrayList<>(); + ArrayList<DisbursementDetail> disbursementDetails = new ArrayList<>(); for (GetLoansLoanIdDisbursementDetails disbursementDetail : loanDetails.getDisbursementDetails()) { - tranches.add(loanTransactionHelper.createTrancheDetail(disbursementDetail.getId().toString(), - dateTimeFormatter.format(disbursementDetail.getExpectedDisbursementDate()), - disbursementDetail.getPrincipal().toString())); + disbursementDetails.add(new DisbursementDetail().id(disbursementDetail.getId()).principal(disbursementDetail.getPrincipal()) + .expectedDisbursementDate(dateTimeFormatter.format(disbursementDetail.getExpectedDisbursementDate()))); } - tranches.add(loanTransactionHelper.createTrancheDetail(null, "20 January 2025", "100")); + disbursementDetails.add(new DisbursementDetail().expectedDisbursementDate("20 January 2025").principal(100.0)); - loanTransactionHelper.addAndDeleteDisbursementDetail(loanId.intValue(), "500", "20 December 2024", tranches, ""); + loanTransactionHelper.addAndDeleteDisbursementDetail(loanId, disbursementDetails); disburseLoan(loanId, BigDecimal.valueOf(100), "20 January 2025"); }); 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 cd0fb38cb8..5db5dc9a1a 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 @@ -47,6 +47,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.client.models.AdvancedPaymentData; import org.apache.fineract.client.models.DeleteLoansLoanIdChargesChargeIdResponse; import org.apache.fineract.client.models.DeleteLoansLoanIdResponse; +import org.apache.fineract.client.models.DisbursementDetail; import org.apache.fineract.client.models.GetDelinquencyActionsResponse; import org.apache.fineract.client.models.GetDelinquencyTagHistoryResponse; import org.apache.fineract.client.models.GetLoanProductsProductIdResponse; @@ -66,6 +67,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.PaymentTypeData; +import org.apache.fineract.client.models.PostAddAndDeleteDisbursementDetailRequest; import org.apache.fineract.client.models.PostLoanProductsRequest; import org.apache.fineract.client.models.PostLoanProductsResponse; import org.apache.fineract.client.models.PostLoansDelinquencyActionRequest; @@ -2483,6 +2485,15 @@ public class LoanTransactionHelper { getAddAndDeleteDisbursementsAsJSON(approvalAmount, expectedDisbursementDate, disbursementData), jsonAttributeToGetBack); } + public String addAndDeleteDisbursementDetail(final Long loanId, PostAddAndDeleteDisbursementDetailRequest request) { + return Calls.ok(FineractClientHelper.getFineractClient().loanDisbursementDetails.addAndDeleteDisbursementDetail(loanId, request)); + } + + public String addAndDeleteDisbursementDetail(final Long loanId, final List<DisbursementDetail> disbursementDetails) { + return addAndDeleteDisbursementDetail(loanId, new PostAddAndDeleteDisbursementDetailRequest().locale("en") + .dateFormat("dd MMMM yyyy").disbursementData(disbursementDetails)); + } + // 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)
