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)

Reply via email to