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


The following commit(s) were added to refs/heads/develop by this push:
     new 9eb94dd7ef FINERACT-2455: added e2e tests for WCPL config with 
validation check
9eb94dd7ef is described below

commit 9eb94dd7ef34c39212b6322d45b8f9838095e1f1
Author: MarianaDmytrivBinariks <[email protected]>
AuthorDate: Wed Mar 4 18:04:11 2026 +0200

    FINERACT-2455: added e2e tests for WCPL config with validation check
---
 .../DefaultWorkingCapitalLoanProduct.java          |   3 +-
 .../WorkingCapitalLoanProductRequestFactory.java   |  70 --
 .../test/factory/WorkingCapitalRequestFactory.java | 159 ++++
 .../fineract/test/helper/ErrorMessageHelper.java   |  29 +
 .../org/apache/fineract/test/helper/Utils.java     |   4 +
 .../test/stepdef/loan/WorkingCapitalStepDef.java   | 808 +++++++++++++++++++++
 .../fineract/test/support/TestContextKey.java      |   6 +
 ...tep.java => WorkingCapitalInitializerStep.java} |  40 +-
 .../features/WorkingCapitalLoanProduct.feature     | 135 ++++
 ...orkingCapitalLoanProductApiResourceSwagger.java |   2 +
 10 files changed, 1159 insertions(+), 97 deletions(-)

diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
index 6cf76bcf00..bb35365fc0 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
@@ -20,7 +20,8 @@ package org.apache.fineract.test.data.workingcapitalproduct;
 
 public enum DefaultWorkingCapitalLoanProduct implements 
WorkingCapitalLoanProduct {
 
-    WCLP; //
+    WCLP, //
+    WCLP_FOR_UPDATE; //
 
     @Override
     public String getName() {
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalLoanProductRequestFactory.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalLoanProductRequestFactory.java
deleted file mode 100644
index da33587441..0000000000
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalLoanProductRequestFactory.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * 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.test.factory;
-
-import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.CURRENCY_CODE;
-import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DATE_FORMAT;
-import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_MONTH_TYPE_30;
-import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_YEAR_TYPE_360;
-import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DELINQUENCY_BUCKET_ID;
-import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.FUND_ID;
-import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.LOCALE_EN;
-
-import java.math.BigDecimal;
-import lombok.RequiredArgsConstructor;
-import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
-import org.apache.fineract.test.helper.Utils;
-import org.springframework.stereotype.Component;
-
-@Component
-@RequiredArgsConstructor
-public class WorkingCapitalLoanProductRequestFactory {
-
-    private final LoanProductsRequestFactory loanProductsRequestFactory;
-
-    public static final String WCLP_NAME_PREFIX = "WCLP-";
-    public static final String WCLP_DESCRIPTION = "Working Capital Loan 
Product";
-
-    public PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductRequest() {
-        String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
-        String shortName = 
loanProductsRequestFactory.generateShortNameSafely();
-
-        return new PostWorkingCapitalLoanProductsRequest()//
-                .name(name)//
-                .shortName(shortName)//
-                .description(WCLP_DESCRIPTION)//
-                .fundId(FUND_ID)//
-                .periodPaymentRate(new BigDecimal(1))//
-                
.repaymentFrequencyType(PostWorkingCapitalLoanProductsRequest.RepaymentFrequencyTypeEnum.valueOf("DAYS"))//
-                .repaymentEvery(DAYS_IN_MONTH_TYPE_30)//
-                .startDate(null)//
-                .closeDate(null)//
-                .currencyCode(CURRENCY_CODE)//
-                .digitsAfterDecimal(2)//
-                .inMultiplesOf(0)//
-                .principal(new BigDecimal(100))//
-                .minPrincipal(new BigDecimal(10))//
-                .maxPrincipal(new BigDecimal(100000))//
-                
.amortizationType(PostWorkingCapitalLoanProductsRequest.AmortizationTypeEnum.valueOf("EIR"))//
-                .npvDayCount(DAYS_IN_YEAR_TYPE_360)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
-                .dateFormat(DATE_FORMAT)//
-                .locale(LOCALE_EN);//
-    }
-}
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java
new file mode 100644
index 0000000000..22817033af
--- /dev/null
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java
@@ -0,0 +1,159 @@
+/**
+ * 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.test.factory;
+
+import static org.apache.fineract.test.data.DaysInYearType.DAYS365;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.CURRENCY_CODE;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.CURRENCY_CODE_USD;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DATE_FORMAT;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_MONTH_TYPE_30;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_YEAR_TYPE_360;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.DELINQUENCY_BUCKET_ID;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.FUND_ID;
+import static 
org.apache.fineract.test.factory.LoanProductsRequestFactory.LOCALE_EN;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import org.apache.fineract.client.models.PaymentAllocationOrder;
+import org.apache.fineract.client.models.PostAllowAttributeOverrides;
+import org.apache.fineract.client.models.PostPaymentAllocation;
+import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
+import 
org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
+import org.apache.fineract.test.helper.Utils;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class WorkingCapitalRequestFactory {
+
+    private final LoanProductsRequestFactory loanProductsRequestFactory;
+
+    public static final String WCLP_NAME_PREFIX = "WCLP-";
+    public static final String WCLP_DESCRIPTION = "Working Capital Loan 
Product";
+    public static final String PENALTY = "PENALTY";
+    public static final String FEE = "FEE";
+    public static final String PRINCIPAL = "PRINCIPAL";
+
+    public PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductRequest() {
+        String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
+        String shortName = 
loanProductsRequestFactory.generateShortNameSafely();
+
+        return new PostWorkingCapitalLoanProductsRequest()//
+                .name(name)//
+                .shortName(shortName)//
+                .description(WCLP_DESCRIPTION)//
+                .fundId(FUND_ID)//
+                .periodPaymentRate(new BigDecimal(1))//
+                
.repaymentFrequencyType(PostWorkingCapitalLoanProductsRequest.RepaymentFrequencyTypeEnum.DAYS)//
+                .repaymentEvery(DAYS_IN_MONTH_TYPE_30)//
+                .startDate(null)//
+                .closeDate(null)//
+                .currencyCode(CURRENCY_CODE)//
+                .digitsAfterDecimal(2)//
+                .inMultiplesOf(1)//
+                .principal(new BigDecimal(100))//
+                .minPrincipal(new BigDecimal(10))//
+                .maxPrincipal(new BigDecimal(100000))//
+                
.amortizationType(PostWorkingCapitalLoanProductsRequest.AmortizationTypeEnum.EIR)//
+                .npvDayCount(DAYS_IN_YEAR_TYPE_360)//
+                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .dateFormat(DATE_FORMAT)//
+                .locale(LOCALE_EN)//
+                .paymentAllocation(List.of(//
+                        
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
+                                List.of(PENALTY, FEE, PRINCIPAL))));//
+    }
+
+    public PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductRequestUpdate() {
+        String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
+        String shortName = 
loanProductsRequestFactory.generateShortNameSafely();
+
+        PostAllowAttributeOverrides allowAttributeOverrides = new 
PostAllowAttributeOverrides().delinquencyBucketClassification(true)
+                
.discountDefault(false).flatPercentageAmount(true).periodPaymentFrequencyType(false).periodPaymentFrequency(true);
+
+        return new PutWorkingCapitalLoanProductsProductIdRequest()//
+                .name(name)//
+                .shortName(shortName)//
+                .description(WCLP_DESCRIPTION)//
+                .fundId(FUND_ID)//
+                .periodPaymentRate(new BigDecimal(1))//
+                
.repaymentFrequencyType(PutWorkingCapitalLoanProductsProductIdRequest.RepaymentFrequencyTypeEnum.MONTHS)//
+                .repaymentEvery(1)//
+                .startDate(null)//
+                .closeDate(null)//
+                .currencyCode(CURRENCY_CODE_USD)//
+                .digitsAfterDecimal(2)//
+                .inMultiplesOf(1)//
+                .principal(new BigDecimal(200))//
+                .minPrincipal(new BigDecimal(15))//
+                .maxPrincipal(new BigDecimal(300000))//
+                
.amortizationType(PutWorkingCapitalLoanProductsProductIdRequest.AmortizationTypeEnum.EIR)//
+                .npvDayCount(DAYS365.value)//
+                .delinquencyBucketId(null)//
+                .dateFormat(DATE_FORMAT)//
+                .locale(LOCALE_EN)//
+                
.allowAttributeOverrides(allowAttributeOverrides).paymentAllocation(List.of(//
+                        
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
 //
+                                List.of(FEE, PRINCIPAL, PENALTY))));//
+    }
+
+    public List<PostPaymentAllocation> 
invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest()
 {
+        return List.of(//
+                
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
 //
+                        List.of(FEE, PRINCIPAL, PENALTY, "INTEREST")));//
+    }
+
+    public List<PostPaymentAllocation> 
invalidPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest() {
+        return List.of(//
+                
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
 //
+                        List.of(FEE, PRINCIPAL, "INTEREST")));//
+    }
+
+    public List<PostPaymentAllocation> 
invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest()
 {
+        return List.of(//
+                
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
 //
+                        List.of(FEE, PRINCIPAL, PENALTY, "INTEREST")));//
+    }
+
+    public List<PostPaymentAllocation> 
invalidPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest() {
+        return List.of(//
+                
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
 //
+                        List.of(FEE, PRINCIPAL, "INTEREST")));//
+    }
+
+    public static PostPaymentAllocation createPaymentAllocation(String 
transactionType, List<String> paymentAllocationRules) {
+        PostPaymentAllocation.TransactionTypeEnum transactionTypeName = 
PostPaymentAllocation.TransactionTypeEnum.valueOf(transactionType);
+        PostPaymentAllocation paymentAllocationData = new 
PostPaymentAllocation();
+        paymentAllocationData.setTransactionType(transactionTypeName);
+
+        List<PaymentAllocationOrder> paymentAllocationOrders = new 
ArrayList<>();
+        for (int i = 0; i < paymentAllocationRules.size(); i++) {
+            PaymentAllocationOrder e = new PaymentAllocationOrder();
+            e.setOrder(i + 1);
+            e.setPaymentAllocationRule(paymentAllocationRules.get(i));
+            paymentAllocationOrders.add(e);
+        }
+
+        
paymentAllocationData.setPaymentAllocationOrder(paymentAllocationOrders);
+        return paymentAllocationData;
+    }
+
+}
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
index f9ced27a25..d689a359f2 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
@@ -1011,4 +1011,33 @@ public final class ErrorMessageHelper {
     public static String reAmortizeSameDateFailure() {
         return "Validation errors: [id] Loan reamortization can only be done 
once a day. There has already been a reamortization done for today";
     }
+
+    public static String incorrectExpectedValueInResponse() {
+        return "The parameter is not matching to expected.";
+    }
+
+    public static String fieldValueNullOrEmptyMandatoryFailure(String 
fieldName) {
+        return String.format("The parameter `%s` is mandatory.", fieldName);
+    }
+
+    public static String fieldValueMoreMaxLengthAllowedFailure(String 
fieldName, int maxAllowedLength) {
+        return String.format("The parameter `%s` exceeds max length of %d.", 
fieldName, maxAllowedLength);
+    }
+
+    public static String fieldValueZeroValueFailure(String fieldName) {
+        return String.format("The parameter `%s` must be greater than 0.", 
fieldName);
+    }
+
+    public static String paymentAllocationRulesInvalidNumberFailure(int 
actualNumberOfPaymentAllocationRules) {
+        return String.format("Each provided payment allocation must contain 
exactly 3 allocation rules, but %d were provided",
+                actualNumberOfPaymentAllocationRules);
+    }
+
+    public static String paymentAllocationRulesInvalidValueFailure() {
+        return "One or more payment allocation types are invalid or not 
recognized";
+    }
+
+    public static String 
workingCapitalLoanProductIdentifiedDoesNotExistFailure(String identifierId) {
+        return String.format("Working Capital Loan Product with identifier %s 
does not exist", identifierId);
+    }
 }
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
index 8427be5b02..5da2b2e073 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
@@ -59,6 +59,10 @@ public final class Utils {
         return randomStringGenerator(prefix, len, 
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
     }
 
+    public static String randomStringGenerator(final int len) {
+        return randomStringGenerator("", len);
+    }
+
     public static String randomFirstNameGenerator() {
         return firstNames.get(random.nextInt(firstNames.size()));
     }
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalStepDef.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalStepDef.java
new file mode 100644
index 0000000000..1590115c84
--- /dev/null
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalStepDef.java
@@ -0,0 +1,808 @@
+/**
+ * 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.test.stepdef.loan;
+
+import static org.apache.fineract.client.feign.util.FeignCalls.fail;
+import static org.apache.fineract.client.feign.util.FeignCalls.ok;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.UUID;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.client.feign.FineractFeignClient;
+import org.apache.fineract.client.feign.services.WorkingCapitalLoanProductsApi;
+import org.apache.fineract.client.feign.util.CallFailedRuntimeException;
+import 
org.apache.fineract.client.models.DeleteWorkingCapitalLoanProductsProductIdResponse;
+import org.apache.fineract.client.models.GetConfigurableAttributes;
+import org.apache.fineract.client.models.GetPaymentAllocation;
+import 
org.apache.fineract.client.models.GetWorkingCapitalLoanProductsProductIdResponse;
+import org.apache.fineract.client.models.PostAllowAttributeOverrides;
+import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
+import 
org.apache.fineract.client.models.PostWorkingCapitalLoanProductsResponse;
+import 
org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
+import 
org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdResponse;
+import 
org.apache.fineract.test.data.workingcapitalproduct.DefaultWorkingCapitalLoanProduct;
+import org.apache.fineract.test.factory.WorkingCapitalRequestFactory;
+import org.apache.fineract.test.helper.ErrorMessageHelper;
+import org.apache.fineract.test.helper.Utils;
+import org.apache.fineract.test.stepdef.AbstractStepDef;
+import org.apache.fineract.test.support.TestContext;
+import org.apache.fineract.test.support.TestContextKey;
+import org.assertj.core.api.SoftAssertions;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@Slf4j
+@RequiredArgsConstructor
+public class WorkingCapitalStepDef extends AbstractStepDef {
+
+    @Autowired
+    private WorkingCapitalRequestFactory workingCapitalRequestFactory;
+
+    private final FineractFeignClient fineractFeignClient;
+
+    public static final String NAME_FIELD_NAME = "name";
+    public static final String SHORT_NAME_FIELD = "shortName";
+    public static final String DESCRIPTION_FIELD_NAME = "description";
+    public static final String CURRENCY_CODE_FIELD_NAME = "currencyCode";
+    public static final String DIGITS_AFTER_DECIMAL_FIELD_NAME = 
"digitsAfterDecimal";
+    public static final String IN_MULTIPLES_OF_FIELD_NAME = "inMultiplesOf";
+    public static final String AMORTIZATION_TYPE_FIELD_NAME = 
"amortizationType";
+    public static final String NPV_DAY_COUNT_FIELD_NAME = "npvDayCount";
+    public static final String PRINCIPAL_FIELD_NAME = "principal";
+    public static final String MIN_PRINCIPAL_FIELD_NAME = "minPrincipal";
+    public static final String MAX_PRINCIPAL_FIELD_NAME = "maxPrincipal";
+    public static final String PERIOD_PAYMENT_RATE_FIELD_NAME = 
"periodPaymentRate";
+    public static final String MIN_PERIOD_PAYMENT_RATE_FIELD_NAME = 
"minPeriodPaymentRate";
+    public static final String MAX_PERIOD_PAYMENT_RATE_FIELD_NAME = 
"maxPeriodPaymentRate";
+    public static final String REPAYMENT_FREQUENCY_TYPE_FIELD_NAME = 
"repaymentFrequencyType";
+    public static final String REPAYMENT_EVERY_FIELD_NAME = "repaymentEvery";
+    public static final String EXTERNAL_ID_FIELD_NAME = "externalId";
+    public static final String DELINQUENCY_BUCKET_ID_FIELD_NAME = 
"delinquencyBucketId";
+    public static final String LOCALE_FIELD_NAME = "locale";
+
+    private WorkingCapitalLoanProductsApi workingCapitalApi() {
+        return fineractFeignClient.workingCapitalLoanProducts();
+    }
+
+    @When("Admin creates a new Working Capital Loan Product")
+    public void createWorkingCapitalLoanProduct() {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequest() //
+                .name(workingCapitalProductDefaultName); //
+        final PostWorkingCapitalLoanProductsResponse 
responseDefaultWorkingCapitalLoanProductCreate = 
createWorkingCapitalLoanProduct(
+                defaultWorkingCapitalLoanProductCreateRequest);
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE, 
responseDefaultWorkingCapitalLoanProductCreate);
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST, 
defaultWorkingCapitalLoanProductCreateRequest);
+        checkWorkingCapitalLoanProductCreate();
+    }
+
+    @When("Admin creates a new Working Capital Loan Product with external-id")
+    public void createWorkingCapitalLoanProductWithExternalId() {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequest() //
+                .name(workingCapitalProductDefaultName) //
+                .externalId("EXT-WCP-" + UUID.randomUUID());//
+        final PostWorkingCapitalLoanProductsResponse 
responseDefaultWorkingCapitalLoanProductCreate = 
createWorkingCapitalLoanProduct(
+                defaultWorkingCapitalLoanProductCreateRequest);
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE, 
responseDefaultWorkingCapitalLoanProductCreate);
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST, 
defaultWorkingCapitalLoanProductCreateRequest);
+        checkWorkingCapitalLoanProductWithExternalIdCreate();
+    }
+
+    @Then("Admin failed to create a new Working Capital Loan Product field 
{string} with empty or null mandatory data {string}")
+    public void createWorkingCapitalLoanProductWithEmptyDataFailed(String 
fieldName, String value) {
+        String errorMessage = 
ErrorMessageHelper.fieldValueNullOrEmptyMandatoryFailure(fieldName);
+        createWorkingCapitalLoanProductWithInvalidDataFailure(fieldName, 
value, errorMessage);
+    }
+
+    @Then("Admin failed to create a new Working Capital Loan Product field 
{string} with max length data {int} while max allowed is {int}")
+    public void createWorkingCapitalLoanProductWithMaxLengthDataFailed(String 
fieldName, int maxLengthValue, int maxAllowedLengthValue) {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequest() //
+                .name(workingCapitalProductDefaultName); //
+        String value = Utils.randomStringGenerator(maxLengthValue);
+        final PostWorkingCapitalLoanProductsRequest 
workingCapitalLoanProductCreateRequestUpdated = 
setWorkingCapitalLoanProductsCreateFieldValue(
+                defaultWorkingCapitalLoanProductCreateRequest, fieldName, 
value);
+
+        String errorMessage = 
ErrorMessageHelper.fieldValueMoreMaxLengthAllowedFailure(fieldName, 
maxAllowedLengthValue);
+        
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(workingCapitalLoanProductCreateRequestUpdated,
 errorMessage);
+    }
+
+    @Then("Admin failed to create a new Working Capital Loan Product field 
{string} with zero incorrect value")
+    public void createWorkingCapitalLoanProductWithZeroValueDataFailed(String 
fieldName) {
+        String errorMessage = 
ErrorMessageHelper.fieldValueZeroValueFailure(fieldName);
+        createWorkingCapitalLoanProductWithInvalidDataFailure(fieldName, "0", 
errorMessage);
+    }
+
+    @Then("Admin failed to create a new Working Capital Loan Product field 
{string} with invalid data {string} and got an error {string}")
+    public void createWorkingCapitalLoanProductWithInvalidDataFailed(String 
fieldName, String value, String errorMessage) {
+        createWorkingCapitalLoanProductWithInvalidDataFailure(fieldName, 
value, errorMessage);
+    }
+
+    @Then("Admin failed to create a new Working Capital Loan Product with 
invalid number of payment allocation rules")
+    public void 
createWorkingCapitalLoanProductWithInvalidNumberPaymentAllocationFailed() {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequest() //
+                .name(workingCapitalProductDefaultName) //
+                .paymentAllocation(
+                        
workingCapitalRequestFactory.invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest());
+
+        String errorMessage = 
ErrorMessageHelper.paymentAllocationRulesInvalidNumberFailure(4);
+        
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductCreateRequest,
 errorMessage);
+    }
+
+    @Then("Admin failed to create a new Working Capital Loan Product with 
invalid value of payment allocation rules")
+    public void 
createWorkingCapitalLoanProductWithInvalidPaymentAllocationFailed() {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequest() //
+                .name(workingCapitalProductDefaultName) //
+                
.paymentAllocation(workingCapitalRequestFactory.invalidPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest());
+
+        String errorMessage = 
ErrorMessageHelper.paymentAllocationRulesInvalidValueFailure();
+        
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductCreateRequest,
 errorMessage);
+    }
+
+    @When("Admin updates a Working Capital Loan Product")
+    public void updateWorkingCapitalLoanProduct() {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final String workingCapitalProductDefaultShortName = 
Utils.randomStringGenerator(4);
+        final PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductUpdateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequestUpdate() //
+                .name(workingCapitalProductDefaultName) //
+                .shortName(workingCapitalProductDefaultShortName)//
+                .externalId("EXT-WCP-" + UUID.randomUUID());
+
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+        PutWorkingCapitalLoanProductsProductIdResponse 
responseWorkingCapitalLoanProductUpdate = ok(
+                () -> 
workingCapitalApi().updateWorkingCapitalLoanProduct(resourceId, 
workingCapitalLoanProductUpdateRequest, Map.of()));
+
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_RESPONSE, 
responseWorkingCapitalLoanProductUpdate);
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST, 
workingCapitalLoanProductUpdateRequest);
+        checkWorkingCapitalLoanProductUpdate();
+    }
+
+    @When("Admin updates a Working Capital Loan Product via external-id")
+    public void updateWorkingCapitalLoanProductViaExternalId() {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final String workingCapitalProductDefaultShortName = 
Utils.randomStringGenerator(4);
+        final PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductUpdateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequestUpdate() //
+                .name(workingCapitalProductDefaultName) //
+                .shortName(workingCapitalProductDefaultShortName)//
+                .externalId("EXT-WCP-" + UUID.randomUUID());
+
+        PostWorkingCapitalLoanProductsRequest 
workingCapitalLoanProductsRequest = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST);
+        String externalId = workingCapitalLoanProductsRequest.getExternalId();
+
+        PutWorkingCapitalLoanProductsProductIdResponse 
responseWorkingCapitalLoanProductUpdate = ok(
+                () -> 
workingCapitalApi().updateWorkingCapitalLoanProduct1(externalId, 
workingCapitalLoanProductUpdateRequest, Map.of()));
+
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_RESPONSE, 
responseWorkingCapitalLoanProductUpdate);
+        
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST, 
workingCapitalLoanProductUpdateRequest);
+        checkWorkingCapitalLoanProductWithExternalIdUpdate();
+    }
+
+    @Then("Admin failed to update a new Working Capital Loan Product field 
{string} with max length data {int} while max allowed is {int}")
+    public void updateWorkingCapitalLoanProductWithMaxLengthDataFailed(String 
fieldName, int maxLengthValue, int maxAllowedLengthValue) {
+        String value = Utils.randomStringGenerator(maxLengthValue);
+        PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductUpdateRequest = new 
PutWorkingCapitalLoanProductsProductIdRequest();
+        final PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductUpdateRequestUpdated = 
setWorkingCapitalLoanProductsUpdateRequest(
+                defaultWorkingCapitalLoanProductUpdateRequest, fieldName, 
value);
+
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+                
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+        String errorMessage = 
ErrorMessageHelper.fieldValueMoreMaxLengthAllowedFailure(fieldName, 
maxAllowedLengthValue);
+        checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId, 
workingCapitalLoanProductUpdateRequestUpdated, errorMessage);
+    }
+
+    @Then("Admin failed to update a new Working Capital Loan Product field 
{string} with zero incorrect value")
+    public void updateWorkingCapitalLoanProductWithZeroValueDataFailed(String 
fieldName) {
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+                
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+        String errorMessage = 
ErrorMessageHelper.fieldValueZeroValueFailure(fieldName);
+        updateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId, 
fieldName, "0", errorMessage);
+    }
+
+    @Then("Admin failed to update a new Working Capital Loan Product field 
{string} with invalid data {string} and got an error {string}")
+    public void updateWorkingCapitalLoanProductWithInvalidDataFailed(String 
fieldName, String value, String errorMessage) {
+        final PostWorkingCapitalLoanProductsRequest 
workingCapitalProductForUpdateRequest = TestContext.GLOBAL
+                
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST_FOR_UPDATE_WCLP);
+        String workingCapitalProductName = 
workingCapitalProductForUpdateRequest.getName();
+        final PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductUpdateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequestUpdate() //
+                .name(workingCapitalProductName); //
+
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+                
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+        
updateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductUpdateRequest,
 resourceId, fieldName, value,
+                errorMessage);
+    }
+
+    @Then("Admin failed to update a new Working Capital Loan Product with 
invalid number of payment allocation rules")
+    public void 
updateWorkingCapitalLoanProductWithInvalidNumberPaymentAllocationFailed() {
+        final PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductUpdateRequest = new 
PutWorkingCapitalLoanProductsProductIdRequest()
+                .paymentAllocation(
+                        
workingCapitalRequestFactory.invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest());
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+                
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+        String errorMessage = 
ErrorMessageHelper.paymentAllocationRulesInvalidNumberFailure(4);
+        checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId, 
defaultWorkingCapitalLoanProductUpdateRequest, errorMessage);
+    }
+
+    @Then("Admin failed to update a new Working Capital Loan Product with 
invalid value of payment allocation rules")
+    public void 
updateWorkingCapitalLoanProductWithInvalidPaymentAllocationFailed() {
+        final PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductUpdateRequest = new 
PutWorkingCapitalLoanProductsProductIdRequest()
+                
.paymentAllocation(workingCapitalRequestFactory.invalidPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest());
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+                
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+        String errorMessage = 
ErrorMessageHelper.paymentAllocationRulesInvalidValueFailure();
+        checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId, 
defaultWorkingCapitalLoanProductUpdateRequest, errorMessage);
+    }
+
+    @Then("Admin failed to retrieve a Working Capital Loan Product with id 
{int} that doesn't exist")
+    public void retrieveWorkingCapitalLoanProductFailure(Integer productId) {
+        CallFailedRuntimeException exception = fail(
+                () -> 
workingCapitalApi().retrieveWorkingCapitalLoanProductDetails(Long.valueOf(productId),
 Map.of()));
+        
assertThat(exception.getStatus()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(404);
+        assertThat(exception.getDeveloperMessage())
+                
.contains(ErrorMessageHelper.workingCapitalLoanProductIdentifiedDoesNotExistFailure(String.valueOf(productId)));
+    }
+
+    @Then("Admin deletes a Working Capital Loan Product")
+    public void deleteWorkingCapitalLoanProduct() {
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+        DeleteWorkingCapitalLoanProductsProductIdResponse 
deleteWorkingCapitalLoanProductResponse = ok(
+                () -> 
workingCapitalApi().deleteWorkingCapitalLoanProduct(resourceId, Map.of()));
+        
assertThat(deleteWorkingCapitalLoanProductResponse.getResourceId()).isEqualTo(resourceId);
+    }
+
+    @Then("Admin deletes a Working Capital Loan Product via external-id")
+    public void deleteWorkingCapitalLoanProductViaExternalId() {
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+        PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductsUpdateRequest = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+        String externalId = 
workingCapitalLoanProductsUpdateRequest.getExternalId();
+
+        DeleteWorkingCapitalLoanProductsProductIdResponse 
deleteWorkingCapitalLoanProductResponse = ok(
+                () -> 
workingCapitalApi().deleteWorkingCapitalLoanProduct1(externalId, Map.of()));
+        
assertThat(deleteWorkingCapitalLoanProductResponse.getResourceId()).isEqualTo(resourceId);
+    }
+
+    @Then("Admin checks a Working Capital Loan Product is deleted and doesn't 
exist")
+    public void checkWorkingCapitalLoanProductIsDeleted() {
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductsResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+        checkWorkingCapitalLoanProductDeleteFailure(resourceId);
+    }
+
+    @Then("Admin failed to delete a Working Capital Loan Product with id {int} 
that doesn't exist")
+    public void checkWorkingCapitalLoanProductIsDeleted(Integer productId) {
+        checkWorkingCapitalLoanProductDeleteFailure(Long.valueOf(productId));
+    }
+
+    @Then("Admin checks a Working Capital Loan Product is deleted and doesn't 
exist via external-id")
+    public void checkWorkingCapitalLoanProductIsDeletedViaExternalId() {
+        PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductsUpdateRequest = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+        String externalId = 
workingCapitalLoanProductsUpdateRequest.getExternalId();
+
+        CallFailedRuntimeException exception = fail(
+                () -> 
workingCapitalApi().retrieveWorkingCapitalLoanProductDetails1(externalId, 
Map.of()));
+        
assertThat(exception.getStatus()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(404);
+        assertThat(exception.getDeveloperMessage())
+                
.contains(ErrorMessageHelper.workingCapitalLoanProductIdentifiedDoesNotExistFailure(String.valueOf(externalId)));
+    }
+
+    public PostWorkingCapitalLoanProductsResponse 
createWorkingCapitalLoanProduct(
+            PostWorkingCapitalLoanProductsRequest 
workingCapitalProductRequest) {
+        String workingCapitalProductName = 
workingCapitalProductRequest.getName();
+        log.debug("Creating new working capital product: {}", 
workingCapitalProductName);
+        try {
+            PostWorkingCapitalLoanProductsResponse response = ok(
+                    () -> 
workingCapitalApi().createWorkingCapitalLoanProduct(workingCapitalProductRequest,
 Map.of()));
+            log.debug("Successfully created working capital product '{}' with 
ID: {}", workingCapitalProductName, response.getResourceId());
+            return response;
+        } catch (Exception e) {
+            log.error("FAILED to create working capital product '{}'", 
workingCapitalProductName, e);
+            throw e;
+        }
+    }
+
+    public void checkWorkingCapitalLoanProductCreate() {
+        PostWorkingCapitalLoanProductsRequest 
workingCapitalLoanProductCreateRequest = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST);
+
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+        GetWorkingCapitalLoanProductsProductIdResponse 
getWorkingCapitalProductResponse = workingCapitalApi()
+                .retrieveWorkingCapitalLoanProductDetails(resourceId, 
Map.of());
+        
checkWorkingCapitalLoanProductCreate(workingCapitalLoanProductCreateRequest, 
getWorkingCapitalProductResponse);
+    }
+
+    public void checkWorkingCapitalLoanProductWithExternalIdCreate() {
+        PostWorkingCapitalLoanProductsRequest 
workingCapitalLoanProductCreateRequest = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST);
+        String externalId = 
workingCapitalLoanProductCreateRequest.getExternalId();
+
+        GetWorkingCapitalLoanProductsProductIdResponse 
getWorkingCapitalProductResponse = workingCapitalApi()
+                .retrieveWorkingCapitalLoanProductDetails1(externalId, 
Map.of());
+        
checkWorkingCapitalLoanProductCreate(workingCapitalLoanProductCreateRequest, 
getWorkingCapitalProductResponse);
+    }
+
+    public void 
checkWorkingCapitalLoanProductCreate(PostWorkingCapitalLoanProductsRequest 
workingCapitalLoanProductCreateRequest,
+            GetWorkingCapitalLoanProductsProductIdResponse 
getWorkingCapitalProductResponse) {
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+
+        SoftAssertions assertions = new SoftAssertions();
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getName()).isEqualTo(getWorkingCapitalProductResponse.getName());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getShortName())
+                .isEqualTo(getWorkingCapitalProductResponse.getShortName());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getDescription())
+                .isEqualTo(getWorkingCapitalProductResponse.getDescription());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getExternalId())
+                .isEqualTo(getWorkingCapitalProductResponse.getExternalId());
+        
assertions.assertThat(resourceId).isEqualTo(getWorkingCapitalProductResponse.getId());
+
+        // check currency
+        assert getWorkingCapitalProductResponse.getCurrency() != null;
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getCurrencyCode())
+                
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getCode());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getDigitsAfterDecimal())
+                
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getDecimalPlaces());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getInMultiplesOf())
+                
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getInMultiplesOf());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getStartDate())
+                .isEqualTo(getWorkingCapitalProductResponse.getStartDate());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getCloseDate())
+                .isEqualTo(getWorkingCapitalProductResponse.getCloseDate());
+
+        assert getWorkingCapitalProductResponse.getAmortizationType() != null;
+        assert workingCapitalLoanProductCreateRequest.getAmortizationType() != 
null;
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getAmortizationType().getValue())
+                
.isEqualTo(getWorkingCapitalProductResponse.getAmortizationType().getCode());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getNpvDayCount())
+                .isEqualTo(getWorkingCapitalProductResponse.getNpvDayCount());
+        assertions.assertThat(
+                
workingCapitalLoanProductCreateRequest.getRepaymentEvery().compareTo(getWorkingCapitalProductResponse.getRepaymentEvery()))
+                .isEqualTo(0);
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getRepaymentFrequencyType().getValue())
+                
.isEqualTo(getWorkingCapitalProductResponse.getRepaymentFrequencyType().getCode());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getPeriodPaymentRate()
+                
.compareTo(getWorkingCapitalProductResponse.getPeriodPaymentRate())).isEqualTo(0);
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getMinPeriodPaymentRate())
+                
.isEqualTo(getWorkingCapitalProductResponse.getMinPeriodPaymentRate());
+        
assertions.assertThat(workingCapitalLoanProductCreateRequest.getMaxPeriodPaymentRate())
+                
.isEqualTo(getWorkingCapitalProductResponse.getMaxPeriodPaymentRate());
+
+        // check payment allocation rules
+        assert workingCapitalLoanProductCreateRequest.getPaymentAllocation() 
!= null;
+        
workingCapitalLoanProductCreateRequest.getPaymentAllocation().forEach(paymentAllocation
 -> {
+            assert getWorkingCapitalProductResponse.getPaymentAllocation() != 
null;
+            GetPaymentAllocation getPaymentAllocation = 
getWorkingCapitalProductResponse.getPaymentAllocation().stream()
+                    .filter(paymentAllocationSearched -> {
+                        assert paymentAllocation.getTransactionType() != null;
+                        return 
paymentAllocation.getTransactionType().getValue().equals(paymentAllocationSearched.getTransactionType());
+                    }).findFirst().orElseThrow(() -> new RuntimeException("No 
paymentAllocation is found!"));
+            
assertions.assertThat(paymentAllocation.getPaymentAllocationOrder())
+                    
.containsAll(getPaymentAllocation.getPaymentAllocationOrder());
+        });
+
+        assertions
+                .assertThat(
+                        
workingCapitalLoanProductCreateRequest.getPrincipal().compareTo(getWorkingCapitalProductResponse.getPrincipal()))
+                .isEqualTo(0);
+        assertions.assertThat(
+                
workingCapitalLoanProductCreateRequest.getMaxPrincipal().compareTo(getWorkingCapitalProductResponse.getMaxPrincipal()))
+                .isEqualTo(0);
+        assertions.assertThat(
+                
workingCapitalLoanProductCreateRequest.getMinPrincipal().compareTo(getWorkingCapitalProductResponse.getMinPrincipal()))
+                .isEqualTo(0);
+
+        if 
(workingCapitalLoanProductCreateRequest.getAllowAttributeOverrides() != null) {
+            PostAllowAttributeOverrides allowAttributeOverridesCreateResponse 
= workingCapitalLoanProductCreateRequest
+                    .getAllowAttributeOverrides();
+            GetConfigurableAttributes allowAttributeOverridesGetResponse = 
getWorkingCapitalProductResponse.getAllowAttributeOverrides();
+            assert allowAttributeOverridesGetResponse != null;
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getDiscountDefault())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getDiscountDefault());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getFlatPercentageAmount())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getFlatPercentageAmount());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getDelinquencyBucketClassification())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getDelinquencyBucketClassification());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequency())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequency());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequencyType())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequencyType());
+        }
+        assertions.assertAll();
+    }
+
+    public void checkWorkingCapitalLoanProductUpdate() {
+        PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductsUpdateRequest = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+
+        GetWorkingCapitalLoanProductsProductIdResponse 
getWorkingCapitalProductResponse = workingCapitalApi()
+                .retrieveWorkingCapitalLoanProductDetails(resourceId, 
Map.of());
+        
checkWorkingCapitalLoanProductUpdate(workingCapitalLoanProductsUpdateRequest, 
getWorkingCapitalProductResponse);
+    }
+
+    public void checkWorkingCapitalLoanProductWithExternalIdUpdate() {
+        PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductsUpdateRequest = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+        String externalId = 
workingCapitalLoanProductsUpdateRequest.getExternalId();
+
+        GetWorkingCapitalLoanProductsProductIdResponse 
getWorkingCapitalProductResponse = workingCapitalApi()
+                .retrieveWorkingCapitalLoanProductDetails1(externalId, 
Map.of());
+        
checkWorkingCapitalLoanProductUpdate(workingCapitalLoanProductsUpdateRequest, 
getWorkingCapitalProductResponse);
+    }
+
+    public void 
checkWorkingCapitalLoanProductUpdate(PutWorkingCapitalLoanProductsProductIdRequest
 workingCapitalLoanProductsUpdateRequest,
+            GetWorkingCapitalLoanProductsProductIdResponse 
getWorkingCapitalProductResponse) {
+        PostWorkingCapitalLoanProductsResponse 
workingCapitalLoanProductResponse = testContext()
+                
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+        Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+
+        SoftAssertions assertions = new SoftAssertions();
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getName()).isEqualTo(getWorkingCapitalProductResponse.getName());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getShortName())
+                .isEqualTo(getWorkingCapitalProductResponse.getShortName());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getDescription())
+                .isEqualTo(getWorkingCapitalProductResponse.getDescription());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getExternalId())
+                .isEqualTo(getWorkingCapitalProductResponse.getExternalId());
+        
assertions.assertThat(resourceId).isEqualTo(getWorkingCapitalProductResponse.getId());
+
+        // check currency
+        assert getWorkingCapitalProductResponse.getCurrency() != null;
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getCurrencyCode())
+                
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getCode());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getDigitsAfterDecimal())
+                
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getDecimalPlaces());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getInMultiplesOf())
+                
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getInMultiplesOf());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getStartDate())
+                .isEqualTo(getWorkingCapitalProductResponse.getStartDate());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getCloseDate())
+                .isEqualTo(getWorkingCapitalProductResponse.getCloseDate());
+
+        assert getWorkingCapitalProductResponse.getAmortizationType() != null;
+        assert workingCapitalLoanProductsUpdateRequest.getAmortizationType() 
!= null;
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getAmortizationType().getValue())
+                
.isEqualTo(getWorkingCapitalProductResponse.getAmortizationType().getCode());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getNpvDayCount())
+                .isEqualTo(getWorkingCapitalProductResponse.getNpvDayCount());
+        assertions.assertThat(
+                
workingCapitalLoanProductsUpdateRequest.getRepaymentEvery().compareTo(getWorkingCapitalProductResponse.getRepaymentEvery()))
+                .isEqualTo(0);
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getRepaymentFrequencyType().getValue())
+                
.isEqualTo(getWorkingCapitalProductResponse.getRepaymentFrequencyType().getCode());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getPeriodPaymentRate()
+                
.compareTo(getWorkingCapitalProductResponse.getPeriodPaymentRate())).isEqualTo(0);
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getMinPeriodPaymentRate())
+                
.isEqualTo(getWorkingCapitalProductResponse.getMinPeriodPaymentRate());
+        
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getMaxPeriodPaymentRate())
+                
.isEqualTo(getWorkingCapitalProductResponse.getMaxPeriodPaymentRate());
+
+        // check payment allocation rules
+        assert workingCapitalLoanProductsUpdateRequest.getPaymentAllocation() 
!= null;
+        
workingCapitalLoanProductsUpdateRequest.getPaymentAllocation().forEach(paymentAllocation
 -> {
+            assert getWorkingCapitalProductResponse.getPaymentAllocation() != 
null;
+            GetPaymentAllocation getPaymentAllocation = 
getWorkingCapitalProductResponse.getPaymentAllocation().stream()
+                    .filter(paymentAllocationSearched -> {
+                        assert paymentAllocation.getTransactionType() != null;
+                        return 
paymentAllocation.getTransactionType().getValue().equals(paymentAllocationSearched.getTransactionType());
+                    }).findFirst().orElseThrow(() -> new RuntimeException("No 
paymentAllocation is found!"));
+            
assertions.assertThat(paymentAllocation.getPaymentAllocationOrder())
+                    
.containsAll(getPaymentAllocation.getPaymentAllocationOrder());
+        });
+
+        assertions
+                .assertThat(
+                        
workingCapitalLoanProductsUpdateRequest.getPrincipal().compareTo(getWorkingCapitalProductResponse.getPrincipal()))
+                .isEqualTo(0);
+        assertions.assertThat(
+                
workingCapitalLoanProductsUpdateRequest.getMaxPrincipal().compareTo(getWorkingCapitalProductResponse.getMaxPrincipal()))
+                .isEqualTo(0);
+        assertions.assertThat(
+                
workingCapitalLoanProductsUpdateRequest.getMinPrincipal().compareTo(getWorkingCapitalProductResponse.getMinPrincipal()))
+                .isEqualTo(0);
+
+        if 
(workingCapitalLoanProductsUpdateRequest.getAllowAttributeOverrides() != null) {
+            PostAllowAttributeOverrides allowAttributeOverridesCreateResponse 
= workingCapitalLoanProductsUpdateRequest
+                    .getAllowAttributeOverrides();
+            GetConfigurableAttributes allowAttributeOverridesGetResponse = 
getWorkingCapitalProductResponse.getAllowAttributeOverrides();
+            assert allowAttributeOverridesGetResponse != null;
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getDiscountDefault())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getDiscountDefault());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getFlatPercentageAmount())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getFlatPercentageAmount());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getDelinquencyBucketClassification())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getDelinquencyBucketClassification());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequency())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequency());
+            
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequencyType())
+                    
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequencyType());
+        }
+        assertions.assertAll();
+    }
+
+    public void createWorkingCapitalLoanProductWithInvalidDataFailure(String 
fieldName, String value, String errorMessage) {
+        final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+                + Utils.randomStringGenerator("_", 10);
+        final PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequest() //
+                .name(workingCapitalProductDefaultName); //
+
+        final PostWorkingCapitalLoanProductsRequest 
workingCapitalLoanProductCreateRequestUpdated = 
setWorkingCapitalLoanProductsCreateFieldValue(
+                defaultWorkingCapitalLoanProductCreateRequest, fieldName, 
value);
+        
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(workingCapitalLoanProductCreateRequestUpdated,
 errorMessage);
+    }
+
+    public void checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(
+            PostWorkingCapitalLoanProductsRequest 
workingCapitalLoanProductCreateRequestUpdated, String errorMessage) {
+        CallFailedRuntimeException exception = fail(
+                () -> 
workingCapitalApi().createWorkingCapitalLoanProduct(workingCapitalLoanProductCreateRequestUpdated,
 Map.of()));
+        
assertThat(exception.getStatus()).as(ErrorMessageHelper.incorrectExpectedValueInResponse()).isEqualTo(400);
+        assertThat(exception.getDeveloperMessage()).contains(errorMessage);
+    }
+
+    public PostWorkingCapitalLoanProductsRequest 
setWorkingCapitalLoanProductsCreateFieldValue(
+            PostWorkingCapitalLoanProductsRequest 
defaultWorkingCapitalLoanProductCreateRequest, String fieldName, String 
fieldValue) {
+        if (fieldValue.equals("null")) {
+            fieldValue = null;
+        }
+        Integer valueInteger = null;
+        BigDecimal valueBigDecimal = null;
+        if (fieldName.equalsIgnoreCase(DIGITS_AFTER_DECIMAL_FIELD_NAME) || 
fieldName.equalsIgnoreCase(IN_MULTIPLES_OF_FIELD_NAME)
+                || fieldName.equalsIgnoreCase(NPV_DAY_COUNT_FIELD_NAME) || 
fieldName.equalsIgnoreCase(REPAYMENT_EVERY_FIELD_NAME)) {
+            valueInteger = fieldValue != null ? Integer.valueOf(fieldValue) : 
null;
+        }
+        if (fieldName.equalsIgnoreCase(PRINCIPAL_FIELD_NAME) || 
fieldName.equalsIgnoreCase(MIN_PRINCIPAL_FIELD_NAME)
+                || fieldName.equalsIgnoreCase(MAX_PRINCIPAL_FIELD_NAME) || 
fieldName.equalsIgnoreCase(PERIOD_PAYMENT_RATE_FIELD_NAME)
+                || 
fieldName.equalsIgnoreCase(MIN_PERIOD_PAYMENT_RATE_FIELD_NAME)
+                || 
fieldName.equalsIgnoreCase(MAX_PERIOD_PAYMENT_RATE_FIELD_NAME)) {
+            valueBigDecimal = fieldValue != null ? new BigDecimal(fieldValue) 
: null;
+        }
+
+        switch (fieldName) {
+            case NAME_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setName(fieldValue);
+            break;
+            case SHORT_NAME_FIELD:
+                
defaultWorkingCapitalLoanProductCreateRequest.setShortName(fieldValue);
+            break;
+            case DESCRIPTION_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setDescription(fieldValue);
+            break;
+            case CURRENCY_CODE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setCurrencyCode(fieldValue);
+            break;
+            case DIGITS_AFTER_DECIMAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setDigitsAfterDecimal(valueInteger);
+            break;
+            case IN_MULTIPLES_OF_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setInMultiplesOf(valueInteger);
+            break;
+            case AMORTIZATION_TYPE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setAmortizationType(
+                        fieldValue == null ? null : 
PostWorkingCapitalLoanProductsRequest.AmortizationTypeEnum.valueOf(fieldValue));
+            break;
+            case NPV_DAY_COUNT_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setNpvDayCount(valueInteger);
+            break;
+            case PRINCIPAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setPrincipal(valueBigDecimal);
+            break;
+            case MIN_PRINCIPAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setMinPrincipal(valueBigDecimal);
+            break;
+            case MAX_PRINCIPAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setMaxPrincipal(valueBigDecimal);
+            break;
+            case PERIOD_PAYMENT_RATE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setPeriodPaymentRate(valueBigDecimal);
+            break;
+            case MIN_PERIOD_PAYMENT_RATE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setMinPeriodPaymentRate(valueBigDecimal);
+            break;
+            case MAX_PERIOD_PAYMENT_RATE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setMaxPeriodPaymentRate(valueBigDecimal);
+            break;
+            case REPAYMENT_FREQUENCY_TYPE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setRepaymentFrequencyType(
+                        fieldValue == null ? null : 
PostWorkingCapitalLoanProductsRequest.RepaymentFrequencyTypeEnum.valueOf(fieldValue));
+            break;
+            case REPAYMENT_EVERY_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setRepaymentEvery(valueInteger);
+            break;
+            case EXTERNAL_ID_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setExternalId(fieldValue);
+            break;
+            case DELINQUENCY_BUCKET_ID_FIELD_NAME:
+                defaultWorkingCapitalLoanProductCreateRequest
+                        .setDelinquencyBucketId(fieldValue != null ? 
Long.parseLong(fieldValue) : null);
+            break;
+            case LOCALE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductCreateRequest.setLocale(fieldValue);
+            break;
+            default:
+            break;
+        }
+        return defaultWorkingCapitalLoanProductCreateRequest;
+    }
+
+    public void updateWorkingCapitalLoanProductWithInvalidDataFailure(Long 
productId, String fieldName, String value, String errorMessage) {
+        final PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductUpdateRequest = new 
PutWorkingCapitalLoanProductsProductIdRequest();
+        
updateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductUpdateRequest,
 productId, fieldName, value,
+                errorMessage);
+    }
+
+    public void updateWorkingCapitalLoanProductWithInvalidDataFailure(
+            PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductUpdateRequest, Long productId, String fieldName,
+            String value, String errorMessage) {
+        final PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductUpdateRequestUpdated = 
setWorkingCapitalLoanProductsUpdateRequest(
+                defaultWorkingCapitalLoanProductUpdateRequest, fieldName, 
value);
+        checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(productId, 
workingCapitalLoanProductUpdateRequestUpdated, errorMessage);
+    }
+
+    public void 
checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(Long productId,
+            PutWorkingCapitalLoanProductsProductIdRequest 
workingCapitalLoanProductUpdateRequestUpdated, String errorMessage) {
+        CallFailedRuntimeException exception = fail(() -> 
workingCapitalApi().updateWorkingCapitalLoanProduct(productId,
+                workingCapitalLoanProductUpdateRequestUpdated, Map.of()));
+        
assertThat(exception.getStatus()).as(ErrorMessageHelper.incorrectExpectedValueInResponse()).isEqualTo(400);
+        assertThat(exception.getDeveloperMessage()).contains(errorMessage);
+    }
+
+    public PutWorkingCapitalLoanProductsProductIdRequest 
setWorkingCapitalLoanProductsUpdateRequest(
+            PutWorkingCapitalLoanProductsProductIdRequest 
defaultWorkingCapitalLoanProductUpdateRequest, String fieldName,
+            String fieldValue) {
+        if (fieldValue.equals("null")) {
+            fieldValue = null;
+        }
+
+        Integer valueInteger = null;
+        BigDecimal valueBigDecimal = null;
+        if (fieldName.equalsIgnoreCase(DIGITS_AFTER_DECIMAL_FIELD_NAME) || 
fieldName.equalsIgnoreCase(IN_MULTIPLES_OF_FIELD_NAME)
+                || fieldName.equalsIgnoreCase(NPV_DAY_COUNT_FIELD_NAME) || 
fieldName.equalsIgnoreCase(REPAYMENT_EVERY_FIELD_NAME)) {
+            valueInteger = fieldValue != null ? Integer.valueOf(fieldValue) : 
null;
+        }
+        if (fieldName.equalsIgnoreCase(PRINCIPAL_FIELD_NAME) || 
fieldName.equalsIgnoreCase(MIN_PRINCIPAL_FIELD_NAME)
+                || fieldName.equalsIgnoreCase(MAX_PRINCIPAL_FIELD_NAME) || 
fieldName.equalsIgnoreCase(PERIOD_PAYMENT_RATE_FIELD_NAME)
+                || 
fieldName.equalsIgnoreCase(MIN_PERIOD_PAYMENT_RATE_FIELD_NAME)
+                || 
fieldName.equalsIgnoreCase(MAX_PERIOD_PAYMENT_RATE_FIELD_NAME)) {
+            valueBigDecimal = fieldValue != null ? new BigDecimal(fieldValue) 
: null;
+        }
+
+        switch (fieldName) {
+            case NAME_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setName(fieldValue);
+            break;
+            case SHORT_NAME_FIELD:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setShortName(fieldValue);
+            break;
+            case DESCRIPTION_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setDescription(fieldValue);
+            break;
+            case CURRENCY_CODE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setCurrencyCode(fieldValue);
+            break;
+            case DIGITS_AFTER_DECIMAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setDigitsAfterDecimal(valueInteger);
+            break;
+            case IN_MULTIPLES_OF_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setInMultiplesOf(valueInteger);
+            break;
+            case AMORTIZATION_TYPE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setAmortizationType(
+                        fieldValue == null ? null : 
PutWorkingCapitalLoanProductsProductIdRequest.AmortizationTypeEnum.valueOf(fieldValue));
+            break;
+            case NPV_DAY_COUNT_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setNpvDayCount(valueInteger);
+            break;
+            case PRINCIPAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setPrincipal(valueBigDecimal);
+            break;
+            case MIN_PRINCIPAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setMinPrincipal(valueBigDecimal);
+            break;
+            case MAX_PRINCIPAL_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setMaxPrincipal(valueBigDecimal);
+            break;
+            case PERIOD_PAYMENT_RATE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setPeriodPaymentRate(valueBigDecimal);
+            break;
+            case MIN_PERIOD_PAYMENT_RATE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setMinPeriodPaymentRate(valueBigDecimal);
+            break;
+            case MAX_PERIOD_PAYMENT_RATE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setMaxPeriodPaymentRate(valueBigDecimal);
+            break;
+            case REPAYMENT_FREQUENCY_TYPE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setRepaymentFrequencyType(fieldValue
 == null ? null
+                        : 
PutWorkingCapitalLoanProductsProductIdRequest.RepaymentFrequencyTypeEnum.valueOf(fieldValue));
+            break;
+            case REPAYMENT_EVERY_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setRepaymentEvery(valueInteger);
+            break;
+            case EXTERNAL_ID_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setExternalId(fieldValue);
+            break;
+            case DELINQUENCY_BUCKET_ID_FIELD_NAME:
+                defaultWorkingCapitalLoanProductUpdateRequest
+                        .setDelinquencyBucketId(fieldValue != null ? 
Long.parseLong(fieldValue) : null);
+            break;
+            case LOCALE_FIELD_NAME:
+                
defaultWorkingCapitalLoanProductUpdateRequest.setLocale(fieldValue);
+            break;
+            default:
+            break;
+        }
+        return defaultWorkingCapitalLoanProductUpdateRequest;
+    }
+
+    public void checkWorkingCapitalLoanProductDeleteFailure(Long productId) {
+        CallFailedRuntimeException exception = fail(
+                () -> 
workingCapitalApi().retrieveWorkingCapitalLoanProductDetails(productId, 
Map.of()));
+        
assertThat(exception.getStatus()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(404);
+        assertThat(exception.getDeveloperMessage())
+                
.contains(ErrorMessageHelper.workingCapitalLoanProductIdentifiedDoesNotExistFailure(String.valueOf(productId)));
+    }
+}
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
index 36a10e2174..70ceff1cb7 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
@@ -318,4 +318,10 @@ public abstract class TestContextKey {
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL_INTEREST_RECALC
 = 
"loanProductCreateResponseLP2DownPaymentAdvancedPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc";
     public static final String 
DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP = 
"workingCapitalLoanProductCreateResponseWCLP";
     public static final String WC_LOAN_IDS = "wcLoanIds";
+    public static final String 
DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST_FOR_UPDATE_WCLP = 
"workingCapitalLoanProductCreateRequestForUpdateWCLP";
+    public static final String 
DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP = 
"workingCapitalLoanProductCreateResponseForUpdateWCLP";
+    public static final String WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST = 
"workingCapitalLoanProductCreateRequest";
+    public static final String WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE = 
"workingCapitalLoanProductCreateResponse";
+    public static final String WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST = 
"workingCapitalLoanProductUpdateRequest";
+    public static final String WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_RESPONSE = 
"workingCapitalLoanProductUpdateResponse";
 }
diff --git 
a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalLoanProductInitializerStep.java
 
b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
similarity index 72%
rename from 
fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalLoanProductInitializerStep.java
rename to 
fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
index 1beffe735c..931e739ad3 100644
--- 
a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalLoanProductInitializerStep.java
+++ 
b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
@@ -20,19 +20,16 @@ package org.apache.fineract.test.initializer.global;
 
 import static org.apache.fineract.client.feign.util.FeignCalls.ok;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.client.feign.FineractFeignClient;
 import org.apache.fineract.client.models.GetWorkingCapitalLoanProductsResponse;
-import org.apache.fineract.client.models.PaymentAllocationOrder;
-import org.apache.fineract.client.models.PostPaymentAllocation;
 import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
 import 
org.apache.fineract.client.models.PostWorkingCapitalLoanProductsResponse;
 import 
org.apache.fineract.test.data.workingcapitalproduct.DefaultWorkingCapitalLoanProduct;
-import 
org.apache.fineract.test.factory.WorkingCapitalLoanProductRequestFactory;
+import org.apache.fineract.test.factory.WorkingCapitalRequestFactory;
 import org.apache.fineract.test.support.TestContext;
 import org.apache.fineract.test.support.TestContextKey;
 import org.springframework.stereotype.Component;
@@ -40,39 +37,30 @@ import org.springframework.stereotype.Component;
 @Slf4j
 @RequiredArgsConstructor
 @Component
-public class WorkingCapitalLoanProductInitializerStep implements 
FineractGlobalInitializerStep {
+public class WorkingCapitalInitializerStep implements 
FineractGlobalInitializerStep {
 
     private final FineractFeignClient fineractClient;
-    private final WorkingCapitalLoanProductRequestFactory 
workingCapitalLoanProductRequestFactory;
+    private final WorkingCapitalRequestFactory workingCapitalRequestFactory;
 
     @Override
     public void initialize() throws Exception {
 
         final String workingCapitalProductDefaultName = 
DefaultWorkingCapitalLoanProduct.WCLP.getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLRequest = 
workingCapitalLoanProductRequestFactory
+        final PostWorkingCapitalLoanProductsRequest defaultWCPLRequest = 
workingCapitalRequestFactory
                 .defaultWorkingCapitalLoanProductRequest() //
-                .name(workingCapitalProductDefaultName) //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", List.of("PENALTY", 
"FEE", "PRINCIPAL"))));//
+                .name(workingCapitalProductDefaultName); //
         final PostWorkingCapitalLoanProductsResponse responseDefaultWCPL = 
createWorkingCapitalLoanProductIdempotent(defaultWCPLRequest);
         
TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP,
 responseDefaultWCPL);
-    }
-
-    private static PostPaymentAllocation createPaymentAllocation(String 
transactionType, List<String> paymentAllocationRules) {
-        PostPaymentAllocation.TransactionTypeEnum transactionTypeName = 
PostPaymentAllocation.TransactionTypeEnum.valueOf(transactionType);
-        PostPaymentAllocation paymentAllocationData = new 
PostPaymentAllocation();
-        paymentAllocationData.setTransactionType(transactionTypeName);
 
-        List<PaymentAllocationOrder> paymentAllocationOrders = new 
ArrayList<>();
-        for (int i = 0; i < paymentAllocationRules.size(); i++) {
-            PaymentAllocationOrder e = new PaymentAllocationOrder();
-            e.setOrder(i + 1);
-            e.setPaymentAllocationRule(paymentAllocationRules.get(i));
-            paymentAllocationOrders.add(e);
-        }
-
-        
paymentAllocationData.setPaymentAllocationOrder(paymentAllocationOrders);
-        return paymentAllocationData;
+        final String workingCapitalProductForUpdateName = 
DefaultWorkingCapitalLoanProduct.WCLP_FOR_UPDATE.getName();
+        final PostWorkingCapitalLoanProductsRequest 
defaultForUpdateWCPLRequest = workingCapitalRequestFactory
+                .defaultWorkingCapitalLoanProductRequest() //
+                .name(workingCapitalProductForUpdateName); //
+        final PostWorkingCapitalLoanProductsResponse responseForUpdateWCPL = 
createWorkingCapitalLoanProductIdempotent(
+                defaultForUpdateWCPLRequest);
+        
TestContext.GLOBAL.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST_FOR_UPDATE_WCLP,
+                defaultForUpdateWCPLRequest);
+        
TestContext.GLOBAL.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP,
 responseForUpdateWCPL);
     }
 
     private PostWorkingCapitalLoanProductsResponse 
createWorkingCapitalLoanProductIdempotent(
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalLoanProduct.feature
 
b/fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalLoanProduct.feature
new file mode 100644
index 0000000000..63c2acbc5c
--- /dev/null
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalLoanProduct.feature
@@ -0,0 +1,135 @@
+@WorkingCapitalLoanProductFeature
+Feature: WorkingCapitalLoanProduct
+
+  @TestRailId:C70208
+  Scenario: Verify Working capital Loan Product create/edit/delete with valid 
data - happy path - UC1
+    When Admin creates a new Working Capital Loan Product
+    When Admin updates a Working Capital Loan Product
+    Then Admin deletes a Working Capital Loan Product
+    Then Admin checks a Working Capital Loan Product is deleted and doesn't 
exist
+
+  @TestRailId:C70209
+  Scenario: Verify Working capital Loan Product create/edit/delete via 
external-id with valid data - happy path - UC2
+    When Admin creates a new Working Capital Loan Product with external-id
+    When Admin updates a Working Capital Loan Product via external-id
+    Then Admin deletes a Working Capital Loan Product via external-id
+    Then Admin checks a Working Capital Loan Product is deleted and doesn't 
exist via external-id
+
+  @TestRailId:C70210
+  Scenario Outline: Verify Working capital Loan Product create with invalid 
data shall outcome with error - validation check with mandatory fields - UC3
+    Then Admin failed to create a new Working Capital Loan Product field 
"<wcp_field_name_mandatory>" with empty or null mandatory data 
<wcp_empty_field_value_mandatory>
+
+    Examples:
+      | wcp_field_name_mandatory  | wcp_empty_field_value_mandatory |
+      | name                      | "null"                          |
+      | name                      | ""                              |
+      | shortName                 | ""                              |
+      | shortName                 | "null"                          |
+      | currencyCode              | ""                              |
+      | currencyCode              | "null"                          |
+      | digitsAfterDecimal        | "null"                          |
+      | amortizationType          | "null"                          |
+      | npvDayCount               | "null"                          |
+      | principal                 | "null"                          |
+      | periodPaymentRate         | "null"                          |
+      | repaymentFrequencyType    | "null"                          |
+
+  @TestRailId:C70211
+  Scenario Outline: Verify Working capital Loan Product create with invalid 
data shall outcome with error - validation check with max allowed length - UC4
+    Then Admin failed to create a new Working Capital Loan Product field 
"<wcp_field_name_max_length>" with max length data 
<wcp_invalid_field_value_max_length> while max allowed is 
<wcp_invalid_field_value_max_allowed_length>
+
+    Examples:
+      | wcp_field_name_max_length | wcp_invalid_field_value_max_length | 
wcp_invalid_field_value_max_allowed_length |
+      | name                      | 101                                | 100   
                                     |
+      | shortName                 | 9                                  | 4     
                                     |
+      | description               | 550                                | 500   
                                     |
+      | currencyCode              | 4                                  | 3     
                                     |
+
+  @TestRailId:C70212
+  Scenario Outline: Verify Working capital Loan Product update with invalid 
data shall outcome with error - validation check with max allowed length - UC5
+    Then Admin failed to update a new Working Capital Loan Product field 
"<wcp_field_name_max_length>" with max length data 
<wcp_invalid_field_value_max_length> while max allowed is 
<wcp_invalid_field_value_max_allowed_length>
+
+    Examples:
+      | wcp_field_name_max_length | wcp_invalid_field_value_max_length | 
wcp_invalid_field_value_max_allowed_length |
+      | name                      | 111                                | 100   
                                     |
+      | shortName                 | 5                                  | 4     
                                     |
+      | description               | 600                                | 500   
                                     |
+      | currencyCode              | 10                                 | 3     
                                     |
+
+  @TestRailId:C70213
+  Scenario Outline: Verify Working capital Loan Product create with invalid 
data shall outcome with error - validation check with zero values - UC6
+    Then Admin failed to create a new Working Capital Loan Product field 
"<wcp_field_name_zero_value>" with zero incorrect value
+
+    Examples:
+      | wcp_field_name_zero_value |
+      | npvDayCount               |
+      | principal                 |
+      | minPrincipal              |
+      | maxPrincipal              |
+      | delinquencyBucketId       |
+
+  @TestRailId:C70214
+  Scenario Outline: Verify Working capital Loan Product update with invalid 
data shall outcome with error - validation check with zero values - UC7
+    Then Admin failed to update a new Working Capital Loan Product field 
"<wcp_field_name_zero_value>" with zero incorrect value
+
+    Examples:
+      | wcp_field_name_zero_value |
+      | npvDayCount               |
+      | principal                 |
+      | minPrincipal              |
+      | maxPrincipal              |
+      | delinquencyBucketId       |
+
+  @TestRailId:C70215
+  Scenario Outline: Verify Working capital Loan Product create with invalid 
data shall outcome with error - validation check with diff values - U8
+    Then Admin failed to create a new Working Capital Loan Product field 
"<wcp_field_name>" with invalid data <wcp_invalid_field_value> and got an error 
<wcp_error_message>
+
+    Examples:
+      | wcp_field_name           | wcp_invalid_field_value  | 
wcp_error_message                                                               
           |
+      | digitsAfterDecimal       |  "25"                    | "The parameter 
`digitsAfterDecimal` must be between 0 and 6."                              |
+      | inMultiplesOf            |  "-1"                    | "The parameter 
`inMultiplesOf` must be zero or greater."                                   |
+      | periodPaymentRate        |  "-1"                    | "The parameter 
`periodPaymentRate` must be greater than or equal to 0."                    |
+      | locale                   |  "null"                  | "The parameter 
`digitsAfterDecimal` requires a `locale` parameter to be passed with it."   |
+      | locale                   |  ""                      | "The parameter 
`locale` is invalid. It cannot be blank."                                   |
+
+  @TestRailId:C70216
+  Scenario Outline: Verify Working capital Loan Product update with invalid 
data shall outcome with error - validation check with diff values - UC9
+    Then Admin failed to update a new Working Capital Loan Product field 
"<wcp_field_name>" with invalid data <wcp_invalid_field_value> and got an error 
<wcp_error_message>
+
+    Examples:
+      | wcp_field_name           | wcp_invalid_field_value  | 
wcp_error_message                                                               
           |
+      | digitsAfterDecimal       |  "25"                    | "The parameter 
`digitsAfterDecimal` must be between 0 and 6."                              |
+      | inMultiplesOf            |  "-1"                    | "The parameter 
`inMultiplesOf` must be zero or greater."                                   |
+      | periodPaymentRate        |  "-1"                    | "The parameter 
`periodPaymentRate` must be greater than or equal to 0."                    |
+
+  @TestRailId:C70217
+  Scenario: Verify Working capital Loan Product create with invalid data shall 
outcome with error - validation check with number of payment allocation rules - 
UC10
+    Then Admin failed to create a new Working Capital Loan Product with 
invalid number of payment allocation rules
+
+  @TestRailId:C70218
+  Scenario: Verify Working capital Loan Product create with invalid data shall 
outcome with error - validation check with payment allocation rules - UC11
+    Then Admin failed to create a new Working Capital Loan Product with 
invalid value of payment allocation rules
+
+  @TestRailId:C70219
+  Scenario: Verify Working capital Loan Product update with invalid data shall 
outcome with error - validation check with number of payment allocation rules - 
UC12
+    Then Admin failed to update a new Working Capital Loan Product with 
invalid number of payment allocation rules
+
+  @TestRailId:C70220
+  Scenario: Verify Working capital Loan Product update with invalid data shall 
outcome with error - validation check with payment allocation rules - UC13
+    Then Admin failed to update a new Working Capital Loan Product with 
invalid value of payment allocation rules
+
+  @TestRailId:C70221
+  Scenario Outline: Verify Working capital Loan Product delete with invalid 
data shall outcome with error - validation check with id - UC14
+    Then Admin failed to delete a Working Capital Loan Product with id 
<wcp_field_name_incorrect_value> that doesn't exist
+    Examples:
+      | wcp_field_name_incorrect_value |
+      | 103284                         |
+      | 0                              |
+
+  @TestRailId:C70222
+  Scenario Outline: Verify Working capital Loan Product retrieve with invalid 
data shall outcome with error - validation check with id - UC15
+    Then Admin failed to retrieve a Working Capital Loan Product with id 
<wcp_field_name_incorrect_value> that doesn't exist
+    Examples:
+      | wcp_field_name_incorrect_value |
+      | 565465                         |
+      | 0                              |
diff --git 
a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
 
b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
index 44281d9b5a..d0cd51d91a 100644
--- 
a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
+++ 
b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
@@ -367,6 +367,8 @@ public final class 
WorkingCapitalLoanProductApiResourceSwagger {
         public String shortName;
         @Schema(example = "Updated Working Capital Loan Product for merchants")
         public String description;
+        @Schema(example = "2075e308-d4a8-44d9-8203-f5a947b8c2f4")
+        public String externalId;
         @Schema(example = "3")
         public Long fundId;
         @Schema(example = "10 July 2022")


Reply via email to