FINERACT-2181: Add missing swagger definition for addAndDeleteDisbursementDetail request

This commit is contained in:
adam.magyari
2025-05-13 09:39:42 +02:00
committed by Adam Saghy
parent 8488918b3b
commit e7b6722e54
5 changed files with 77 additions and 8 deletions
@@ -1162,7 +1162,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom<Long> {
boolean isInRightStatus = actualLoanStatus.isActive() || actualLoanStatus.isApproved() || actualLoanStatus.isClosedObligationsMet() boolean isInRightStatus = actualLoanStatus.isActive() || actualLoanStatus.isApproved() || actualLoanStatus.isClosedObligationsMet()
|| actualLoanStatus.isOverpaid(); || actualLoanStatus.isOverpaid();
boolean notDisbursedTrancheExists = loanProduct.isDisallowExpectedDisbursements() 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; return this.loanProduct.isMultiDisburseLoan() && isInRightStatus && isDisbursementAllowed() && notDisbursedTrancheExists;
} }
@@ -18,6 +18,9 @@
*/ */
package org.apache.fineract.portfolio.loanaccount.api; 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 io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.ws.rs.Consumes; import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET; import jakarta.ws.rs.GET;
@@ -80,6 +83,7 @@ public class LoanDisbursementDetailApiResource {
@Path("editDisbursements") @Path("editDisbursements")
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ 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) { public String addAndDeleteDisbursementDetail(@PathParam("loanId") final Long loanId, final String apiRequestBodyAsJson) {
CommandWrapper commandRequest = new CommandWrapperBuilder().addAndDeleteDisbursementDetails(loanId).withJson(apiRequestBodyAsJson) CommandWrapper commandRequest = new CommandWrapperBuilder().addAndDeleteDisbursementDetails(loanId).withJson(apiRequestBodyAsJson)
@@ -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;
}
}
@@ -20,9 +20,9 @@ package org.apache.fineract.integrationtests;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicReference; 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.GetLoansLoanIdDisbursementDetails;
import org.apache.fineract.client.models.GetLoansLoanIdResponse; import org.apache.fineract.client.models.GetLoansLoanIdResponse;
import org.apache.fineract.client.models.PostClientsResponse; import org.apache.fineract.client.models.PostClientsResponse;
@@ -64,15 +64,14 @@ public class ProgressiveLoanTrancheTest extends BaseLoanIntegrationTest {
final GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId); final GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
List<HashMap> tranches = new ArrayList<>(); ArrayList<DisbursementDetail> disbursementDetails = new ArrayList<>();
for (GetLoansLoanIdDisbursementDetails disbursementDetail : loanDetails.getDisbursementDetails()) { for (GetLoansLoanIdDisbursementDetails disbursementDetail : loanDetails.getDisbursementDetails()) {
tranches.add(loanTransactionHelper.createTrancheDetail(disbursementDetail.getId().toString(), disbursementDetails.add(new DisbursementDetail().id(disbursementDetail.getId()).principal(disbursementDetail.getPrincipal())
dateTimeFormatter.format(disbursementDetail.getExpectedDisbursementDate()), .expectedDisbursementDate(dateTimeFormatter.format(disbursementDetail.getExpectedDisbursementDate())));
disbursementDetail.getPrincipal().toString()));
} }
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"); disburseLoan(loanId, BigDecimal.valueOf(100), "20 January 2025");
}); });
@@ -47,6 +47,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.fineract.client.models.AdvancedPaymentData; import org.apache.fineract.client.models.AdvancedPaymentData;
import org.apache.fineract.client.models.DeleteLoansLoanIdChargesChargeIdResponse; import org.apache.fineract.client.models.DeleteLoansLoanIdChargesChargeIdResponse;
import org.apache.fineract.client.models.DeleteLoansLoanIdResponse; 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.GetDelinquencyActionsResponse;
import org.apache.fineract.client.models.GetDelinquencyTagHistoryResponse; import org.apache.fineract.client.models.GetDelinquencyTagHistoryResponse;
import org.apache.fineract.client.models.GetLoanProductsProductIdResponse; 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.GetLoansLoanIdTransactionsTransactionIdResponse;
import org.apache.fineract.client.models.GetLoansResponse; import org.apache.fineract.client.models.GetLoansResponse;
import org.apache.fineract.client.models.PaymentTypeData; 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.PostLoanProductsRequest;
import org.apache.fineract.client.models.PostLoanProductsResponse; import org.apache.fineract.client.models.PostLoanProductsResponse;
import org.apache.fineract.client.models.PostLoansDelinquencyActionRequest; import org.apache.fineract.client.models.PostLoansDelinquencyActionRequest;
@@ -2483,6 +2485,15 @@ public class LoanTransactionHelper {
getAddAndDeleteDisbursementsAsJSON(approvalAmount, expectedDisbursementDate, disbursementData), jsonAttributeToGetBack); 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! // TODO: Rewrite to use fineract-client instead!
// Example: org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long, // Example: org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long,
// org.apache.fineract.client.models.PostLoansLoanIdRequest) // org.apache.fineract.client.models.PostLoansLoanIdRequest)