diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeCreateRequestMapper.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeCreateRequestMapper.java
index db83e4c..6b7e022 100644
--- a/fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeCreateRequestMapper.java
+++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeCreateRequestMapper.java
@@ -28,5 +28,6 @@
 public interface PaymentTypeCreateRequestMapper {
 
     @Mapping(ignore = true, target = "id")
+    @Mapping(target = "isSystemDefined", expression = "java(Boolean.TRUE.equals(source.getIsSystemDefined()))")
     PaymentType map(PaymentTypeCreateRequest source);
 }
diff --git a/fineract-e2e-tests-core/build.gradle b/fineract-e2e-tests-core/build.gradle
index 885c2fc..747a62e 100644
--- a/fineract-e2e-tests-core/build.gradle
+++ b/fineract-e2e-tests-core/build.gradle
@@ -58,7 +58,6 @@
 
 dependencies {
     testImplementation(project(':fineract-avro-schemas'))
-    testImplementation(project(':fineract-client'))
     testImplementation(project(':fineract-client-feign'))
 
     testImplementation 'org.springframework:spring-context'
@@ -69,6 +68,7 @@
 
     testImplementation 'com.squareup.retrofit2:retrofit:2.11.0'
     testImplementation 'io.github.openfeign:feign-core:13.6'
+    testImplementation 'io.github.openfeign:feign-jackson:13.6'
     testImplementation 'org.apache.httpcomponents:httpclient:4.5.14'
     testImplementation 'org.apache.commons:commons-lang3:3.18.0'
     testImplementation 'com.google.guava:guava'
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/config/CacheConfiguration.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/config/CacheConfiguration.java
index 6d1fe56..45552a7 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/config/CacheConfiguration.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/config/CacheConfiguration.java
@@ -37,6 +37,8 @@
                 new ConcurrentMapCache("jobsByShortName"), //
                 new ConcurrentMapCache("loanProductsByName"), //
                 new ConcurrentMapCache("accountTypesByName"), //
+                new ConcurrentMapCache("chargeTypesByName"), //
+                new ConcurrentMapCache("delinquencyBucketsByName"), //
                 new ConcurrentMapCache("codeValuesByName")));//
         return simpleCacheManager;
     }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductResolver.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductResolver.java
new file mode 100644
index 0000000..cfb48be
--- /dev/null
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductResolver.java
@@ -0,0 +1,51 @@
+/**
+ * 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.data;
+
+import static org.apache.fineract.client.feign.util.FeignCalls.ok;
+
+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.ChargeData;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class ChargeProductResolver {
+
+    private final FineractFeignClient fineractClient;
+
+    @Cacheable(key = "#chargeType.getName()", value = "chargeTypesByName")
+    public long resolve(ChargeProductType chargeType) {
+        String chargeProductTypeName = chargeType.getName();
+        log.debug("Resolving charge product type by name [{}]", chargeProductTypeName);
+        List<ChargeData> chargeProductsResponses = ok(() -> fineractClient.charges().retrieveAllCharges(Map.of()));
+        ChargeData foundAtr = chargeProductsResponses.stream()//
+                .filter(atr -> chargeProductTypeName.equals(atr.getName()))//
+                .findAny()//
+                .orElseThrow(() -> new IllegalArgumentException("Charge product [%s] not found".formatted(chargeProductTypeName)));//
+
+        return foundAtr.getId();
+    }
+}
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java
index 11e570e..3dd2afa 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java
@@ -18,34 +18,34 @@
  */
 package org.apache.fineract.test.data;
 
+import lombok.Getter;
+
+@Getter
 public enum ChargeProductType {
 
-    LOAN_PERCENTAGE_LATE_FEE(1L), //
-    LOAN_PERCENTAGE_PROCESSING_FEE(2L), //
-    LOAN_FIXED_LATE_FEE(3L), //
-    LOAN_FIXED_RETURNED_PAYMENT_FEE(4L), //
-    LOAN_SNOOZE_FEE(5L), //
-    LOAN_NSF_FEE(6L), //
-    LOAN_DISBURSEMENT_PERCENTAGE_FEE(7L), //
-    LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE(8L), //
-    LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST(9L), //
-    LOAN_PERCENTAGE_LATE_FEE_AMOUNT_PLUS_INTEREST(10L), //
-    CLIENT_TEST_CHARGE_FEE(11L), //
-    LOAN_DISBURSEMENT_CHARGE(12L), //
-    CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_AMOUNT(13L), //
-    CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT(14L), //
-    LOAN_INSTALLMENT_FEE_FLAT(15L), //
-    LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT(16L), //
-    LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST(17L), //
-    LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_FEE(18L); //
+    LOAN_PERCENTAGE_LATE_FEE("% Late fee"), //
+    LOAN_PERCENTAGE_PROCESSING_FEE("% Processing fee"), //
+    LOAN_FIXED_LATE_FEE("Fixed Late fee"), //
+    LOAN_FIXED_RETURNED_PAYMENT_FEE("Fixed Returned payment fee"), //
+    LOAN_SNOOZE_FEE("Snooze fee"), //
+    LOAN_NSF_FEE("NSF fee"), //
+    LOAN_DISBURSEMENT_PERCENTAGE_FEE("Disbursement percentage fee"), //
+    LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE("Tranche Disbursement percentage fee"), //
+    LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST("Installment percentage amount + interest fee"), //
+    LOAN_PERCENTAGE_LATE_FEE_AMOUNT_PLUS_INTEREST("% Late fee amount+interest"), //
+    CLIENT_TEST_CHARGE_FEE("Fixed fee for Client"), //
+    LOAN_DISBURSEMENT_CHARGE("Disbursement Charge"), //
+    CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_AMOUNT("Tranche Disbursement Charge Amount"), //
+    CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT("Tranche Disbursement Charge Percent"), //
+    LOAN_INSTALLMENT_FEE_FLAT("Installment flat fee"), //
+    LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT("Installment percentage amount fee"), //
+    LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST("Installment percentage interest fee"), //
+    LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_FEE("Disbursement percentage amount + interest fee"); //
 
-    public final Long value;
+    public final String name;
 
-    ChargeProductType(Long value) {
-        this.value = value;
+    ChargeProductType(String name) {
+        this.name = name;
     }
 
-    public Long getValue() {
-        return value;
-    }
 }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/DelinquencyBucket.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/DelinquencyBucket.java
index a089092..07bef4e 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/DelinquencyBucket.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/DelinquencyBucket.java
@@ -18,13 +18,17 @@
  */
 package org.apache.fineract.test.data;
 
+import org.apache.fineract.test.data.delinquency.DelinquencyBucketType;
+
 public enum DelinquencyBucket {
 
-    BASIC_DELINQUENCY_BUCKET(1);
+    BASIC_DELINQUENCY_BUCKET(DelinquencyBucketType.REGULAR), //
+    WC_DELINQUENCY_BUCKET(DelinquencyBucketType.WORKING_CAPITAL), //
+    ;
 
-    public final Integer value;
+    public final DelinquencyBucketType type;
 
-    DelinquencyBucket(Integer value) {
-        this.value = value;
+    DelinquencyBucket(DelinquencyBucketType type) {
+        this.type = type;
     }
 }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/codevalue/DefaultCodeValue.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/codevalue/DefaultCodeValue.java
index 29cfe91..391c3f7 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/codevalue/DefaultCodeValue.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/codevalue/DefaultCodeValue.java
@@ -26,7 +26,9 @@
     OTHER("Other"), //
     BAD_DEBT("Bad Debt"), //
     FORGIVEN("Forgiven"), //
-    TEST("Test"); //
+    // Reschedule reason
+    TEST("Test"), //
+    ; //
 
     private final String customName;
 
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/delinquency/DelinquencyBucketResolver.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/delinquency/DelinquencyBucketResolver.java
new file mode 100644
index 0000000..ea238a5
--- /dev/null
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/delinquency/DelinquencyBucketResolver.java
@@ -0,0 +1,52 @@
+/**
+ * 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.data.delinquency;
+
+import static org.apache.fineract.client.feign.util.FeignCalls.ok;
+
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.client.feign.FineractFeignClient;
+import org.apache.fineract.client.models.DelinquencyBucketResponse;
+import org.apache.fineract.test.data.DelinquencyBucket;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class DelinquencyBucketResolver {
+
+    private final FineractFeignClient fineractClient;
+
+    @Cacheable(key = "#delinquencyBucket.name()", value = "delinquencyBucketsByName")
+    public long resolve(DelinquencyBucket delinquencyBucket) {
+        String delinquencyBucketName = delinquencyBucket.name();
+        log.debug("Resolving account type by name [{}]", delinquencyBucketName);
+        List<DelinquencyBucketResponse> delinquencyBucketResponses = ok(
+                () -> fineractClient.delinquencyRangeAndBucketsManagement().getBuckets());
+        DelinquencyBucketResponse foundAtr = delinquencyBucketResponses.stream()//
+                .filter(atr -> delinquencyBucketName.equals(atr.getName()))//
+                .findAny()//
+                .orElseThrow(() -> new IllegalArgumentException("Delinquency bucket [%s] not found".formatted(delinquencyBucketName)));//
+
+        return foundAtr.getId();
+    }
+}
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
index 965b314..02a4732 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
@@ -55,6 +55,7 @@
 import org.apache.fineract.test.data.accounttype.DefaultAccountType;
 import org.apache.fineract.test.data.codevalue.CodeValueResolver;
 import org.apache.fineract.test.data.codevalue.DefaultCodeValue;
+import org.apache.fineract.test.data.delinquency.DelinquencyBucketResolver;
 import org.apache.fineract.test.data.paymenttype.DefaultPaymentType;
 import org.apache.fineract.test.data.paymenttype.PaymentTypeResolver;
 import org.apache.fineract.test.helper.CodeHelper;
@@ -69,6 +70,7 @@
     private final PaymentTypeResolver paymentTypeResolver;
     private final AccountTypeResolver accountTypeResolver;
     private final CodeValueResolver codeValueResolver;
+    private final DelinquencyBucketResolver delinquencyBucketResolver;
 
     private final Set<String> productShortNameMap = new HashSet<>();
 
@@ -117,7 +119,6 @@
     public static final Integer CASH_ACCOUNTING_RULE = AccountingRule.CASH_BASED.value;
     public static final String OVER_APPLIED_CALCULATION_TYPE = OverAppliedCalculationType.PERCENTAGE.value;
     public static final Integer OVER_APPLIED_NUMBER = 50;
-    public static final Integer DELINQUENCY_BUCKET_ID = DelinquencyBucket.BASIC_DELINQUENCY_BUCKET.value;
     public static final Integer PRE_CLOSURE_INTEREST_CALCULATION_RULE_TILL_PRE_CLOSE_DATE = PreClosureInterestCalculationRule.TILL_PRE_CLOSE_DATE.value;
     public static final Integer ADVANCE_PAYMENT_ADJUSTMENT_TYPE_REDUCE_EMI_AMOUNT = AdvancePaymentsAdjustmentType.REDUCE_EMI_AMOUNT.value;
     public static final Integer INTEREST_RECALCULATION_COMPOUND_METHOD_INTEREST = InterestRecalculationCompoundingMethod.INTEREST.value;
@@ -223,7 +224,7 @@
                 .allowApprovedDisbursedAmountsOverApplied(true)//
                 .overAppliedCalculationType(OVER_APPLIED_CALCULATION_TYPE)//
                 .overAppliedNumber(OVER_APPLIED_NUMBER)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -331,7 +332,7 @@
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
                 .allowApprovedDisbursedAmountsOverApplied(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -439,7 +440,7 @@
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
                 .allowApprovedDisbursedAmountsOverApplied(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -543,7 +544,7 @@
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
                 .allowApprovedDisbursedAmountsOverApplied(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -656,7 +657,7 @@
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
                 .allowApprovedDisbursedAmountsOverApplied(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -716,7 +717,7 @@
                 .dateFormat(DATE_FORMAT)//
                 .daysInMonthType(DAYS_IN_MONTH_TYPE_30)//
                 .daysInYearType(DAYS_IN_YEAR_TYPE_360)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .digitsAfterDecimal(2)//
                 .disallowExpectedDisbursements(true)//
                 .dueDaysForRepaymentEvent(1)//
@@ -890,7 +891,7 @@
                 .allowApprovedDisbursedAmountsOverApplied(true)//
                 .overAppliedCalculationType(OVER_APPLIED_CALCULATION_TYPE)//
                 .overAppliedNumber(OVER_APPLIED_NUMBER)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1001,7 +1002,7 @@
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
                 .allowApprovedDisbursedAmountsOverApplied(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1111,7 +1112,7 @@
                 .dateFormat(DATE_FORMAT)//
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1241,7 +1242,7 @@
                 .dateFormat(DATE_FORMAT)//
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1362,7 +1363,7 @@
                 .allowApprovedDisbursedAmountsOverApplied(true)//
                 .overAppliedCalculationType(OVER_APPLIED_CALCULATION_TYPE)//
                 .overAppliedNumber(OVER_APPLIED_NUMBER)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1490,7 +1491,7 @@
                 .dateFormat(DATE_FORMAT)//
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1601,7 +1602,7 @@
                 .allowApprovedDisbursedAmountsOverApplied(true)//
                 .overAppliedCalculationType(OVER_APPLIED_CALCULATION_TYPE)//
                 .overAppliedNumber(OVER_APPLIED_NUMBER)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1747,7 +1748,7 @@
                 .dateFormat(DATE_FORMAT)//
                 .locale(LOCALE_EN)//
                 .disallowExpectedDisbursements(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
                 .incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 .incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
@@ -1871,7 +1872,7 @@
                         .graceOnPrincipalAndInterestPayment(true)//
                         .graceOnArrearsAgeing(true))//
                 .isEqualAmortization(false)//
-                .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET))//
                 .enableDownPayment(false)//
                 .enableInstallmentLevelDelinquency(true)//
                 .loanScheduleType("PROGRESSIVE") //
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java
index f3c2d43..2f07386 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java
@@ -46,6 +46,8 @@
 import org.apache.fineract.test.data.accounttype.DefaultAccountType;
 import org.apache.fineract.test.data.loanproduct.DefaultLoanProduct;
 import org.apache.fineract.test.data.loanproduct.LoanProductResolver;
+import org.apache.fineract.test.data.paymenttype.DefaultPaymentType;
+import org.apache.fineract.test.data.paymenttype.PaymentTypeResolver;
 import org.apache.fineract.test.helper.Utils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -56,6 +58,8 @@
 
     @Autowired
     private LoanProductResolver loanProductResolver;
+    @Autowired
+    private PaymentTypeResolver paymentTypeResolver;
 
     public static final String DATE_FORMAT = "dd MMMM yyyy";
     public static final String DEFAULT_LOCALE = "en";
@@ -68,8 +72,6 @@
     public static final Double DEFAULT_CHARGEBACK_TRANSACTION_AMOUNT = 250.00;
     public static final Double DEFAULT_CHARGE_ADJUSTMENT_TRANSACTION_AMOUNT = 10.00;
     public static final String DEFAULT_EXTERNAL_ID = "";
-    public static final Long DEFAULT_PAYMENT_TYPE_ID = 4L;
-    public static final Long DEFAULT_PAYMENT_TYPE_ID_CHARGEBACK = 8L;
     public static final BigDecimal DEFAULT_PRINCIPAL = BigDecimal.valueOf(1000L);
     public static final BigDecimal DEFAULT_APPROVED_AMOUNT = BigDecimal.valueOf(1000L);
     public static final BigDecimal DEFAULT_DISBURSED_AMOUNT = BigDecimal.valueOf(1000L);
@@ -186,15 +188,15 @@
                 .principal(DEFAULT_PRINCIPAL.longValue());//
     }
 
-    public static PutLoansLoanIdRequest enableFraudFlag() {
+    public PutLoansLoanIdRequest enableFraudFlag() {
         return new PutLoansLoanIdRequest().fraud(true);
     }
 
-    public static PutLoansLoanIdRequest disableFraudFlag() {
+    public PutLoansLoanIdRequest disableFraudFlag() {
         return new PutLoansLoanIdRequest().fraud(false);
     }
 
-    public static PostLoansLoanIdRequest defaultLoanApproveRequest() {
+    public PostLoansLoanIdRequest defaultLoanApproveRequest() {
         return new PostLoansLoanIdRequest()//
                 .approvedOnDate(DATE_SUBMIT_STRING)//
                 .expectedDisbursementDate(DATE_SUBMIT_STRING)//
@@ -203,99 +205,99 @@
                 .locale(DEFAULT_LOCALE);//
     }
 
-    public static PostLoansLoanIdRequest defaultLoanRejectRequest() {
+    public PostLoansLoanIdRequest defaultLoanRejectRequest() {
         return new PostLoansLoanIdRequest()//
                 .rejectedOnDate(DATE_REJECT_STRING)//
                 .dateFormat(DATE_FORMAT)//
                 .locale(DEFAULT_LOCALE);//
     }
 
-    public static PostLoansLoanIdRequest defaultLoanWithdrawnRequest() {
+    public PostLoansLoanIdRequest defaultLoanWithdrawnRequest() {
         return new PostLoansLoanIdRequest()//
                 .withdrawnOnDate(DATE_WITHDRAWN_STRING)//
                 .dateFormat(DATE_FORMAT)//
                 .locale(DEFAULT_LOCALE);//
     }
 
-    public static PostLoansLoanIdRequest defaultLoanDisburseRequest() {
+    public PostLoansLoanIdRequest defaultLoanDisburseRequest() {
         return new PostLoansLoanIdRequest().actualDisbursementDate(DATE_SUBMIT_STRING).transactionAmount(DEFAULT_DISBURSED_AMOUNT)
-                .paymentTypeId(Math.toIntExact(DEFAULT_PAYMENT_TYPE_ID)).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
+                .paymentTypeId(Math.toIntExact(paymentTypeResolver.resolve(DefaultPaymentType.AUTOPAY))).dateFormat(DATE_FORMAT)
+                .locale(DEFAULT_LOCALE);
     }
 
-    public static PostAddAndDeleteDisbursementDetailRequest defaultLoanDisbursementDetailRequest(
-            List<DisbursementDetail> disbursementData) {
+    public PostAddAndDeleteDisbursementDetailRequest defaultLoanDisbursementDetailRequest(List<DisbursementDetail> disbursementData) {
         return new PostAddAndDeleteDisbursementDetailRequest().disbursementData(disbursementData).dateFormat(DATE_FORMAT)
                 .locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultPaymentTransactionRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultPaymentTransactionRequest() {
         return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
-                .transactionAmount(DEFAULT_PAYMENT_TRANSACTION_AMOUNT).paymentTypeId(DEFAULT_PAYMENT_TYPE_ID).dateFormat(DATE_FORMAT)
-                .locale(DEFAULT_LOCALE);
+                .transactionAmount(DEFAULT_PAYMENT_TRANSACTION_AMOUNT)
+                .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.AUTOPAY)).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultRepaymentRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultRepaymentRequest() {
         return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
-                .transactionAmount(DEFAULT_REPAYMENT_TRANSACTION_AMOUNT).paymentTypeId(DEFAULT_PAYMENT_TYPE_ID).dateFormat(DATE_FORMAT)
-                .locale(DEFAULT_LOCALE);
+                .transactionAmount(DEFAULT_REPAYMENT_TRANSACTION_AMOUNT)
+                .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.AUTOPAY)).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultRefundRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultRefundRequest() {
         return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
-                .transactionAmount(DEFAULT_REPAYMENT_TRANSACTION_AMOUNT).paymentTypeId(DEFAULT_PAYMENT_TYPE_ID).dateFormat(DATE_FORMAT)
-                .locale(DEFAULT_LOCALE);
+                .transactionAmount(DEFAULT_REPAYMENT_TRANSACTION_AMOUNT)
+                .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.AUTOPAY)).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsTransactionIdRequest defaultRepaymentUndoRequest() {
+    public PostLoansLoanIdTransactionsTransactionIdRequest defaultRepaymentUndoRequest() {
         return new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
                 .transactionAmount(DEFAULT_UNDO_TRANSACTION_AMOUNT).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsTransactionIdRequest defaultCapitalizedIncomeAdjustmentUndoRequest() {
+    public PostLoansLoanIdTransactionsTransactionIdRequest defaultCapitalizedIncomeAdjustmentUndoRequest() {
         return new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
                 .transactionAmount(DEFAULT_UNDO_TRANSACTION_AMOUNT).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsTransactionIdRequest defaultRepaymentAdjustRequest(double amount) {
+    public PostLoansLoanIdTransactionsTransactionIdRequest defaultRepaymentAdjustRequest(double amount) {
         return new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(DEFAULT_TRANSACTION_DATE).transactionAmount(amount)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsTransactionIdRequest defaultTransactionUndoRequest() {
+    public PostLoansLoanIdTransactionsTransactionIdRequest defaultTransactionUndoRequest() {
         return new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
                 .transactionAmount(DEFAULT_UNDO_TRANSACTION_AMOUNT).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsTransactionIdRequest defaultRefundUndoRequest() {
+    public PostLoansLoanIdTransactionsTransactionIdRequest defaultRefundUndoRequest() {
         return new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
                 .transactionAmount(DEFAULT_UNDO_TRANSACTION_AMOUNT).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsTransactionIdRequest defaultChargebackRequest() {
+    public PostLoansLoanIdTransactionsTransactionIdRequest defaultChargebackRequest() {
         return new PostLoansLoanIdTransactionsTransactionIdRequest().transactionAmount(DEFAULT_CHARGEBACK_TRANSACTION_AMOUNT)
-                .locale(DEFAULT_LOCALE).paymentTypeId(DEFAULT_PAYMENT_TYPE_ID_CHARGEBACK);
+                .locale(DEFAULT_LOCALE).paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.REPAYMENT_ADJUSTMENT_CHARGEBACK));
     }
 
-    public static PostLoansLoanIdChargesChargeIdRequest defaultChargeAdjustmentRequest() {
+    public PostLoansLoanIdChargesChargeIdRequest defaultChargeAdjustmentRequest() {
         return new PostLoansLoanIdChargesChargeIdRequest().amount(DEFAULT_CHARGE_ADJUSTMENT_TRANSACTION_AMOUNT)
                 .externalId(DEFAULT_EXTERNAL_ID);
     }
 
-    public static PostLoansLoanIdTransactionsTransactionIdRequest defaultChargeAdjustmentTransactionUndoRequest() {
+    public PostLoansLoanIdTransactionsTransactionIdRequest defaultChargeAdjustmentTransactionUndoRequest() {
         return new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(DEFAULT_TRANSACTION_DATE)
                 .transactionAmount(DEFAULT_UNDO_TRANSACTION_AMOUNT).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultChargeOffRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultChargeOffRequest() {
         return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE).dateFormat(DATE_FORMAT)
                 .locale(DEFAULT_LOCALE);
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultUndoChargeOffRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultUndoChargeOffRequest() {
         return new PostLoansLoanIdTransactionsRequest();
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultReAgingRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultReAgingRequest() {
         return new PostLoansLoanIdTransactionsRequest()//
                 .dateFormat(DATE_FORMAT)//
                 .locale(DEFAULT_LOCALE)//
@@ -305,17 +307,17 @@
                 .numberOfInstallments(DEFAULT_NUMBER_OF_INSTALLMENTS);//
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultLoanReAmortizationRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultLoanReAmortizationRequest() {
         return new PostLoansLoanIdTransactionsRequest().dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
     }
 
-    public static PostUpdateRescheduleLoansRequest defaultLoanRescheduleUpdateRequest() {
+    public PostUpdateRescheduleLoansRequest defaultLoanRescheduleUpdateRequest() {
         return new PostUpdateRescheduleLoansRequest()//
                 .locale(DEFAULT_LOCALE)//
                 .dateFormat(DATE_FORMAT);
     }
 
-    public static PostCreateRescheduleLoansRequest defaultLoanRescheduleCreateRequest(Long loanId, String fromDate, String toDate) {
+    public PostCreateRescheduleLoansRequest defaultLoanRescheduleCreateRequest(Long loanId, String fromDate, String toDate) {
         return new PostCreateRescheduleLoansRequest()//
                 .submittedOnDate(DATE_SUBMIT_STRING)//
                 .rescheduleFromDate(fromDate)//
@@ -326,30 +328,30 @@
                 .dateFormat(DATE_FORMAT);
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultWriteOffRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultWriteOffRequest() {
         return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE).dateFormat(DATE_FORMAT)
                 .locale(DEFAULT_LOCALE).note("Write Off");
     }
 
-    public static InterestPauseRequestDto defaultInterestPauseRequest() {
+    public InterestPauseRequestDto defaultInterestPauseRequest() {
         return new InterestPauseRequestDto().dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE).startDate(DEFAULT_TRANSACTION_DATE)
                 .endDate(DEFAULT_TRANSACTION_DATE);
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultCapitalizedIncomeRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultCapitalizedIncomeRequest() {
         return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE).dateFormat(DATE_FORMAT)
                 .locale(DEFAULT_LOCALE).note("Capitalized Income");
     }
 
-    public static PostLoansLoanIdRequest defaultContractTerminationUndoRequest() {
+    public PostLoansLoanIdRequest defaultContractTerminationUndoRequest() {
         return new PostLoansLoanIdRequest().note("Contract Termination Undo");
     }
 
-    public static PostLoansLoanIdRequest defaultLoanContractTerminationRequest() {
+    public PostLoansLoanIdRequest defaultLoanContractTerminationRequest() {
         return new PostLoansLoanIdRequest().dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE).note("Contract Termination");
     }
 
-    public static PostLoansLoanIdTransactionsRequest defaultBuyDownFeeIncomeRequest() {
+    public PostLoansLoanIdTransactionsRequest defaultBuyDownFeeIncomeRequest() {
         return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE).dateFormat(DATE_FORMAT)
                 .locale(DEFAULT_LOCALE).note("Buy Down Fee");
     }
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
index 3a50b67..be3c460 100644
--- 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
@@ -34,7 +34,6 @@
 import lombok.RequiredArgsConstructor;
 import org.apache.fineract.client.feign.FineractFeignClient;
 import org.apache.fineract.client.models.DelinquencyBucketRequest;
-import org.apache.fineract.client.models.DelinquencyBucketResponse;
 import org.apache.fineract.client.models.MinimumPaymentPeriodAndRule;
 import org.apache.fineract.client.models.PaymentAllocationOrder;
 import org.apache.fineract.client.models.PostAllowAttributeOverrides;
@@ -47,8 +46,10 @@
 import org.apache.fineract.client.models.WorkingCapitalBreachRequest;
 import org.apache.fineract.client.models.WorkingCapitalNearBreachData;
 import org.apache.fineract.client.models.WorkingCapitalNearBreachRequest;
+import org.apache.fineract.test.data.DelinquencyBucket;
 import org.apache.fineract.test.data.accounttype.AccountTypeResolver;
 import org.apache.fineract.test.data.accounttype.DefaultAccountType;
+import org.apache.fineract.test.data.delinquency.DelinquencyBucketResolver;
 import org.apache.fineract.test.data.delinquency.DelinquencyBucketType;
 import org.apache.fineract.test.data.delinquency.DelinquencyFrequencyType;
 import org.apache.fineract.test.data.delinquency.DelinquencyMinimumPayment;
@@ -64,10 +65,10 @@
     private final LoanProductsRequestFactory loanProductsRequestFactory;
     private final FineractFeignClient fineractClient;
     private final AccountTypeResolver accountTypeResolver;
+    private final DelinquencyBucketResolver delinquencyBucketResolver;
 
     public static final String WCLP_NAME_PREFIX = "WCLP-";
     public static final String WCLP_DESCRIPTION = "Working Capital Loan Product";
-    public static final String DEFAULT_WC_DELINQUENCY_BUCKET_NAME = "Default Working Capital delinquency bucket";
     public static final String DEFAULT_WC_BREACH_NAME = "Default Working Capital breach";
     public static final String DEFAULT_WC_NEAR_BREACH_NAME = "Default Working Capital near breach";
     public static final String PENALTY = "PENALTY";
@@ -139,7 +140,7 @@
                 .maxPrincipal(new BigDecimal(100000))//
                 .amortizationType(PostWorkingCapitalLoanProductsRequest.AmortizationTypeEnum.EIR)//
                 .npvDayCount(DAYS_IN_YEAR_TYPE_360)//
-                .delinquencyBucketId(getWCDelinquencyBucketIdByName(DEFAULT_WC_DELINQUENCY_BUCKET_NAME))//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.WC_DELINQUENCY_BUCKET))//
                 .dateFormat(DATE_FORMAT)//
                 .locale(LOCALE_EN)//
                 .accountingRule(AccountingRuleEnum.NONE)//
@@ -208,7 +209,7 @@
                 .discount(new BigDecimal(50)) //
                 .amortizationType(PutWorkingCapitalLoanProductsProductIdRequest.AmortizationTypeEnum.EIR)//
                 .npvDayCount(DAYS365.value)//
-                .delinquencyBucketId(getWCDelinquencyBucketIdByName(DEFAULT_WC_DELINQUENCY_BUCKET_NAME))//
+                .delinquencyBucketId(delinquencyBucketResolver.resolve(DelinquencyBucket.WC_DELINQUENCY_BUCKET))//
                 .dateFormat(DATE_FORMAT)//
                 .locale(LOCALE_EN)//
                 .allowAttributeOverrides(allowAttributeOverrides)//
@@ -293,16 +294,6 @@
                 .locale(LOCALE_EN);
     }
 
-    private Long getWCDelinquencyBucketIdByName(String bucketName) {
-        try {
-            List<DelinquencyBucketResponse> buckets = fineractClient.delinquencyRangeAndBucketsManagement().getBuckets(Map.of());
-            return buckets.stream().filter(b -> bucketName.equals(b.getName())).findFirst().map(DelinquencyBucketResponse::getId)
-                    .orElseThrow(() -> new RuntimeException("Working Capital delinquency bucket not found with name: " + bucketName));
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to fetch Working Capital delinquency bucket by name: " + bucketName, e);
-        }
-    }
-
     private Long getWCBreachIdByName(String breachName) {
         try {
             List<WorkingCapitalBreachData> breaches = fineractClient.workingCapitalBreaches().retrieveAllWorkingCapitalBreaches(Map.of());
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ParallelExecutionHelper.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ParallelExecutionHelper.java
new file mode 100644
index 0000000..f657387
--- /dev/null
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ParallelExecutionHelper.java
@@ -0,0 +1,66 @@
+/**
+ * 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.helper;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+public final class ParallelExecutionHelper {
+
+    private ParallelExecutionHelper() {}
+
+    private static final int CLEANUP_THREAD_COUNT = 10;
+
+    public static <T, R> void runInParallel(List<T> items, Consumer<T> action) {
+        mapInParallel(items, id -> {
+            action.accept(id);
+            return null;
+        });
+    }
+
+    public static void runInParallel(List<Runnable> items) {
+        runInParallel(items, Runnable::run);
+    }
+
+    private static <T, R> List<R> mapInParallel(List<T> items, Function<T, R> action) {
+        if (items.isEmpty()) {
+            return List.of();
+        }
+        try (ExecutorService executor = Executors.newFixedThreadPool(Math.min(CLEANUP_THREAD_COUNT, items.size()))) {
+            List<Future<R>> futures = items.stream().map(item -> executor.submit(() -> action.apply(item))).toList();
+            return futures.stream().map(ParallelExecutionHelper::getFutureResult).toList();
+        }
+    }
+
+    private static <T> T getFutureResult(Future<T> future) {
+        try {
+            return future.get();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new IllegalStateException("Interrupted during parallel loan cleanup", e);
+        } catch (ExecutionException e) {
+            throw new IllegalStateException("Parallel loan cleanup failed", e);
+        }
+    }
+}
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/messaging/event/EventCheckHelper.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/messaging/event/EventCheckHelper.java
index ba88693..ab37d73 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/messaging/event/EventCheckHelper.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/messaging/event/EventCheckHelper.java
@@ -106,13 +106,19 @@
     @Autowired
     private org.apache.fineract.test.messaging.config.EventProperties eventProperties;
 
-    private void waitForTransactionCommit() {
-        if (eventProperties.isEventVerificationEnabled() && TRANSACTION_COMMIT_DELAY_MS > 0) {
+    public void waitForTransactionCommit() {
+        if (TRANSACTION_COMMIT_DELAY_MS > 0) {
+            sleepIfEventVerificationEnabled(TRANSACTION_COMMIT_DELAY_MS);
+        }
+    }
+
+    public void sleepIfEventVerificationEnabled(long sleepInMs) {
+        if (eventProperties.isEventVerificationEnabled()) {
             try {
-                Thread.sleep(TRANSACTION_COMMIT_DELAY_MS);
+                Thread.sleep(sleepInMs);
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
-                throw new RuntimeException("Interrupted while waiting for transaction commit", e);
+                throw new RuntimeException("Thread interrupted while waiting...", e);
             }
         }
     }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java
index 74e85cd..3b1416d 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java
@@ -65,6 +65,7 @@
 import org.apache.fineract.client.models.PostLoansResponse;
 import org.apache.fineract.client.models.PostUpdateRescheduleLoansRequest;
 import org.apache.fineract.client.models.PostUsersResponse;
+import org.apache.fineract.test.data.ChargeProductResolver;
 import org.apache.fineract.test.data.ChargeProductType;
 import org.apache.fineract.test.data.LoanRescheduleErrorMessage;
 import org.apache.fineract.test.data.LoanStatus;
@@ -112,7 +113,6 @@
     private static final Header HEADER = new Header().name("Content-type").value("text/html");
     private static final Header HEADER_JSON = new Header().name("Content-type").value("application/json");
     private static final String BODY_GET_REQUEST = "{}";
-    private static final Long CHARGE_ID_NFS_FEE = ChargeProductType.LOAN_NSF_FEE.value;
     private static final String ERROR_DEVELOPER_MESSAGE = "The requested resource is not available.";
     private static final Integer ERROR_HTTP_404 = 404;
     private static final String ERROR_DEVELOPER_MESSAGE_CLIENT = "Client with identifier {externalId} does not exist";
@@ -135,6 +135,9 @@
     @Autowired
     private LoanRequestFactory loanRequestFactory;
 
+    @Autowired
+    private ChargeProductResolver chargeProductResolver;
+
     private BatchApiApi batchApiApi() {
         return fineractFeignClient.batch();
     }
@@ -182,7 +185,7 @@
         String dateOfCharge = formatter.format(Utils.now().minusMonths(1L).plusDays(1L));
 
         PostLoansLoanIdChargesRequest loanIdChargesRequest = new PostLoansLoanIdChargesRequest();
-        loanIdChargesRequest.chargeId(CHARGE_ID_NFS_FEE);
+        loanIdChargesRequest.chargeId(chargeProductResolver.resolve(ChargeProductType.LOAN_NSF_FEE));
         loanIdChargesRequest.amount(25D);
         loanIdChargesRequest.dueDate(dateOfCharge);
         loanIdChargesRequest.dateFormat(DATE_FORMAT);
@@ -248,7 +251,7 @@
         batchRequest2.body(bodyLoansRequestMod);
 
         // request 3 - approve Loan
-        PostLoansLoanIdRequest loanApproveRequest = LoanRequestFactory.defaultLoanApproveRequest();
+        PostLoansLoanIdRequest loanApproveRequest = loanRequestFactory.defaultLoanApproveRequest();
         String bodyLoanApproveRequest = toJson(loanApproveRequest);
 
         BatchRequest batchRequest3 = new BatchRequest();
@@ -260,7 +263,7 @@
         batchRequest3.body(bodyLoanApproveRequest);
 
         // request 4 - disburse Loan
-        PostLoansLoanIdRequest loanDisburseRequest = LoanRequestFactory.defaultLoanDisburseRequest();
+        PostLoansLoanIdRequest loanDisburseRequest = loanRequestFactory.defaultLoanDisburseRequest();
         String bodyLoanDisburseRequest = toJson(loanDisburseRequest);
 
         BatchRequest batchRequest4 = new BatchRequest();
@@ -272,7 +275,7 @@
         batchRequest4.body(bodyLoanDisburseRequest);
 
         // request 5 - repayment with idempotency key
-        PostLoansLoanIdTransactionsRequest loanRepaymentRequest1 = LoanRequestFactory.defaultRepaymentRequest();
+        PostLoansLoanIdTransactionsRequest loanRepaymentRequest1 = loanRequestFactory.defaultRepaymentRequest();
         String bodyLoanRepaymentRequest1 = toJson(loanRepaymentRequest1);
 
         String idempotencyKey = UUID.randomUUID().toString();
@@ -287,7 +290,7 @@
         batchRequest5.body(bodyLoanRepaymentRequest1);
 
         // request 6 - repayment with same idempotency key
-        PostLoansLoanIdTransactionsRequest loanRepaymentRequest2 = LoanRequestFactory.defaultRepaymentRequest();
+        PostLoansLoanIdTransactionsRequest loanRepaymentRequest2 = loanRequestFactory.defaultRepaymentRequest();
         String bodyLoanRepaymentRequest2 = toJson(loanRepaymentRequest2);
 
         BatchRequest batchRequest6 = new BatchRequest();
@@ -624,7 +627,7 @@
 
     private BatchRequest createLoanReschedule(Long requestId, Long loanId, String fromDateStr, String toDateStr, String submittedOnDate,
             String idempotencyKey, Long referenceId) {
-        PostCreateRescheduleLoansRequest rescheduleLoansRequest = LoanRequestFactory.defaultLoanRescheduleCreateRequest(loanId, fromDateStr,
+        PostCreateRescheduleLoansRequest rescheduleLoansRequest = loanRequestFactory.defaultLoanRescheduleCreateRequest(loanId, fromDateStr,
                 toDateStr);
         rescheduleLoansRequest.setSubmittedOnDate(submittedOnDate);
         String bodyLoanRescheduleRequest = toJson(rescheduleLoansRequest);
@@ -646,7 +649,7 @@
     }
 
     private BatchRequest approveLoanReschedule(Long requestId, String idempotencyKey, String approvedOnDate, Long referenceId) {
-        PostUpdateRescheduleLoansRequest rescheduleLoansRequest = LoanRequestFactory.defaultLoanRescheduleUpdateRequest();
+        PostUpdateRescheduleLoansRequest rescheduleLoansRequest = loanRequestFactory.defaultLoanRescheduleUpdateRequest();
         rescheduleLoansRequest.setApprovedOnDate(approvedOnDate);
         String bodyLoanRescheduleRequest = toJson(rescheduleLoansRequest);
 
@@ -1017,7 +1020,7 @@
         requestList.add(approveLoanByExternalId(3L, 2L, idempotencyKey));
 
         // Disburse loan
-        PostLoansLoanIdRequest loanDisburseRequest = LoanRequestFactory.defaultLoanDisburseRequest();
+        PostLoansLoanIdRequest loanDisburseRequest = loanRequestFactory.defaultLoanDisburseRequest();
         String bodyLoanDisburseRequest = toJson(loanDisburseRequest);
         BatchRequest disburseRequest = new BatchRequest();
         disburseRequest.requestId(4L);
@@ -1072,7 +1075,7 @@
         requestList.add(approveLoanByExternalId(3L, 2L, idempotencyKey));
 
         // Disburse loan
-        PostLoansLoanIdRequest loanDisburseRequest = LoanRequestFactory.defaultLoanDisburseRequest();
+        PostLoansLoanIdRequest loanDisburseRequest = loanRequestFactory.defaultLoanDisburseRequest();
         String bodyLoanDisburseRequest = toJson(loanDisburseRequest);
         BatchRequest disburseRequest = new BatchRequest();
         disburseRequest.requestId(4L);
@@ -1246,7 +1249,7 @@
     }
 
     private BatchRequest approveLoanByExternalId(Long requestId, Long referenceId, String idempotencyKey) {
-        PostLoansLoanIdRequest loanApproveRequest = LoanRequestFactory.defaultLoanApproveRequest();
+        PostLoansLoanIdRequest loanApproveRequest = loanRequestFactory.defaultLoanApproveRequest();
         String bodyLoanApproveRequest = toJson(loanApproveRequest);
 
         BatchRequest batchRequest = new BatchRequest();
@@ -1261,7 +1264,7 @@
     }
 
     private BatchRequest approveLoanByExternalIdFail(Long requestId, Long referenceId, String idempotencyKey, String loanExternalId) {
-        PostLoansLoanIdRequest loanApproveRequest = LoanRequestFactory.defaultLoanApproveRequest();
+        PostLoansLoanIdRequest loanApproveRequest = loanRequestFactory.defaultLoanApproveRequest();
         String bodyLoanApproveRequest = toJson(loanApproveRequest);
 
         BatchRequest batchRequest = new BatchRequest();
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/ChargeStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/ChargeStepDef.java
index ef494a4..62f0557 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/ChargeStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/ChargeStepDef.java
@@ -24,6 +24,7 @@
 import org.apache.fineract.client.feign.FineractFeignClient;
 import org.apache.fineract.client.models.ChargeRequest;
 import org.apache.fineract.test.data.ChargeCalculationType;
+import org.apache.fineract.test.data.ChargeProductResolver;
 import org.apache.fineract.test.data.ChargeProductType;
 import org.apache.fineract.test.stepdef.AbstractStepDef;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +34,9 @@
     @Autowired
     private FineractFeignClient fineractClient;
 
+    @Autowired
+    private ChargeProductResolver chargeProductResolver;
+
     @When("Admin updates charge {string} with {string} calculation type and {double} % of transaction amount")
     public void updateCharge(String chargeType, String chargeCalculationType, double amount) {
         ChargeRequest disbursementChargeUpdateRequest = new ChargeRequest();
@@ -40,7 +44,7 @@
         disbursementChargeUpdateRequest.chargeCalculationType(chargeProductTypeValue.value).amount(amount).locale("en");
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        Long chargeId = chargeProductType.getValue();
+        Long chargeId = chargeProductResolver.resolve(chargeProductType);
 
         ok(() -> fineractClient.charges().updateCharge(chargeId, disbursementChargeUpdateRequest));
     }
@@ -52,7 +56,7 @@
         disbursementChargeUpdateRequest.chargeCalculationType(chargeProductTypeValue.value).amount(flatAmount).locale("en");
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        Long chargeId = chargeProductType.getValue();
+        Long chargeId = chargeProductResolver.resolve(chargeProductType);
 
         ok(() -> fineractClient.charges().updateCharge(chargeId, disbursementChargeUpdateRequest));
     }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeAdjustmentStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeAdjustmentStepDef.java
index dda5777..733a1cf 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeAdjustmentStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeAdjustmentStepDef.java
@@ -40,6 +40,7 @@
 import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdResponse;
 import org.apache.fineract.client.models.PostLoansLoanIdTransactionsTransactionIdRequest;
 import org.apache.fineract.client.models.PostLoansResponse;
+import org.apache.fineract.test.data.ChargeProductResolver;
 import org.apache.fineract.test.data.ChargeProductType;
 import org.apache.fineract.test.factory.LoanRequestFactory;
 import org.apache.fineract.test.helper.ErrorMessageHelper;
@@ -62,6 +63,10 @@
     private EventCheckHelper eventCheckHelper;
     @Autowired
     private EventStore eventStore;
+    @Autowired
+    private ChargeProductResolver chargeProductResolver;
+    @Autowired
+    private LoanRequestFactory loanRequestFactory;
 
     @When("Admin makes a charge adjustment for the last {string} type charge which is due on {string} with {double} EUR transaction amount and externalId {string}")
     public void makeLoanChargeAdjustment(String chargeTypeEnum, String date, Double transactionAmount, String externalId)
@@ -85,7 +90,7 @@
                 () -> fineractClient.loans().retrieveLoan(loanId, Map.of("associations", "charges")));
 
         Long transactionId = getTransactionIdForLastChargeMetConditions(chargeTypeEnum, date, loanDetailsResponse);
-        PostLoansLoanIdChargesChargeIdRequest chargeAdjustmentRequest = LoanRequestFactory.defaultChargeAdjustmentRequest().amount(amount)
+        PostLoansLoanIdChargesChargeIdRequest chargeAdjustmentRequest = loanRequestFactory.defaultChargeAdjustmentRequest().amount(amount)
                 .externalId("");
 
         Integer httpStatusCodeExpected = 403;
@@ -128,7 +133,7 @@
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
         String businessDateActual = formatter.format(businessDate);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest chargeAdjustmentUndoRequest = LoanRequestFactory
+        PostLoansLoanIdTransactionsTransactionIdRequest chargeAdjustmentUndoRequest = loanRequestFactory
                 .defaultChargeAdjustmentTransactionUndoRequest().transactionDate(businessDateActual);
 
         ok(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId, transactionId, chargeAdjustmentUndoRequest,
@@ -162,7 +167,7 @@
 
     private void makeChargeAdjustmentCall(Long loanId, Long transactionId, String externalId, double transactionAmount) throws IOException {
         eventStore.reset();
-        PostLoansLoanIdChargesChargeIdRequest chargeAdjustmentRequest = LoanRequestFactory.defaultChargeAdjustmentRequest()
+        PostLoansLoanIdChargesChargeIdRequest chargeAdjustmentRequest = loanRequestFactory.defaultChargeAdjustmentRequest()
                 .amount(transactionAmount).externalId(externalId);
 
         PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResponse = ok(
@@ -177,7 +182,7 @@
         List<GetLoansLoanIdLoanChargeData> charges = loanDetailsResponse.getCharges();
 
         ChargeProductType chargeType = ChargeProductType.valueOf(chargeTypeEnum);
-        Long chargeProductId = chargeType.getValue();
+        Long chargeProductId = chargeProductResolver.resolve(chargeType);
 
         List<GetLoansLoanIdLoanChargeData> resultList = new ArrayList<>();
         charges.forEach(charge -> {
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeBackStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeBackStepDef.java
index a036d27..e0b812a 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeBackStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeBackStepDef.java
@@ -64,6 +64,8 @@
 
     @Autowired
     EventStore eventStore;
+    @Autowired
+    private LoanRequestFactory loanRequestFactory;
 
     @When("Admin makes {string} chargeback with {double} EUR transaction amount")
     public void makeLoanChargeback(String repaymentType, double transactionAmount) throws IOException {
@@ -145,7 +147,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest chargebackRequest = LoanRequestFactory.defaultChargebackRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest chargebackRequest = loanRequestFactory.defaultChargebackRequest()
                 .paymentTypeId(paymentTypeValue).transactionAmount(transactionAmount);
 
         PostLoansLoanIdTransactionsResponse chargebackResponse = ok(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeStepDef.java
index 385b52a..d85e822 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanChargeStepDef.java
@@ -44,6 +44,7 @@
 import org.apache.fineract.client.models.PostLoansResponse;
 import org.apache.fineract.client.models.PutChargeTransactionChangesRequest;
 import org.apache.fineract.client.models.PutChargeTransactionChangesResponse;
+import org.apache.fineract.test.data.ChargeProductResolver;
 import org.apache.fineract.test.data.ChargeProductType;
 import org.apache.fineract.test.data.ErrorMessageType;
 import org.apache.fineract.test.factory.LoanChargeRequestFactory;
@@ -73,6 +74,8 @@
     private EventCheckHelper eventCheckHelper;
     @Autowired
     private EventStore eventStore;
+    @Autowired
+    private ChargeProductResolver chargeProductResolver;
 
     @When("Admin adds {string} due date charge with {string} due date and {double} EUR transaction amount")
     public void addChargeDueDate(String chargeType, String transactionDate, double transactionAmount) throws IOException {
@@ -80,10 +83,10 @@
         long loanId = loanResponse.getLoanId();
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        Long chargeTypeId = chargeProductType.getValue();
-        if (chargeTypeId.equals(ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_FEE.getValue())
-                || chargeTypeId.equals(ChargeProductType.LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE.getValue())
-                || chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.getValue())) {
+        Long chargeTypeId = chargeProductResolver.resolve(chargeProductType);
+        if (chargeType.equals(ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_FEE.name())
+                || chargeType.equals(ChargeProductType.LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE.name())
+                || chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.name())) {
             throw new IllegalStateException(String.format("The requested %s charge is NOT due date type, cannot be used here", chargeType));
         }
 
@@ -104,11 +107,11 @@
         long loanId = loanResponse.getLoanId();
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        Long chargeTypeId = chargeProductType.getValue();
-        if (!chargeTypeId.equals(ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_FEE.getValue())
-                && !chargeTypeId.equals(ChargeProductType.LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE.getValue())
-                && !chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT.getValue())
-                && !chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.getValue())) {
+        Long chargeTypeId = chargeProductResolver.resolve(chargeProductType);
+        if (!chargeType.equals(ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_FEE.name())
+                && !chargeType.equals(ChargeProductType.LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE.name())
+                && !chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT.name())
+                && !chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.name())) {
             throw new IllegalStateException(String.format("The requested %s charge is due date type, cannot be used here", chargeType));
         }
 
@@ -127,11 +130,11 @@
         final long loanId = loanResponse.getLoanId();
 
         final ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        final Long chargeTypeId = chargeProductType.getValue();
-        if (!chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT.getValue())
-                && !chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT.getValue())
-                && !chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.getValue())
-                && !chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.getValue())) {
+        final Long chargeTypeId = chargeProductResolver.resolve(chargeProductType);
+        if (!chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT.name())
+                && !chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT.name())
+                && !chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.name())
+                && !chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.name())) {
             throw new IllegalStateException(
                     String.format("The requested %s charge is not installment fee type, cannot be used here", chargeType));
         }
@@ -151,7 +154,7 @@
 
         final long loanId = loanResponse.getLoanId();
         final ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        final Long chargeTypeId = chargeProductType.getValue();
+        final Long chargeTypeId = chargeProductResolver.resolve(chargeProductType);
 
         final PostLoansLoanIdChargesRequest loanIdChargesRequest = LoanChargeRequestFactory.defaultLoanChargeRequest()
                 .chargeId(chargeTypeId).amount(amount);
@@ -162,9 +165,10 @@
         } catch (FeignException e) {
             final ErrorResponse errorDetails = ErrorResponse.fromFeignException(e);
             assertThat(errorDetails.getHttpStatusCode()).isEqualTo(400);
-            String expectedMessage = chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.getValue())
-                    ? ErrorMessageHelper.addInstallmentFeeInterestPercentageChargeFailure()
-                    : ErrorMessageHelper.addInstallmentFeePrincipalPercentageChargeFailure();
+            String expectedMessage = chargeTypeId
+                    .equals(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST))
+                            ? ErrorMessageHelper.addInstallmentFeeInterestPercentageChargeFailure()
+                            : ErrorMessageHelper.addInstallmentFeePrincipalPercentageChargeFailure();
             assertThat(errorDetails.getSingleError().getDeveloperMessage()).contains(expectedMessage);
         }
     }
@@ -175,7 +179,7 @@
         long loanId = loanResponse.getLoanId();
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        Long chargeTypeId = chargeProductType.getValue();
+        Long chargeTypeId = chargeProductResolver.resolve(chargeProductType);
 
         PostLoansLoanIdChargesRequest loanIdChargesRequest = LoanChargeRequestFactory.defaultLoanChargeRequest().chargeId(chargeTypeId)
                 .dueDate(transactionDate).amount(transactionAmount);
@@ -197,8 +201,8 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
         PostLoansLoanIdChargesRequest loanIdChargesRequest = LoanChargeRequestFactory.defaultLoanChargeRequest()
-                .chargeId(ChargeProductType.LOAN_PERCENTAGE_PROCESSING_FEE.value).amount(chargeAmount).dueDate(date)
-                .dateFormat(DEFAULT_DATE_FORMAT).locale(locale);
+                .chargeId(chargeProductResolver.resolve(ChargeProductType.LOAN_PERCENTAGE_PROCESSING_FEE)).amount(chargeAmount)
+                .dueDate(date).dateFormat(DEFAULT_DATE_FORMAT).locale(locale);
 
         PostLoansLoanIdChargesResponse loanChargeResponse = ok(
                 () -> fineractClient.loanCharges().executeLoanCharge(loanId, loanIdChargesRequest, Map.<String, Object>of()));
@@ -212,8 +216,8 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
         PostLoansLoanIdChargesRequest loanIdChargesRequest = LoanChargeRequestFactory.defaultLoanChargeRequest()
-                .chargeId(ChargeProductType.LOAN_PERCENTAGE_PROCESSING_FEE.value).amount(chargeAmount).dueDate(date)
-                .dateFormat(DEFAULT_DATE_FORMAT).locale(locale);
+                .chargeId(chargeProductResolver.resolve(ChargeProductType.LOAN_PERCENTAGE_PROCESSING_FEE)).amount(chargeAmount)
+                .dueDate(date).dateFormat(DEFAULT_DATE_FORMAT).locale(locale);
 
         PostLoansLoanIdChargesResponse loanChargeResponse = ok(
                 () -> fineractClient.loanCharges().executeLoanCharge(loanId, loanIdChargesRequest, Map.<String, Object>of()));
@@ -226,7 +230,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
         PostLoansLoanIdChargesRequest loanIdChargesRequest = LoanChargeRequestFactory.defaultLoanChargeRequest()
-                .chargeId(ChargeProductType.LOAN_NSF_FEE.value).amount(DEFAULT_CHARGE_FEE_FLAT).dueDate(date)
+                .chargeId(chargeProductResolver.resolve(ChargeProductType.LOAN_NSF_FEE)).amount(DEFAULT_CHARGE_FEE_FLAT).dueDate(date)
                 .dateFormat(DEFAULT_DATE_FORMAT);
 
         PostLoansLoanIdChargesResponse loanChargeResponse = ok(
@@ -326,10 +330,10 @@
         String errorMessageExpected = String.format(errorMessageExpectedRaw, loanId);
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargeType);
-        Long chargeTypeId = chargeProductType.getValue();
-        if (chargeTypeId.equals(ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_FEE.getValue())
-                || chargeTypeId.equals(ChargeProductType.LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE.getValue())
-                || chargeTypeId.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.getValue())) {
+        Long chargeTypeId = chargeProductResolver.resolve(chargeProductType);
+        if (chargeType.equals(ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_FEE.name())
+                || chargeType.equals(ChargeProductType.LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE.name())
+                || chargeType.equals(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.name())) {
             throw new IllegalStateException(String.format("The requested %s charge is NOT due date type, cannot be used here", chargeType));
         }
 
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanDelinquencyStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanDelinquencyStepDef.java
index e309ac0..90469f0 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanDelinquencyStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanDelinquencyStepDef.java
@@ -561,14 +561,13 @@
                 .as(ErrorMessageHelper.nrOfLinesWrongInInstallmentLevelDelinquencyData(installmentLevelDelinquency.size(), data.size() - 1))
                 .isEqualTo(data.size() - 1);
         for (int i = 1; i < data.size(); i++) {
-            DelinquencyRange expectedDelinquencyRange = DelinquencyRange.valueOf(data.get(i).get(1));
+            DelinquencyRange expectedDelinquencyRange = DelinquencyRange.valueOf(data.get(i).get(0));
             String expectedDelinquencyRangeValue = expectedDelinquencyRange.getValue();
 
             List<String> expectedValuesList = data.get(i);
-            expectedValuesList.set(1, expectedDelinquencyRangeValue);
+            expectedValuesList.set(0, expectedDelinquencyRangeValue);
 
-            List<String> actualValuesList = List.of(String.valueOf(installmentLevelDelinquency.get(i - 1).getRangeId()),
-                    installmentLevelDelinquency.get(i - 1).getClassification(),
+            List<String> actualValuesList = List.of(installmentLevelDelinquency.get(i - 1).getClassification(),
                     installmentLevelDelinquency.get(i - 1).getDelinquentAmount().setScale(2, RoundingMode.HALF_DOWN).toString());
             assertThat(actualValuesList)
                     .as(ErrorMessageHelper.wrongValueInLineInInstallmentLevelDelinquencyData(i, actualValuesList, expectedValuesList))
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanInterestPauseStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanInterestPauseStepDef.java
index 78858be..056b751 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanInterestPauseStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanInterestPauseStepDef.java
@@ -52,13 +52,14 @@
 
     private final EventAssertion eventAssertion;
     private final FineractFeignClient fineractClient;
+    private final LoanRequestFactory loanRequestFactory;
 
     @Then("Create an interest pause period with start date {string} and end date {string}")
     public void interestPauseCreate(final String startDate, final String endDate) throws IOException {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
-        final InterestPauseRequestDto interestPauseRequest = LoanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
+        final InterestPauseRequestDto interestPauseRequest = loanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
                 .endDate(endDate);
         final CommandProcessingResult interestPauseResponse = ok(
                 () -> fineractClient.loanInterestPause().createLoanInterestPause(loanId, interestPauseRequest));
@@ -89,7 +90,7 @@
         final Long variationId = testContext().get(TestContextKey.INTEREST_PAUSE_VARIATION_ID);
         Assertions.assertNotNull(variationId, "Interest pause variation ID must be set before update");
 
-        final InterestPauseRequestDto interestPauseRequest = LoanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
+        final InterestPauseRequestDto interestPauseRequest = loanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
                 .endDate(endDate);
         ok(() -> fineractClient.loanInterestPause().updateLoanInterestPause(loanId, variationId, interestPauseRequest));
     }
@@ -100,7 +101,7 @@
         Assertions.assertNotNull(loanResponse);
         final Long loanId = loanResponse.getLoanId();
 
-        final InterestPauseRequestDto interestPauseRequest = LoanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
+        final InterestPauseRequestDto interestPauseRequest = loanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
                 .endDate(endDate);
 
         CallFailedRuntimeException exception = fail(
@@ -115,7 +116,7 @@
         Assertions.assertNotNull(loanResponse);
         final Long loanId = loanResponse.getLoanId();
 
-        final InterestPauseRequestDto interestPauseRequest = LoanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
+        final InterestPauseRequestDto interestPauseRequest = loanRequestFactory.defaultInterestPauseRequest().startDate(startDate)
                 .endDate(endDate);
 
         CallFailedRuntimeException exception = fail(
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanOriginationStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanOriginationStepDef.java
index 699e1fd..d93a03e 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanOriginationStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanOriginationStepDef.java
@@ -444,7 +444,7 @@
         long loanId = getLoanId();
         eventStore.reset();
 
-        PostLoansLoanIdRequest approveRequest = LoanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
+        PostLoansLoanIdRequest approveRequest = loanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
                 .approvedLoanAmount(new BigDecimal(approvedAmount)).expectedDisbursementDate(expectedDisbursementDate);
 
         PostLoansLoanIdResponse loanApproveResponse = ok(
@@ -617,7 +617,7 @@
         PostLoansLoanIdTransactionsResponse repaymentResponse = testContext().get(TestContextKey.LOAN_REPAYMENT_RESPONSE);
         Long originalTransactionId = repaymentResponse.getResourceId();
 
-        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = LoanRequestFactory.defaultRepaymentUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = loanRequestFactory.defaultRepaymentUndoRequest()
                 .transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         ok(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId, originalTransactionId, repaymentUndoRequest,
@@ -634,7 +634,7 @@
         PostLoansLoanIdTransactionsResponse repaymentResponse = testContext().get(TestContextKey.LOAN_REPAYMENT_RESPONSE);
         Long originalTransactionId = repaymentResponse.getResourceId();
 
-        PostLoansLoanIdTransactionsTransactionIdRequest repaymentAdjustRequest = LoanRequestFactory
+        PostLoansLoanIdTransactionsTransactionIdRequest repaymentAdjustRequest = loanRequestFactory
                 .defaultRepaymentAdjustRequest(transactionAmount).transactionDate(transactionDate).dateFormat(DATE_FORMAT)
                 .locale(DEFAULT_LOCALE);
 
@@ -658,7 +658,7 @@
                 .filter(t -> "loanTransactionType.waiveCharges".equals(t.getType().getCode())).map(GetLoansLoanIdTransactions::getId)
                 .findFirst().orElseThrow(() -> new IllegalStateException("Waiver transaction not found on loan " + loanId));
 
-        PostLoansLoanIdTransactionsTransactionIdRequest undoRequest = LoanRequestFactory.defaultRepaymentUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest undoRequest = loanRequestFactory.defaultRepaymentUndoRequest()
                 .transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         ok(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId, waiveTransactionId, undoRequest,
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAgingStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAgingStepDef.java
index 3f46a3f..6e02cea 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAgingStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAgingStepDef.java
@@ -64,6 +64,7 @@
 
     private final EventAssertion eventAssertion;
     private final FineractFeignClient fineractClient;
+    private final LoanRequestFactory loanRequestFactory;
 
     @When("Admin creates a Loan re-aging transaction with the following data:")
     public void createReAgingTransaction(DataTable table) throws IOException {
@@ -71,7 +72,7 @@
         long loanId = loanResponse.getLoanId();
 
         PostLoansLoanIdTransactionsRequest reAgingRequest = setReAgeingRequestProperties(//
-                LoanRequestFactory.defaultReAgingRequest(), //
+                loanRequestFactory.defaultReAgingRequest(), //
                 table.row(0), //
                 table.row(1) //
         );
@@ -87,7 +88,7 @@
         String loanExternalId = loanResponse.getResourceExternalId();
 
         PostLoansLoanIdTransactionsRequest reAgingRequest = setReAgeingRequestProperties(//
-                LoanRequestFactory.defaultReAgingRequest(), //
+                loanRequestFactory.defaultReAgingRequest(), //
                 table.row(0), //
                 table.row(1) //
         );
@@ -387,7 +388,7 @@
         String loanExternalId = loanResponse.getResourceExternalId();
 
         PostLoansLoanIdTransactionsRequest reAgingRequest = setReAgeingRequestProperties(//
-                LoanRequestFactory.defaultReAgingRequest(), //
+                loanRequestFactory.defaultReAgingRequest(), //
                 table.row(0), //
                 table.row(1) //
         );
@@ -403,7 +404,7 @@
         final long loanId = loanResponse.getLoanId();
 
         PostLoansLoanIdTransactionsRequest reAgingRequest = setReAgeingRequestProperties(//
-                LoanRequestFactory.defaultReAgingRequest(), //
+                loanRequestFactory.defaultReAgingRequest(), //
                 table.row(0), //
                 table.row(1) //
         );
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAmortizationStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAmortizationStepDef.java
index 08540db..1f2f4de 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAmortizationStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanReAmortizationStepDef.java
@@ -57,13 +57,14 @@
 
     private final FineractFeignClient fineractClient;
     private final EventAssertion eventAssertion;
+    private final LoanRequestFactory loanRequestFactory;
 
     @When("Admin creates a Loan re-amortization transaction on current business date")
     public void createLoanReAmortization() {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest reAmortizationRequest = LoanRequestFactory.defaultLoanReAmortizationRequest();
+        PostLoansLoanIdTransactionsRequest reAmortizationRequest = loanRequestFactory.defaultLoanReAmortizationRequest();
 
         PostLoansLoanIdTransactionsResponse response = ok(() -> fineractClient.loanTransactions().executeLoanTransaction(loanId,
                 reAmortizationRequest, Map.of("command", "reAmortize")));
@@ -75,7 +76,7 @@
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         final Long loanId = loanResponse.getLoanId();
 
-        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = LoanRequestFactory.defaultLoanReAmortizationRequest()
+        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = loanRequestFactory.defaultLoanReAmortizationRequest()
                 .reAmortizationInterestHandling(reAmortizationInterestHandling);
 
         fail(() -> fineractClient.loanTransactions().executeLoanTransaction(loanId, reAmortizationRequest,
@@ -87,7 +88,7 @@
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         final Long loanId = loanResponse.getLoanId();
 
-        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = LoanRequestFactory.defaultLoanReAmortizationRequest()
+        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = loanRequestFactory.defaultLoanReAmortizationRequest()
                 .reAmortizationInterestHandling(reAmortizationInterestHandling);
 
         final PostLoansLoanIdTransactionsResponse response = ok(() -> fineractClient.loanTransactions().executeLoanTransaction(loanId,
@@ -100,7 +101,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         String loanExternalId = loanResponse.getResourceExternalId();
 
-        PostLoansLoanIdTransactionsRequest reAmortizationRequest = LoanRequestFactory.defaultLoanReAmortizationRequest();
+        PostLoansLoanIdTransactionsRequest reAmortizationRequest = loanRequestFactory.defaultLoanReAmortizationRequest();
 
         PostLoansLoanIdTransactionsResponse response = ok(() -> fineractClient.loanTransactions()
                 .executeLoanTransactionByLoanExternalId(loanExternalId, reAmortizationRequest, Map.of("command", "reAmortize")));
@@ -122,7 +123,7 @@
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         final Long loanId = loanResponse.getLoanId();
 
-        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = LoanRequestFactory.defaultLoanReAmortizationRequest();
+        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = loanRequestFactory.defaultLoanReAmortizationRequest();
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().executeLoanTransaction(loanId,
                 reAmortizationRequest, Map.of("command", "reAmortize")));
@@ -134,7 +135,7 @@
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         final Long loanId = loanResponse.getLoanId();
 
-        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = LoanRequestFactory.defaultLoanReAmortizationRequest()
+        final PostLoansLoanIdTransactionsRequest reAmortizationRequest = loanRequestFactory.defaultLoanReAmortizationRequest()
                 .reAmortizationInterestHandling(reAmortizationInterestHandling);
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().executeLoanTransaction(loanId,
@@ -187,7 +188,7 @@
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         final Long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest reAmortizationRequest = LoanRequestFactory.defaultLoanReAmortizationRequest();
+        PostLoansLoanIdTransactionsRequest reAmortizationRequest = loanRequestFactory.defaultLoanReAmortizationRequest();
         if (reAmortizationInterestHandling != null) {
             reAmortizationRequest.reAmortizationInterestHandling(reAmortizationInterestHandling);
         }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRepaymentStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRepaymentStepDef.java
index 3f96666..370e65c 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRepaymentStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRepaymentStepDef.java
@@ -93,6 +93,9 @@
     @Autowired
     private org.apache.fineract.test.api.ApiProperties apiProperties;
 
+    @Autowired
+    private LoanRequestFactory loanRequestFactory;
+
     @And("Customer makes {string} repayment on {string} with {double} EUR transaction amount")
     public void makeLoanRepayment(String repaymentType, String transactionDate, double transactionAmount) throws IOException {
         makeRepayment(repaymentType, transactionDate, transactionAmount, null);
@@ -120,7 +123,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest repaymentRequest = LoanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest repaymentRequest = loanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         String idempotencyKey = UUID.randomUUID().toString();
@@ -144,7 +147,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest repaymentRequest = LoanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest repaymentRequest = loanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         String idempotencyKey = UUID.randomUUID().toString();
@@ -175,7 +178,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest repaymentRequest = LoanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest repaymentRequest = loanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         String idempotencyKey = UUID.randomUUID().toString();
@@ -200,7 +203,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest repaymentRequest = LoanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest repaymentRequest = loanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         String idempotencyKey = UUID.randomUUID().toString();
@@ -230,7 +233,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest repaymentRequest = LoanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest repaymentRequest = loanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         try {
@@ -254,7 +257,7 @@
 
         PostLoansLoanIdTransactionsResponse repaymentResponse = testContext().get(TestContextKey.LOAN_REPAYMENT_RESPONSE);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = LoanRequestFactory.defaultRepaymentUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = loanRequestFactory.defaultRepaymentUndoRequest()
                 .transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         try {
@@ -277,7 +280,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest repaymentRequest = LoanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest repaymentRequest = loanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().executeLoanTransaction(loanId, repaymentRequest,
@@ -291,7 +294,7 @@
         eventStore.reset();
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdTransactionsRequest refundRequest = LoanRequestFactory.defaultRefundRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest refundRequest = loanRequestFactory.defaultRefundRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeResolver.resolve(AUTOPAY)).dateFormat(DATE_FORMAT)
                 .locale(DEFAULT_LOCALE).accountNumber(DEFAULT_ACCOUNT_NB).checkNumber(DEFAULT_CHECK_NB).receiptNumber(DEFAULT_RECEIPT_NB)
                 .bankNumber(DEFAULT_BANK_NB);
@@ -309,7 +312,7 @@
         long loanId = loanResponse.getLoanId();
         PostLoansLoanIdTransactionsResponse refundResponse = testContext().get(TestContextKey.LOAN_REFUND_RESPONSE);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest refundUndoRequest = LoanRequestFactory.defaultRefundUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest refundUndoRequest = loanRequestFactory.defaultRefundUndoRequest()
                 .transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         PostLoansLoanIdTransactionsResponse refundUndoResponse = ok(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
@@ -335,7 +338,7 @@
         long loanId = loanResponse.getLoanId();
         PostLoansLoanIdTransactionsResponse repaymentResponse = testContext().get(TestContextKey.LOAN_REPAYMENT_RESPONSE);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = LoanRequestFactory.defaultRepaymentUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = loanRequestFactory.defaultRepaymentUndoRequest()
                 .transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         PostLoansLoanIdTransactionsResponse repaymentUndoResponse = ok(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
@@ -360,7 +363,7 @@
         long loanId = loanResponse.getLoanId();
         PostLoansLoanIdTransactionsResponse repaymentResponse = testContext().get(transactionType);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = LoanRequestFactory.defaultRepaymentUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = loanRequestFactory.defaultRepaymentUndoRequest()
                 .transactionAmount(transactionAmount);
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
@@ -382,7 +385,7 @@
         GetLoansLoanIdTransactions targetTransaction = transactions.stream().filter(t -> Boolean.TRUE.equals(t.getType().getRepayment()))
                 .toList().get(nthItem);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = LoanRequestFactory.defaultRepaymentUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = loanRequestFactory.defaultRepaymentUndoRequest()
                 .transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         PostLoansLoanIdTransactionsResponse repaymentUndoResponse = ok(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
@@ -405,7 +408,7 @@
         GetLoansLoanIdTransactions targetTransaction = transactions.stream()
                 .filter(t -> Boolean.TRUE.equals(t.getType().getCapitalizedIncomeAdjustment())).toList().get(nthItem);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest capitalizedIncomeUndoRequest = LoanRequestFactory
+        PostLoansLoanIdTransactionsTransactionIdRequest capitalizedIncomeUndoRequest = loanRequestFactory
                 .defaultCapitalizedIncomeAdjustmentUndoRequest().transactionDate(transactionDate);
 
         PostLoansLoanIdTransactionsResponse capitalizedIncomeUndoResponse = ok(() -> fineractClient.loanTransactions()
@@ -429,7 +432,7 @@
         GetLoansLoanIdTransactions targetTransaction = transactions.stream()
                 .filter(t -> transactionDate.equals(formatter.format(t.getDate()))).toList().get(nthItem);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = LoanRequestFactory.defaultTransactionUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = loanRequestFactory.defaultTransactionUndoRequest()
                 .transactionDate(transactionDate);
 
         PostLoansLoanIdTransactionsResponse transactionUndoResponse = ok(() -> fineractClient.loanTransactions()
@@ -452,7 +455,7 @@
         GetLoansLoanIdTransactions targetTransaction = eventCheckHelper.getNthTransactionType(nthItemStr, transactionType, transactionDate,
                 transactions);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = LoanRequestFactory.defaultTransactionUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = loanRequestFactory.defaultTransactionUndoRequest()
                 .transactionDate(transactionDate);
 
         PostLoansLoanIdTransactionsResponse transactionUndoResponse = ok(() -> fineractClient.loanTransactions()
@@ -470,7 +473,7 @@
         GetLoansLoanIdTransactions targetTransaction = eventCheckHelper.findNthTransaction(nthItemStr, transactionType, transactionDate,
                 loanId);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = LoanRequestFactory.defaultTransactionUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = loanRequestFactory.defaultTransactionUndoRequest()
                 .transactionDate(transactionDate);
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
@@ -507,7 +510,7 @@
         GetLoansLoanIdTransactions targetTransaction = eventCheckHelper.findNthTransaction(nthItemStr, transactionType, transactionDate,
                 loanId);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = LoanRequestFactory.defaultTransactionUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = loanRequestFactory.defaultTransactionUndoRequest()
                 .transactionDate(transactionDate);
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
@@ -527,7 +530,7 @@
         GetLoansLoanIdTransactions targetTransaction = eventCheckHelper.findNthTransaction(nthItemStr, transactionType, transactionDate,
                 loanId);
 
-        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = LoanRequestFactory.defaultTransactionUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = loanRequestFactory.defaultTransactionUndoRequest()
                 .transactionDate(transactionDate);
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
@@ -556,7 +559,7 @@
 
         GetLoansLoanIdTransactions targetTransaction = eventCheckHelper.getNthTransactionType(nthItemStr, transactionType, transactionDate,
                 transactions);
-        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = LoanRequestFactory.defaultTransactionUndoRequest()
+        PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = loanRequestFactory.defaultTransactionUndoRequest()
                 .transactionDate(transactionDate);
         PostLoansLoanIdTransactionsResponse transactionUndoResponse = ok(() -> fineractClient.loanTransactions()
                 .adjustLoanTransaction(loanId, targetTransaction.getId(), transactionUndoRequest, Map.<String, Object>of()));
@@ -652,7 +655,7 @@
         GetLoansLoanIdTransactions targetTransaction = transactions.stream().filter(t -> Boolean.TRUE.equals(t.getType().getRepayment()))
                 .toList().get(nthItem);
         double amountValue = Double.parseDouble(amount);
-        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = LoanRequestFactory.defaultRepaymentAdjustRequest(amountValue)
+        PostLoansLoanIdTransactionsTransactionIdRequest repaymentUndoRequest = loanRequestFactory.defaultRepaymentAdjustRequest(amountValue)
                 .transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         PostLoansLoanIdTransactionsResponse repaymentAdjustmentResponse = ok(() -> fineractClient.loanTransactions()
@@ -709,7 +712,7 @@
             return transactionDate.equals(formatter.format(t.getDate()));
         }).toList().get(nthItem);
 
-        final PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = LoanRequestFactory.defaultTransactionUndoRequest()
+        final PostLoansLoanIdTransactionsTransactionIdRequest transactionUndoRequest = loanRequestFactory.defaultTransactionUndoRequest()
                 .transactionDate(transactionDate);
 
         final CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().adjustLoanTransaction(loanId,
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRescheduleStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRescheduleStepDef.java
index 2f982a9..c9be00c 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRescheduleStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanRescheduleStepDef.java
@@ -41,6 +41,9 @@
 import org.apache.fineract.client.models.PostLoansResponse;
 import org.apache.fineract.client.models.PostUpdateRescheduleLoansRequest;
 import org.apache.fineract.test.data.LoanRescheduleErrorMessage;
+import org.apache.fineract.test.data.codevalue.CodeNames;
+import org.apache.fineract.test.data.codevalue.CodeValueResolver;
+import org.apache.fineract.test.data.codevalue.DefaultCodeValue;
 import org.apache.fineract.test.helper.ErrorMessageHelper;
 import org.apache.fineract.test.messaging.event.EventCheckHelper;
 import org.apache.fineract.test.messaging.store.EventStore;
@@ -62,6 +65,8 @@
     private EventStore eventStore;
     @Autowired
     private EventCheckHelper eventCheckHelper;
+    @Autowired
+    private CodeValueResolver codeValueResolver;
 
     @When("Admin creates and approves Loan reschedule with the following data:")
     public void createAndApproveLoanReschedule(DataTable table) throws IOException {
@@ -92,7 +97,7 @@
                 .graceOnInterest(graceOnInterest)//
                 .extraTerms(extraTerms)//
                 .newInterestRate(newInterestRate)//
-                .rescheduleReasonId(54L)//
+                .rescheduleReasonId(codeValueResolver.resolve(CodeNames.LOAN_RESCHEDULE_REASON.getValue(), DefaultCodeValue.TEST.getName()))//
                 .rescheduleReasonComment("")//
                 .dateFormat("dd MMMM yyyy")//
                 .locale("en");//
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
index 99dda48..a2594c5 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
@@ -122,6 +122,7 @@
 import org.apache.fineract.client.models.PutLoansLoanIdRequest;
 import org.apache.fineract.client.models.PutLoansLoanIdResponse;
 import org.apache.fineract.test.data.AmortizationType;
+import org.apache.fineract.test.data.ChargeProductResolver;
 import org.apache.fineract.test.data.ChargeProductType;
 import org.apache.fineract.test.data.InterestCalculationPeriodTime;
 import org.apache.fineract.test.data.InterestRateFrequencyType;
@@ -203,6 +204,7 @@
     private final CodeHelper codeHelper;
     private final EventProperties eventProperties;
     private final JobPollingProperties jobPollingProperties;
+    private final ChargeProductResolver chargeProductResolver;
 
     private void storePaymentTransactionResponse(ApiResponse<PostLoansLoanIdTransactionsResponse> apiResponse) {
         testContext().set(TestContextKey.LOAN_PAYMENT_TRANSACTION_RESPONSE, apiResponse.getData());
@@ -313,7 +315,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue);
 
         String idempotencyKey = UUID.randomUUID().toString();
@@ -339,7 +341,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue);
 
         ApiResponse<PostLoansLoanIdTransactionsResponse> paymentTransactionApiResponse = ok(() -> fineractClient.loanTransactions()
@@ -362,7 +364,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue)
                 .externalId(externalId);
 
@@ -412,7 +414,7 @@
         final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        final PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        final PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue)
                 .interestRefundCalculation(interestRefundCalculation);
 
@@ -602,7 +604,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue);
 
         ApiResponse<PostLoansLoanIdTransactionsResponse> paymentTransactionApiResponse = ok(() -> fineractClient.loanTransactions()
@@ -615,13 +617,14 @@
 
     @When("Admin makes Credit Balance Refund transaction on {string} with {double} EUR transaction amount")
     public void createCBR(String transactionDate, double transactionAmount) throws IOException {
+        eventCheckHelper.sleepIfEventVerificationEnabled(1000L);
         eventStore.reset();
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
         String transactionTypeValue = "creditBalanceRefund";
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount);
 
         ApiResponse<PostLoansLoanIdTransactionsResponse> paymentTransactionApiResponse = ok(() -> fineractClient.loanTransactions()
@@ -659,7 +662,7 @@
         String errorMessageExpected = String.format("Loan: %s, Credit Balance Refund transaction cannot be created for the future.",
                 loanId);
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount);
 
         checkCBRerror(paymentTransactionRequest, errorCodeExpected, errorMessageExpected);
@@ -670,7 +673,7 @@
         int errorCodeExpected = 400;
         String errorMessageExpected = "Loan Credit Balance Refund is not allowed. Loan Account is not Overpaid.";
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount);
         checkCBRerror(paymentTransactionRequest, errorCodeExpected, errorMessageExpected);
     }
@@ -1429,7 +1432,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue);
 
         String idempotencyKey = testContext().get(TestContextKey.TRANSACTION_IDEMPOTENCY_KEY);
@@ -1450,7 +1453,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = LoanRequestFactory.defaultPaymentTransactionRequest()
+        PostLoansLoanIdTransactionsRequest paymentTransactionRequest = loanRequestFactory.defaultPaymentTransactionRequest()
                 .transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue);
 
         String idempotencyKey = testContext().get(TestContextKey.TRANSACTION_IDEMPOTENCY_KEY);
@@ -1538,7 +1541,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdRequest approveRequest = LoanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
+        PostLoansLoanIdRequest approveRequest = loanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
                 .approvedLoanAmount(new BigDecimal(approvedAmount)).expectedDisbursementDate(expectedDisbursementDate);
 
         PostLoansLoanIdResponse loanApproveResponse = ok(
@@ -1554,7 +1557,7 @@
     public void rejectLoan(String rejectDate) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest rejectRequest = LoanRequestFactory.defaultLoanRejectRequest().rejectedOnDate(rejectDate);
+        PostLoansLoanIdRequest rejectRequest = loanRequestFactory.defaultLoanRejectRequest().rejectedOnDate(rejectDate);
 
         PostLoansLoanIdResponse loanRejectResponse = ok(
                 () -> fineractClient.loans().stateTransitions(loanId, rejectRequest, Map.of("command", "reject")));
@@ -1569,7 +1572,7 @@
     public void withdrawnLoan(String withdrawnDate) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest withdawnRequest = LoanRequestFactory.defaultLoanWithdrawnRequest().withdrawnOnDate(withdrawnDate);
+        PostLoansLoanIdRequest withdawnRequest = loanRequestFactory.defaultLoanWithdrawnRequest().withdrawnOnDate(withdrawnDate);
 
         PostLoansLoanIdResponse loanWithdrawnResponse = ok(
                 () -> fineractClient.loans().stateTransitions(loanId, withdawnRequest, Map.of("command", "withdrawnByApplicant")));
@@ -1584,7 +1587,7 @@
     public void approveSecondLoan(String approveDate, String approvedAmount, String expectedDisbursementDate) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_SECOND_LOAN_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest approveRequest = LoanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
+        PostLoansLoanIdRequest approveRequest = loanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
                 .approvedLoanAmount(new BigDecimal(approvedAmount)).expectedDisbursementDate(expectedDisbursementDate);
 
         PostLoansLoanIdResponse loanApproveResponse = ok(
@@ -1610,7 +1613,7 @@
     public void failedLoanApproveWithDate(String approveDate, String approvedAmount, String expectedDisbursementDate) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest approveRequest = LoanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
+        PostLoansLoanIdRequest approveRequest = loanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
                 .approvedLoanAmount(new BigDecimal(approvedAmount)).expectedDisbursementDate(expectedDisbursementDate);
 
         CallFailedRuntimeException exception = fail(
@@ -1623,7 +1626,7 @@
     public void failedLoanApproveWithAmount(String approveDate, String approvedAmount, String expectedDisbursementDate) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest approveRequest = LoanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
+        PostLoansLoanIdRequest approveRequest = loanRequestFactory.defaultLoanApproveRequest().approvedOnDate(approveDate)
                 .approvedLoanAmount(new BigDecimal(approvedAmount)).expectedDisbursementDate(expectedDisbursementDate);
 
         CallFailedRuntimeException exception = fail(
@@ -1638,7 +1641,7 @@
         long loanId = loanResponse.getLoanId();
         String resourceId = String.valueOf(loanId);
 
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         PostLoansLoanIdResponse loanDisburseResponse = ok(
@@ -1690,7 +1693,7 @@
                 .expectedDisbursementDate(FORMATTER.format(LocalDate.parse(detail.getExpectedDisbursementDate(), parsingFormatter))));
         disbursementData.sort(Comparator.comparing(detail -> LocalDate.parse(detail.getExpectedDisbursementDate(), parsingFormatter)));
 
-        PostAddAndDeleteDisbursementDetailRequest disbursementDetailRequest = LoanRequestFactory
+        PostAddAndDeleteDisbursementDetailRequest disbursementDetailRequest = loanRequestFactory
                 .defaultLoanDisbursementDetailRequest(disbursementData);
         CommandProcessingResult loanDisburseResponse = ok(
                 () -> fineractClient.loanDisbursementDetails().addAndDeleteDisbursementDetail(loanId, disbursementDetailRequest));
@@ -1743,7 +1746,7 @@
         long loanId = loanResponse.getLoanId();
         String resourceId = String.valueOf(loanId);
 
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         PostLoansLoanIdResponse loanDisburseResponse = ok(() -> fineractClient.loans().stateTransitions(loanId, disburseRequest,
@@ -1768,7 +1771,7 @@
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         assertNotNull(loanResponse);
         final long loanId = loanResponse.getLoanId();
-        final PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        final PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount))
                 .fixedEmiAmount(new BigDecimal(fixedEmiAmount));
         performLoanDisbursementAndVerifyStatus(loanId, disburseRequest);
@@ -1780,7 +1783,7 @@
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         assertNotNull(loanResponse);
         final long loanId = loanResponse.getLoanId();
-        final PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        final PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount))
                 .fixedEmiAmount(new BigDecimal(fixedEmiAmount)).adjustRepaymentDate(adjustRepaymentDate);
         performLoanDisbursementAndVerifyStatus(loanId, disburseRequest);
@@ -1790,7 +1793,7 @@
     public void disburseSecondLoan(String actualDisbursementDate, String transactionAmount) throws IOException {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_SECOND_LOAN_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         PostLoansLoanIdResponse loanDisburseResponse = ok(
@@ -1836,7 +1839,7 @@
     public void disburseLoanFailureWithDate(String actualDisbursementDate, String transactionAmount) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         CallFailedRuntimeException exception = fail(
@@ -1849,7 +1852,7 @@
     public void disburseLoanFailureWithAmount(String actualDisbursementDate, String transactionAmount) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         CallFailedRuntimeException exception = fail(
@@ -1863,7 +1866,7 @@
     public void disburseLoanFailureIsNotAllowed(String disbursementDate, String disbursementAmount) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest().actualDisbursementDate(disbursementDate)
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest().actualDisbursementDate(disbursementDate)
                 .transactionAmount(new BigDecimal(disbursementAmount));
 
         CallFailedRuntimeException exception = fail(
@@ -1876,7 +1879,7 @@
     public void disburseIsNotAllowedExceedApprovedAmountFailure(String disbursementDate, String disbursementAmount) {
         final PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         final long loanId = loanResponse.getLoanId();
-        final PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        final PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(disbursementDate).transactionAmount(new BigDecimal(disbursementAmount));
 
         final CallFailedRuntimeException exception = fail(
@@ -1889,7 +1892,7 @@
     public void disburseChargedOffLoanFailure(String actualDisbursementDate, String transactionAmount) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         CallFailedRuntimeException exception = fail(
@@ -1903,7 +1906,7 @@
     public void disburseLoanFailureWithPastDate(String actualDisbursementDate, String transactionAmount, String futureApproveDate) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         String futureApproveDateISO = FORMATTER_EVENTS.format(FORMATTER.parse(futureApproveDate));
@@ -1918,7 +1921,7 @@
     public void disbursementForbiddenExceedApprovedAmount(String actualDisbursementDate, String transactionAmount) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         CallFailedRuntimeException exception = fail(
@@ -1932,7 +1935,7 @@
             String totalDisbursalAmount, String maxDisbursalAmount) {
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         CallFailedRuntimeException exception = fail(
@@ -1960,7 +1963,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest chargeOffRequest = LoanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest chargeOffRequest = loanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         CallFailedRuntimeException exception = fail(
@@ -1987,7 +1990,7 @@
         Long chargeOffReasonCodeId = codeHelper.retrieveCodeByName(CHARGE_OFF_REASONS).getId();
         long chargeOffReasonId = codeValueResolver.resolve(chargeOffReasonCodeId, chargeOffReasonCodeValue);
 
-        PostLoansLoanIdTransactionsRequest chargeOffRequest = LoanRequestFactory.defaultChargeOffRequest()
+        PostLoansLoanIdTransactionsRequest chargeOffRequest = loanRequestFactory.defaultChargeOffRequest()
                 .chargeOffReasonId(chargeOffReasonId).transactionDate(transactionDate).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         PostLoansLoanIdTransactionsResponse chargeOffResponse = ok(
@@ -2015,7 +2018,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest chargeOffRequest = LoanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest chargeOffRequest = loanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         CallFailedRuntimeException exception = fail(
@@ -2029,7 +2032,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest chargeOffRequest = LoanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest chargeOffRequest = loanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         CallFailedRuntimeException exception = fail(
@@ -2049,7 +2052,7 @@
     }
 
     public PostLoansLoanIdTransactionsResponse undoChargeOff(Long loanId) {
-        PostLoansLoanIdTransactionsRequest chargeOffUndoRequest = LoanRequestFactory.defaultUndoChargeOffRequest();
+        PostLoansLoanIdTransactionsRequest chargeOffUndoRequest = loanRequestFactory.defaultUndoChargeOffRequest();
 
         PostLoansLoanIdTransactionsResponse chargeOffUndoResponse = ok(() -> fineractClient.loanTransactions()
                 .executeLoanTransaction(loanId, chargeOffUndoRequest, Map.of("command", "undo-charge-off")));
@@ -2058,7 +2061,7 @@
     }
 
     public PostLoansLoanIdTransactionsResponse makeChargeOffTransaction(Long loanId, String transactionDate) {
-        PostLoansLoanIdTransactionsRequest chargeOffRequest = LoanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest chargeOffRequest = loanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         PostLoansLoanIdTransactionsResponse chargeOffResponse = ok(
@@ -2072,7 +2075,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         Long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest chargeOffRequest = LoanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest chargeOffRequest = loanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         CallFailedRuntimeException exception = fail(
@@ -2086,7 +2089,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         Long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest chargeOffRequest = LoanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest chargeOffRequest = loanRequestFactory.defaultChargeOffRequest().transactionDate(transactionDate)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         CallFailedRuntimeException exception = fail(
@@ -2100,7 +2103,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         Long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest chargeOffUndoRequest = LoanRequestFactory.defaultUndoChargeOffRequest();
+        PostLoansLoanIdTransactionsRequest chargeOffUndoRequest = loanRequestFactory.defaultUndoChargeOffRequest();
 
         CallFailedRuntimeException exception = fail(() -> fineractClient.loanTransactions().executeLoanTransaction(loanId,
                 chargeOffUndoRequest, Map.of("command", "undo-charge-off")));
@@ -2729,7 +2732,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         Long loanId = loanResponse.getResourceId();
 
-        PutLoansLoanIdRequest putLoansLoanIdRequest = LoanRequestFactory.enableFraudFlag();
+        PutLoansLoanIdRequest putLoansLoanIdRequest = loanRequestFactory.enableFraudFlag();
 
         PutLoansLoanIdResponse responseMod = ok(
                 () -> fineractClient.loans().modifyLoanApplication(loanId, putLoansLoanIdRequest, Map.of("command", "markAsFraud")));
@@ -2747,7 +2750,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         Long loanId = loanResponse.getResourceId();
 
-        PutLoansLoanIdRequest putLoansLoanIdRequest = LoanRequestFactory.disableFraudFlag();
+        PutLoansLoanIdRequest putLoansLoanIdRequest = loanRequestFactory.disableFraudFlag();
 
         PutLoansLoanIdResponse responseMod = ok(
                 () -> fineractClient.loans().modifyLoanApplication(loanId, putLoansLoanIdRequest, Map.of("command", "markAsFraud")));
@@ -2765,7 +2768,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         Long loanId = loanResponse.getResourceId();
 
-        PutLoansLoanIdRequest putLoansLoanIdRequest = LoanRequestFactory.disableFraudFlag();
+        PutLoansLoanIdRequest putLoansLoanIdRequest = loanRequestFactory.disableFraudFlag();
 
         CallFailedRuntimeException exception = fail(
                 () -> fineractClient.loans().modifyLoanApplication(loanId, putLoansLoanIdRequest, Map.of("command", "markAsFraud")));
@@ -3268,7 +3271,7 @@
         long loanId = loanResponse.getLoanId();
 
         String reversalExternalId = Utils.randomStringGenerator("reversalExtId_", 10);
-        PostLoansLoanIdTransactionsRequest chargeOffUndoRequest = LoanRequestFactory.defaultUndoChargeOffRequest()
+        PostLoansLoanIdTransactionsRequest chargeOffUndoRequest = loanRequestFactory.defaultUndoChargeOffRequest()
                 .reversalExternalId(reversalExternalId);
 
         PostLoansLoanIdTransactionsResponse chargeOffUndoResponse = ok(() -> fineractClient.loanTransactions()
@@ -3396,7 +3399,7 @@
         PostLoansResponse loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
         long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdTransactionsRequest writeOffRequest = LoanRequestFactory.defaultWriteOffRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest writeOffRequest = loanRequestFactory.defaultWriteOffRequest().transactionDate(transactionDate)
                 .dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         PostLoansLoanIdTransactionsResponse writeOffResponse = ok(
@@ -3433,7 +3436,7 @@
         DefaultPaymentType paymentType = DefaultPaymentType.valueOf(repaymentType);
         long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        PostLoansLoanIdTransactionsRequest repaymentRequest = LoanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
+        PostLoansLoanIdTransactionsRequest repaymentRequest = loanRequestFactory.defaultRepaymentRequest().transactionDate(transactionDate)
                 .transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE);
 
         CallFailedRuntimeException exception = fail(
@@ -3982,7 +3985,7 @@
         final String transactionProcessingStrategyCodeValue = processingStrategyCode.getValue();
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargesCalculationType);
-        Long chargeId = chargeProductType.getValue();
+        Long chargeId = chargeProductResolver.resolve(chargeProductType);
 
         List<PostLoansRequestChargeData> charges = new ArrayList<>();
         charges.add(new PostLoansRequestChargeData().chargeId(chargeId).amount(chargesAmount));
@@ -4088,7 +4091,7 @@
         final String transactionProcessingStrategyCodeValue = processingStrategyCode.getValue();
 
         ChargeProductType chargeProductType = ChargeProductType.valueOf(chargesCalculationType);
-        Long chargeId = chargeProductType.getValue();
+        Long chargeId = chargeProductResolver.resolve(chargeProductType);
 
         List<PostLoansRequestChargeData> charges = new ArrayList<>();
         charges.add(new PostLoansRequestChargeData().chargeId(chargeId).amount(chargesAmount));
@@ -5008,7 +5011,7 @@
         final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = LoanRequestFactory.defaultCapitalizedIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = loanRequestFactory.defaultCapitalizedIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-CAP-INC-" + UUID.randomUUID());
 
@@ -5025,7 +5028,7 @@
         final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = LoanRequestFactory.defaultCapitalizedIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = loanRequestFactory.defaultCapitalizedIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-CAP-INC-" + UUID.randomUUID()).classificationId(24L);
 
@@ -5062,7 +5065,7 @@
         final Long classificationId = getClassificationCodeValueId(CodeNames.CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION.getValue(),
                 classificationCodeName);
 
-        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = LoanRequestFactory.defaultCapitalizedIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = loanRequestFactory.defaultCapitalizedIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-CAP-INC-" + UUID.randomUUID()).classificationId(classificationId);
 
@@ -5095,7 +5098,7 @@
         final long loanId = loanResponse.getLoanId();
         final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
-        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = LoanRequestFactory.defaultCapitalizedIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = loanRequestFactory.defaultCapitalizedIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-CAP-INC-" + UUID.randomUUID());
 
@@ -5113,7 +5116,7 @@
         final long loanId = loanResponse.getLoanId();
         final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
-        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = LoanRequestFactory.defaultCapitalizedIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest capitalizedIncomeRequest = loanRequestFactory.defaultCapitalizedIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-CAP-INC-" + UUID.randomUUID());
 
@@ -5370,7 +5373,7 @@
         assert loanResponse != null;
         final long loanId = loanResponse.getLoanId();
 
-        final PostLoansLoanIdRequest contractTerminationRequest = LoanRequestFactory.defaultLoanContractTerminationRequest();
+        final PostLoansLoanIdRequest contractTerminationRequest = loanRequestFactory.defaultLoanContractTerminationRequest();
 
         final PostLoansLoanIdResponse loanContractTerminationResponse = ok(() -> fineractClient.loans().stateTransitions(loanId,
                 contractTerminationRequest, Map.of("command", "contractTermination")));
@@ -5388,7 +5391,7 @@
         assert loanResponse != null;
         final long loanId = loanResponse.getLoanId();
 
-        final PostLoansLoanIdRequest contractTerminationRequest = LoanRequestFactory.defaultLoanContractTerminationRequest();
+        final PostLoansLoanIdRequest contractTerminationRequest = loanRequestFactory.defaultLoanContractTerminationRequest();
 
         final PostLoansLoanIdResponse loanContractTerminationResponse = ok(() -> fineractClient.loans().stateTransitions(loanId,
                 contractTerminationRequest, Map.of("command", "contractTermination")));
@@ -5414,7 +5417,7 @@
             return Boolean.TRUE.equals(t.getType().getContractTermination());
         }).findFirst().orElse(null);
 
-        final PostLoansLoanIdRequest request = LoanRequestFactory.defaultContractTerminationUndoRequest();
+        final PostLoansLoanIdRequest request = loanRequestFactory.defaultContractTerminationUndoRequest();
 
         final PostLoansLoanIdResponse response = ok(
                 () -> fineractClient.loans().stateTransitions(loanId, request, Map.of("command", "undoContractTermination")));
@@ -5476,7 +5479,7 @@
         final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        final PostLoansLoanIdTransactionsRequest buyDownFeeRequest = LoanRequestFactory.defaultBuyDownFeeIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest buyDownFeeRequest = loanRequestFactory.defaultBuyDownFeeIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-BUY-DOWN-FEE" + UUID.randomUUID());
 
@@ -5493,7 +5496,7 @@
         final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
         final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
 
-        final PostLoansLoanIdTransactionsRequest buyDownFeeRequest = LoanRequestFactory.defaultBuyDownFeeIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest buyDownFeeRequest = loanRequestFactory.defaultBuyDownFeeIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-BUY-DOWN-FEE" + UUID.randomUUID()).classificationId(25L);
 
@@ -5549,7 +5552,7 @@
         final Long classificationId = getClassificationCodeValueId(CodeNames.BUYDOWN_FEE_TRANSACTION_CLASSIFICATION.getValue(),
                 classificationCodeValueName);
 
-        final PostLoansLoanIdTransactionsRequest buyDownFeeRequest = LoanRequestFactory.defaultBuyDownFeeIncomeRequest()
+        final PostLoansLoanIdTransactionsRequest buyDownFeeRequest = loanRequestFactory.defaultBuyDownFeeIncomeRequest()
                 .transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
                 .externalId("EXT-BUY-DOWN-FEE" + UUID.randomUUID()).classificationId(classificationId);
 
@@ -5930,7 +5933,7 @@
         }).toList();
 
         final LoanAmortizationAllocationResponse loanAmortizationAllocationResponse = transactionsMatch.getFirst().getType().getCode()
-                .substring(20).equals(GetLoansLoanIdLoanTransactionEnumData.SERIALIZED_NAME_CAPITALIZED_INCOME)
+                .substring(20).equals(GetLoansLoanIdLoanTransactionEnumData.JSON_PROPERTY_CAPITALIZED_INCOME)
                         ? ok(() -> fineractClient.loanCapitalizedIncome().retrieveCapitalizedIncomeAllocationData(loanId,
                                 transactionsMatch.getFirst().getId()))
                         : ok(() -> fineractClient.loanBuyDownFees().retrieveBuyDownFeesAllocationData(loanId,
@@ -5966,7 +5969,7 @@
         }).toList().get(nthTransaction);
 
         final LoanAmortizationAllocationResponse loanAmortizationAllocationResponse = transactionMatch.getType().getCode().substring(20)
-                .equals(GetLoansLoanIdLoanTransactionEnumData.SERIALIZED_NAME_CAPITALIZED_INCOME)
+                .equals(GetLoansLoanIdLoanTransactionEnumData.JSON_PROPERTY_CAPITALIZED_INCOME)
                         ? ok(() -> fineractClient.loanCapitalizedIncome().retrieveCapitalizedIncomeAllocationData(loanId,
                                 transactionMatch.getId()))
                         : ok(() -> fineractClient.loanBuyDownFees().retrieveBuyDownFeesAllocationData(loanId, transactionMatch.getId()));
@@ -6071,7 +6074,7 @@
         assertNotNull(loanResponse);
         long loanId = loanResponse.getLoanId();
 
-        PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest()
+        PostLoansLoanIdRequest disburseRequest = loanRequestFactory.defaultLoanDisburseRequest()
                 .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount));
 
         PostLoansLoanIdResponse loanDisburseResponse = ok(
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
index 460f462..f9da6bf 100644
--- 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
@@ -65,6 +65,10 @@
 import org.apache.fineract.client.models.WorkingCapitalPostWriteOffReasonToExpenseAccountMappings;
 import org.apache.fineract.test.data.accounttype.AccountTypeResolver;
 import org.apache.fineract.test.data.accounttype.DefaultAccountType;
+import org.apache.fineract.test.data.codevalue.CodeNames;
+import org.apache.fineract.test.data.codevalue.CodeValueResolver;
+import org.apache.fineract.test.data.codevalue.DefaultCodeValue;
+import org.apache.fineract.test.data.paymenttype.DefaultPaymentType;
 import org.apache.fineract.test.data.paymenttype.PaymentTypeResolver;
 import org.apache.fineract.test.data.workingcapitalproduct.DefaultWorkingCapitalLoanProduct;
 import org.apache.fineract.test.data.workingcapitalproduct.WCGLAccountMapping;
@@ -89,6 +93,7 @@
     private final FineractFeignClient fineractFeignClient;
     private final AccountTypeResolver accountTypeResolver;
     private final PaymentTypeResolver paymentTypeResolver;
+    private final CodeValueResolver codeValueResolver;
     private static final ObjectMapper OBJECT_MAPPER = ObjectMapperFactory.getShared();
     private static final String WC_ADVANCED_MAPPINGS_EXPECTED_CREATE = "wcAdvancedMappingsExpectedCreate";
     private static final String WC_ADVANCED_MAPPINGS_EXPECTED_UPDATE = "wcAdvancedMappingsExpectedUpdate";
@@ -121,29 +126,6 @@
 
     private static final long NON_EXISTENT_GL_ACCOUNT_ID = 999999L;
 
-    // GL Account IDs for advanced accounting mappings
-    private static final Long DEFAULT_PAYMENT_TYPE_ID = 1L;
-    private static final Long DEFAULT_FUND_SOURCE_ACCOUNT_ID = 1L;
-    private static final Long DEFAULT_LOAN_PORTFOLIO_ACCOUNT_ID = 1L;
-    private static final Long DEFAULT_TRANSFERS_IN_SUSPENSE_ACCOUNT_ID = 21L;
-    private static final Long DEFAULT_DEFERRED_INCOME_LIABILITY_ACCOUNT_ID = 22L;
-    private static final Long DEFAULT_INCOME_FROM_DISCOUNT_FEE_ACCOUNT_ID = 10L;
-    private static final Long DEFAULT_INCOME_FROM_FEE_ACCOUNT_ID = 10L;
-    private static final Long DEFAULT_INCOME_FROM_PENALTY_ACCOUNT_ID = 9L;
-    private static final Long DEFAULT_INCOME_FROM_RECOVERY_ACCOUNT_ID = 15L;
-    private static final Long DEFAULT_WRITE_OFF_ACCOUNT_ID = 16L;
-    private static final Long DEFAULT_OVERPAYMENT_LIABILITY_ACCOUNT_ID = 17L;
-
-    // Code Value IDs for advanced mappings
-    private static final Long DEFAULT_CHARGE_OFF_REASON_CODE_VALUE_ID = 29L;
-    private static final Long DEFAULT_CHARGE_OFF_EXPENSE_ACCOUNT_ID_FOR_MAPPING = 23L;
-    private static final Long DEFAULT_WRITE_OFF_REASON_CODE_VALUE_ID = 66L;
-    private static final Long DEFAULT_WRITE_OFF_EXPENSE_ACCOUNT_ID_FOR_MAPPING = 23L;
-
-    // Alternative IDs for duplicate testing
-    private static final Long ALTERNATIVE_PAYMENT_TYPE_ID = 2L;
-    private static final Long ALTERNATIVE_FUND_SOURCE_ACCOUNT_ID = 2L;
-
     private WorkingCapitalLoanProductsApi workingCapitalApi() {
         return fineractFeignClient.workingCapitalLoanProducts();
     }
@@ -1907,15 +1889,15 @@
     public void attemptCreateWithNullPaymentTypeId() {
         List<WorkingCapitalLoanPaymentChannelToFundSourceMappings> paymentChannelMappings = List
                 .of(new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(null)
-                        .fundSourceAccountId(DEFAULT_FUND_SOURCE_ACCOUNT_ID));
+                        .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES)));
         attemptCreateWithAdvancedMappings(paymentChannelMappings, buildDefaultChargeOffMappings(), buildDefaultWriteOffMappings());
     }
 
     @When("Admin attempts to create Working Capital Loan Product with null fundSourceAccountId in payment channel mappings")
     public void attemptCreateWithNullFundSourceAccountId() {
         List<WorkingCapitalLoanPaymentChannelToFundSourceMappings> paymentChannelMappings = List
-                .of(new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(DEFAULT_PAYMENT_TYPE_ID)
-                        .fundSourceAccountId(null));
+                .of(new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                        .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER)).fundSourceAccountId(null));
         attemptCreateWithAdvancedMappings(paymentChannelMappings, buildDefaultChargeOffMappings(), buildDefaultWriteOffMappings());
     }
 
@@ -1923,7 +1905,7 @@
     public void attemptCreateWithNullChargeOffReasonCodeValueId() {
         List<WorkingCapitalPostChargeOffReasonToExpenseAccountMappings> chargeOffMappings = List
                 .of(new WorkingCapitalPostChargeOffReasonToExpenseAccountMappings().chargeOffReasonCodeValueId(null)
-                        .expenseAccountId(DEFAULT_CHARGE_OFF_EXPENSE_ACCOUNT_ID_FOR_MAPPING));
+                        .expenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT)));
         attemptCreateWithAdvancedMappings(buildDefaultPaymentChannelMappings(), chargeOffMappings, buildDefaultWriteOffMappings());
     }
 
@@ -1931,7 +1913,9 @@
     public void attemptCreateWithNullChargeOffExpenseAccountId() {
         List<WorkingCapitalPostChargeOffReasonToExpenseAccountMappings> chargeOffMappings = List
                 .of(new WorkingCapitalPostChargeOffReasonToExpenseAccountMappings()
-                        .chargeOffReasonCodeValueId(DEFAULT_CHARGE_OFF_REASON_CODE_VALUE_ID).expenseAccountId(null));
+                        .chargeOffReasonCodeValueId(
+                                codeValueResolver.resolve(CodeNames.CHARGE_OFF.getValue(), DefaultCodeValue.FRAUD.getName()))
+                        .expenseAccountId(null));
         attemptCreateWithAdvancedMappings(buildDefaultPaymentChannelMappings(), chargeOffMappings, buildDefaultWriteOffMappings());
     }
 
@@ -1939,7 +1923,7 @@
     public void attemptCreateWithNullWriteOffReasonCodeValueId() {
         List<WorkingCapitalPostWriteOffReasonToExpenseAccountMappings> writeOffMappings = List
                 .of(new WorkingCapitalPostWriteOffReasonToExpenseAccountMappings().writeOffReasonCodeValueId(null)
-                        .expenseAccountId(DEFAULT_WRITE_OFF_EXPENSE_ACCOUNT_ID_FOR_MAPPING));
+                        .expenseAccountId(accountTypeResolver.resolve(DefaultAccountType.WRITTEN_OFF)));
         attemptCreateWithAdvancedMappings(buildDefaultPaymentChannelMappings(), buildDefaultChargeOffMappings(), writeOffMappings);
     }
 
@@ -1947,37 +1931,45 @@
     public void attemptCreateWithNullWriteOffExpenseAccountId() {
         List<WorkingCapitalPostWriteOffReasonToExpenseAccountMappings> writeOffMappings = List
                 .of(new WorkingCapitalPostWriteOffReasonToExpenseAccountMappings()
-                        .writeOffReasonCodeValueId(DEFAULT_WRITE_OFF_REASON_CODE_VALUE_ID).expenseAccountId(null));
+                        .writeOffReasonCodeValueId(
+                                codeValueResolver.resolve(CodeNames.WRITE_OFF_REASON.getValue(), DefaultCodeValue.BAD_DEBT.getName()))
+                        .expenseAccountId(null));
         attemptCreateWithAdvancedMappings(buildDefaultPaymentChannelMappings(), buildDefaultChargeOffMappings(), writeOffMappings);
     }
 
     @When("Admin attempts to create Working Capital Loan Product with duplicate paymentTypeId in payment channel mappings")
     public void attemptCreateWithDuplicatePaymentTypeId() {
         List<WorkingCapitalLoanPaymentChannelToFundSourceMappings> paymentChannelMappings = List.of(
-                new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(DEFAULT_PAYMENT_TYPE_ID)
-                        .fundSourceAccountId(DEFAULT_FUND_SOURCE_ACCOUNT_ID),
-                new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(DEFAULT_PAYMENT_TYPE_ID)
-                        .fundSourceAccountId(ALTERNATIVE_FUND_SOURCE_ACCOUNT_ID));
+                new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                        .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER))
+                        .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES)),
+                new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                        .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER))
+                        .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.OTHER_RECEIVABLES)));
         attemptCreateWithAdvancedMappings(paymentChannelMappings, buildDefaultChargeOffMappings(), buildDefaultWriteOffMappings());
     }
 
     @When("Admin attempts to create Working Capital Loan Product with duplicate fundSourceAccountId in payment channel mappings")
     public void attemptCreateWithDuplicateFundSourceAccountId() {
         List<WorkingCapitalLoanPaymentChannelToFundSourceMappings> paymentChannelMappings = List.of(
-                new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(DEFAULT_PAYMENT_TYPE_ID)
-                        .fundSourceAccountId(DEFAULT_FUND_SOURCE_ACCOUNT_ID),
-                new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(ALTERNATIVE_PAYMENT_TYPE_ID)
-                        .fundSourceAccountId(DEFAULT_FUND_SOURCE_ACCOUNT_ID));
+                new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                        .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER))
+                        .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES)),
+                new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                        .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER))
+                        .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES)));
         attemptCreateWithAdvancedMappings(paymentChannelMappings, buildDefaultChargeOffMappings(), buildDefaultWriteOffMappings());
     }
 
     @When("Admin creates Working Capital Loan Product with unique payment channel mappings")
     public void createWithUniquePaymentChannelMappings() {
         List<WorkingCapitalLoanPaymentChannelToFundSourceMappings> paymentChannelMappings = List.of(
-                new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(DEFAULT_PAYMENT_TYPE_ID)
-                        .fundSourceAccountId(DEFAULT_FUND_SOURCE_ACCOUNT_ID),
-                new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(ALTERNATIVE_PAYMENT_TYPE_ID)
-                        .fundSourceAccountId(ALTERNATIVE_FUND_SOURCE_ACCOUNT_ID));
+                new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                        .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER))
+                        .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES)),
+                new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                        .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.AUTOPAY))
+                        .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.OTHER_RECEIVABLES)));
         PostWorkingCapitalLoanProductsRequest request = buildAdvancedMappingsRequest(paymentChannelMappings,
                 buildDefaultChargeOffMappings(), buildDefaultWriteOffMappings());
         PostWorkingCapitalLoanProductsResponse response = createWorkingCapitalLoanProduct(request);
@@ -1985,20 +1977,22 @@
     }
 
     private List<WorkingCapitalLoanPaymentChannelToFundSourceMappings> buildDefaultPaymentChannelMappings() {
-        return List.of(new WorkingCapitalLoanPaymentChannelToFundSourceMappings().paymentTypeId(DEFAULT_PAYMENT_TYPE_ID)
-                .fundSourceAccountId(DEFAULT_FUND_SOURCE_ACCOUNT_ID));
+        return List.of(new WorkingCapitalLoanPaymentChannelToFundSourceMappings()
+                .paymentTypeId(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER))
+                .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES)));
     }
 
     private List<WorkingCapitalPostChargeOffReasonToExpenseAccountMappings> buildDefaultChargeOffMappings() {
         return List.of(new WorkingCapitalPostChargeOffReasonToExpenseAccountMappings()
-                .chargeOffReasonCodeValueId(DEFAULT_CHARGE_OFF_REASON_CODE_VALUE_ID)
-                .expenseAccountId(DEFAULT_CHARGE_OFF_EXPENSE_ACCOUNT_ID_FOR_MAPPING));
+                .chargeOffReasonCodeValueId(codeValueResolver.resolve(CodeNames.CHARGE_OFF.getValue(), DefaultCodeValue.FRAUD.getName()))
+                .expenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT)));
     }
 
     private List<WorkingCapitalPostWriteOffReasonToExpenseAccountMappings> buildDefaultWriteOffMappings() {
         return List.of(new WorkingCapitalPostWriteOffReasonToExpenseAccountMappings()
-                .writeOffReasonCodeValueId(DEFAULT_WRITE_OFF_REASON_CODE_VALUE_ID)
-                .expenseAccountId(DEFAULT_WRITE_OFF_EXPENSE_ACCOUNT_ID_FOR_MAPPING));
+                .writeOffReasonCodeValueId(
+                        codeValueResolver.resolve(CodeNames.WRITE_OFF_REASON.getValue(), DefaultCodeValue.BAD_DEBT.getName()))
+                .expenseAccountId(accountTypeResolver.resolve(DefaultAccountType.WRITTEN_OFF)));
     }
 
     private PostWorkingCapitalLoanProductsRequest buildAdvancedMappingsRequest(
@@ -2007,15 +2001,17 @@
             List<WorkingCapitalPostWriteOffReasonToExpenseAccountMappings> writeOffMappings) {
         final String productName = DefaultWorkingCapitalLoanProduct.WCLP.getName() + Utils.randomStringGenerator("_", 10);
         return workingCapitalRequestFactory.defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest().name(productName)
-                .accountingRule(AccountingRuleEnum.CASH_BASED).fundSourceAccountId(DEFAULT_FUND_SOURCE_ACCOUNT_ID)
-                .loanPortfolioAccountId(DEFAULT_LOAN_PORTFOLIO_ACCOUNT_ID)
-                .transfersInSuspenseAccountId(DEFAULT_TRANSFERS_IN_SUSPENSE_ACCOUNT_ID)
-                .deferredIncomeLiabilityAccountId(DEFAULT_DEFERRED_INCOME_LIABILITY_ACCOUNT_ID)
-                .incomeFromDiscountFeeAccountId(DEFAULT_INCOME_FROM_DISCOUNT_FEE_ACCOUNT_ID)
-                .incomeFromFeeAccountId(DEFAULT_INCOME_FROM_FEE_ACCOUNT_ID)
-                .incomeFromPenaltyAccountId(DEFAULT_INCOME_FROM_PENALTY_ACCOUNT_ID)
-                .incomeFromRecoveryAccountId(DEFAULT_INCOME_FROM_RECOVERY_ACCOUNT_ID).writeOffAccountId(DEFAULT_WRITE_OFF_ACCOUNT_ID)
-                .overpaymentLiabilityAccountId(DEFAULT_OVERPAYMENT_LIABILITY_ACCOUNT_ID)
+                .accountingRule(AccountingRuleEnum.CASH_BASED)
+                .fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES))
+                .loanPortfolioAccountId(accountTypeResolver.resolve(DefaultAccountType.LOANS_RECEIVABLE))
+                .transfersInSuspenseAccountId(accountTypeResolver.resolve(DefaultAccountType.TRANSFER_IN_SUSPENSE_ACCOUNT))
+                .deferredIncomeLiabilityAccountId(accountTypeResolver.resolve(DefaultAccountType.DEFERRED_CAPITALIZED_INCOME))
+                .incomeFromDiscountFeeAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME))
+                .incomeFromFeeAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_INCOME))
+                .incomeFromPenaltyAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_INCOME))
+                .incomeFromRecoveryAccountId(accountTypeResolver.resolve(DefaultAccountType.RECOVERIES))
+                .writeOffAccountId(accountTypeResolver.resolve(DefaultAccountType.WRITTEN_OFF))
+                .overpaymentLiabilityAccountId(accountTypeResolver.resolve(DefaultAccountType.OVERPAYMENT_ACCOUNT))
                 .paymentChannelToFundSourceMappings(paymentChannelMappings).chargeOffReasonToExpenseAccountMappings(chargeOffMappings)
                 .writeOffReasonsToExpenseMappings(writeOffMappings).feeToIncomeAccountMappings(List.of())
                 .penaltyToIncomeAccountMappings(List.of());
@@ -2061,13 +2057,13 @@
 
         List<PaymentTypeToGLAccountMapper> mappings = productDetails.getPaymentChannelToFundSourceMappings();
         assertThat(mappings.get(0).getPaymentType().getId()).as(ErrorMessageHelper.incorrectExpectedValueInResponse())
-                .isEqualTo(DEFAULT_PAYMENT_TYPE_ID);
+                .isEqualTo(paymentTypeResolver.resolve(DefaultPaymentType.MONEY_TRANSFER));
         assertThat(mappings.get(0).getFundSourceAccount().getId()).as(ErrorMessageHelper.incorrectExpectedValueInResponse())
-                .isEqualTo(DEFAULT_FUND_SOURCE_ACCOUNT_ID);
+                .isEqualTo(accountTypeResolver.resolve(DefaultAccountType.FUND_RECEIVABLES));
         assertThat(mappings.get(1).getPaymentType().getId()).as(ErrorMessageHelper.incorrectExpectedValueInResponse())
-                .isEqualTo(ALTERNATIVE_PAYMENT_TYPE_ID);
+                .isEqualTo(paymentTypeResolver.resolve(DefaultPaymentType.AUTOPAY));
         assertThat(mappings.get(1).getFundSourceAccount().getId()).as(ErrorMessageHelper.incorrectExpectedValueInResponse())
-                .isEqualTo(ALTERNATIVE_FUND_SOURCE_ACCOUNT_ID);
+                .isEqualTo(accountTypeResolver.resolve(DefaultAccountType.OTHER_RECEIVABLES));
     }
 
 }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailApiClient.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailApiClient.java
index 29e943a..69a16d8 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailApiClient.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailApiClient.java
@@ -18,15 +18,13 @@
  */
 package org.apache.fineract.test.testrail;
 
-import retrofit2.Call;
-import retrofit2.http.Body;
-import retrofit2.http.Headers;
-import retrofit2.http.POST;
-import retrofit2.http.Path;
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
 
 interface TestRailApiClient {
 
-    @Headers({ "Content-Type:application/json" })
-    @POST("/api/v2/add_result_for_case/{runId}/{caseId}")
-    Call<Void> addResultForCase(@Path("runId") int runId, @Path("caseId") int caseId, @Body AddResultForCaseRequest request);
+    @Headers({ "Content-Type: application/json" })
+    @RequestLine("POST /index.php?/api/v2/add_result_for_case/{runId}/{caseId}")
+    void addResultForCase(@Param("runId") int runId, @Param("caseId") int caseId, AddResultForCaseRequest request);
 }
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailClient.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailClient.java
index 1e1a12a..ca750bf 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailClient.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailClient.java
@@ -18,23 +18,20 @@
  */
 package org.apache.fineract.test.testrail;
 
+import feign.FeignException;
 import io.cucumber.java.Scenario;
-import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.ResponseBody;
 import org.apache.commons.lang3.ClassUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.http.HttpStatus;
 import org.junit.runner.Result;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.annotation.Conditional;
 import org.springframework.stereotype.Component;
-import retrofit2.Response;
 
 @Slf4j
 @Component
@@ -66,11 +63,8 @@
 
         if (caseId != null) {
             try {
-                Response<Void> response = apiClient.addResultForCase(testRailProperties.getRunId(), caseId, request).execute();
-                if (response.code() != HttpStatus.SC_OK) {
-                    handleApiError(response);
-                }
-            } catch (IOException e) {
+                apiClient.addResultForCase(testRailProperties.getRunId(), caseId, request);
+            } catch (FeignException e) {
                 throw new RuntimeException("Error while reporting to TestRail", e);
             }
         }
@@ -89,15 +83,6 @@
         return caseId;
     }
 
-    private void handleApiError(Response<Void> response) throws IOException {
-        String exceptionMsg = "Error while reporting to TestRail";
-        ResponseBody errorBody = response.errorBody();
-        if (errorBody != null) {
-            exceptionMsg += " " + errorBody.string();
-        }
-        throw new RuntimeException(exceptionMsg);
-    }
-
     private AddResultForCaseRequest createFailedRequest(Scenario scenario) {
         return new AddResultForCaseRequest.AddResultForCaseRequestBuilder().statusId(TestRailStatus.FAILED)
                 .comment(createFailedComment(scenario)).build();
diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailConfiguration.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailConfiguration.java
index 838e463..de98ef2 100644
--- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailConfiguration.java
+++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/testrail/TestRailConfiguration.java
@@ -20,18 +20,17 @@
 
 import static org.apache.commons.lang3.StringUtils.isBlank;
 
-import java.io.IOException;
-import okhttp3.Interceptor;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
-import org.apache.fineract.client.auth.HttpBasicAuth;
-import org.apache.fineract.client.util.JSON;
+import feign.Feign;
+import feign.Request;
+import feign.Retryer;
+import feign.jackson.JacksonEncoder;
+import java.util.concurrent.TimeUnit;
+import org.apache.fineract.client.feign.BasicAuthRequestInterceptor;
+import org.apache.fineract.client.feign.ObjectMapperFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Conditional;
 import org.springframework.context.annotation.Configuration;
-import retrofit2.Retrofit;
 
 @Configuration
 @Conditional(TestRailEnabledCondition.class)
@@ -56,25 +55,9 @@
             throw new IllegalStateException("TestRail password has not been set");
         }
 
-        HttpBasicAuth httpBasicAuth = new HttpBasicAuth();
-        httpBasicAuth.setCredentials(testRailUsername, testRailPassword);
-        OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(httpBasicAuth).addInterceptor(new TestRailIndexPhpInterceptor())
-                .build();
-
-        Retrofit retrofit = new Retrofit.Builder().addConverterFactory(JSON.GsonCustomConverterFactory.create(new JSON().getGson()))
-                .client(httpClient).baseUrl(testRailBaseUrl).build();
-
-        return retrofit.create(TestRailApiClient.class);
-    }
-
-    // Needed otherwise Retrofit 2 will be mad on the URL query/path parameters
-    private static final class TestRailIndexPhpInterceptor implements Interceptor {
-
-        @Override
-        public Response intercept(Chain chain) throws IOException {
-            Request request = chain.request();
-            String finalUrl = request.url().toString().replace("api/v2", "index.php?/api/v2");
-            return chain.proceed(request.newBuilder().url(finalUrl).build());
-        }
+        return Feign.builder().encoder(new JacksonEncoder(ObjectMapperFactory.getShared()))
+                .options(new Request.Options(30, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true)).retryer(Retryer.NEVER_RETRY)
+                .requestInterceptor(new BasicAuthRequestInterceptor(testRailUsername, testRailPassword))
+                .target(TestRailApiClient.class, testRailBaseUrl);
     }
 }
diff --git a/fineract-e2e-tests-runner/build.gradle b/fineract-e2e-tests-runner/build.gradle
index e27579c..efa762c 100644
--- a/fineract-e2e-tests-runner/build.gradle
+++ b/fineract-e2e-tests-runner/build.gradle
@@ -31,7 +31,6 @@
 
 dependencies {
     testImplementation(project(':fineract-avro-schemas'))
-    testImplementation(project(':fineract-client'))
     testImplementation(project(':fineract-client-feign'))
     testImplementation(project(':fineract-e2e-tests-core').sourceSets.test.output)
 
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java
index 6dfec13..c35e291 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java
@@ -33,9 +33,11 @@
 import org.apache.fineract.test.data.ChargeCalculationType;
 import org.apache.fineract.test.data.ChargePaymentMode;
 import org.apache.fineract.test.data.ChargeProductAppliesTo;
+import org.apache.fineract.test.data.ChargeProductType;
 import org.apache.fineract.test.data.ChargeTimeType;
 import org.apache.fineract.test.data.CurrencyOptions;
 import org.apache.fineract.test.helper.ErrorMessageHelper;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.apache.fineract.test.support.TestContext;
 import org.apache.fineract.test.support.TestContextKey;
 import org.springframework.stereotype.Component;
@@ -51,24 +53,6 @@
     public static final Integer CHARGE_PAYMENT_MODE = ChargePaymentMode.REGULAR.value;
     public static final Enum<ChargeProductAppliesTo> CHARGE_APPLIES_TO_LOAN = ChargeProductAppliesTo.LOAN;
     public static final Enum<ChargeProductAppliesTo> CHARGE_APPLIES_TO_CLIENT = ChargeProductAppliesTo.CLIENT;
-    public static final String CHARGE_LOAN_PERCENTAGE_LATE_FEE = "% Late fee";
-    public static final String CHARGE_LOAN_PERCENTAGE_LATE_FEE_AMOUNT_PLUS_INTEREST = "% Late fee amount+interest";
-    public static final String CHARGE_LOAN_PERCENTAGE_PROCESSING_FEE = "% Processing fee";
-    public static final String CHARGE_LOAN_FIXED_LATE_FEE = "Fixed Late fee";
-    public static final String CHARGE_LOAN_FIXED_RETURNED_PAYMENT_FEE = "Fixed Returned payment fee";
-    public static final String CHARGE_LOAN_SNOOZE_FEE = "Snooze fee";
-    public static final String CHARGE_LOAN_NSF_FEE = "NSF fee";
-    public static final String CHARGE_LOAN_DISBURSEMENT_PERCENT_FEE = "Disbursement percentage fee";
-    public static final String CHARGE_LOAN_TRANCHE_DISBURSEMENT_PERCENT_FEE = "Tranche Disbursement percentage fee";
-    public static final String CHARGE_LOAN_INSTALLMENT_FEE_FLAT = "Installment flat fee";
-    public static final String CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_AMOUNT = "Installment percentage amount fee";
-    public static final String CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_INTEREST = "Installment percentage interest fee";
-    public static final String CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_AMOUNT_PLUS_INTEREST = "Installment percentage amount + interest fee";
-    public static final String CHARGE_LOAN_DISBURSEMENT_PERCENT_AMOUNT_PLUS_INTEREST_FEE = "Disbursement percentage amount + interest fee";
-    public static final String CHARGE_CLIENT_FIXED_FEE = "Fixed fee for Client";
-    public static final String CHARGE_DISBURSEMENT_CHARGE = "Disbursement Charge";
-    public static final String CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_AMOUNT = "Tranche Disbursement Charge Amount";
-    public static final String CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT = "Tranche Disbursement Charge Percent";
     public static final Double CHARGE_AMOUNT_FLAT = 25D;
     public static final Double CHARGE_INSTALLMENT_FEE_AMOUNT_FLAT = 10D;
     public static final Double CHARGE_INSTALLMENT_FEE_AMOUNT_PERCENTAGE = 1D;
@@ -90,7 +74,7 @@
     private final FineractFeignClient fineractClient;
 
     @Override
-    public void initialize() throws Exception {
+    public void initialize() {
         List<ChargeData> existingCharges = new ArrayList<>();
         try {
             existingCharges = fineractClient.charges().retrieveAllCharges(Map.of());
@@ -100,103 +84,86 @@
 
         final List<ChargeData> charges = existingCharges;
 
-        PostChargesResponse responseLoanPercentLate = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_PERCENTAGE_LATE_FEE, CHARGE_TIME_TYPE_OVERDUE_FEES, CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT,
-                CHARGE_AMOUNT_OVERDUE_PERCENTAGE, true, true);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_PERCENT_LATE_CREATE_RESPONSE, responseLoanPercentLate);
+        List<Runnable> items = List.of(
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_PERCENT_LATE_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, ChargeProductType.LOAN_PERCENTAGE_LATE_FEE.getName(),
+                                CHARGE_TIME_TYPE_OVERDUE_FEES, CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT, CHARGE_AMOUNT_OVERDUE_PERCENTAGE,
+                                true, true)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_PERCENT_PROCESSING_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, ChargeProductType.LOAN_PERCENTAGE_PROCESSING_FEE.getName(),
+                                CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST,
+                                CHARGE_AMOUNT_PERCENTAGE, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_FIXED_LATE_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, ChargeProductType.LOAN_FIXED_LATE_FEE.getName(),
+                                CHARGE_TIME_TYPE_OVERDUE_FEES, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, true)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_FIXED_RETURNED_PAYMENT_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_FIXED_RETURNED_PAYMENT_FEE.getName(), CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE,
+                                CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_SNOOZE_FEE_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, ChargeProductType.LOAN_SNOOZE_FEE.getName(),
+                                CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_NSF_FEE_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, ChargeProductType.LOAN_NSF_FEE.getName(),
+                                CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, true)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_DISBURSEMENET_FEE_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_FEE.getName(), CHARGE_TIME_TYPE_DISBURSEMENT,
+                                CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT, CHARGE_AMOUNT_DISBURSEMENT_PERCENTAGE, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_TRANCHE_DISBURSEMENT_PERCENT_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_TRANCHE_DISBURSEMENT_PERCENTAGE_FEE.getName(), CHARGE_TIME_TYPE_TRANCHE_DISBURSEMENT,
+                                CHARGE_CALCULATION_TYPE_PERCENTAGE_DISBURSEMENT_AMOUNT, CHARGE_AMOUNT_DISBURSEMENT_PERCENTAGE, true,
+                                false)),
+                () -> TestContext.INSTANCE.set(
+                        TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.getName(),
+                                CHARGE_TIME_TYPE_INSTALLMENT, CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST,
+                                CHARGE_INSTALLMENT_FEE_AMOUNT_PERCENTAGE, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_PERCENT_LATE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_PERCENTAGE_LATE_FEE_AMOUNT_PLUS_INTEREST.getName(), CHARGE_TIME_TYPE_OVERDUE_FEES,
+                                CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST, CHARGE_AMOUNT_OVERDUE_PERCENTAGE, true,
+                                true)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_CLIENT_FIXED_FEE_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_CLIENT, ChargeProductType.CLIENT_TEST_CHARGE_FEE.getName(),
+                                CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_DISBURSEMENT_CHARGE_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, ChargeProductType.LOAN_DISBURSEMENT_CHARGE.getName(),
+                                CHARGE_TIME_TYPE_DISBURSEMENT, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_TRANCHE_DISBURSEMENT_CHARGE_FLAT_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_AMOUNT.getName(),
+                                CHARGE_TIME_TYPE_TRANCHE_DISBURSEMENT, CHARGE_CALCULATION_TYPE_FLAT, 10.0, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT.getName(),
+                                CHARGE_TIME_TYPE_TRANCHE_DISBURSEMENT, CHARGE_CALCULATION_TYPE_PERCENTAGE_DISBURSEMENT_AMOUNT, 2.0, true,
+                                false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_FLAT_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT.getName(),
+                                CHARGE_TIME_TYPE_INSTALLMENT, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_INSTALLMENT_FEE_AMOUNT_FLAT, true,
+                                false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT.getName(), CHARGE_TIME_TYPE_INSTALLMENT,
+                                CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT, CHARGE_INSTALLMENT_FEE_AMOUNT_PERCENTAGE, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.getName(), CHARGE_TIME_TYPE_INSTALLMENT,
+                                CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST, CHARGE_AMOUNT_PERCENTAGE, true, false)),
+                () -> TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE,
+                        createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                                ChargeProductType.LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_FEE.getName(),
+                                CHARGE_TIME_TYPE_DISBURSEMENT, CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST,
+                                CHARGE_AMOUNT_PERCENTAGE, true, false)));
 
-        PostChargesResponse responseLoanPercentProcessing = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_PERCENTAGE_PROCESSING_FEE, CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE,
-                CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST, CHARGE_AMOUNT_PERCENTAGE, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_PERCENT_PROCESSING_CREATE_RESPONSE, responseLoanPercentProcessing);
-
-        PostChargesResponse responseLoanFixedLate = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, CHARGE_LOAN_FIXED_LATE_FEE,
-                CHARGE_TIME_TYPE_OVERDUE_FEES, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, true);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_FIXED_LATE_CREATE_RESPONSE, responseLoanFixedLate);
-
-        PostChargesResponse responseLoanFixedReturnedPayment = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_FIXED_RETURNED_PAYMENT_FEE, CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_FLAT,
-                CHARGE_AMOUNT_FLAT, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_FIXED_RETURNED_PAYMENT_CREATE_RESPONSE, responseLoanFixedReturnedPayment);
-
-        PostChargesResponse responseLoanSnooze = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, CHARGE_LOAN_SNOOZE_FEE,
-                CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_SNOOZE_FEE_CREATE_RESPONSE, responseLoanSnooze);
-
-        PostChargesResponse responseLoanNsf = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN, CHARGE_LOAN_NSF_FEE,
-                CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, true);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_NSF_FEE_CREATE_RESPONSE, responseLoanNsf);
-
-        PostChargesResponse responseLoanDisbursePercent = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_DISBURSEMENT_PERCENT_FEE, CHARGE_TIME_TYPE_DISBURSEMENT, CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT,
-                CHARGE_AMOUNT_DISBURSEMENT_PERCENTAGE, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_DISBURSEMENET_FEE_CREATE_RESPONSE, responseLoanDisbursePercent);
-
-        PostChargesResponse responseLoanTrancheDisbursePercent = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_TRANCHE_DISBURSEMENT_PERCENT_FEE, CHARGE_TIME_TYPE_TRANCHE_DISBURSEMENT,
-                CHARGE_CALCULATION_TYPE_PERCENTAGE_DISBURSEMENT_AMOUNT, CHARGE_AMOUNT_DISBURSEMENT_PERCENTAGE, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_TRANCHE_DISBURSEMENT_PERCENT_CREATE_RESPONSE,
-                responseLoanTrancheDisbursePercent);
-
-        PostChargesResponse responseLoanInstallmentPercentAmountPlusInterest = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_AMOUNT_PLUS_INTEREST, CHARGE_TIME_TYPE_INSTALLMENT,
-                CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST, CHARGE_INSTALLMENT_FEE_AMOUNT_PERCENTAGE, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE,
-                responseLoanInstallmentPercentAmountPlusInterest);
-
-        PostChargesResponse responseLoanPercentAmountPlusInterestLate = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_PERCENTAGE_LATE_FEE_AMOUNT_PLUS_INTEREST, CHARGE_TIME_TYPE_OVERDUE_FEES,
-                CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST, CHARGE_AMOUNT_OVERDUE_PERCENTAGE, true, true);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_PERCENT_LATE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE,
-                responseLoanPercentAmountPlusInterestLate);
-
-        PostChargesResponse responseClientFixed = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_CLIENT, CHARGE_CLIENT_FIXED_FEE,
-                CHARGE_TIME_TYPE_SPECIFIED_DUE_DATE, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_CLIENT_FIXED_FEE_CREATE_RESPONSE, responseClientFixed);
-
-        PostChargesResponse responseDisbursementCharge = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_DISBURSEMENT_CHARGE, CHARGE_TIME_TYPE_DISBURSEMENT, CHARGE_CALCULATION_TYPE_FLAT, CHARGE_AMOUNT_FLAT, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_DISBURSEMENT_CHARGE_CREATE_RESPONSE, responseDisbursementCharge);
-
-        PostChargesResponse responseTrancheDisbursementCharge = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_AMOUNT, CHARGE_TIME_TYPE_TRANCHE_DISBURSEMENT, CHARGE_CALCULATION_TYPE_FLAT, 10.0,
-                true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_TRANCHE_DISBURSEMENT_CHARGE_FLAT_CREATE_RESPONSE,
-                responseTrancheDisbursementCharge);
-
-        PostChargesResponse responseTrancheDisbursementChargePercent = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT, CHARGE_TIME_TYPE_TRANCHE_DISBURSEMENT,
-                CHARGE_CALCULATION_TYPE_PERCENTAGE_DISBURSEMENT_AMOUNT, 2.0, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT_CREATE_RESPONSE,
-                responseTrancheDisbursementChargePercent);
-
-        PostChargesResponse responseLoanInstallmentFlat = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_INSTALLMENT_FEE_FLAT, CHARGE_TIME_TYPE_INSTALLMENT, CHARGE_CALCULATION_TYPE_FLAT,
-                CHARGE_INSTALLMENT_FEE_AMOUNT_FLAT, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_FLAT_CREATE_RESPONSE, responseLoanInstallmentFlat);
-
-        PostChargesResponse responseLoanInstallmentPercentAmount = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_AMOUNT, CHARGE_TIME_TYPE_INSTALLMENT, CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT,
-                CHARGE_INSTALLMENT_FEE_AMOUNT_PERCENTAGE, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_CREATE_RESPONSE,
-                responseLoanInstallmentPercentAmount);
-
-        PostChargesResponse responseLoanInstallmentPercentInterest = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_INTEREST, CHARGE_TIME_TYPE_INSTALLMENT, CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST,
-                CHARGE_AMOUNT_PERCENTAGE, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST_CREATE_RESPONSE,
-                responseLoanInstallmentPercentInterest);
-
-        PostChargesResponse responseLoanDisbursementPercentAmountPlusInterest = createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
-                CHARGE_LOAN_DISBURSEMENT_PERCENT_AMOUNT_PLUS_INTEREST_FEE, CHARGE_TIME_TYPE_DISBURSEMENT,
-                CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST, CHARGE_AMOUNT_PERCENTAGE, true, false);
-        TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE,
-                responseLoanDisbursementPercentAmountPlusInterest);
+        ParallelExecutionHelper.runInParallel(items);
     }
 
     private PostChargesResponse createChargeIfNotExists(List<ChargeData> existingCharges, Enum<ChargeProductAppliesTo> appliesTo,
-            String name, Integer chargeTimeType, Integer chargeCalculationType, Double amount, Boolean isActive, Boolean isPenalty)
-            throws Exception {
+            String name, Integer chargeTimeType, Integer chargeCalculationType, Double amount, Boolean isActive, Boolean isPenalty) {
         ChargeRequest request = defaultChargesRequest(appliesTo, name, chargeTimeType, chargeCalculationType, amount, isActive, isPenalty);
 
         try {
@@ -216,7 +183,7 @@
     }
 
     public static ChargeRequest defaultChargesRequest(Enum<ChargeProductAppliesTo> appliesTo, String name, Integer chargeTimeType,
-            Integer chargeCalculationType, Double amount, Boolean isActive, Boolean isPenalty) throws Exception {
+            Integer chargeCalculationType, Double amount, Boolean isActive, Boolean isPenalty) {
         ChargeRequest request = new ChargeRequest();
         Integer chargeAppliesTo;
 
@@ -226,7 +193,7 @@
             chargeAppliesTo = ChargeProductAppliesTo.LOAN.value;
             request.chargePaymentMode(CHARGE_PAYMENT_MODE);
         } else {
-            throw new Exception(ErrorMessageHelper.chargeAppliesToIsInvalid(appliesTo));
+            throw new IllegalArgumentException(ErrorMessageHelper.chargeAppliesToIsInvalid(appliesTo));
         }
 
         request//
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/CodeGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/CodeGlobalInitializerStep.java
index 8581bbb..fef66e9 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/CodeGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/CodeGlobalInitializerStep.java
@@ -20,17 +20,20 @@
 
 import static org.apache.fineract.client.feign.util.FeignCalls.executeVoid;
 
-import java.util.ArrayList;
+import java.util.HashMap;
 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.feign.util.CallFailedRuntimeException;
+import org.apache.fineract.client.models.GetCodeValuesDataResponse;
+import org.apache.fineract.client.models.GetCodesResponse;
 import org.apache.fineract.client.models.PostCodeValuesDataRequest;
 import org.apache.fineract.client.models.PostCodesRequest;
 import org.apache.fineract.client.models.PutCodeValuesDataRequest;
 import org.apache.fineract.test.data.codevalue.CodeNames;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -95,176 +98,97 @@
     public static final String CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION_VALUE = "capitalized_income_transaction_classification_value";
 
     private final FineractFeignClient fineractClient;
+    private Map<String, List<String>> existingCodeAndCodeValues = new HashMap<>();
 
     @Override
     public void initialize() {
+        fetchExistingCodesAndCodeValues();
         createCodeNames();
         createCodeValues();
     }
 
+    private void fetchExistingCodesAndCodeValues() {
+        List<GetCodesResponse> existingCodes = fineractClient.codes().retrieveCodes();
+        existingCodes.forEach(code -> {
+            List<GetCodeValuesDataResponse> existingCodeValues = fineractClient.codeValues()
+                    .retrieveAllCodeValuesByCodeName(code.getName());
+            existingCodeAndCodeValues.put(code.getName(), existingCodeValues.stream().map(GetCodeValuesDataResponse::getName).toList());
+        });
+    }
+
     private void createCodeValues() {
-        // address type
-        List<String> addressNames = new ArrayList<>();
-        addressNames.add(CODE_VALUE_ADDRESS_TYPE_RESIDENTIAL);
-        addressNames.add(CODE_VALUE_ADDRESS_TYPE_OFFICE);
-        createCodeValues(CodeNames.ADDRESS_TYPE.getValue(), addressNames);
-
-        // Country
-        List<String> countryNames = new ArrayList<>();
-        countryNames.add(CODE_VALUE_COUNTRY_GERMANY);
-        createCodeValues(CodeNames.COUNTRY.getValue(), countryNames);
-
-        // State
-        List<String> stateNames = new ArrayList<>();
-        stateNames.add(CODE_VALUE_STATE_BERLIN);
-        createCodeValues(CodeNames.STATE.getValue(), stateNames);
-
-        // financial instrument
-        List<String> financialInstrumentNames = new ArrayList<>();
-        financialInstrumentNames.add(CODE_VALUE_FINANCIAL_INSTRUMENT_DEBIT);
-        financialInstrumentNames.add(CODE_VALUE_FINANCIAL_INSTRUMENT_CREDIT);
-        createCodeValues(CodeNames.FINANCIAL_INSTRUMENT.getValue(), financialInstrumentNames);
-
-        List<String> chargeOffReasonNames = new ArrayList<>();
-        chargeOffReasonNames.add(CODE_VALUE_CHARGE_OFF_REASON_FRAUD);
-        chargeOffReasonNames.add(CODE_VALUE_CHARGE_OFF_REASON_DELINQUENT);
-        chargeOffReasonNames.add(CODE_VALUE_CHARGE_OFF_REASON_OTHER);
-        createCodeValues(CodeNames.CHARGE_OFF.getValue(), chargeOffReasonNames);
-
-        // transaction type
-        List<String> transactionTypeNames = new ArrayList<>();
-        transactionTypeNames.add(CODE_VALUE_TRANSACTION_TYPE_SCHEDULED_PAYMENT);
-        createCodeValues(CodeNames.TRANSACTION_TYPE.getValue(), transactionTypeNames);
-
-        // bankruptcy tag
-        List<String> bankruptcyTagNames = new ArrayList<>();
-        bankruptcyTagNames.add(CODE_VALUE_BANKRUPTCY_TAG_PENDING);
-        bankruptcyTagNames.add(CODE_VALUE_BANKRUPTCY_TAG_BANKRUPTCY);
-        createCodeValues(CodeNames.BANKRUPTCY_TAG.getValue(), bankruptcyTagNames);
-
-        // pending fraud tag
-        List<String> pendingFraudTagNames = new ArrayList<>();
-        pendingFraudTagNames.add(CODE_VALUE_PENDING_FRAUD_TAG_PENDING);
-        pendingFraudTagNames.add(CODE_VALUE_PENDING_FRAUD_TAG_FRAUD);
-        createCodeValues(CodeNames.PENDING_FRAUD_TAG.getValue(), pendingFraudTagNames);
-
-        // pending deceased tag
-        List<String> pendingDeceasedTagNames = new ArrayList<>();
-        pendingDeceasedTagNames.add(CODE_VALUE_PENDING_DECEASED_TAG_PENDING);
-        pendingDeceasedTagNames.add(CODE_VALUE_PENDING_DECEASED_TAG_DECEASED);
-        createCodeValues(CodeNames.PENDING_DECEASED_TAG.getValue(), pendingDeceasedTagNames);
-
-        // hardship tag
-        List<String> hardshipTagNames = new ArrayList<>();
-        hardshipTagNames.add(CODE_VALUE_HARDSHIP_TAG_ACTIVE);
-        hardshipTagNames.add(CODE_VALUE_HARDSHIP_TAG_INACTIVE);
-        createCodeValues(CodeNames.HARDSHIP_TAG.getValue(), hardshipTagNames);
-
-        // active duty tag
-        List<String> activeDutyTagNames = new ArrayList<>();
-        activeDutyTagNames.add(CODE_VALUE_ACTIVE_DUTY_TAG_ACTIVE);
-        activeDutyTagNames.add(CODE_VALUE_ACTIVE_DUTY_TAG_INACTIVE);
-        createCodeValues(CodeNames.ACTIVE_DUTY_TAG.getValue(), activeDutyTagNames);
-
-        // customer identifiers put/post
-        List<String> customerIdentifierNamesPut = new ArrayList<>();
-        customerIdentifierNamesPut.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_1);
-        customerIdentifierNamesPut.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_2);
-        customerIdentifierNamesPut.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_3);
-        customerIdentifierNamesPut.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_4);
-        updateCodeValues(CodeNames.CUSTOMER_IDENTIFIER.getValue(), customerIdentifierNamesPut);
-
-        List<String> customerIdentifierNamesPost = new ArrayList<>();
-        customerIdentifierNamesPost.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_5);
-        customerIdentifierNamesPost.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_6);
-        customerIdentifierNamesPost.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_7);
-        customerIdentifierNamesPost.add(CODE_VALUE_CUSTOMER_IDENTIFIERS_8);
-        createCodeValues(CodeNames.CUSTOMER_IDENTIFIER.getValue(), customerIdentifierNamesPost);
-
-        // gender
-        List<String> genderNames = new ArrayList<>();
-        genderNames.add(CODE_VALUE_GENDER_FEMALE);
-        genderNames.add(CODE_VALUE_GENDER_MALE);
-        createCodeValues(CodeNames.GENDER.getValue(), genderNames);
-
-        // client type
-        List<String> clientTypeNames = new ArrayList<>();
-        clientTypeNames.add(CODE_VALUE_CLIENT_TYPE_CORPORATE);
-        clientTypeNames.add(CODE_VALUE_CLIENT_TYPE_LEGAL);
-        clientTypeNames.add(CODE_VALUE_CLIENT_TYPE_NON_LEGAL);
-        createCodeValues(CodeNames.CLIENT_TYPE.getValue(), clientTypeNames);
-
-        // client classification
-        List<String> clientClassificationNames = new ArrayList<>();
-        clientClassificationNames.add(CODE_VALUE_CLIENT_CLASSIFICATION_LAWYER);
-        clientClassificationNames.add(CODE_VALUE_CLIENT_CLASSIFICATION_DIRECTOR);
-        clientClassificationNames.add(CODE_VALUE_CLIENT_CLASSIFICATION_NONE);
-        createCodeValues(CodeNames.CLIENT_CLASSIFICATION.getValue(), clientClassificationNames);
-
-        // add family member - relationship
-        List<String> familyMemberRelationshipNames = new ArrayList<>();
-        familyMemberRelationshipNames.add(CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_SPOUSE);
-        familyMemberRelationshipNames.add(CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_FATHER);
-        familyMemberRelationshipNames.add(CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_MOTHER);
-        familyMemberRelationshipNames.add(CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_CHILD);
-        createCodeValues(CodeNames.FAMILY_MEMBER_RELATIONSHIP.getValue(), familyMemberRelationshipNames);
-
-        // add family member - profession
-        List<String> familyMemberProfessionNames = new ArrayList<>();
-        familyMemberProfessionNames.add(CODE_VALUE_FAMILY_MEMBER_PROFESSION_EMPLOYEE);
-        familyMemberProfessionNames.add(CODE_VALUE_FAMILY_MEMBER_PROFESSION_SELF_EMPLOYED);
-        createCodeValues(CodeNames.FAMILY_MEMBER_PROFESSION.getValue(), familyMemberProfessionNames);
-
-        // add family member - marital status
-        List<String> familyMemberMaritalStatusNames = new ArrayList<>();
-        familyMemberMaritalStatusNames.add(CODE_VALUE_FAMILY_MARITAL_STATUS_MARRIED);
-        familyMemberMaritalStatusNames.add(CODE_VALUE_FAMILY_MARITAL_STATUS_SINGLE);
-        familyMemberMaritalStatusNames.add(CODE_VALUE_FAMILY_MARITAL_STATUS_WIDOWED);
-        createCodeValues(CodeNames.FAMILY_MARITAL_STATUS.getValue(), familyMemberMaritalStatusNames);
-
-        // add constitution (for client creation as Entity)
-        List<String> constitutionNames = new ArrayList<>();
-        constitutionNames.add(CODE_VALUE_CONSTITUTION_TEST);
-        createCodeValues(CodeNames.CONSTITUTION.getValue(), constitutionNames);
-
-        // add LoanRescheduleReason
-        List<String> rescheduleReasonNames = new ArrayList<>();
-        rescheduleReasonNames.add(CODE_VALUE_RESCHEDULE_REASON_TEST);
-        createCodeValues(CodeNames.LOAN_RESCHEDULE_REASON.getValue(), rescheduleReasonNames);
-
-        // add Write-off reasons
-        List<String> writeOffReasonNames = new ArrayList<>();
-        writeOffReasonNames.add(CODE_VALUE_WRITE_OFF_REASON_TEST_1);
-        writeOffReasonNames.add(CODE_VALUE_WRITE_OFF_REASON_TEST_2);
-        writeOffReasonNames.add(CODE_VALUE_WRITE_OFF_REASON_TEST_3);
-        createCodeValues(CodeNames.WRITE_OFF_REASON.getValue(), writeOffReasonNames);
-
-        // Add buy down fee transaction classification
-        List<String> buydownFeeTransactionClassificationName = new ArrayList<>();
-        buydownFeeTransactionClassificationName.add(BUYDOWN_FEE_TRANSACTION_CLASSIFICATION_VALUE);
-        createCodeValues(CodeNames.BUYDOWN_FEE_TRANSACTION_CLASSIFICATION.getValue(), buydownFeeTransactionClassificationName);
-
-        // Add capitalized income transaction classification
-        List<String> capitalizedIncomeTransactionClassificationName = new ArrayList<>();
-        capitalizedIncomeTransactionClassificationName.add(CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION_VALUE);
-        createCodeValues(CodeNames.CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION.getValue(),
-                capitalizedIncomeTransactionClassificationName);
+        List<Runnable> items = List.of(
+                () -> createCodeValues(CodeNames.ADDRESS_TYPE.getValue(),
+                        List.of(CODE_VALUE_ADDRESS_TYPE_RESIDENTIAL, CODE_VALUE_ADDRESS_TYPE_OFFICE)),
+                () -> createCodeValues(CodeNames.COUNTRY.getValue(), List.of(CODE_VALUE_COUNTRY_GERMANY)),
+                () -> createCodeValues(CodeNames.STATE.getValue(), List.of(CODE_VALUE_STATE_BERLIN)),
+                () -> createCodeValues(CodeNames.FINANCIAL_INSTRUMENT.getValue(),
+                        List.of(CODE_VALUE_FINANCIAL_INSTRUMENT_DEBIT, CODE_VALUE_FINANCIAL_INSTRUMENT_CREDIT)),
+                () -> createCodeValues(CodeNames.CHARGE_OFF.getValue(),
+                        List.of(CODE_VALUE_CHARGE_OFF_REASON_FRAUD, CODE_VALUE_CHARGE_OFF_REASON_DELINQUENT,
+                                CODE_VALUE_CHARGE_OFF_REASON_OTHER)),
+                () -> createCodeValues(CodeNames.TRANSACTION_TYPE.getValue(), List.of(CODE_VALUE_TRANSACTION_TYPE_SCHEDULED_PAYMENT)),
+                () -> createCodeValues(CodeNames.BANKRUPTCY_TAG.getValue(),
+                        List.of(CODE_VALUE_BANKRUPTCY_TAG_PENDING, CODE_VALUE_BANKRUPTCY_TAG_BANKRUPTCY)),
+                () -> createCodeValues(CodeNames.PENDING_FRAUD_TAG.getValue(),
+                        List.of(CODE_VALUE_PENDING_FRAUD_TAG_PENDING, CODE_VALUE_PENDING_FRAUD_TAG_FRAUD)),
+                () -> createCodeValues(CodeNames.PENDING_DECEASED_TAG.getValue(),
+                        List.of(CODE_VALUE_PENDING_DECEASED_TAG_PENDING, CODE_VALUE_PENDING_DECEASED_TAG_DECEASED)),
+                () -> createCodeValues(CodeNames.HARDSHIP_TAG.getValue(),
+                        List.of(CODE_VALUE_HARDSHIP_TAG_ACTIVE, CODE_VALUE_HARDSHIP_TAG_INACTIVE)),
+                () -> createCodeValues(CodeNames.ACTIVE_DUTY_TAG.getValue(),
+                        List.of(CODE_VALUE_ACTIVE_DUTY_TAG_ACTIVE, CODE_VALUE_ACTIVE_DUTY_TAG_INACTIVE)),
+                () -> {
+                    // customer identifiers: update pre-existing values, then create new ones (sequential on same code)
+                    updateCodeValues(CodeNames.CUSTOMER_IDENTIFIER.getValue(), List.of(CODE_VALUE_CUSTOMER_IDENTIFIERS_1,
+                            CODE_VALUE_CUSTOMER_IDENTIFIERS_2, CODE_VALUE_CUSTOMER_IDENTIFIERS_3, CODE_VALUE_CUSTOMER_IDENTIFIERS_4));
+                    createCodeValues(CodeNames.CUSTOMER_IDENTIFIER.getValue(), List.of(CODE_VALUE_CUSTOMER_IDENTIFIERS_5,
+                            CODE_VALUE_CUSTOMER_IDENTIFIERS_6, CODE_VALUE_CUSTOMER_IDENTIFIERS_7, CODE_VALUE_CUSTOMER_IDENTIFIERS_8));
+                }, () -> createCodeValues(CodeNames.GENDER.getValue(), List.of(CODE_VALUE_GENDER_FEMALE, CODE_VALUE_GENDER_MALE)),
+                () -> createCodeValues(CodeNames.CLIENT_TYPE.getValue(),
+                        List.of(CODE_VALUE_CLIENT_TYPE_CORPORATE, CODE_VALUE_CLIENT_TYPE_LEGAL, CODE_VALUE_CLIENT_TYPE_NON_LEGAL)),
+                () -> createCodeValues(CodeNames.CLIENT_CLASSIFICATION.getValue(),
+                        List.of(CODE_VALUE_CLIENT_CLASSIFICATION_LAWYER, CODE_VALUE_CLIENT_CLASSIFICATION_DIRECTOR,
+                                CODE_VALUE_CLIENT_CLASSIFICATION_NONE)),
+                () -> createCodeValues(CodeNames.FAMILY_MEMBER_RELATIONSHIP.getValue(),
+                        List.of(CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_SPOUSE, CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_FATHER,
+                                CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_MOTHER, CODE_VALUE_FAMILY_MEMBER_RELATIONSHIP_CHILD)),
+                () -> createCodeValues(CodeNames.FAMILY_MEMBER_PROFESSION.getValue(),
+                        List.of(CODE_VALUE_FAMILY_MEMBER_PROFESSION_EMPLOYEE, CODE_VALUE_FAMILY_MEMBER_PROFESSION_SELF_EMPLOYED)),
+                () -> createCodeValues(CodeNames.FAMILY_MARITAL_STATUS.getValue(),
+                        List.of(CODE_VALUE_FAMILY_MARITAL_STATUS_MARRIED, CODE_VALUE_FAMILY_MARITAL_STATUS_SINGLE,
+                                CODE_VALUE_FAMILY_MARITAL_STATUS_WIDOWED)),
+                () -> createCodeValues(CodeNames.CONSTITUTION.getValue(), List.of(CODE_VALUE_CONSTITUTION_TEST)),
+                () -> createCodeValues(CodeNames.LOAN_RESCHEDULE_REASON.getValue(), List.of(CODE_VALUE_RESCHEDULE_REASON_TEST)),
+                () -> createCodeValues(CodeNames.WRITE_OFF_REASON.getValue(),
+                        List.of(CODE_VALUE_WRITE_OFF_REASON_TEST_1, CODE_VALUE_WRITE_OFF_REASON_TEST_2,
+                                CODE_VALUE_WRITE_OFF_REASON_TEST_3)),
+                () -> createCodeValues(CodeNames.BUYDOWN_FEE_TRANSACTION_CLASSIFICATION.getValue(),
+                        List.of(BUYDOWN_FEE_TRANSACTION_CLASSIFICATION_VALUE)),
+                () -> createCodeValues(CodeNames.CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION.getValue(),
+                        List.of(CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION_VALUE)));
+        ParallelExecutionHelper.runInParallel(items);
     }
 
     public void createCodeValues(String codeName, List<String> codeValueNames) {
-        codeValueNames.forEach(name -> {
-            Integer position = codeValueNames.indexOf(name);
+
+        codeValueNames.forEach(codeValueName -> {
+            if (existingCodeAndCodeValues.get(codeName) != null && existingCodeAndCodeValues.get(codeName).contains(codeValueName)) {
+                log.debug("Code value '{}' already exists, skipping creation", codeValueName);
+                return;
+            }
+            Integer position = codeValueNames.indexOf(codeValueName);
             PostCodeValuesDataRequest postCodeValuesDataRequest = new PostCodeValuesDataRequest();
             postCodeValuesDataRequest.isActive(true);
-            postCodeValuesDataRequest.name(name);
+            postCodeValuesDataRequest.name(codeValueName);
             postCodeValuesDataRequest.position(position);
 
             try {
                 executeVoid(() -> fineractClient.codeValues().createCodeValueByCodeName(codeName, postCodeValuesDataRequest, Map.of()));
-                log.debug("Code value '{}' created successfully", name);
+                log.debug("Code value '{}' created successfully", codeValueName);
             } catch (CallFailedRuntimeException e) {
                 if (e.getStatus() == 403 && e.getDeveloperMessage() != null && e.getDeveloperMessage().contains("already exists")) {
-                    log.debug("Code value '{}' already exists, skipping creation", name);
+                    log.debug("Code value '{}' already exists, skipping creation", codeValueName);
                     return;
                 }
                 throw e;
@@ -286,24 +210,14 @@
     }
 
     private void createCodeNames() {
-        List<String> codesNameList = new ArrayList<>();
-        codesNameList.add(CodeNames.FINANCIAL_INSTRUMENT.getValue());
-        codesNameList.add(CodeNames.TRANSACTION_TYPE.getValue());
-        codesNameList.add(CodeNames.BANKRUPTCY_TAG.getValue());
-        codesNameList.add(CodeNames.PENDING_FRAUD_TAG.getValue());
-        codesNameList.add(CodeNames.PENDING_DECEASED_TAG.getValue());
-        codesNameList.add(CodeNames.HARDSHIP_TAG.getValue());
-        codesNameList.add(CodeNames.ACTIVE_DUTY_TAG.getValue());
-
-        codesNameList.forEach(codeName -> {
-            try {
-                fineractClient.codes().retrieveCodeByName(codeName);
-                // Code already exists, skip creation
-            } catch (Exception e) {
-                // Code doesn't exist, create it
-                PostCodesRequest postCodesRequest = new PostCodesRequest();
-                executeVoid(() -> fineractClient.codes().createCode(postCodesRequest.name(codeName), Map.of()));
-            }
-        });
+        List.of(CodeNames.FINANCIAL_INSTRUMENT.getValue(), CodeNames.TRANSACTION_TYPE.getValue(), CodeNames.BANKRUPTCY_TAG.getValue(),
+                CodeNames.PENDING_FRAUD_TAG.getValue(), CodeNames.PENDING_DECEASED_TAG.getValue(), CodeNames.HARDSHIP_TAG.getValue(),
+                CodeNames.ACTIVE_DUTY_TAG.getValue()).parallelStream().forEach(codeName -> {
+                    if (existingCodeAndCodeValues.get(codeName) == null) {
+                        executeVoid(() -> fineractClient.codes().createCode(new PostCodesRequest().name(codeName), Map.of()));
+                    } else {
+                        log.debug("Code '{}' already exists, skipping creation", codeName);
+                    }
+                });
     }
 }
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DatatablesGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DatatablesGlobalInitializerStep.java
index f76d595..64dfd27 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DatatablesGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DatatablesGlobalInitializerStep.java
@@ -20,7 +20,6 @@
 
 import static org.apache.fineract.client.feign.util.FeignCalls.executeVoid;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import lombok.RequiredArgsConstructor;
@@ -28,6 +27,7 @@
 import org.apache.fineract.client.feign.FineractFeignClient;
 import org.apache.fineract.client.models.PostColumnHeaderData;
 import org.apache.fineract.client.models.PostDataTablesRequest;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -80,113 +80,37 @@
 
     @Override
     public void initialize() {
-        // autopay
-        PostColumnHeaderData column1 = new PostColumnHeaderData();
-        column1.name(DATA_TABLE_1_COLUMN_1_NAME);
-        column1.type(DATA_TABLE_1_COLUMN_1_TYPE);
-        column1.code(DATA_TABLE_1_COLUMN_1_CODE);
-        column1.mandatory(false);
-
-        PostColumnHeaderData column2 = new PostColumnHeaderData();
-        column2.name(DATA_TABLE_1_COLUMN_2_NAME);
-        column2.type(DATA_TABLE_1_COLUMN_2_TYPE);
-        column2.mandatory(false);
-
-        List<PostColumnHeaderData> columns = new ArrayList<>();
-        columns.add(column1);
-        columns.add(column2);
-
-        PostDataTablesRequest postDataTablesRequest = new PostDataTablesRequest();
-        postDataTablesRequest.datatableName(DATA_TABLE_1_NAME);
-        postDataTablesRequest.apptableName(DATA_TABLE_1_APP_NAME);
-        postDataTablesRequest.multiRow(true);
-        postDataTablesRequest.columns(columns);
-
-        createDatatableIdempotent(postDataTablesRequest);
-
-        // scheduled payments
-        PostColumnHeaderData columnScheduled1 = new PostColumnHeaderData();
-        columnScheduled1.name(DATA_TABLE_2_COLUMN_1_NAME);
-        columnScheduled1.type(DATA_TABLE_2_COLUMN_1_TYPE);
-        columnScheduled1.length(DATA_TABLE_2_COLUMN_1_LENGTH);
-        columnScheduled1.mandatory(false);
-
-        PostColumnHeaderData columnScheduled2 = new PostColumnHeaderData();
-        columnScheduled2.name(DATA_TABLE_2_COLUMN_2_NAME);
-        columnScheduled2.type(DATA_TABLE_2_COLUMN_2_TYPE);
-        columnScheduled2.mandatory(false);
-
-        PostColumnHeaderData columnScheduled3 = new PostColumnHeaderData();
-        columnScheduled3.name(DATA_TABLE_2_COLUMN_3_NAME);
-        columnScheduled3.type(DATA_TABLE_2_COLUMN_3_TYPE);
-        columnScheduled3.mandatory(false);
-
-        PostColumnHeaderData columnScheduled4 = new PostColumnHeaderData();
-        columnScheduled4.name(DATA_TABLE_2_COLUMN_4_NAME);
-        columnScheduled4.type(DATA_TABLE_2_COLUMN_4_TYPE);
-        columnScheduled4.code(DATA_TABLE_2_COLUMN_4_CODE);
-        columnScheduled4.mandatory(false);
-
-        List<PostColumnHeaderData> columnsScheduled = new ArrayList<>();
-        columnsScheduled.add(columnScheduled1);
-        columnsScheduled.add(columnScheduled2);
-        columnsScheduled.add(columnScheduled3);
-        columnsScheduled.add(columnScheduled4);
-
-        PostDataTablesRequest postDataTablesRequestScheduled = new PostDataTablesRequest();
-        postDataTablesRequestScheduled.datatableName(DATA_TABLE_2_NAME);
-        postDataTablesRequestScheduled.apptableName(DATA_TABLE_2_APP_NAME);
-        postDataTablesRequestScheduled.multiRow(true);
-        postDataTablesRequestScheduled.columns(columnsScheduled);
-
-        createDatatableIdempotent(postDataTablesRequestScheduled);
-
-        // 3 tags
-        PostColumnHeaderData column3Tags1 = new PostColumnHeaderData();
-        column3Tags1.name(DATA_TABLE_3_COLUMN_1_NAME);
-        column3Tags1.type(DATA_TABLE_3_COLUMN_1_TYPE);
-        column3Tags1.code(DATA_TABLE_3_COLUMN_1_CODE);
-        column3Tags1.mandatory(false);
-
-        PostColumnHeaderData column3Tags2 = new PostColumnHeaderData();
-        column3Tags2.name(DATA_TABLE_3_COLUMN_2_NAME);
-        column3Tags2.type(DATA_TABLE_3_COLUMN_2_TYPE);
-        column3Tags2.code(DATA_TABLE_3_COLUMN_2_CODE);
-        column3Tags2.mandatory(false);
-
-        PostColumnHeaderData column3Tags3 = new PostColumnHeaderData();
-        column3Tags3.name(DATA_TABLE_3_COLUMN_3_NAME);
-        column3Tags3.type(DATA_TABLE_3_COLUMN_3_TYPE);
-        column3Tags3.code(DATA_TABLE_3_COLUMN_3_CODE);
-        column3Tags3.mandatory(false);
-
-        PostColumnHeaderData column3Tags4 = new PostColumnHeaderData();
-        column3Tags4.name(DATA_TABLE_3_COLUMN_4_NAME);
-        column3Tags4.type(DATA_TABLE_3_COLUMN_4_TYPE);
-        column3Tags4.code(DATA_TABLE_3_COLUMN_4_CODE);
-        column3Tags4.mandatory(false);
-
-        PostColumnHeaderData column3Tags5 = new PostColumnHeaderData();
-        column3Tags5.name(DATA_TABLE_3_COLUMN_5_NAME);
-        column3Tags5.type(DATA_TABLE_3_COLUMN_5_TYPE);
-        column3Tags5.code(DATA_TABLE_3_COLUMN_5_CODE);
-        column3Tags5.mandatory(false);
-
-        List<PostColumnHeaderData> columns3Tags = new ArrayList<>();
-        columns3Tags.add(column3Tags1);
-        columns3Tags.add(column3Tags2);
-        columns3Tags.add(column3Tags3);
-        columns3Tags.add(column3Tags4);
-        columns3Tags.add(column3Tags5);
-
-        PostDataTablesRequest postDataTablesRequest3Tags = new PostDataTablesRequest();
-        postDataTablesRequest3Tags.datatableName(DATA_TABLE_3_NAME);
-        postDataTablesRequest3Tags.apptableName(DATA_TABLE_3_APP_NAME);
-        postDataTablesRequest3Tags.entitySubType(DATA_TABLE_3_ENTITY_SUBTYPE);
-        postDataTablesRequest3Tags.multiRow(false);
-        postDataTablesRequest3Tags.columns(columns3Tags);
-
-        createDatatableIdempotent(postDataTablesRequest3Tags);
+        List<Runnable> items = List.of(() -> createDatatableIdempotent(new PostDataTablesRequest().datatableName(DATA_TABLE_1_NAME)
+                .apptableName(DATA_TABLE_1_APP_NAME).multiRow(true)
+                .columns(List.of(
+                        new PostColumnHeaderData().name(DATA_TABLE_1_COLUMN_1_NAME).type(DATA_TABLE_1_COLUMN_1_TYPE)
+                                .code(DATA_TABLE_1_COLUMN_1_CODE).mandatory(false),
+                        new PostColumnHeaderData().name(DATA_TABLE_1_COLUMN_2_NAME).type(DATA_TABLE_1_COLUMN_2_TYPE).mandatory(false)))),
+                () -> createDatatableIdempotent(
+                        new PostDataTablesRequest().datatableName(DATA_TABLE_2_NAME).apptableName(DATA_TABLE_2_APP_NAME).multiRow(true)
+                                .columns(List.of(
+                                        new PostColumnHeaderData().name(DATA_TABLE_2_COLUMN_1_NAME).type(DATA_TABLE_2_COLUMN_1_TYPE)
+                                                .length(DATA_TABLE_2_COLUMN_1_LENGTH).mandatory(false),
+                                        new PostColumnHeaderData().name(DATA_TABLE_2_COLUMN_2_NAME).type(DATA_TABLE_2_COLUMN_2_TYPE)
+                                                .mandatory(false),
+                                        new PostColumnHeaderData().name(DATA_TABLE_2_COLUMN_3_NAME).type(DATA_TABLE_2_COLUMN_3_TYPE)
+                                                .mandatory(false),
+                                        new PostColumnHeaderData().name(DATA_TABLE_2_COLUMN_4_NAME).type(DATA_TABLE_2_COLUMN_4_TYPE)
+                                                .code(DATA_TABLE_2_COLUMN_4_CODE).mandatory(false)))),
+                () -> createDatatableIdempotent(new PostDataTablesRequest().datatableName(DATA_TABLE_3_NAME)
+                        .apptableName(DATA_TABLE_3_APP_NAME).entitySubType(DATA_TABLE_3_ENTITY_SUBTYPE).multiRow(false)
+                        .columns(List.of(
+                                new PostColumnHeaderData().name(DATA_TABLE_3_COLUMN_1_NAME).type(DATA_TABLE_3_COLUMN_1_TYPE)
+                                        .code(DATA_TABLE_3_COLUMN_1_CODE).mandatory(false),
+                                new PostColumnHeaderData().name(DATA_TABLE_3_COLUMN_2_NAME).type(DATA_TABLE_3_COLUMN_2_TYPE)
+                                        .code(DATA_TABLE_3_COLUMN_2_CODE).mandatory(false),
+                                new PostColumnHeaderData().name(DATA_TABLE_3_COLUMN_3_NAME).type(DATA_TABLE_3_COLUMN_3_TYPE)
+                                        .code(DATA_TABLE_3_COLUMN_3_CODE).mandatory(false),
+                                new PostColumnHeaderData().name(DATA_TABLE_3_COLUMN_4_NAME).type(DATA_TABLE_3_COLUMN_4_TYPE)
+                                        .code(DATA_TABLE_3_COLUMN_4_CODE).mandatory(false),
+                                new PostColumnHeaderData().name(DATA_TABLE_3_COLUMN_5_NAME).type(DATA_TABLE_3_COLUMN_5_TYPE)
+                                        .code(DATA_TABLE_3_COLUMN_5_CODE).mandatory(false)))));
+        ParallelExecutionHelper.runInParallel(items);
     }
 
     private void createDatatableIdempotent(PostDataTablesRequest datatableRequest) {
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DelinquencyGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DelinquencyGlobalInitializerStep.java
index e3457e3..379f59f 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DelinquencyGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/DelinquencyGlobalInitializerStep.java
@@ -35,9 +35,11 @@
 import org.apache.fineract.client.models.DelinquencyRangeResponse;
 import org.apache.fineract.client.models.MinimumPaymentPeriodAndRule;
 import org.apache.fineract.client.models.PostDelinquencyRangeResponse;
+import org.apache.fineract.test.data.DelinquencyBucket;
 import org.apache.fineract.test.data.delinquency.DelinquencyBucketType;
 import org.apache.fineract.test.data.delinquency.DelinquencyFrequencyType;
 import org.apache.fineract.test.data.delinquency.DelinquencyMinimumPayment;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -50,8 +52,6 @@
 
     public static final String DEFAULT_LOCALE = "en";
     public static final List<Integer> DEFAULT_DELINQUENCY_RANGES = Arrays.asList(1, 3, 30, 60, 90, 120, 150, 180, 240);
-    public static final String DEFAULT_DELINQUENCY_BUCKET_NAME = "Default delinquency bucket";
-    public static final String DEFAULT_WC_DELINQUENCY_BUCKET_NAME = "Default Working Capital delinquency bucket";
 
     private final FineractFeignClient fineractClient;
 
@@ -60,10 +60,10 @@
 
     @Override
     public void initialize() {
-        setDefaultDelinquencyRanges();
-        setDefaultDelinquencyBucket();
-        setDefaultWCDelinquencyRanges();
-        setDefaultWCDelinquencyBucket();
+        List<Runnable> items = List.of(this::setDefaultDelinquencyRanges, this::setDefaultWCDelinquencyRanges);
+        ParallelExecutionHelper.runInParallel(items);
+        items = List.of(this::setDefaultDelinquencyBucket, this::setDefaultWCDelinquencyBucket);
+        ParallelExecutionHelper.runInParallel(items);
     }
 
     public void setDefaultDelinquencyRanges() {
@@ -75,51 +75,21 @@
             existingRanges = new ArrayList<>();
         }
 
+        List<RangeDefinition> defaultRanges = new ArrayList<>();
         for (int i = 0; i < DEFAULT_DELINQUENCY_RANGES.size() - 1; i++) {
-            String classification = "Delinquency range " + DEFAULT_DELINQUENCY_RANGES.get(i).toString();
-
-            DelinquencyRangeResponse existingRange = existingRanges.stream().filter(r -> classification.equals(r.getClassification()))
-                    .findFirst().orElse(null);
-
-            if (existingRange != null) {
-                createdRangeIds.add(existingRange.getId());
-                continue;
-            }
-
-            DelinquencyRangeRequest postDelinquencyRangeRequest = new DelinquencyRangeRequest();
-            postDelinquencyRangeRequest.classification(classification);
-            postDelinquencyRangeRequest.locale(DEFAULT_LOCALE);
-            if (DEFAULT_DELINQUENCY_RANGES.get(i) == 1) {
-                postDelinquencyRangeRequest.minimumAgeDays(1);
-                postDelinquencyRangeRequest.maximumAgeDays(3);
-            } else {
-                postDelinquencyRangeRequest.minimumAgeDays(DEFAULT_DELINQUENCY_RANGES.get(i) + 1);
-                postDelinquencyRangeRequest.maximumAgeDays(DEFAULT_DELINQUENCY_RANGES.get(i + 1));
-            }
-
-            PostDelinquencyRangeResponse response = ok(
-                    () -> fineractClient.delinquencyRangeAndBucketsManagement().createRange(postDelinquencyRangeRequest, Map.of()));
-            createdRangeIds.add(response.getResourceId());
+            Integer rangeStart = DEFAULT_DELINQUENCY_RANGES.get(i);
+            String classification = "Delinquency range " + rangeStart;
+            Integer minDays = rangeStart == 1 ? 1 : rangeStart + 1;
+            Integer maxDays = DEFAULT_DELINQUENCY_RANGES.get(i + 1);
+            defaultRanges.add(new RangeDefinition(classification, minDays, maxDays));
         }
 
-        String lastClassification = "Delinquency range " + DEFAULT_DELINQUENCY_RANGES.get(DEFAULT_DELINQUENCY_RANGES.size() - 1).toString();
-        DelinquencyRangeResponse existingLastRange = existingRanges.stream().filter(r -> lastClassification.equals(r.getClassification()))
-                .findFirst().orElse(null);
+        Integer lastRangeStart = DEFAULT_DELINQUENCY_RANGES.get(DEFAULT_DELINQUENCY_RANGES.size() - 1);
+        defaultRanges.add(new RangeDefinition("Delinquency range " + lastRangeStart, lastRangeStart + 1, null));
 
-        if (existingLastRange != null) {
-            createdRangeIds.add(existingLastRange.getId());
-            return;
-        }
-
-        DelinquencyRangeRequest lastRange = new DelinquencyRangeRequest();
-        lastRange.classification(lastClassification);
-        lastRange.locale(DEFAULT_LOCALE);
-        lastRange.minimumAgeDays(DEFAULT_DELINQUENCY_RANGES.get(DEFAULT_DELINQUENCY_RANGES.size() - 1) + 1);
-        lastRange.maximumAgeDays(null);
-
-        PostDelinquencyRangeResponse lastResponse = ok(
-                () -> fineractClient.delinquencyRangeAndBucketsManagement().createRange(lastRange, Map.of()));
-        createdRangeIds.add(lastResponse.getResourceId());
+        final List<DelinquencyRangeResponse> ranges = existingRanges;
+        createdRangeIds.clear();
+        createdRangeIds.addAll(defaultRanges.parallelStream().map(rangeDef -> createRangeIfNotExists(ranges, rangeDef)).toList());
     }
 
     public void setDefaultWCDelinquencyRanges() {
@@ -136,27 +106,9 @@
                 new RangeDefinition("D150", 151, 180), new RangeDefinition("D180", 181, 210), new RangeDefinition("D210", 211, 240),
                 new RangeDefinition("D240", 241, 270), new RangeDefinition("D270", 271, null));
 
-        for (RangeDefinition rangeDef : wclpRanges) {
-            String classification = rangeDef.name;
-
-            DelinquencyRangeResponse existingRange = existingRanges.stream().filter(r -> classification.equals(r.getClassification()))
-                    .findFirst().orElse(null);
-
-            if (existingRange != null) {
-                createdWCRangeIds.add(existingRange.getId());
-                continue;
-            }
-
-            DelinquencyRangeRequest rangeRequest = new DelinquencyRangeRequest();
-            rangeRequest.classification(classification);
-            rangeRequest.locale(DEFAULT_LOCALE);
-            rangeRequest.minimumAgeDays(rangeDef.minDays);
-            rangeRequest.maximumAgeDays(rangeDef.maxDays);
-
-            PostDelinquencyRangeResponse response = ok(
-                    () -> fineractClient.delinquencyRangeAndBucketsManagement().createRange(rangeRequest, Map.of()));
-            createdWCRangeIds.add(response.getResourceId());
-        }
+        final List<DelinquencyRangeResponse> ranges = existingRanges;
+        createdWCRangeIds.clear();
+        createdWCRangeIds.addAll(wclpRanges.parallelStream().map(rangeDef -> createRangeIfNotExists(ranges, rangeDef)).toList());
 
         log.debug("Created WCLP delinquency ranges with IDs: {}", createdWCRangeIds);
     }
@@ -174,10 +126,30 @@
         }
     }
 
+    private Long createRangeIfNotExists(List<DelinquencyRangeResponse> existingRanges, RangeDefinition rangeDef) {
+        DelinquencyRangeResponse existingRange = existingRanges.stream().filter(r -> rangeDef.name.equals(r.getClassification()))
+                .findFirst().orElse(null);
+
+        if (existingRange != null) {
+            return existingRange.getId();
+        }
+
+        DelinquencyRangeRequest rangeRequest = new DelinquencyRangeRequest();
+        rangeRequest.classification(rangeDef.name);
+        rangeRequest.locale(DEFAULT_LOCALE);
+        rangeRequest.minimumAgeDays(rangeDef.minDays);
+        rangeRequest.maximumAgeDays(rangeDef.maxDays);
+
+        PostDelinquencyRangeResponse response = ok(
+                () -> fineractClient.delinquencyRangeAndBucketsManagement().createRange(rangeRequest, Map.of()));
+        return response.getResourceId();
+    }
+
     public void setDefaultDelinquencyBucket() {
         try {
             List<DelinquencyBucketResponse> existingBuckets = fineractClient.delinquencyRangeAndBucketsManagement().getBuckets(Map.of());
-            boolean bucketExists = existingBuckets.stream().anyMatch(b -> DEFAULT_DELINQUENCY_BUCKET_NAME.equals(b.getName()));
+            boolean bucketExists = existingBuckets.stream()
+                    .anyMatch(b -> DelinquencyBucket.BASIC_DELINQUENCY_BUCKET.name().equals(b.getName()));
 
             if (bucketExists) {
                 return;
@@ -187,7 +159,7 @@
         }
 
         DelinquencyBucketRequest postDelinquencyBucketRequest = new DelinquencyBucketRequest();
-        postDelinquencyBucketRequest.name(DEFAULT_DELINQUENCY_BUCKET_NAME);
+        postDelinquencyBucketRequest.name(DelinquencyBucket.BASIC_DELINQUENCY_BUCKET.name());
         postDelinquencyBucketRequest.ranges(createdRangeIds);
 
         executeVoid(() -> fineractClient.delinquencyRangeAndBucketsManagement().createBucket(postDelinquencyBucketRequest, Map.of()));
@@ -196,7 +168,8 @@
     public void setDefaultWCDelinquencyBucket() {
         try {
             List<DelinquencyBucketResponse> existingBuckets = fineractClient.delinquencyRangeAndBucketsManagement().getBuckets(Map.of());
-            boolean bucketExists = existingBuckets.stream().anyMatch(b -> DEFAULT_WC_DELINQUENCY_BUCKET_NAME.equals(b.getName()));
+            boolean bucketExists = existingBuckets.stream()
+                    .anyMatch(b -> DelinquencyBucket.WC_DELINQUENCY_BUCKET.name().equals(b.getName()));
 
             if (bucketExists) {
                 return;
@@ -205,8 +178,8 @@
             log.debug("Could not retrieve existing working capital delinquency buckets, will create default bucket", e);
         }
 
-        DelinquencyBucketRequest postDelinquencyBucketWCRequest = new DelinquencyBucketRequest().name(DEFAULT_WC_DELINQUENCY_BUCKET_NAME)
-                .bucketType(DelinquencyBucketType.WORKING_CAPITAL.name())//
+        DelinquencyBucketRequest postDelinquencyBucketWCRequest = new DelinquencyBucketRequest()
+                .name(DelinquencyBucket.WC_DELINQUENCY_BUCKET.name()).bucketType(DelinquencyBucketType.WORKING_CAPITAL.name())//
                 .ranges(createdWCRangeIds) //
                 .minimumPaymentPeriodAndRule(new MinimumPaymentPeriodAndRule() //
                         .frequency(30) //
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/FinancialActivityMappingGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/FinancialActivityMappingGlobalInitializerStep.java
index 2f6ca5a..3054e82 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/FinancialActivityMappingGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/FinancialActivityMappingGlobalInitializerStep.java
@@ -19,6 +19,7 @@
 package org.apache.fineract.test.initializer.global;
 
 import static org.apache.fineract.client.feign.util.FeignCalls.executeVoid;
+import static org.apache.fineract.test.data.accounttype.DefaultAccountType.ASSET_TRANSFER;
 
 import java.util.Map;
 import lombok.RequiredArgsConstructor;
@@ -26,6 +27,7 @@
 import org.apache.fineract.client.feign.FineractFeignClient;
 import org.apache.fineract.client.feign.util.CallFailedRuntimeException;
 import org.apache.fineract.client.models.PostFinancialActivityAccountsRequest;
+import org.apache.fineract.test.data.accounttype.AccountTypeResolver;
 import org.springframework.stereotype.Component;
 
 @Slf4j
@@ -34,14 +36,15 @@
 public class FinancialActivityMappingGlobalInitializerStep implements FineractGlobalInitializerStep {
 
     public static final Long FINANCIAL_ACTIVITY_ID_ASSET_TRANSFER = 100L;
-    public static final Long GL_ACCOUNT_ID_ASSET_TRANSFER = 21L;
 
     private final FineractFeignClient fineractClient;
+    private final AccountTypeResolver accountTypeResolver;
 
     @Override
     public void initialize() {
+        Long assetTransferGlAccountId = accountTypeResolver.resolve(ASSET_TRANSFER);
         PostFinancialActivityAccountsRequest request = new PostFinancialActivityAccountsRequest()
-                .financialActivityId(FINANCIAL_ACTIVITY_ID_ASSET_TRANSFER).glAccountId(GL_ACCOUNT_ID_ASSET_TRANSFER);
+                .financialActivityId(FINANCIAL_ACTIVITY_ID_ASSET_TRANSFER).glAccountId(assetTransferGlAccountId);
 
         try {
             executeVoid(() -> fineractClient.mappingFinancialActivitiesToAccounts().createGLAccountMappingFinancialActivityAccount(request,
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GLGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GLGlobalInitializerStep.java
index 7739942..1d69ec5 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GLGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GLGlobalInitializerStep.java
@@ -31,6 +31,7 @@
 import org.apache.fineract.test.data.GLAType;
 import org.apache.fineract.test.data.GLAUsage;
 import org.apache.fineract.test.factory.GLAccountRequestFactory;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -108,30 +109,36 @@
 
         final List<GetGLAccountsResponse> accounts = existingAccounts;
 
-        createGLAccountIfNotExists(accounts, GLA_NAME_1, GLA_GL_CODE_1, GLA_TYPE_ASSET);
-        createGLAccountIfNotExists(accounts, GLA_NAME_2, GLA_GL_CODE_2, GLA_TYPE_ASSET);
-        createGLAccountIfNotExists(accounts, GLA_NAME_3, GLA_GL_CODE_3, GLA_TYPE_ASSET);
-        createGLAccountIfNotExists(accounts, GLA_NAME_4, GLA_GL_CODE_4, GLA_TYPE_ASSET);
-        createGLAccountIfNotExists(accounts, GLA_NAME_5, GLA_GL_CODE_5, GLA_TYPE_LIABILITY);
-        createGLAccountIfNotExists(accounts, GLA_NAME_6, GLA_GL_CODE_6, GLA_TYPE_LIABILITY);
-        createGLAccountIfNotExists(accounts, GLA_NAME_7, GLA_GL_CODE_7, GLA_TYPE_INCOME);
-        createGLAccountIfNotExists(accounts, GLA_NAME_8, GLA_GL_CODE_8, GLA_TYPE_INCOME);
-        createGLAccountIfNotExists(accounts, GLA_NAME_9, GLA_GL_CODE_9, GLA_TYPE_INCOME);
-        createGLAccountIfNotExists(accounts, GLA_NAME_10, GLA_GL_CODE_10, GLA_TYPE_INCOME);
-        createGLAccountIfNotExists(accounts, GLA_NAME_11, GLA_GL_CODE_11, GLA_TYPE_INCOME);
-        createGLAccountIfNotExists(accounts, GLA_NAME_12, GLA_GL_CODE_12, GLA_TYPE_EXPENSE);
-        createGLAccountIfNotExists(accounts, GLA_NAME_13, GLA_GL_CODE_13, GLA_TYPE_EXPENSE);
-        createGLAccountIfNotExists(accounts, GLA_NAME_14, GLA_GL_CODE_14, GLA_TYPE_ASSET);
-        createGLAccountIfNotExists(accounts, GLA_NAME_15, GLA_GL_CODE_15, GLA_TYPE_INCOME);
-        createGLAccountIfNotExists(accounts, GLA_NAME_16, GLA_GL_CODE_16, GLA_TYPE_EXPENSE);
-        createGLAccountIfNotExists(accounts, GLA_NAME_17, GLA_GL_CODE_17, GLA_TYPE_LIABILITY);
-        createGLAccountIfNotExists(accounts, GLA_NAME_18, GLA_GL_CODE_18, GLA_TYPE_ASSET);
-        createGLAccountIfNotExists(accounts, GLA_NAME_19, GLA_GL_CODE_19, GLA_TYPE_EXPENSE);
-        createGLAccountIfNotExists(accounts, GLA_NAME_20, GLA_GL_CODE_20, GLA_TYPE_INCOME);
-        createGLAccountIfNotExists(accounts, GLA_NAME_21, GLA_GL_CODE_21, GLA_TYPE_ASSET);
-        createGLAccountIfNotExists(accounts, GLA_NAME_22, GLA_GL_CODE_22, GLA_TYPE_LIABILITY);
-        createGLAccountIfNotExists(accounts, GLA_NAME_23, GLA_GL_CODE_23, GLA_TYPE_EXPENSE);
-        createGLAccountIfNotExists(accounts, GLA_NAME_24, GLA_GL_CODE_24, GLA_TYPE_INCOME);
+        List<GLAccountDefinition> items = List.of(new GLAccountDefinition(GLA_NAME_1, GLA_GL_CODE_1, GLA_TYPE_ASSET),
+                new GLAccountDefinition(GLA_NAME_2, GLA_GL_CODE_2, GLA_TYPE_ASSET),
+                new GLAccountDefinition(GLA_NAME_3, GLA_GL_CODE_3, GLA_TYPE_ASSET),
+                new GLAccountDefinition(GLA_NAME_4, GLA_GL_CODE_4, GLA_TYPE_ASSET),
+                new GLAccountDefinition(GLA_NAME_5, GLA_GL_CODE_5, GLA_TYPE_LIABILITY),
+                new GLAccountDefinition(GLA_NAME_6, GLA_GL_CODE_6, GLA_TYPE_LIABILITY),
+                new GLAccountDefinition(GLA_NAME_7, GLA_GL_CODE_7, GLA_TYPE_INCOME),
+                new GLAccountDefinition(GLA_NAME_8, GLA_GL_CODE_8, GLA_TYPE_INCOME),
+                new GLAccountDefinition(GLA_NAME_9, GLA_GL_CODE_9, GLA_TYPE_INCOME),
+                new GLAccountDefinition(GLA_NAME_10, GLA_GL_CODE_10, GLA_TYPE_INCOME),
+                new GLAccountDefinition(GLA_NAME_11, GLA_GL_CODE_11, GLA_TYPE_INCOME),
+                new GLAccountDefinition(GLA_NAME_12, GLA_GL_CODE_12, GLA_TYPE_EXPENSE),
+                new GLAccountDefinition(GLA_NAME_13, GLA_GL_CODE_13, GLA_TYPE_EXPENSE),
+                new GLAccountDefinition(GLA_NAME_14, GLA_GL_CODE_14, GLA_TYPE_ASSET),
+                new GLAccountDefinition(GLA_NAME_15, GLA_GL_CODE_15, GLA_TYPE_INCOME),
+                new GLAccountDefinition(GLA_NAME_16, GLA_GL_CODE_16, GLA_TYPE_EXPENSE),
+                new GLAccountDefinition(GLA_NAME_17, GLA_GL_CODE_17, GLA_TYPE_LIABILITY),
+                new GLAccountDefinition(GLA_NAME_18, GLA_GL_CODE_18, GLA_TYPE_ASSET),
+                new GLAccountDefinition(GLA_NAME_19, GLA_GL_CODE_19, GLA_TYPE_EXPENSE),
+                new GLAccountDefinition(GLA_NAME_20, GLA_GL_CODE_20, GLA_TYPE_INCOME),
+                new GLAccountDefinition(GLA_NAME_21, GLA_GL_CODE_21, GLA_TYPE_ASSET),
+                new GLAccountDefinition(GLA_NAME_22, GLA_GL_CODE_22, GLA_TYPE_LIABILITY),
+                new GLAccountDefinition(GLA_NAME_23, GLA_GL_CODE_23, GLA_TYPE_EXPENSE),
+                new GLAccountDefinition(GLA_NAME_24, GLA_GL_CODE_24, GLA_TYPE_INCOME));
+
+        ParallelExecutionHelper.runInParallel(items,
+                (definition) -> createGLAccountIfNotExists(accounts, definition.name(), definition.glCode(), definition.type()));
+    }
+
+    private record GLAccountDefinition(String name, String glCode, Integer type) {
     }
 
     private void createGLAccountIfNotExists(List<GetGLAccountsResponse> existingAccounts, String name, String glCode, Integer type) {
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GlobalConfigurationGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GlobalConfigurationGlobalInitializerStep.java
index 3ee84d2..9c67616 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GlobalConfigurationGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/GlobalConfigurationGlobalInitializerStep.java
@@ -18,8 +18,10 @@
  */
 package org.apache.fineract.test.initializer.global;
 
+import java.util.List;
 import lombok.RequiredArgsConstructor;
 import org.apache.fineract.test.helper.GlobalConfigurationHelper;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -42,13 +44,14 @@
 
     @Override
     public void initialize() throws Exception {
-        globalConfigurationHelper.disableGlobalConfiguration(CONFIG_KEY_ENABLE_ADDRESS, 0L);
-        globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_INTEREST_CALCULATION, 0L);
-        globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_BUSINESS_DATE, 0L);
-        globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_RECALCULATE_COB_DATE, 0L);
-        globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_DAYS_BEFORE_REPAYMENT_IS_DUE, 1L);
-        globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_DAYS_AFTER_REPAYMENT_IS_OVERDUE, 2L);
-        globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_AUTO_GENERATED_EXTERNAL_ID, 0L);
-        globalConfigurationHelper.disableGlobalConfiguration(CONFIG_KEY_ALLOW_CASH_AND_NON_CASH_ACCRUAL, 0L);
+        List<Runnable> items = List.of(() -> globalConfigurationHelper.disableGlobalConfiguration(CONFIG_KEY_ENABLE_ADDRESS, 0L),
+                () -> globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_INTEREST_CALCULATION, 0L),
+                () -> globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_BUSINESS_DATE, 0L),
+                () -> globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_RECALCULATE_COB_DATE, 0L),
+                () -> globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_DAYS_BEFORE_REPAYMENT_IS_DUE, 1L),
+                () -> globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_DAYS_AFTER_REPAYMENT_IS_OVERDUE, 2L),
+                () -> globalConfigurationHelper.enableGlobalConfiguration(CONFIG_KEY_ENABLE_AUTO_GENERATED_EXTERNAL_ID, 0L),
+                () -> globalConfigurationHelper.disableGlobalConfiguration(CONFIG_KEY_ALLOW_CASH_AND_NON_CASH_ACCRUAL, 0L));
+        ParallelExecutionHelper.runInParallel(items);
     }
 }
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
index b2528ff..803d832 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
@@ -23,6 +23,11 @@
 import static org.apache.fineract.test.data.ChargeOffBehaviour.ACCELERATE_MATURITY;
 import static org.apache.fineract.test.data.ChargeOffBehaviour.ZERO_INTEREST;
 import static org.apache.fineract.test.data.TransactionProcessingStrategyCode.ADVANCED_PAYMENT_ALLOCATION;
+import static org.apache.fineract.test.data.accounttype.DefaultAccountType.BUY_DOWN_EXPENSE;
+import static org.apache.fineract.test.data.accounttype.DefaultAccountType.CREDIT_LOSS_BAD_DEBT;
+import static org.apache.fineract.test.data.accounttype.DefaultAccountType.FEE_INCOME;
+import static org.apache.fineract.test.data.accounttype.DefaultAccountType.RECOVERIES;
+import static org.apache.fineract.test.data.accounttype.DefaultAccountType.WRITTEN_OFF;
 import static org.apache.fineract.test.factory.LoanProductsRequestFactory.INTEREST_CALCULATION_PERIOD_TYPE_SAME_AS_REPAYMENT;
 import static org.apache.fineract.test.factory.LoanProductsRequestFactory.INTEREST_RATE_FREQUENCY_TYPE_MONTH;
 import static org.apache.fineract.test.factory.LoanProductsRequestFactory.INTEREST_RATE_FREQUENCY_TYPE_WHOLE_TERM;
@@ -53,6 +58,7 @@
 import org.apache.fineract.client.models.PostLoanProductsResponse;
 import org.apache.fineract.client.models.PostWriteOffReasonToExpenseAccountMappings;
 import org.apache.fineract.test.data.AdvancePaymentsAdjustmentType;
+import org.apache.fineract.test.data.ChargeProductResolver;
 import org.apache.fineract.test.data.ChargeProductType;
 import org.apache.fineract.test.data.DaysInMonthType;
 import org.apache.fineract.test.data.DaysInYearType;
@@ -63,6 +69,7 @@
 import org.apache.fineract.test.data.PreClosureInterestCalculationRule;
 import org.apache.fineract.test.data.RecalculationRestFrequencyType;
 import org.apache.fineract.test.data.TransactionProcessingStrategyCode;
+import org.apache.fineract.test.data.accounttype.AccountTypeResolver;
 import org.apache.fineract.test.data.codevalue.CodeNames;
 import org.apache.fineract.test.data.codevalue.CodeValue;
 import org.apache.fineract.test.data.codevalue.CodeValueResolver;
@@ -70,6 +77,7 @@
 import org.apache.fineract.test.data.loanproduct.DefaultLoanProduct;
 import org.apache.fineract.test.factory.LoanProductsRequestFactory;
 import org.apache.fineract.test.helper.CodeHelper;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.apache.fineract.test.support.TestContext;
 import org.apache.fineract.test.support.TestContextKey;
 import org.springframework.stereotype.Component;
@@ -83,4582 +91,5076 @@
     private final LoanProductsRequestFactory loanProductsRequestFactory;
     private final CodeHelper codeHelper;
     private final CodeValueResolver codeValueResolver;
+    private final AccountTypeResolver accountTypeResolver;
+    private final ChargeProductResolver chargeProductResolver;
 
     @Override
     public void initialize() throws Exception {
-        // LP1
-        String name = DefaultLoanProduct.LP1.getName();
-        PostLoanProductsRequest loanProductsRequest = loanProductsRequestFactory.defaultLoanProductsRequestLP1().name(name);
-        PostLoanProductsResponse response = createLoanProductIdempotent(loanProductsRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1, response);
-
-        // LP1 product with due date and overdue date for repayment in config
-        // (LP1_DUE_DATE)
-        PostLoanProductsRequest loanProductsRequestDueDate = loanProductsRequestFactory.defaultLoanProductsRequestLP1()//
-                .name(DefaultLoanProduct.LP1_DUE_DATE.getName())//
-                .dueDaysForRepaymentEvent(3)//
-                .overDueDaysForRepaymentEvent(3);//
-        PostLoanProductsResponse responseDueDate = createLoanProductIdempotent(loanProductsRequestDueDate);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_DUE_DATE, responseDueDate);
-
-        // LP1 with 12% FLAT interest
-        // (LP1_INTEREST_FLAT)
-        String name2 = DefaultLoanProduct.LP1_INTEREST_FLAT.getName();
-        PostLoanProductsRequest loanProductsRequestInterestFlat = loanProductsRequestFactory.defaultLoanProductsRequestLP1InterestFlat()
-                .name(name2);
-        PostLoanProductsResponse responseInterestFlat = createLoanProductIdempotent(loanProductsRequestInterestFlat);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT, responseInterestFlat);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Same as payment period
-        // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_SAME_AS_PAYMENT)
-        String name3 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_SAME_AS_PAYMENT.getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodSameAsPayment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDeclining().name(name3);
-        PostLoanProductsResponse responseInterestDecliningPeriodSameAsPayment = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningPeriodSameAsPayment);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_SAME_AS_PAYMENT,
-                responseInterestDecliningPeriodSameAsPayment);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily
-        // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY)
-        String name4 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY.getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodDaily = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDeclining().name(name4)
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value).allowPartialPeriodInterestCalculation(false);
-        PostLoanProductsResponse responseInterestDecliningPeriodDaily = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningPeriodDaily);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_DAILY,
-                responseInterestDecliningPeriodDaily);
-
-        // LP1-1MONTH with 12% DECLINING BALANCE interest, interest period: Daily, Interest recalculation-Monthly,
-        // Compounding:Interest
-        // (LP1_1MONTH_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_MONTHLY)
-        String name5 = DefaultLoanProduct.LP1_1MONTH_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_MONTHLY.getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingMonthly = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP11MonthInterestDecliningBalanceDailyRecalculationCompoundingMonthly().name(name5);
-        PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingMonthly = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingMonthly);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_1MONTH_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_MONTHLY,
-                responseInterestDecliningBalanceDailyRecalculationCompoundingMonthly);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
-        // recalculation-Daily, Compounding:none
-        // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE)
-        String name6 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE.getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNone = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone().name(name6);
-        PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingNone = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNone);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE,
-                responseInterestDecliningBalanceDailyRecalculationCompoundingNone);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
-        // recalculation-Daily, Compounding:none, rescheduleStrategyMethod:Reduce number of installments
-        // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_REDUCE_NR_INST)
-        String name7 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_REDUCE_NR_INST
-                .getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name7)//
-                .rescheduleStrategyMethod(AdvancePaymentsAdjustmentType.REDUCE_NUMBER_OF_INSTALLMENTS.value);//
-        PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_REDUCE_NR_INSTALLMENTS,
-                responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
-        // recalculation-Daily, Compounding:none, rescheduleStrategyMethod:Reschedule next repayments
-        // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_RESCH_NEXT_REP)
-        String name8 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_RESCH_NEXT_REP
-                .getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name8)//
-                .rescheduleStrategyMethod(AdvancePaymentsAdjustmentType.RESCHEDULE_NEXT_REPAYMENTS.value);//
-        PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_NEXT_REPAYMENTS,
-                responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
-        // recalculation-Daily, Compounding:none, Interest Recalculation Frequency: Same as Repayment Period
-        // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE)
-        String name9 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE.getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name9)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value);//
-        PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE,
-                responseInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
-        // recalculation-Daily, Compounding:none, Interest Recalculation Frequency: Same as Repayment Period,
-        // Multi-disbursement
-        // (LP1_INTEREST_DECLINING_BALANCE_SAR_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE_MULTIDISB)
-        String name10 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_SAR_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE_MULTIDISB
-                .getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name10)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowPartialPeriodInterestCalculation(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_SAR_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE_MULTI_DISBURSEMENT,
-                responseInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement);
-
-        // LP1 with new due-penalty-fee-interest-principal-in-advance-principal-penalty-fee-interest-strategy payment
-        // strategy
-        // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE)
-        String name11 = DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE.getName();
-        PostLoanProductsRequest loanProductsRequestDueInAdvance = loanProductsRequestFactory.defaultLoanProductsRequestLP1()//
-                .name(name11)//
-                .transactionProcessingStrategyCode(
-                        TransactionProcessingStrategyCode.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST.value);//
-        PostLoanProductsResponse responseDueInAdvance = createLoanProductIdempotent(loanProductsRequestDueInAdvance);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE,
-                responseDueInAdvance);
-
-        // LP1 with new due-penalty-fee-interest-principal-in-advance-principal-penalty-fee-interest-strategy payment
-        // strategy and with 12% FLAT interest
-        // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT)
-        String name12 = DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT.getName();
-        PostLoanProductsRequest loanProductsRequestDueInAdvanceInterestFlat = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestFlat()//
-                .name(name12)//
-                .transactionProcessingStrategyCode(
-                        TransactionProcessingStrategyCode.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST.value);//
-        PostLoanProductsResponse responseDueInAdvanceInterestFlat = createLoanProductIdempotent(
-                loanProductsRequestDueInAdvanceInterestFlat);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT,
-                responseDueInAdvanceInterestFlat);
-
-        // LP1 with new due-penalty-interest-principal-fee-in-advance-penalty-interest-principal-fee-strategy payment
-        // strategy
-        // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE)
-        PostLoanProductsRequest loanProductsRequestDueInAdvance2 = loanProductsRequestFactory.defaultLoanProductsRequestLP1()//
-                .name(DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE.getName())//
-                .transactionProcessingStrategyCode(
-                        TransactionProcessingStrategyCode.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE.value);//
-        PostLoanProductsResponse responseDueInAdvance2 = createLoanProductIdempotent(loanProductsRequestDueInAdvance2);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE,
-                responseDueInAdvance2);
-
-        // LP1 with new due-penalty-interest-principal-fee-in-advance-penalty-interest-principal-fee-strategy payment
-        // strategy and with 12% FLAT interest
-        // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_INTEREST_FLAT)
-        PostLoanProductsRequest loanProductsRequestDueInAdvanceInterestFlat2 = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestFlat()//
-                .name(DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_INTEREST_FLAT.getName())//
-                .transactionProcessingStrategyCode(
-                        TransactionProcessingStrategyCode.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE.value);//
-        PostLoanProductsResponse responseDueInAdvanceInterestFlat2 = createLoanProductIdempotent(
-                loanProductsRequestDueInAdvanceInterestFlat2);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_INTEREST_FLAT,
-                responseDueInAdvanceInterestFlat2);
-
-        // LP1 with 12% FLAT interest with % overdue fee for amount
-        // (LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT)
-        String name13 = DefaultLoanProduct.LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT.getName();
-        List<LoanProductChargeData> charges = new ArrayList<>();
-        charges.add(new LoanProductChargeData().id(ChargeProductType.LOAN_PERCENTAGE_LATE_FEE.value));
-        PostLoanProductsRequest loanProductsRequestInterestFlatOverdueFeeAmount = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestFlat()//
-                .name(name13)//
-                .charges(charges);//
-        PostLoanProductsResponse responseInterestFlatOverdueFeeAmount = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatOverdueFeeAmount);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT,
-                responseInterestFlatOverdueFeeAmount);
-
-        // LP1 with 12% FLAT interest with % overdue fee for amount+interest
-        // (LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT_INTEREST)
-        String name14 = DefaultLoanProduct.LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT_INTEREST.getName();
-        List<LoanProductChargeData> chargesInterest = new ArrayList<>();
-        chargesInterest.add(new LoanProductChargeData().id(ChargeProductType.LOAN_PERCENTAGE_LATE_FEE_AMOUNT_PLUS_INTEREST.value));
-        PostLoanProductsRequest loanProductsRequestInterestFlatOverdueFeeAmountInterest = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestFlat()//
-                .name(name14)//
-                .charges(chargesInterest);//
-        PostLoanProductsResponse responseInterestFlatOverdueFeeAmountInterest = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatOverdueFeeAmountInterest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT_INTEREST,
-                responseInterestFlatOverdueFeeAmountInterest);
-
-        // LP2 with Down-payment
-        // (LP2_DOWNPAYMENT)
-        String name15 = DefaultLoanProduct.LP2_DOWNPAYMENT.getName();
-        PostLoanProductsRequest loanProductsRequestDownPayment = loanProductsRequestFactory.defaultLoanProductsRequestLP2()//
-                .name(name15)//
-                .enableAutoRepaymentForDownPayment(false);//
-        PostLoanProductsResponse responseDownPayment = createLoanProductIdempotent(loanProductsRequestDownPayment);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT, responseDownPayment);
-
-        // LP2 with Down-payment+autopayment
-        // (LP2_DOWNPAYMENT_AUTO)
-        String name16 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAuto = loanProductsRequestFactory.defaultLoanProductsRequestLP2()
-                .name(name16);
-        PostLoanProductsResponse responseDownPaymentAuto = createLoanProductIdempotent(loanProductsRequestDownPaymentAuto);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO, responseDownPaymentAuto);
-
-        // LP2 with Down-payment+autopayment + advanced payment allocation
-        // (LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION)
-        String name17 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvPaymentAllocation = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name17)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocation = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAutoAdvPaymentAllocation);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION,
-                responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocation);
-
-        // LP2 with Down-payment+autopayment + advanced payment allocation, no installmentAmountInMultiplesOf
-        // (LP2_DOWNPAYMENT_AUTO_ADV_PMT_ALLOC_NO_MULTIPLES_OF)
-        final String nameDownPaymentAutoAdvPmtAllocNoMultiplesOf = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADV_PMT_ALLOC_NO_MULTIPLES_OF
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(nameDownPaymentAutoAdvPmtAllocNoMultiplesOf)//
-                .installmentAmountInMultiplesOf(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE")//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "LAST_INSTALLMENT")));//
-        final PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADV_PMT_ALLOC_NO_MULTIPLES_OF,
-                responseLoanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf);
-
-        // LP2 with Down-payment + advanced payment allocation - no auto downpayment
-        // (LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION)
-        String name24 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocation = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name24)//
-                .enableAutoRepaymentForDownPayment(false)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocation = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPaymentAllocation);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION,
-                responseLoanProductsRequestDownPaymentAdvPaymentAllocation);
-
-        // LP2 with Down-payment and interest
-        // (LP2_DOWNPAYMENT_INTEREST)
-        String name18 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentInterest = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat()//
-                .name(name18)//
-                .enableAutoRepaymentForDownPayment(false);//
-        PostLoanProductsResponse responseDownPaymentInterest = createLoanProductIdempotent(loanProductsRequestDownPaymentInterest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST, responseDownPaymentInterest);
-
-        // LP2 with Down-payment and interest
-        // (LP2_DOWNPAYMENT_INTEREST_AUTO)
-        String name19 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST_AUTO.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentInterestAuto = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat().name(name19);
-        PostLoanProductsResponse responseDownPaymentInterestAuto = createLoanProductIdempotent(loanProductsRequestDownPaymentInterestAuto);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST_AUTO,
-                responseDownPaymentInterestAuto);
-
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal
-        // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
-        String name20 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name20)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableAutoRepaymentForDownPayment(false)//
-                .installmentAmountInMultiplesOf(null)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
-                responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule);
-
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + vertical
-        // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL)
-        String name21 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name21)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("VERTICAL")//
-                .enableAutoRepaymentForDownPayment(false)//
-                .installmentAmountInMultiplesOf(null)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL,
-                responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical);
-
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal + installment
-        // level delinquency
-        // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_INSTALLMENT_LEVEL_DELINQUENCY)
-        String name22 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_INSTALLMENT_LEVEL_DELINQUENCY
-                .getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name22)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableInstallmentLevelDelinquency(true)//
-                .enableAutoRepaymentForDownPayment(false)//
-                .installmentAmountInMultiplesOf(null)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_INSTALLMENT_LEVEL_DELINQUENCY,
-                responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency);
-
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal + installment
-        // level delinquency + creditAllocation
-        // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_INSTALLMENT_LEVEL_DELINQUENCY)
-        String name23 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROG_SCHEDULE_HOR_INST_LVL_DELINQUENCY_CREDIT_ALLOCATION.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name23)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableInstallmentLevelDelinquency(true)//
-                .enableAutoRepaymentForDownPayment(false)//
-                .installmentAmountInMultiplesOf(null)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("PENALTY", "FEE", "INTEREST", "PRINCIPAL"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROG_SCHEDULE_HOR_INST_LVL_DELINQUENCY_CREDIT_ALLOCATION,
-                responseLoanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation);
-
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal + installment
-        // level delinquency + creditAllocation + fixed length (90)
-        // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_FIXED_LENGTH)
-        String name25 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_FIXED_LENGTH.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAdvPmtAllocFixedLength = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name25)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableInstallmentLevelDelinquency(true)//
-                .enableAutoRepaymentForDownPayment(false)//
-                .installmentAmountInMultiplesOf(null)//
-                .fixedLength(90).creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("PENALTY", "FEE", "INTEREST", "PRINCIPAL"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPmtAllocFixedLength = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPmtAllocFixedLength);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADV_PMT_ALLOC_FIXED_LENGTH,
-                responseLoanProductsRequestDownPaymentAdvPmtAllocFixedLength);
-
-        // LP2 with Down-payment+autopayment + advanced payment allocation + repayment start date SUBMITTED ON DATE
-        // (LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION_REPAYMENT_START_SUBMITTED)
-        String name26 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION_REPAYMENT_START_SUBMITTED.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name26)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .repaymentStartDateType(2)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADVANCED_REPAYMENT_ALLOCATION_PAYMENT_START_SUBMITTED,
-                responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted);
-
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal + interest Flat
-        // + Multi-disbursement
-        // (LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE)
-        final String name27 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE.getName();
-        final PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat()//
-                .name(name27)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableAutoRepaymentForDownPayment(false)//
-                .installmentAmountInMultiplesOf(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE,
-                responseLoanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL)
-        String name28 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActual = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name28)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActual = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmiActualActual);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActual);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30)
-        String name29 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030 = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name29)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030 = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE)
-        String name36 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburse = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name36)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburse = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburse);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburse);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement + downpayment
-        // 25%, auto disabled
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT)
-        String name37 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburseDownPayment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name37)//
-                .enableDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburseDownPayment = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburseDownPayment);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburseDownPayment);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 365/Actual
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_365_ACTUAL)
-        String name30 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_365_ACTUAL.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterest365Actual = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name30)//
-                .daysInYearType(DaysInYearType.DAYS365.value)//
-                .daysInMonthType(DaysInMonthType.ACTUAL.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi365Actual = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterest365Actual);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_365_ACTUAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi365Actual);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + downpayment 25%
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_DOWNPAYMENT)
-        String name31 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_DOWNPAYMENT.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterest36030Downpayment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name31)//
-                .enableDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030Downpayment = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterest36030Downpayment);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_DOWNPAYMENT,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030Downpayment);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual +
-        // enableAccrualActivityPosting
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY)
-        String name32 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name32)//
-                .enableAccrualActivityPosting(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily + enableAccrualActivityPosting
-        // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_ACCRUAL_ACTIVITY)
-        String name33 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_ACCRUAL_ACTIVITY.getName();
-        PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodDailyAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDeclining()//
-                .name(name33)//
-                .enableAccrualActivityPosting(true)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
-                .allowPartialPeriodInterestCalculation(false);//
-        PostLoanProductsResponse responseInterestDecliningPeriodDailyAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningPeriodDailyAccrualActivity);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_DAILY_ACCRUAL_ACTIVITY,
-                responseInterestDecliningPeriodDailyAccrualActivity);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
-        // recalculation-Daily, Compounding:none + enableAccrualActivityPosting
-        // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_ACCRUAL_ACTIVITY)
-        String name34 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_ACCRUAL_ACTIVITY.getName();
-        PostLoanProductsRequest loanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name34)//
-                .enableAccrualActivityPosting(true)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
-                .allowPartialPeriodInterestCalculation(false);//
-        PostLoanProductsResponse responseLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_ACCRUAL_ACTIVITY,
-                responseLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + interest refund with
-        // Merchant issued and Payment refund
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND)
-        String name35 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND.getName();
+        List<Runnable> tasks = new ArrayList<>();
         List<String> supportedInterestRefundTypes = Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND");
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name35)//
-                .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE)
-        String name38 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclose = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name38)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloese = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclose);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloese);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till rest frequency date,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_REST_FREQUENCY_DATE)
-        String name39 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_REST_FREQUENCY_DATE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDate = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name39)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(2)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDate = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDate);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_REST_FREQUENCY_DATE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDate);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Same as repayment period, Frequency Interval for
-        // recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_PRECLOSE)
-        String name40 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_PRECLOSE.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillPreclose = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name40)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(1)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillPreCloese = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillPreclose);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SAME_AS_REP_TILL_PRECLOSE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillPreCloese);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till rest frequency date,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Same as repayment period, Frequency Interval for
-        // recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_REST_FREQUENCY_DATE)
-        String name41 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_REST_FREQUENCY_DATE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillRestFrequencyDate = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name41)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(2)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(1)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillRestFrequencyDate = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillRestFrequencyDate);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SAME_AS_REP_TILL_REST_FREQUENCY_DATE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillRestFrequencyDate);
-
-        // LP1 advanced payment allocation + progressive loan schedule + horizontal
-        // (LP1_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
-        String name42 = DefaultLoanProduct.LP1_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
-        PostLoanProductsRequest loanProductsRequestLP1AdvPmtAllocProgressiveLoanScheduleHorizontal = loanProductsRequestFactory//
-                .defaultLoanProductsRequestLP1()//
-                .name(name42)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLP1AdvPmtAllocProgressiveLoanScheduleHorizontal = createLoanProductIdempotent(
-                loanProductsRequestLP1AdvPmtAllocProgressiveLoanScheduleHorizontal);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL,
-                responseLP1AdvPmtAllocProgressiveLoanScheduleHorizontal);
-
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // Frequency for Interest rate - Whole Year
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM)
-        String name43 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm = loanProductsRequestFactory//
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name43)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .interestRatePerPeriod((double) 4)//
-                .interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_WHOLE_TERM)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM,
-                responseLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm);
-
-        // LP2 + interest recalculation + advanced custom payment allocation + progressive loan schedule + horizontal
-        // (LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
-        String name44 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
-
-        PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name44)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .enableAccrualActivityPosting(true) //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
-                responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule);
-
-        // LP2 + interest recalculation + horizontal + interest refund
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_FULL)
-        String name45 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_FULL.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name45)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_FULL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // payment allocation order: penalty-fee-interest-principal
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_PMT_ALLOC_1)
-        String name46 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_PMT_ALLOC_1
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclosePmtAlloc1 = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name46)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocationPenFeeIntPrincipal("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocationPenFeeIntPrincipal("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocationPenFeeIntPrincipal("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocationPenFeeIntPrincipal("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloesePmtAlloc1 = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclosePmtAlloc1);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_PMT_ALLOC_1,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloesePmtAlloc1);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30, LAST INSTALLMENT strategy
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_PRECLOSE_LAST_INSTALLMENT_STRATEGY)
-        String name47 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_PRECLOSE_LAST_INSTALLMENT_STRATEGY
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name47)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT")));//
-        PostLoanProductsResponse loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallmentResponse = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallment);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_LAST_INSTALLMENT,
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallmentResponse);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + interest refund with
-        // Merchant issued and Payment refund + interest recalculation
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION)
-        String name48 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculation = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .name(name48)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculation = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculation);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculation);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement + downpayment +
-        // interest recalculation
-        // 25%, auto disabled
-        // (LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT)
-        String name49 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseDownPayment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name49)//
-                .enableDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseDownPayment = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseDownPayment);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseDownPayment);
-
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 + multi
-        // disbursement + custom default payment allocation order
-        // (LP2_ADV_CUSTOM_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE)
-        String name50 = DefaultLoanProduct.LP2_ADV_CUSTOM_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDailyEmi36030MultiDisburse = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name50)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDaily36030MultiDisburse = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDailyEmi36030MultiDisburse);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE,
-                responseLoanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDaily36030MultiDisburse);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, no interest on past due principal balances,
-        // preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_TILL_PRECLOSE)
-        String name51 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_NO_CALC_ON_PAST_DUE_TILL_PRECLOSE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalcDailyNoCalcOnPastDueTillPreclose = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name51)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .disallowInterestCalculationOnPastDue(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcNoCalcOnPastDueDailyTillPreClose = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalcDailyNoCalcOnPastDueTillPreclose);
-        TestContext.INSTANCE.set(TestContextKey.temp,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcNoCalcOnPastDueDailyTillPreClose);
-
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30
-        // + multi disbursement + no interest on past due principal balances,
-        // (LP2_ADV_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_EMI_360_30_MULTIDISBURSE)
-        String name52 = DefaultLoanProduct.LP2_ADV_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_EMI_360_30_MULTIDISBURSE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDueEmi36030MultiDisburse = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name52)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .disallowInterestCalculationOnPastDue(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDue36030MultiDisburse = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDueEmi36030MultiDisburse);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_PAYMENT_ALLOCATION_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_EMI_360_30_MULTIDISBURSE,
-                responseLoanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDue36030MultiDisburse);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement + downpayment +
-        // interest recalculation
-        // 25%, auto enabled
-        // (LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_AUTO_DOWNPAYMENT)
-        String name53 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_AUTO_DOWNPAYMENT.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseAutoDownPayment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name53)//
-                .enableDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .enableAutoRepaymentForDownPayment(true).paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseAutoDownPayment = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseAutoDownPayment);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_AUTO_DOWNPAYMENT,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseAutoDownPayment);
-
-        // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR)
-        final String name54 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR
-                .getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name54)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")))
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        final PostLoanProductsResponse responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR,
-                responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
-
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
-        // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR)
-        final String name55 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR.getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name55)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE,
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR,
-                responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement +
-        // accelerate-maturity chargeOff behaviour
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR)
-        final String name56 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR
-                .getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name56)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .chargeOffBehaviour("ACCELERATE_MATURITY");//
-        PostLoanProductsResponse responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR,
-                responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule);
-
-        // + interest recalculation, allowPartialPeriodInterestCalculation = true
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 2
-        // Frequency for Interest rate - Whole Year
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ALLOW_PARTIAL_PERIOD)
-        String name57 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ALLOW_PARTIAL_PERIOD
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod = loanProductsRequestFactory//
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name57)//
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .interestCalculationPeriodType(INTEREST_CALCULATION_PERIOD_TYPE_SAME_AS_REPAYMENT).preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(1)//
-                .recalculationRestFrequencyInterval(1)//
-                .repaymentEvery(1)//
-                .interestRatePerPeriod(7.0)//
-                .interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_MONTH)//
-                .enableDownPayment(false)//
-                .interestRecalculationCompoundingMethod(0)//
-                .repaymentFrequencyType(REPAYMENT_FREQUENCY_TYPE_MONTHS)//
-                .allowPartialPeriodInterestCalculation(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ALLOW_PARTIAL_PERIOD,
-                responseLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod);
-
-        // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
-        // interest EMI + 360/30, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF)
-        final String name58 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiWithChargeOff()//
-                .name(name58)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF,
-                responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff);
-
-        // LP2 + NO interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
-        // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF)
-        final String name59 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiWithChargeOff()//
-                .name(name59)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"))) //
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF,
-                responseLoanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + accrual activity posting +
-        // down payment
-        // enableAccrualActivityPosting
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_AUTO_DOWNPAYMENT_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY)
-        String name60 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_AUTO_DOWNPAYMENT_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name60)//
-                .enableDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .enableAutoRepaymentForDownPayment(true)//
-                .enableAccrualActivityPosting(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // AccrualActivityPostingEnabled = true
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ACCRUAL_ACTIVITY_POSTING)
-        String name61 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ACCRUAL_ACTIVITY_POSTING
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name61)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .enableAccrualActivityPosting(true).paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseloanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ACCRUAL_ACTIVITY_POSTING,
-                responseloanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/Actual
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_ACTUAL)
-        String name62 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_ACTUAL.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterest360Actual = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name62)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.ACTUAL.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi360Actual = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterest360Actual);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_ACTUAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi360Actual);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // Chargeback: Interest, Fee, Principal
-        // + interest recalculation DISABLED
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL)
-        String name63 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name63)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // Chargeback: Principal, Interest, Fee
-        // + interest recalculation DISABLED
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE)
-        String name64 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name64)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("PRINCIPAL", "INTEREST", "FEE", "PENALTY"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // Chargeback: Interest, Penalty, Fee, Principal
-        // + interest recalculation DISABLED
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL)
-        String name65 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name65)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("INTEREST", "PENALTY", "FEE", "PRINCIPAL"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY)
-        String name66 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name66)//
-                .maxPrincipal(1000000.0)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + accrual activity
-        String name67 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_ACCRUAL_ACTIVITY.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name67)//
-                .enableAccrualActivityPosting(true)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity);
-
-        // LP2 with progressive loan schedule + horizontal + accelerate-maturity chargeOff behaviour
-        // (LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR)
-        final String name68 = DefaultLoanProduct.LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR.getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2 = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name68)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .chargeOffBehaviour("ACCELERATE_MATURITY");//
-        PostLoanProductsResponse responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2 = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR,
-                responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2);
-
-        // LP2 with disabled interest recalculation + chargeback allocation(INTEREST, PENALTY, FEE, PRINCIPAL)
-        // (LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_INTEREST_FIRST)
-        String name69 = DefaultLoanProduct.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_INTEREST_FIRST.getName();
-        PostLoanProductsRequest loanProductsRequestChargebackAllocation = loanProductsRequestFactory.defaultLoanProductsRequestLP2Emi()//
-                .name(name69)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("INTEREST", "PENALTY", "FEE", "PRINCIPAL"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse loanProductsResponseChargebackAllocation = createLoanProductIdempotent(
-                loanProductsRequestChargebackAllocation);
-        TestContext.INSTANCE.set(TestContextKey.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_INTEREST_FIRST_RESPONSE,
-                loanProductsResponseChargebackAllocation);
-
-        // LP2 with disabled interest recalculation + chargeback allocation(PRINCIPAL, INTEREST, PENALTY, FEE)
-        // (LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_PRINCIPAL_FIRST)
-        String name70 = DefaultLoanProduct.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_PRINCIPAL_FIRST.getName();
-        PostLoanProductsRequest loanProductsRequestChargebackAllocationPrincipalFirst = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name70)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("PRINCIPAL", "INTEREST", "PENALTY", "FEE"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse loanProductsResponseChargebackAllocationPrincipalFirst = createLoanProductIdempotent(
-                loanProductsRequestChargebackAllocationPrincipalFirst);
-        TestContext.INSTANCE.set(TestContextKey.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_PRINCIPAL_FIRST_RESPONSE,
-                loanProductsResponseChargebackAllocationPrincipalFirst);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // Chargeback: Interest, Penalty, Fee, Principal
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL)
-        String name71 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name71)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("INTEREST", "PENALTY", "FEE", "PRINCIPAL"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // Chargeback: Interest, Fee, Principal, Penalty
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL)
-        String name72 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name72)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // Chargeback: Principal, Interest, Fee, Penalty
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE)
-        String name73 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name73)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("PRINCIPAL", "INTEREST", "FEE", "PENALTY"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 +
-        // accelerate-maturity chargeOff behaviour + last installment strategy
-        // (LP2_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY)
-        final String name74 = DefaultLoanProduct.LP2_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY
-                .getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name74)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL))) //
-                .chargeOffBehaviour("ACCELERATE_MATURITY");//
-        final PostLoanProductsResponse responseLoanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY,
-                responseLoanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
-
-        // LP2 with progressive loan schedule + horizontal + accelerate-maturity chargeOff behaviour + last installment
-        // strategy
-        // (LP2_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY)
-        final String name75 = DefaultLoanProduct.LP2_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY.getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name75)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL))) //
-                .chargeOffBehaviour("ACCELERATE_MATURITY");//
-        final PostLoanProductsResponse responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY,
-                responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + interestRecognitionOnDisbursementDate = true
-        // + 360/30 + accrual activity
-        String name76 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_360_30_ACCRUAL_ACTIVITY.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmi36030AccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name76)//
-                .enableAccrualActivityPosting(true)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .interestRecognitionOnDisbursementDate(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmi36030AccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmi36030AccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_360_30_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmi36030AccrualActivity);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + interestRecognitionOnDisbursementDate = true
-        // + 360/30 + accrual activity
-        String name77 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmiActualActual30AccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name77)//
-                .enableAccrualActivityPosting(true)//
-                .daysInYearType(DaysInYearType.ACTUAL.value)//
-                .daysInMonthType(DaysInMonthType.ACTUAL.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .interestRecognitionOnDisbursementDate(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmiActualActualAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmiActualActual30AccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmiActualActualAccrualActivity);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose, accountingRule = NONE
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_ACCOUNTING_RULE_NONE)
-        String name78 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_ACCOUNTING_RULE_NONE.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcAccountingRuleNone = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name78)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .accountingRule(LOAN_ACCOUNTING_RULE_NONE).chargeOffBehaviour("REGULAR").paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcAccountingRuleNone = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcAccountingRuleNone);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_ACCOUNTING_RULE_NONE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcAccountingRuleNone);
-
-        // LP2 with progressive loan schedule + horizontal
-        // + interest recalculation + interest recognition from disbursement date enabled
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INT_RECALCULATION_ZERO_INT_CHARGE_OFF_INT_RECOGNITION_FROM_DISB_DATE)
-        String name79 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INT_RECALCULATION_ZERO_INT_CHARGE_OFF_INT_RECOGNITION_FROM_DISB_DATE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name79)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .interestRecognitionOnDisbursementDate(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INT_RECALCULATION_ZERO_INT_CHARGE_OFF_INT_RECOGNITION_FROM_DISB_DATE,
-                responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + leap year
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY)
-        String name80 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_LEAP_YEAR_INTEREST_RECALCULATION_DAILY.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name80)//
-                .maxPrincipal(1000000.0)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .daysInYearType(DaysInYearType.ACTUAL.value)//
-                .daysInYearCustomStrategy(FEB_29_PERIOD_ONLY.getValue()).paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_LEAP_YEAR_INTEREST_RECALCULATION_DAILY,
-                responseLoanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, interest recalculation enabled
-        // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC)
-        final String name81 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC.getName();
-        final PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodDailyIntRecalc = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDeclining().name(name81).isInterestRecalculationEnabled(true)
-                .preClosureInterestCalculationStrategy(1).rescheduleStrategyMethod(1).interestRecalculationCompoundingMethod(0)
-                .recalculationRestFrequencyType(2).recalculationRestFrequencyInterval(1)
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value).allowPartialPeriodInterestCalculation(false);
-        final PostLoanProductsResponse responseInterestDecliningPeriodDailyIntRecalc = createLoanProductIdempotent(
-                loanProductsRequestInterestDecliningPeriodDailyIntRecalc);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_DAILY_INT_RECALC,
-                responseInterestDecliningPeriodDailyIntRecalc);
-
-        // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, interest recalculation enabled, 360/30
-        // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC)
-        final String name82 = DefaultLoanProduct.LP1_INTEREST_360_30_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC.getName();
-        final PostLoanProductsRequest loanProductsRequestInterest36030DecliningPeriodDailyIntRecalc = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDeclining().name(name82).isInterestRecalculationEnabled(false)
-                .daysInYearType(DaysInYearType.DAYS360.value).daysInMonthType(DaysInMonthType.DAYS30.value)
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value).allowPartialPeriodInterestCalculation(false);
-        final PostLoanProductsResponse responseInterest36030DecliningPeriodDailyIntRecalc = createLoanProductIdempotent(
-                loanProductsRequestInterest36030DecliningPeriodDailyIntRecalc);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_360_30__DECLINING_PERIOD_DAILY_INT_RECALC,
-                responseInterest36030DecliningPeriodDailyIntRecalc);
-
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + delinquent charge-off
-        // reason to GL account mapping
-        // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON)
-        final String name83 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON.getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappings()//
-                .name(name83)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason = createLoanProductIdempotent(
-                loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON,
-                responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason);
-
-        // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + down payment
-        // (LP2_ADV_DP_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
-        String name84 = DefaultLoanProduct.LP2_ADV_DP_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
-
-        PostLoanProductsRequest loanProductsRequestAdvDPCustomPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name84)//
-                .enableAccrualActivityPosting(false) //
-                .enableDownPayment(true) //
-                .enableAutoRepaymentForDownPayment(true) //
-                .multiDisburseLoan(true) //
-                .disallowExpectedDisbursements(true) //
-                .disbursedAmountPercentageForDownPayment(BigDecimal.valueOf(25.0)) //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("DOWN_PAYMENT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE) //
-                ));//
-        PostLoanProductsResponse responseLoanProductsResponseAdvDPCustomPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvDPCustomPaymentAllocationProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_DP_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
-                responseLoanProductsResponseAdvDPCustomPaymentAllocationProgressiveLoanSchedule);
-
-        // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + down payment + interest
-        // recalculation
-        // (LP2_ADV_DP_IR_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
-        String name85 = DefaultLoanProduct.LP2_ADV_DP_IR_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
-
-        PostLoanProductsRequest loanProductsRequestAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name85)//
-                .enableAccrualActivityPosting(false) //
-                .enableDownPayment(true) //
-                .enableAutoRepaymentForDownPayment(true) //
-                .multiDisburseLoan(true) //
-                .disallowExpectedDisbursements(true) //
-                .installmentAmountInMultiplesOf(null) //
-                .disbursedAmountPercentageForDownPayment(BigDecimal.valueOf(25.0)) //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("DOWN_PAYMENT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE) //
-                ));//
-        PostLoanProductsResponse responseLoanProductsResponseAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_DP_IR_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
-                responseLoanProductsResponseAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + interest recalculation
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // charges - Disbursement Charge
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_DISBURSEMENT_CHARGES)
-        String name86 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_DISBURSEMENT_CHARGES.getName();
         List<LoanProductChargeData> chargesDisbursement = new ArrayList<>();
-        chargesDisbursement.add(new LoanProductChargeData().id(ChargeProductType.LOAN_DISBURSEMENT_CHARGE.value));
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name86)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .charges(chargesDisbursement)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_DISBURSEMENT_CHARGES,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge);
-
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE)
-        String name87 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name87)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse);
-
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // charges - Disbursement Charge
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE)
-        String name88 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name88)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge);
-
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 + cash based
-        // accounting
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // charges - Disbursement Charge
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES)
-        String name89 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCashAccounting()//
-                .name(name89)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .charges(chargesDisbursement)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge);
-
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + delinquent charge-off
-        // reason to GL account mapping + interest recalculation
-        // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC)
-        final String name90 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC.getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappings()//
-                .name(name90)//
-                .enableDownPayment(false)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc = createLoanProductIdempotent(
-                loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC,
-                responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc);
-
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + interest recalculation
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF)
-        final String name91 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff = loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull
-                .name(name91)//
-                .shortName(loanProductsRequestFactory.generateShortNameSafely())//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF,
-                responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff);
-
-        // LP2 + accelerate maturity chargeOff behaviour + progressive loan schedule + horizontal + interest
-        // recalculation
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ACCELERATE_MATURITY_CHARGE_OFF)
-        final String name92 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ACCELERATE_MATURITY_CHARGE_OFF
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff = loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull
-                .name(name92)//
-                .shortName(loanProductsRequestFactory.generateShortNameSafely())//
-                .chargeOffBehaviour("ACCELERATE_MATURITY");//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ACCELERATE_MATURITY_CHARGE_OFF,
-                responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff);
-
-        // LP2 + no interest recalculation + horizontal + interest refund
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_REFUND_FULL)
-        String name93 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_REFUND_FULL.getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name93)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualNoInterestRecalcRefundFull = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_REFUND_FULL,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualNoInterestRecalcRefundFull);
-
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + no interest recalculation
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF)
-        final String name94 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff = loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull
-                .name(name94)//
-                .shortName(loanProductsRequestFactory.generateShortNameSafely())//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF,
-                responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff);
-
-        // LP2 + accelerate maturity chargeOff behaviour + progressive loan schedule + horizontal + no interest
-        // recalculation
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ACC_MATUR_CHARGE_OFF)
-        final String name95 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ACC_MATUR_CHARGE_OFF
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff = loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull
-                .name(name95)//
-                .shortName(loanProductsRequestFactory.generateShortNameSafely())//
-                .chargeOffBehaviour("ACCELERATE_MATURITY");//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ACC_MATUR_CHARGE_OFF,
-                responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till rest frequency date,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_REST_FREQUENCY_DATE_LAST_INSTALLMENT)
-        String name96 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_REST_FREQUENCY_DATE_LAST_INSTALLMENT
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDateLastInstallment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name96)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(2)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDateLastInstallment = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDateLastInstallment);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_REST_FREQUENCY_DATE_LAST_INSTALLMENT,
-                responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDateLastInstallment);
-
-        final String name97 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_CAPITALIZED_INCOME.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2CapitalizedIncome()//
-                .name(name97)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .allowApprovedDisbursedAmountsOverApplied(false)//
-                .overAppliedCalculationType(null)//
-                .overAppliedNumber(null)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + interest refund with
-        // Merchant issued and Payment refund + interest recalculation + Multidisbursement
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB)
-        String name98 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculationMultiDisb = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .name(name98)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculationMultidisb = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculationMultiDisb);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculationMultidisb);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // capitalized income enabled
-        final String name99 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome().name(name99)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // multidisbursal
-        // capitalized income enabled
-        final String name100 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSAL_CAPITALIZED_INCOME
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name100)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSAL_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // capitalized income enabled, capitalized income type: FEE
-        final String name101 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_FEE
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name101)//
-                .capitalizedIncomeType(PostLoanProductsRequest.CapitalizedIncomeTypeEnum.FEE)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_FEE,
-                responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee);
-
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + delinquent charge-off
-        // reason to GL account mapping + interest recalculation
-        // capitalized income enabled
-        final String name102 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC_CAPITALIZED_INCOME
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappingsWithCapitalizedIncome()//
-                .name(name102)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INT_CHARGE_OFF_DELINQUENT_REASON_INT_RECALC_CAPITALIZED_INCOME,
-                responseLoanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome);
-
-        // Merchant issued with Interest refund + interest recalculation, 360/30
-        // accrual activity enabled
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY)
-        String name103 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name103)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .enableAccrualActivityPosting(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity);
-
-        // Merchant issued with Interest refund + interest recalculation, 360/30
-        // accrual activity enabled
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_DOWNPAYMENT_ACCRUAL_ACTIVITY)
-        String name104 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_DOWNPAYMENT_ACCRUAL_ACTIVITY
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculation = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name104)//
-                .enableDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .enableAutoRepaymentForDownPayment(true)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .enableAccrualActivityPosting(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundInterestRecalculation = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculation);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_DOWNPAYMENT_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundInterestRecalculation);
-
-        // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR)
-        final String name105 = DefaultLoanProduct.LP2_ADV_PYMNT_360_30_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name105)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"),
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT")))
-                .enableAccrualActivityPosting(true)//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_360_30_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + custom allocation capital
-        // adjustment
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // capitalized income enabled + income type - fee
-        final String name106 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name106)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("CAPITALIZED_INCOME_ADJUSTMENT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc);
-
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC,
-                responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement +
-        // contract termination
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION)
-        final String name107 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION.getName();
-
-        final PostLoanProductsRequest loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name107)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION,
-                responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
-        // capitalized income enabled; approver over applied amount enabled with percentage type
-        final String name108 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name108)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
-                .overAppliedNumber(50);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome);
-
-        // LP2 with Down-payment+autopayment + custom advanced payment allocation
-        // (LP2_DOWNPAYMENT_AUTO_ADVANCED_CUSTOM_PAYMENT_ALLOCATION)
-        String name109 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADVANCED_CUSTOM_PAYMENT_ALLOCATION.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name109)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("DOWN_PAYMENT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADVANCED_CUSTOM_PAYMENT_ALLOCATION,
-                responseLoanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // multidisbursal
-        // capitalized income enabled
-        final String name110 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name110)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("CAPITALIZED_INCOME_ADJUSTMENT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC,
-                responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
-        // capitalized income enabled; approver over applied amount enabled with percentage type
-        final String name111 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_FLAT_CAPITALIZED_INCOME
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name111)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.FIXED_SIZE.value)//
-                .overAppliedNumber(1000);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_FLAT_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
-        // capitalized income enabled; approver over applied amount enabled with percentage type
-        final String name112 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name112)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
-                .overAppliedNumber(50);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
-        // capitalized income enabled; approver over applied amount enabled with fixed-size(flat) type
-        final String name113 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_FLAT_CAPITALIZED_INCOME
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name113)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.FIXED_SIZE.value)//
-                .overAppliedNumber(1000);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_FLAT_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome);
-
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, buy down fees enabled
-        final String name114 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2BuyDownFees()//
-                .name(name114)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees);
-
-        // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
-        // (LP2_ADV_PYMNT_360_30_INTEREST_RECALC_AUTO_DOWNPAYMENT_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY)
-        final String name115 = DefaultLoanProduct.LP2_ADV_PYMNT_360_30_INTEREST_RECALC_AUTO_DOWNPAYMENT_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name115)//
-                .enableDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .enableAutoRepaymentForDownPayment(true)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")))
-                .enableAccrualActivityPosting(true)//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        final PostLoanProductsResponse responseLoanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_360_30_INTEREST_RECALC_AUTO_DOWNPAYMENT_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity);
-
-        // LP2 with progressive loan schedule + horizontal + interest recalculation
-        // charges - Installment Fee Flat
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_DAILY_INSTALLMENT_FEE_FLAT_CHARGES)
-        final String name116 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_DAILY_INSTALLMENT_FEE_FLAT_CHARGES.getName();
-        final List<LoanProductChargeData> chargesInstallmentFeeFlat = new ArrayList<>();
-        chargesInstallmentFeeFlat.add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT.value));
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name116)//
-                .charges(chargesInstallmentFeeFlat)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_DAILY_INSTALLMENT_FEE_FLAT_CHARGES,
-                responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges);
-
-        // LP2 with progressive loan schedule + horizontal
-        // charges - Installment Fee Percentage Amount
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_CHARGES)
-        final String name117 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_CHARGES.getName();
-        final List<LoanProductChargeData> chargesInstallmentFeePercentAmount = new ArrayList<>();
-        chargesInstallmentFeePercentAmount
-                .add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT.value));
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name117)//
-                .charges(chargesInstallmentFeePercentAmount)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .minPrincipal(1.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_CHARGES,
-                responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges);
-
-        // LP2 with progressive loan schedule + horizontal
-        // charges - Installment Fee Percentage Interest
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_INTEREST_CHARGES)
-        final String name118 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_INTEREST_CHARGES.getName();
+        chargesDisbursement.add(new LoanProductChargeData().id(chargeProductResolver.resolve(ChargeProductType.LOAN_DISBURSEMENT_CHARGE)));
         final List<LoanProductChargeData> chargesInstallmentFeePercentInterest = new ArrayList<>();
-        chargesInstallmentFeePercentInterest
-                .add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.value));
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name118)//
-                .charges(chargesInstallmentFeePercentInterest)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_INTEREST_CHARGES,
-                responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges);
+        chargesInstallmentFeePercentInterest.add(
+                new LoanProductChargeData().id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST)));
+
+        tasks.add(() -> {
+            // LP1
+            String name = DefaultLoanProduct.LP1.getName();
+            PostLoanProductsRequest loanProductsRequest = loanProductsRequestFactory.defaultLoanProductsRequestLP1().name(name);
+            PostLoanProductsResponse response = createLoanProductIdempotent(loanProductsRequest);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1, response);
+        });
+
+        tasks.add(() -> {
+            // LP1 product with due date and overdue date for repayment in config
+            // (LP1_DUE_DATE)
+            PostLoanProductsRequest loanProductsRequestDueDate = loanProductsRequestFactory.defaultLoanProductsRequestLP1()//
+                    .name(DefaultLoanProduct.LP1_DUE_DATE.getName())//
+                    .dueDaysForRepaymentEvent(3)//
+                    .overDueDaysForRepaymentEvent(3);//
+            PostLoanProductsResponse responseDueDate = createLoanProductIdempotent(loanProductsRequestDueDate);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_DUE_DATE, responseDueDate);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% FLAT interest
+            // (LP1_INTEREST_FLAT)
+            String name2 = DefaultLoanProduct.LP1_INTEREST_FLAT.getName();
+            PostLoanProductsRequest loanProductsRequestInterestFlat = loanProductsRequestFactory.defaultLoanProductsRequestLP1InterestFlat()
+                    .name(name2);
+            PostLoanProductsResponse responseInterestFlat = createLoanProductIdempotent(loanProductsRequestInterestFlat);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT, responseInterestFlat);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Same as payment period
+            // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_SAME_AS_PAYMENT)
+            String name3 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_SAME_AS_PAYMENT.getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodSameAsPayment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDeclining().name(name3);
+            PostLoanProductsResponse responseInterestDecliningPeriodSameAsPayment = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningPeriodSameAsPayment);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_SAME_AS_PAYMENT,
+                    responseInterestDecliningPeriodSameAsPayment);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily
+            // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY)
+            String name4 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY.getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodDaily = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDeclining().name(name4)
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value).allowPartialPeriodInterestCalculation(false);
+            PostLoanProductsResponse responseInterestDecliningPeriodDaily = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningPeriodDaily);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_DAILY,
+                    responseInterestDecliningPeriodDaily);
+        });
+
+        tasks.add(() -> {
+            // LP1-1MONTH with 12% DECLINING BALANCE interest, interest period: Daily, Interest recalculation-Monthly,
+            // Compounding:Interest
+            // (LP1_1MONTH_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_MONTHLY)
+            String name5 = DefaultLoanProduct.LP1_1MONTH_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_MONTHLY.getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingMonthly = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP11MonthInterestDecliningBalanceDailyRecalculationCompoundingMonthly().name(name5);
+            PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingMonthly = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingMonthly);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_1MONTH_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_MONTHLY,
+                    responseInterestDecliningBalanceDailyRecalculationCompoundingMonthly);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
+            // recalculation-Daily, Compounding:none
+            // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE)
+            String name6 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE.getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNone = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone().name(name6);
+            PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingNone = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNone);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE,
+                    responseInterestDecliningBalanceDailyRecalculationCompoundingNone);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
+            // recalculation-Daily, Compounding:none, rescheduleStrategyMethod:Reduce number of installments
+            // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_REDUCE_NR_INST)
+            String name7 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_REDUCE_NR_INST
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name7)//
+                    .rescheduleStrategyMethod(AdvancePaymentsAdjustmentType.REDUCE_NUMBER_OF_INSTALLMENTS.value);//
+            PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_REDUCE_NR_INSTALLMENTS,
+                    responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleReduceNrInstallments);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
+            // recalculation-Daily, Compounding:none, rescheduleStrategyMethod:Reschedule next repayments
+            // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_RESCH_NEXT_REP)
+            String name8 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_RESCH_NEXT_REP
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name8)//
+                    .rescheduleStrategyMethod(AdvancePaymentsAdjustmentType.RESCHEDULE_NEXT_REPAYMENTS.value);//
+            PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_RESCHEDULE_NEXT_REPAYMENTS,
+                    responseInterestDecliningBalanceDailyRecalculationCompoundingNoneRescheduleRescheduleNextRepayments);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
+            // recalculation-Daily, Compounding:none, Interest Recalculation Frequency: Same as Repayment Period
+            // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE)
+            String name9 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name9)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value);//
+            PostLoanProductsResponse responseInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE,
+                    responseInterestDecliningBalanceDailyRecalculationSameAsRepaymentCompoundingNone);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
+            // recalculation-Daily, Compounding:none, Interest Recalculation Frequency: Same as Repayment Period,
+            // Multi-disbursement
+            // (LP1_INTEREST_DECLINING_BALANCE_SAR_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE_MULTIDISB)
+            String name10 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_SAR_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE_MULTIDISB
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name10)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowPartialPeriodInterestCalculation(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_SAR_RECALCULATION_SAME_AS_REPAYMENT_COMPOUNDING_NONE_MULTI_DISBURSEMENT,
+                    responseInterestDecliningBalanceSaRRecalculationSameAsRepaymentCompoundingNoneMultiDisbursement);
+        });
+
+        tasks.add(() -> {
+            // LP1 with new due-penalty-fee-interest-principal-in-advance-principal-penalty-fee-interest-strategy
+            // payment
+            // strategy
+            // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE)
+            String name11 = DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE.getName();
+            PostLoanProductsRequest loanProductsRequestDueInAdvance = loanProductsRequestFactory.defaultLoanProductsRequestLP1()//
+                    .name(name11)//
+                    .transactionProcessingStrategyCode(
+                            TransactionProcessingStrategyCode.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST.value);//
+            PostLoanProductsResponse responseDueInAdvance = createLoanProductIdempotent(loanProductsRequestDueInAdvance);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE,
+                    responseDueInAdvance);
+        });
+
+        tasks.add(() -> {
+            // LP1 with new due-penalty-fee-interest-principal-in-advance-principal-penalty-fee-interest-strategy
+            // payment
+            // strategy and with 12% FLAT interest
+            // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT)
+            String name12 = DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT.getName();
+            PostLoanProductsRequest loanProductsRequestDueInAdvanceInterestFlat = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestFlat()//
+                    .name(name12)//
+                    .transactionProcessingStrategyCode(
+                            TransactionProcessingStrategyCode.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST.value);//
+            PostLoanProductsResponse responseDueInAdvanceInterestFlat = createLoanProductIdempotent(
+                    loanProductsRequestDueInAdvanceInterestFlat);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT,
+                    responseDueInAdvanceInterestFlat);
+        });
+
+        tasks.add(() -> {
+            // LP1 with new due-penalty-interest-principal-fee-in-advance-penalty-interest-principal-fee-strategy
+            // payment
+            // strategy
+            // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE)
+            PostLoanProductsRequest loanProductsRequestDueInAdvance2 = loanProductsRequestFactory.defaultLoanProductsRequestLP1()//
+                    .name(DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE.getName())//
+                    .transactionProcessingStrategyCode(
+                            TransactionProcessingStrategyCode.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE.value);//
+            PostLoanProductsResponse responseDueInAdvance2 = createLoanProductIdempotent(loanProductsRequestDueInAdvance2);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE,
+                    responseDueInAdvance2);
+        });
+
+        tasks.add(() -> {
+            // LP1 with new due-penalty-interest-principal-fee-in-advance-penalty-interest-principal-fee-strategy
+            // payment
+            // strategy and with 12% FLAT interest
+            // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_INTEREST_FLAT)
+            PostLoanProductsRequest loanProductsRequestDueInAdvanceInterestFlat2 = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestFlat()//
+                    .name(DefaultLoanProduct.LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_INTEREST_FLAT.getName())//
+                    .transactionProcessingStrategyCode(
+                            TransactionProcessingStrategyCode.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE.value);//
+            PostLoanProductsResponse responseDueInAdvanceInterestFlat2 = createLoanProductIdempotent(
+                    loanProductsRequestDueInAdvanceInterestFlat2);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_INTEREST_FLAT,
+                    responseDueInAdvanceInterestFlat2);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% FLAT interest with % overdue fee for amount
+            // (LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT)
+            String name13 = DefaultLoanProduct.LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT.getName();
+            List<LoanProductChargeData> charges = new ArrayList<>();
+            charges.add(new LoanProductChargeData().id(chargeProductResolver.resolve(ChargeProductType.LOAN_PERCENTAGE_LATE_FEE)));
+            PostLoanProductsRequest loanProductsRequestInterestFlatOverdueFeeAmount = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestFlat()//
+                    .name(name13)//
+                    .charges(charges);//
+            PostLoanProductsResponse responseInterestFlatOverdueFeeAmount = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatOverdueFeeAmount);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT,
+                    responseInterestFlatOverdueFeeAmount);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% FLAT interest with % overdue fee for amount+interest
+            // (LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT_INTEREST)
+            String name14 = DefaultLoanProduct.LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT_INTEREST.getName();
+            List<LoanProductChargeData> chargesInterest = new ArrayList<>();
+            chargesInterest.add(new LoanProductChargeData()
+                    .id(chargeProductResolver.resolve(ChargeProductType.LOAN_PERCENTAGE_LATE_FEE_AMOUNT_PLUS_INTEREST)));
+            PostLoanProductsRequest loanProductsRequestInterestFlatOverdueFeeAmountInterest = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestFlat()//
+                    .name(name14)//
+                    .charges(chargesInterest);//
+            PostLoanProductsResponse responseInterestFlatOverdueFeeAmountInterest = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatOverdueFeeAmountInterest);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_OVERDUE_FROM_AMOUNT_INTEREST,
+                    responseInterestFlatOverdueFeeAmountInterest);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment
+            // (LP2_DOWNPAYMENT)
+            String name15 = DefaultLoanProduct.LP2_DOWNPAYMENT.getName();
+            PostLoanProductsRequest loanProductsRequestDownPayment = loanProductsRequestFactory.defaultLoanProductsRequestLP2()//
+                    .name(name15)//
+                    .enableAutoRepaymentForDownPayment(false);//
+            PostLoanProductsResponse responseDownPayment = createLoanProductIdempotent(loanProductsRequestDownPayment);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT, responseDownPayment);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment+autopayment
+            // (LP2_DOWNPAYMENT_AUTO)
+            String name16 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAuto = loanProductsRequestFactory.defaultLoanProductsRequestLP2()
+                    .name(name16);
+            PostLoanProductsResponse responseDownPaymentAuto = createLoanProductIdempotent(loanProductsRequestDownPaymentAuto);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO, responseDownPaymentAuto);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment+autopayment + advanced payment allocation
+            // (LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION)
+            String name17 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvPaymentAllocation = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name17)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocation = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAutoAdvPaymentAllocation);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION,
+                    responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocation);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment+autopayment + advanced payment allocation, no installmentAmountInMultiplesOf
+            // (LP2_DOWNPAYMENT_AUTO_ADV_PMT_ALLOC_NO_MULTIPLES_OF)
+            final String nameDownPaymentAutoAdvPmtAllocNoMultiplesOf = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADV_PMT_ALLOC_NO_MULTIPLES_OF
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(nameDownPaymentAutoAdvPmtAllocNoMultiplesOf)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE")//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "LAST_INSTALLMENT")));//
+            final PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADV_PMT_ALLOC_NO_MULTIPLES_OF,
+                    responseLoanProductsRequestDownPaymentAutoAdvPmtAllocNoMultiplesOf);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation - no auto downpayment
+            // (LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION)
+            String name24 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocation = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name24)//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocation = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPaymentAllocation);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION,
+                    responseLoanProductsRequestDownPaymentAdvPaymentAllocation);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment and interest
+            // (LP2_DOWNPAYMENT_INTEREST)
+            String name18 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentInterest = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat()//
+                    .name(name18)//
+                    .enableAutoRepaymentForDownPayment(false);//
+            PostLoanProductsResponse responseDownPaymentInterest = createLoanProductIdempotent(loanProductsRequestDownPaymentInterest);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST,
+                    responseDownPaymentInterest);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment and interest
+            // (LP2_DOWNPAYMENT_INTEREST_AUTO)
+            String name19 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST_AUTO.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentInterestAuto = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat().name(name19);
+            PostLoanProductsResponse responseDownPaymentInterestAuto = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentInterestAuto);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST_AUTO,
+                    responseDownPaymentInterestAuto);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal
+            // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
+            String name20 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name20)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
+                    responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + vertical
+            // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL)
+            String name21 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name21)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("VERTICAL")//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL,
+                    responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVertical);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal +
+            // installment
+            // level delinquency
+            // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_INSTALLMENT_LEVEL_DELINQUENCY)
+            String name22 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_INSTALLMENT_LEVEL_DELINQUENCY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name22)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableInstallmentLevelDelinquency(true)//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_INSTALLMENT_LEVEL_DELINQUENCY,
+                    responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleInstLvlDelinquency);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal +
+            // installment
+            // level delinquency + creditAllocation
+            // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_INSTALLMENT_LEVEL_DELINQUENCY)
+            String name23 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROG_SCHEDULE_HOR_INST_LVL_DELINQUENCY_CREDIT_ALLOCATION
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name23)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableInstallmentLevelDelinquency(true)//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("PENALTY", "FEE", "INTEREST", "PRINCIPAL"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROG_SCHEDULE_HOR_INST_LVL_DELINQUENCY_CREDIT_ALLOCATION,
+                    responseLoanProductsRequestDownPaymentAdvPmtAllocProgSchedInstLvlDelinquencyCreditAllocation);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal +
+            // installment
+            // level delinquency + creditAllocation + fixed length (90)
+            // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_FIXED_LENGTH)
+            String name25 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_FIXED_LENGTH.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAdvPmtAllocFixedLength = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name25)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableInstallmentLevelDelinquency(true)//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .fixedLength(90).creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("PENALTY", "FEE", "INTEREST", "PRINCIPAL"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPmtAllocFixedLength = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPmtAllocFixedLength);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADV_PMT_ALLOC_FIXED_LENGTH,
+                    responseLoanProductsRequestDownPaymentAdvPmtAllocFixedLength);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment+autopayment + advanced payment allocation + repayment start date SUBMITTED ON DATE
+            // (LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION_REPAYMENT_START_SUBMITTED)
+            String name26 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADVANCED_PAYMENT_ALLOCATION_REPAYMENT_START_SUBMITTED.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name26)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .repaymentStartDateType(2)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADVANCED_REPAYMENT_ALLOCATION_PAYMENT_START_SUBMITTED,
+                    responseLoanProductsRequestDownPaymentAutoAdvPaymentAllocationRepaymentStartSubmitted);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal + interest
+            // Flat
+            // + Multi-disbursement
+            // (LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE)
+            final String name27 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE.getName();
+            final PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat()//
+                    .name(name27)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE,
+                    responseLoanProductsRequestDownPaymentAdvPaymentAllocationInterestFlatMultiDisbursement);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL)
+            String name28 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActual = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name28)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActual = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmiActualActual);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActual);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30)
+            String name29 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030 = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name29)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030 = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE)
+            String name36 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburse = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name36)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburse = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburse);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburse);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement + downpayment
+            // 25%, auto disabled
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT)
+            String name37 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburseDownPayment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name37)//
+                    .enableDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburseDownPayment = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030MultiDisburseDownPayment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030MultiDisburseDownPayment);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 365/Actual
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_365_ACTUAL)
+            String name30 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_365_ACTUAL.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterest365Actual = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name30)//
+                    .daysInYearType(DaysInYearType.DAYS365.value)//
+                    .daysInMonthType(DaysInMonthType.ACTUAL.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi365Actual = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterest365Actual);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_365_ACTUAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi365Actual);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + downpayment 25%
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_DOWNPAYMENT)
+            String name31 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_DOWNPAYMENT.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterest36030Downpayment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name31)//
+                    .enableDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030Downpayment = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterest36030Downpayment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_DOWNPAYMENT,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030Downpayment);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual +
+            // enableAccrualActivityPosting
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY)
+            String name32 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name32)//
+                    .enableAccrualActivityPosting(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily + enableAccrualActivityPosting
+            // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_ACCRUAL_ACTIVITY)
+            String name33 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_ACCRUAL_ACTIVITY.getName();
+            PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodDailyAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDeclining()//
+                    .name(name33)//
+                    .enableAccrualActivityPosting(true)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
+                    .allowPartialPeriodInterestCalculation(false);//
+            PostLoanProductsResponse responseInterestDecliningPeriodDailyAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningPeriodDailyAccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_DAILY_ACCRUAL_ACTIVITY,
+                    responseInterestDecliningPeriodDailyAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, Interest
+            // recalculation-Daily, Compounding:none + enableAccrualActivityPosting
+            // (LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_ACCRUAL_ACTIVITY)
+            String name34 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_ACCRUAL_ACTIVITY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name34)//
+                    .enableAccrualActivityPosting(true)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
+                    .allowPartialPeriodInterestCalculation(false);//
+            PostLoanProductsResponse responseLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_BALANCE_DAILY_RECALCULATION_COMPOUNDING_NONE_ACCRUAL_ACTIVITY,
+                    responseLP1InterestDecliningBalanceDailyRecalculationCompoundingNoneAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + interest refund with
+            // Merchant issued and Payment refund
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND)
+            String name35 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name35)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefund);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE)
+            String name38 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclose = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name38)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloese = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclose);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloese);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till rest frequency date,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_REST_FREQUENCY_DATE)
+            String name39 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_REST_FREQUENCY_DATE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDate = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name39)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(2)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDate = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDate);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_REST_FREQUENCY_DATE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDate);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Same as repayment period, Frequency Interval for
+            // recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_PRECLOSE)
+            String name40 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_PRECLOSE.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillPreclose = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name40)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(1)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillPreCloese = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillPreclose);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SAME_AS_REP_TILL_PRECLOSE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillPreCloese);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till rest frequency date,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Same as repayment period, Frequency Interval for
+            // recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_REST_FREQUENCY_DATE)
+            String name41 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SARP_TILL_REST_FREQUENCY_DATE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillRestFrequencyDate = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name41)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(2)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(1)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillRestFrequencyDate = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcSameAsRepTillRestFrequencyDate);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_SAME_AS_REP_TILL_REST_FREQUENCY_DATE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcSameAsRepTillRestFrequencyDate);
+        });
+
+        tasks.add(() -> {
+            // LP1 advanced payment allocation + progressive loan schedule + horizontal
+            // (LP1_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
+            String name42 = DefaultLoanProduct.LP1_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
+            PostLoanProductsRequest loanProductsRequestLP1AdvPmtAllocProgressiveLoanScheduleHorizontal = loanProductsRequestFactory//
+                    .defaultLoanProductsRequestLP1()//
+                    .name(name42)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLP1AdvPmtAllocProgressiveLoanScheduleHorizontal = createLoanProductIdempotent(
+                    loanProductsRequestLP1AdvPmtAllocProgressiveLoanScheduleHorizontal);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL,
+                    responseLP1AdvPmtAllocProgressiveLoanScheduleHorizontal);
+        });
+
+        tasks.add(() -> {
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // Frequency for Interest rate - Whole Year
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM)
+            String name43 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm = loanProductsRequestFactory//
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name43)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .interestRatePerPeriod((double) 4)//
+                    .interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_WHOLE_TERM)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM,
+                    responseLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseWholeTerm);
+        });
+
+        tasks.add(() -> {
+            // LP2 + interest recalculation + advanced custom payment allocation + progressive loan schedule +
+            // horizontal
+            // (LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
+            String name44 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
+
+            PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name44)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .enableAccrualActivityPosting(true) //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
+                    responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 + interest recalculation + horizontal + interest refund
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_FULL)
+            String name45 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_FULL.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name45)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_FULL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // payment allocation order: penalty-fee-interest-principal
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_PMT_ALLOC_1)
+            String name46 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_PMT_ALLOC_1
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclosePmtAlloc1 = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name46)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocationPenFeeIntPrincipal("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocationPenFeeIntPrincipal("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocationPenFeeIntPrincipal("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocationPenFeeIntPrincipal("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloesePmtAlloc1 = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPreclosePmtAlloc1);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_PMT_ALLOC_1,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillPreCloesePmtAlloc1);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30, LAST INSTALLMENT strategy
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_PRECLOSE_LAST_INSTALLMENT_STRATEGY)
+            String name47 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_PRECLOSE_LAST_INSTALLMENT_STRATEGY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name47)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT")));//
+            PostLoanProductsResponse loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallmentResponse = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_LAST_INSTALLMENT,
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseLastInstallmentResponse);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + interest refund with
+            // Merchant issued and Payment refund + interest recalculation
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION)
+            String name48 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculation = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .name(name48)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculation = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculation);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculation);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement + downpayment
+            // +
+            // interest recalculation
+            // 25%, auto disabled
+            // (LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT)
+            String name49 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseDownPayment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name49)//
+                    .enableDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseDownPayment = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseDownPayment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_DOWNPAYMENT,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseDownPayment);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 + multi
+            // disbursement + custom default payment allocation order
+            // (LP2_ADV_CUSTOM_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE)
+            String name50 = DefaultLoanProduct.LP2_ADV_CUSTOM_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDailyEmi36030MultiDisburse = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name50)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDaily36030MultiDisburse = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDailyEmi36030MultiDisburse);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE,
+                    responseLoanProductsRequestLP2AdvCustomPaymentAllocationInterestRecalculationDaily36030MultiDisburse);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, no interest on past due principal balances,
+            // preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_TILL_PRECLOSE)
+            String name51 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_NO_CALC_ON_PAST_DUE_TILL_PRECLOSE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalcDailyNoCalcOnPastDueTillPreclose = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name51)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .disallowInterestCalculationOnPastDue(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcNoCalcOnPastDueDailyTillPreClose = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalcDailyNoCalcOnPastDueTillPreclose);
+            TestContext.INSTANCE.set(TestContextKey.temp,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcNoCalcOnPastDueDailyTillPreClose);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30
+            // + multi disbursement + no interest on past due principal balances,
+            // (LP2_ADV_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_EMI_360_30_MULTIDISBURSE)
+            String name52 = DefaultLoanProduct.LP2_ADV_PAYMENT_ALLOC_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_EMI_360_30_MULTIDISBURSE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDueEmi36030MultiDisburse = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name52)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .disallowInterestCalculationOnPastDue(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDue36030MultiDisburse = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDueEmi36030MultiDisburse);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_PAYMENT_ALLOCATION_INTEREST_RECALCULATION_DAILY_NO_CALC_ON_PAST_DUE_EMI_360_30_MULTIDISBURSE,
+                    responseLoanProductsRequestLP2AdvPaymentAllocationInterestRecalculationDailyNoCalcOnPastDue36030MultiDisburse);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement + downpayment
+            // +
+            // interest recalculation
+            // 25%, auto enabled
+            // (LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_AUTO_DOWNPAYMENT)
+            String name53 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_AUTO_DOWNPAYMENT
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseAutoDownPayment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name53)//
+                    .enableDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .enableAutoRepaymentForDownPayment(true).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseAutoDownPayment = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestRecalculationEmi36030MultiDisburseAutoDownPayment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECALCULATION_DAILY_EMI_360_30_MULTIDISBURSE_AUTO_DOWNPAYMENT,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestRecalculation36030MultiDisburseAutoDownPayment);
+        });
+
+        tasks.add(() -> {
+            // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR)
+            final String name54 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR
+                    .getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name54)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")))
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            final PostLoanProductsResponse responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR,
+                    responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
+            // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR)
+            final String name55 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR.getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name55)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE,
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR,
+                    responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement +
+            // accelerate-maturity chargeOff behaviour
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR)
+            final String name56 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR
+                    .getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name56)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .chargeOffBehaviour("ACCELERATE_MATURITY");//
+            PostLoanProductsResponse responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR,
+                    responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // + interest recalculation, allowPartialPeriodInterestCalculation = true
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 2
+            // Frequency for Interest rate - Whole Year
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ALLOW_PARTIAL_PERIOD)
+            String name57 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ALLOW_PARTIAL_PERIOD
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod = loanProductsRequestFactory//
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name57)//
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .interestCalculationPeriodType(INTEREST_CALCULATION_PERIOD_TYPE_SAME_AS_REPAYMENT)
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(1)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .repaymentEvery(1)//
+                    .interestRatePerPeriod(7.0)//
+                    .interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_MONTH)//
+                    .enableDownPayment(false)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .repaymentFrequencyType(REPAYMENT_FREQUENCY_TYPE_MONTHS)//
+                    .allowPartialPeriodInterestCalculation(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ALLOW_PARTIAL_PERIOD,
+                    responseLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyAllowPartialPeriod);
+        });
+
+        tasks.add(() -> {
+            // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
+            // interest EMI + 360/30, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF)
+            final String name58 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF.getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiWithChargeOff()//
+                    .name(name58)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF,
+                    responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030InterestRecalculationDailyChargeOff);
+        });
+
+        tasks.add(() -> {
+            // LP2 + NO interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule +
+            // horizontal
+            // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF)
+            final String name59 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF.getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiWithChargeOff()//
+                    .name(name59)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"))) //
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF,
+                    responseLoanProductsRequestLP2AdvancedPaymentNoInterestInterestRecalculationChargeOff);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + accrual activity posting
+            // +
+            // down payment
+            // enableAccrualActivityPosting
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_AUTO_DOWNPAYMENT_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY)
+            String name60 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_AUTO_DOWNPAYMENT_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name60)//
+                    .enableDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .enableAutoRepaymentForDownPayment(true)//
+                    .enableAccrualActivityPosting(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestAutoDownpaymentEmiActualActualAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // AccrualActivityPostingEnabled = true
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ACCRUAL_ACTIVITY_POSTING)
+            String name61 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ACCRUAL_ACTIVITY_POSTING
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name61)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .enableAccrualActivityPosting(true).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseloanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_ACCRUAL_ACTIVITY_POSTING,
+                    responseloanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyAccrualActivityPosting);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/Actual
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_ACTUAL)
+            String name62 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_ACTUAL.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterest360Actual = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name62)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.ACTUAL.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi360Actual = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterest360Actual);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_ACTUAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi360Actual);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // Chargeback: Interest, Fee, Principal
+            // + interest recalculation DISABLED
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL)
+            String name63 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name63)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestFeePrincipal);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // Chargeback: Principal, Interest, Fee
+            // + interest recalculation DISABLED
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE)
+            String name64 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name64)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("PRINCIPAL", "INTEREST", "FEE", "PENALTY"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackPrincipalInterestFee);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // Chargeback: Interest, Penalty, Fee, Principal
+            // + interest recalculation DISABLED
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL)
+            String name65 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name65)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("INTEREST", "PENALTY", "FEE", "PRINCIPAL"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestDailyEmi36030ChargebackInterestPenaltyFeePrincipal);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY)
+            String name66 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name66)//
+                    .maxPrincipal(1000000.0)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRecalculationDaily);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + accrual activity
+            String name67 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_ACCRUAL_ACTIVITY.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name67)//
+                    .enableAccrualActivityPosting(true)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestLP2AdvancedPaymentInterestEmi36030AccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + accelerate-maturity chargeOff behaviour
+            // (LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR)
+            final String name68 = DefaultLoanProduct.LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR.getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2 = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name68)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .chargeOffBehaviour("ACCELERATE_MATURITY");//
+            PostLoanProductsResponse responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2 = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR,
+                    responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourProgressiveLoanSchedule2);
+        });
+
+        tasks.add(() -> {
+            // LP2 with disabled interest recalculation + chargeback allocation(INTEREST, PENALTY, FEE, PRINCIPAL)
+            // (LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_INTEREST_FIRST)
+            String name69 = DefaultLoanProduct.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_INTEREST_FIRST.getName();
+            PostLoanProductsRequest loanProductsRequestChargebackAllocation = loanProductsRequestFactory.defaultLoanProductsRequestLP2Emi()//
+                    .name(name69)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("INTEREST", "PENALTY", "FEE", "PRINCIPAL"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse loanProductsResponseChargebackAllocation = createLoanProductIdempotent(
+                    loanProductsRequestChargebackAllocation);
+            TestContext.INSTANCE.set(TestContextKey.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_INTEREST_FIRST_RESPONSE,
+                    loanProductsResponseChargebackAllocation);
+        });
+
+        tasks.add(() -> {
+            // LP2 with disabled interest recalculation + chargeback allocation(PRINCIPAL, INTEREST, PENALTY, FEE)
+            // (LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_PRINCIPAL_FIRST)
+            String name70 = DefaultLoanProduct.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_PRINCIPAL_FIRST.getName();
+            PostLoanProductsRequest loanProductsRequestChargebackAllocationPrincipalFirst = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name70)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("PRINCIPAL", "INTEREST", "PENALTY", "FEE"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse loanProductsResponseChargebackAllocationPrincipalFirst = createLoanProductIdempotent(
+                    loanProductsRequestChargebackAllocationPrincipalFirst);
+            TestContext.INSTANCE.set(TestContextKey.LP2_NO_INTEREST_RECALCULATION_CHARGEBACK_ALLOCATION_PRINCIPAL_FIRST_RESPONSE,
+                    loanProductsResponseChargebackAllocationPrincipalFirst);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // Chargeback: Interest, Penalty, Fee, Principal
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL)
+            String name71 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name71)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("INTEREST", "PENALTY", "FEE", "PRINCIPAL"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_PENALTY_FEE_PRINCIPAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestPenaltyFeePrincipal);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // Chargeback: Interest, Fee, Principal, Penalty
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL)
+            String name72 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name72)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_INTEREST_FEE_PRINCIPAL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackInterestFeePrincipal);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // Chargeback: Principal, Interest, Fee, Penalty
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE)
+            String name73 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name73)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("PRINCIPAL", "INTEREST", "FEE", "PENALTY"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_EMI_360_30_CHARGEBACK_PRINCIPAL_INTEREST_FEE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestDailyInterestRecalcEmi36030ChargebackPrincipalInterestFee);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 +
+            // accelerate-maturity chargeOff behaviour + last installment strategy
+            // (LP2_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY)
+            final String name74 = DefaultLoanProduct.LP2_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY
+                    .getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name74)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL))) //
+                    .chargeOffBehaviour("ACCELERATE_MATURITY");//
+            final PostLoanProductsResponse responseLoanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY,
+                    responseLoanProductsRequestAdvCustomInterestRecalculationAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + accelerate-maturity chargeOff behaviour + last
+            // installment
+            // strategy
+            // (LP2_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY)
+            final String name75 = DefaultLoanProduct.LP2_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY.getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name75)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL))) //
+                    .chargeOffBehaviour("ACCELERATE_MATURITY");//
+            final PostLoanProductsResponse responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ACCELERATE_MATURITY_CHARGE_OFF_BEHAVIOUR_LAST_INSTALLMENT_STRATEGY,
+                    responseLoanProductsRequestAdvCustomAccelerateMaturityChargeOffBehaviourLastInstallmentStrategyProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + interestRecognitionOnDisbursementDate =
+            // true
+            // + 360/30 + accrual activity
+            String name76 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_360_30_ACCRUAL_ACTIVITY.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmi36030AccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name76)//
+                    .enableAccrualActivityPosting(true)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .interestRecognitionOnDisbursementDate(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmi36030AccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmi36030AccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_360_30_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmi36030AccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + interestRecognitionOnDisbursementDate =
+            // true
+            // + 360/30 + accrual activity
+            String name77 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmiActualActual30AccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name77)//
+                    .enableAccrualActivityPosting(true)//
+                    .daysInYearType(DaysInYearType.ACTUAL.value)//
+                    .daysInMonthType(DaysInMonthType.ACTUAL.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .interestRecognitionOnDisbursementDate(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmiActualActualAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestRecognitionOnDisbursementEmiActualActual30AccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_RECOGNITION_DISBURSEMENT_DAILY_EMI_ACTUAL_ACTUAL_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestLP2AdvancedPaymentInterestInterestRecognitionOnDisbursementEmiActualActualAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose, accountingRule = NONE
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_ACCOUNTING_RULE_NONE)
+            String name78 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_ACCOUNTING_RULE_NONE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcAccountingRuleNone = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name78)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .accountingRule(LOAN_ACCOUNTING_RULE_NONE).chargeOffBehaviour("REGULAR").paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcAccountingRuleNone = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcAccountingRuleNone);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_ACCOUNTING_RULE_NONE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcAccountingRuleNone);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal
+            // + interest recalculation + interest recognition from disbursement date enabled
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INT_RECALCULATION_ZERO_INT_CHARGE_OFF_INT_RECOGNITION_FROM_DISB_DATE)
+            String name79 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INT_RECALCULATION_ZERO_INT_CHARGE_OFF_INT_RECOGNITION_FROM_DISB_DATE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name79)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .interestRecognitionOnDisbursementDate(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INT_RECALCULATION_ZERO_INT_CHARGE_OFF_INT_RECOGNITION_FROM_DISB_DATE,
+                    responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyZeroIntChargeOffIntRecognitionFromDisbDate);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + leap year
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALCULATION_DAILY)
+            String name80 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_LEAP_YEAR_INTEREST_RECALCULATION_DAILY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name80)//
+                    .maxPrincipal(1000000.0)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .daysInYearType(DaysInYearType.ACTUAL.value)//
+                    .daysInYearCustomStrategy(FEB_29_PERIOD_ONLY.getValue()).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_LEAP_YEAR_INTEREST_RECALCULATION_DAILY,
+                    responseLoanProductsRequestLP2AdvancedPaymentInterestEmiActualActualLeapYearInterestRecalculationDaily);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, interest recalculation enabled
+            // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC)
+            final String name81 = DefaultLoanProduct.LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC.getName();
+            final PostLoanProductsRequest loanProductsRequestInterestDecliningPeriodDailyIntRecalc = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDeclining().name(name81).isInterestRecalculationEnabled(true)
+                    .preClosureInterestCalculationStrategy(1).rescheduleStrategyMethod(1).interestRecalculationCompoundingMethod(0)
+                    .recalculationRestFrequencyType(2).recalculationRestFrequencyInterval(1)
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value).allowPartialPeriodInterestCalculation(false);
+            final PostLoanProductsResponse responseInterestDecliningPeriodDailyIntRecalc = createLoanProductIdempotent(
+                    loanProductsRequestInterestDecliningPeriodDailyIntRecalc);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_DECLINING_PERIOD_DAILY_INT_RECALC,
+                    responseInterestDecliningPeriodDailyIntRecalc);
+        });
+
+        tasks.add(() -> {
+            // LP1 with 12% DECLINING BALANCE interest, interest period: Daily, interest recalculation enabled, 360/30
+            // (LP1_INTEREST_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC)
+            final String name82 = DefaultLoanProduct.LP1_INTEREST_360_30_DECLINING_BALANCE_PERIOD_DAILY_INT_RECALC.getName();
+            final PostLoanProductsRequest loanProductsRequestInterest36030DecliningPeriodDailyIntRecalc = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDeclining().name(name82).isInterestRecalculationEnabled(false)
+                    .daysInYearType(DaysInYearType.DAYS360.value).daysInMonthType(DaysInMonthType.DAYS30.value)
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value).allowPartialPeriodInterestCalculation(false);
+            final PostLoanProductsResponse responseInterest36030DecliningPeriodDailyIntRecalc = createLoanProductIdempotent(
+                    loanProductsRequestInterest36030DecliningPeriodDailyIntRecalc);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_360_30__DECLINING_PERIOD_DAILY_INT_RECALC,
+                    responseInterest36030DecliningPeriodDailyIntRecalc);
+        });
+
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + delinquent charge-off
+            // reason to GL account mapping
+            // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON)
+            final String name83 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON.getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappings()//
+                    .name(name83)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason = createLoanProductIdempotent(
+                    loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON,
+                    responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReason);
+        });
+
+        tasks.add(() -> {
+            // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + down payment
+            // (LP2_ADV_DP_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
+            String name84 = DefaultLoanProduct.LP2_ADV_DP_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
+
+            PostLoanProductsRequest loanProductsRequestAdvDPCustomPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name84)//
+                    .enableAccrualActivityPosting(false) //
+                    .enableDownPayment(true) //
+                    .enableAutoRepaymentForDownPayment(true) //
+                    .multiDisburseLoan(true) //
+                    .disallowExpectedDisbursements(true) //
+                    .disbursedAmountPercentageForDownPayment(BigDecimal.valueOf(25.0)) //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("DOWN_PAYMENT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE) //
+            ));//
+            PostLoanProductsResponse responseLoanProductsResponseAdvDPCustomPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvDPCustomPaymentAllocationProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_DP_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
+                    responseLoanProductsResponseAdvDPCustomPaymentAllocationProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + down payment + interest
+            // recalculation
+            // (LP2_ADV_DP_IR_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
+            String name85 = DefaultLoanProduct.LP2_ADV_DP_IR_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
+
+            PostLoanProductsRequest loanProductsRequestAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name85)//
+                    .enableAccrualActivityPosting(false) //
+                    .enableDownPayment(true) //
+                    .enableAutoRepaymentForDownPayment(true) //
+                    .multiDisburseLoan(true) //
+                    .disallowExpectedDisbursements(true) //
+                    .installmentAmountInMultiplesOf(null) //
+                    .disbursedAmountPercentageForDownPayment(BigDecimal.valueOf(25.0)) //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("DOWN_PAYMENT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE) //
+            ));//
+            PostLoanProductsResponse responseLoanProductsResponseAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_DP_IR_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE,
+                    responseLoanProductsResponseAdvDPIRCustomPaymentAllocationProgressiveLoanSchedule);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + interest recalculation
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // charges - Disbursement Charge
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_DISBURSEMENT_CHARGES)
+            String name86 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_DISBURSEMENT_CHARGES.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name86)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .charges(chargesDisbursement)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_DISBURSEMENT_CHARGES,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyDisbursementCharge);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE)
+            String name87 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name87)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburse);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // charges - Disbursement Charge
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE)
+            String name88 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name88)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseDisbursementCharge);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 + cash based
+            // accounting
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // charges - Disbursement Charge
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES)
+            String name89 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCashAccounting()//
+                    .name(name89)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .charges(chargesDisbursement)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyCashAccountingDisbursementCharge);
+        });
+
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + delinquent charge-off
+            // reason to GL account mapping + interest recalculation
+            // (LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC)
+            final String name90 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC.getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappings()//
+                    .name(name90)//
+                    .enableDownPayment(false)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc = createLoanProductIdempotent(
+                    loanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC,
+                    responseLoanProductsRequestAdvZeroInterestChargeOffProgressiveDelinquentReasonIntRecalc);
+        });
+
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + interest recalculation
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF)
+            final String name91 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")))
+                    .name(name91)//
+                    .shortName(loanProductsRequestFactory.generateShortNameSafely())//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF,
+                    responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff);
+        });
+
+        tasks.add(() -> {
+            // LP2 + accelerate maturity chargeOff behaviour + progressive loan schedule + horizontal + interest
+            // recalculation
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ACCELERATE_MATURITY_CHARGE_OFF)
+            final String name92 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ACCELERATE_MATURITY_CHARGE_OFF
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")))
+                    .name(name92)//
+                    .shortName(loanProductsRequestFactory.generateShortNameSafely())//
+                    .chargeOffBehaviour("ACCELERATE_MATURITY");//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ACCELERATE_MATURITY_CHARGE_OFF,
+                    responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff);
+        });
+
+        tasks.add(() -> {
+            // LP2 + no interest recalculation + horizontal + interest refund
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_REFUND_FULL)
+            String name93 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_REFUND_FULL.getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name93)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualNoInterestRecalcRefundFull = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_REFUND_FULL,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualNoInterestRecalcRefundFull);
+        });
+
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + no interest
+            // recalculation
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF)
+            final String name94 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")))//
+                    .name(name94)//
+                    .shortName(loanProductsRequestFactory.generateShortNameSafely())//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF,
+                    responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff);
+        });
+
+        tasks.add(() -> {
+            // LP2 + accelerate maturity chargeOff behaviour + progressive loan schedule + horizontal + no interest
+            // recalculation
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ACC_MATUR_CHARGE_OFF)
+            final String name95 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ACC_MATUR_CHARGE_OFF
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")))//
+                    .name(name95)//
+                    .shortName(loanProductsRequestFactory.generateShortNameSafely())//
+                    .chargeOffBehaviour("ACCELERATE_MATURITY");//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_NO_INTEREST_RECALC_INT_REFUND_FULL_ACC_MATUR_CHARGE_OFF,
+                    responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till rest frequency date,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_REST_FREQUENCY_DATE_LAST_INSTALLMENT)
+            String name96 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_REST_FREQUENCY_DATE_LAST_INSTALLMENT
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDateLastInstallment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name96)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(2)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDateLastInstallment = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillRestFrequencyDateLastInstallment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_REST_FREQUENCY_DATE_LAST_INSTALLMENT,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterest36030InterestRecalcDailyTillRestFrequencyDateLastInstallment);
+        });
+
+        tasks.add(() -> {
+            final String name97 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_CAPITALIZED_INCOME.getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2CapitalizedIncome()//
+                    .name(name97)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .allowApprovedDisbursedAmountsOverApplied(false)//
+                    .overAppliedCalculationType(null)//
+                    .overAppliedNumber(null)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + interest refund with
+            // Merchant issued and Payment refund + interest recalculation + Multidisbursement
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB)
+            String name98 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculationMultiDisb = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .name(name98)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculationMultidisb = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculationMultiDisb);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculationMultidisb);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // capitalized income enabled
+            final String name99 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome().name(name99)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // multidisbursal
+            // capitalized income enabled
+            final String name100 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSAL_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name100)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSAL_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcMultidisbursalCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // capitalized income enabled, capitalized income type: FEE
+            final String name101 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_FEE
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name101)//
+                    .capitalizedIncomeType(PostLoanProductsRequest.CapitalizedIncomeTypeEnum.FEE)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_FEE,
+                    responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee);
+        });
+
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + delinquent charge-off
+            // reason to GL account mapping + interest recalculation
+            // capitalized income enabled
+            final String name102 = DefaultLoanProduct.LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON_INTEREST_RECALC_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappingsWithCapitalizedIncome()//
+                    .name(name102)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INT_CHARGE_OFF_DELINQUENT_REASON_INT_RECALC_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestPrgAdvZeroIntChargeOffDelinquentReasonIntRecalcCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // Merchant issued with Interest refund + interest recalculation, 360/30
+            // accrual activity enabled
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY)
+            String name103 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name103)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .enableAccrualActivityPosting(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculationAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // Merchant issued with Interest refund + interest recalculation, 360/30
+            // accrual activity enabled
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_DOWNPAYMENT_ACCRUAL_ACTIVITY)
+            String name104 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_DOWNPAYMENT_ACCRUAL_ACTIVITY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculation = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name104)//
+                    .enableDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .enableAutoRepaymentForDownPayment(true)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .enableAccrualActivityPosting(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundInterestRecalculation = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundRecalculation);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_DOWNPAYMENT_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRefundInterestRecalculation);
+        });
+
+        tasks.add(() -> {
+            // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR)
+            final String name105 = DefaultLoanProduct.LP2_ADV_PYMNT_360_30_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name105)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"),
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT")))
+                    .enableAccrualActivityPosting(true)//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_360_30_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestAdvInterestRecalculationZeroInterestChargeOffBehaviourAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + custom allocation capital
+            // adjustment
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // capitalized income enabled + income type - fee
+            final String name106 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name106)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("CAPITALIZED_INCOME_ADJUSTMENT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc);
+
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC,
+                    responseLoanProductsRequestLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeAdjCustomAlloc);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement +
+            // contract termination
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION)
+            final String name107 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION.getName();
+
+            final PostLoanProductsRequest loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name107)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION,
+                    responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalc);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
+            // capitalized income enabled; approver over applied amount enabled with percentage type
+            final String name108 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name108)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                    .overAppliedNumber(50);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // LP2 with Down-payment+autopayment + custom advanced payment allocation
+            // (LP2_DOWNPAYMENT_AUTO_ADVANCED_CUSTOM_PAYMENT_ALLOCATION)
+            String name109 = DefaultLoanProduct.LP2_DOWNPAYMENT_AUTO_ADVANCED_CUSTOM_PAYMENT_ALLOCATION.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name109)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "REAMORTIZATION"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("DOWN_PAYMENT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_AUTO_ADVANCED_CUSTOM_PAYMENT_ALLOCATION,
+                    responseLoanProductsRequestDownPaymentAutoAdvCustomPaymentAllocation);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // multidisbursal
+            // capitalized income enabled
+            final String name110 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name110)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("CAPITALIZED_INCOME_ADJUSTMENT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC,
+                    responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalCapitalizedIncomeAdjCustomAlloc);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
+            // capitalized income enabled; approver over applied amount enabled with percentage type
+            final String name111 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_FLAT_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name111)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.FIXED_SIZE.value)//
+                    .overAppliedNumber(1000);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_FLAT_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbursalApprovedOverAppliedFlatCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
+            // capitalized income enabled; approver over applied amount enabled with percentage type
+            final String name112 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name112)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                    .overAppliedNumber(50);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // multidisbursal that doesn't expect tranches with allowed approved/disbursed amount over applied amount
+            // capitalized income enabled; approver over applied amount enabled with fixed-size(flat) type
+            final String name113 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_FLAT_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name113)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.FIXED_SIZE.value)//
+                    .overAppliedNumber(1000);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_FLAT_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, buy down fees enabled
+            final String name114 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES.getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2BuyDownFees()//
+                    .name(name114)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees);
+        });
+
+        tasks.add(() -> {
+            // LP2 + interest recalculation + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
+            // (LP2_ADV_PYMNT_360_30_INTEREST_RECALC_AUTO_DOWNPAYMENT_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY)
+            final String name115 = DefaultLoanProduct.LP2_ADV_PYMNT_360_30_INTEREST_RECALC_AUTO_DOWNPAYMENT_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name115)//
+                    .enableDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .enableAutoRepaymentForDownPayment(true)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")))
+                    .enableAccrualActivityPosting(true)//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            final PostLoanProductsResponse responseLoanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_360_30_INTEREST_RECALC_AUTO_DOWNPAYMENT_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestAdvInterestRecalculationAutoDownpaymentZeroInterestChargeOffBehaviourAccrualActivity);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation
+            // charges - Installment Fee Flat
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_DAILY_INSTALLMENT_FEE_FLAT_CHARGES)
+            final String name116 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_DAILY_INSTALLMENT_FEE_FLAT_CHARGES
+                    .getName();
+            final List<LoanProductChargeData> chargesInstallmentFeeFlat = new ArrayList<>();
+            chargesInstallmentFeeFlat
+                    .add(new LoanProductChargeData().id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT)));
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name116)//
+                    .charges(chargesInstallmentFeeFlat)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_DAILY_INSTALLMENT_FEE_FLAT_CHARGES,
+                    responseLoanProductsRequestLP2AdvPaymentInterestRecalcDailyInstallmentFeeFlatCharges);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal
+            // charges - Installment Fee Percentage Amount
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_CHARGES)
+            final String name117 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_CHARGES.getName();
+            final List<LoanProductChargeData> chargesInstallmentFeePercentAmount = new ArrayList<>();
+            chargesInstallmentFeePercentAmount.add(new LoanProductChargeData()
+                    .id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT)));
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name117)//
+                    .charges(chargesInstallmentFeePercentAmount)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .minPrincipal(1.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_CHARGES,
+                    responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountCharges);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal
+            // charges - Installment Fee Percentage Interest
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_INTEREST_CHARGES)
+            final String name118 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_INTEREST_CHARGES.getName();
+
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name118)//
+                    .charges(chargesInstallmentFeePercentInterest)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_INTEREST_CHARGES,
+                    responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges);
+        });
+
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal
+            // charges - Installment Fee Percentage Amount + Interest
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_INTEREST_CHARGES)
+            final String name119 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_INTEREST_CHARGES
+                    .getName();
+            final List<LoanProductChargeData> chargesInstallmentFeePercentAmountPlusInterest = new ArrayList<>();
+            chargesInstallmentFeePercentAmountPlusInterest.add(new LoanProductChargeData()
+                    .id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST)));
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name119)//
+                    .charges(chargesInstallmentFeePercentAmountPlusInterest)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_INTEREST_CHARGES,
+                    responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges);
+        });
 
-        // LP2 with progressive loan schedule + horizontal
-        // charges - Installment Fee Percentage Amount + Interest
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_INTEREST_CHARGES)
-        final String name119 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_INTEREST_CHARGES.getName();
-        final List<LoanProductChargeData> chargesInstallmentFeePercentAmountPlusInterest = new ArrayList<>();
-        chargesInstallmentFeePercentAmountPlusInterest
-                .add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.value));
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name119)//
-                .charges(chargesInstallmentFeePercentAmountPlusInterest)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_INTEREST_CHARGES,
-                responseLoanProductsRequestLP2AdvPaymentInstallmentFeePercentAmountPlusInterestCharges);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal
+            // charges - Installment Fee All
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_ALL_CHARGES)
+            final String name120 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_ALL_CHARGES.getName();
+            final List<LoanProductChargeData> chargesInstallmentFeeAll = new ArrayList<>();
+            chargesInstallmentFeeAll
+                    .add(new LoanProductChargeData().id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT)));
+            chargesInstallmentFeeAll.add(new LoanProductChargeData()
+                    .id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT)));
+            chargesInstallmentFeeAll.add(new LoanProductChargeData()
+                    .id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST)));
+            chargesInstallmentFeeAll.add(new LoanProductChargeData()
+                    .id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST)));
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name120)//
+                    .charges(chargesInstallmentFeeAll)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_ALL_CHARGES,
+                    responseLoanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges);
+        });
 
-        // LP2 with progressive loan schedule + horizontal
-        // charges - Installment Fee All
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_ALL_CHARGES)
-        final String name120 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_ALL_CHARGES.getName();
-        final List<LoanProductChargeData> chargesInstallmentFeeAll = new ArrayList<>();
-        chargesInstallmentFeeAll.add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT.value));
-        chargesInstallmentFeeAll.add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT.value));
-        chargesInstallmentFeeAll.add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.value));
-        chargesInstallmentFeeAll
-                .add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT_PLUS_INTEREST.value));
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name120)//
-                .charges(chargesInstallmentFeeAll)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestRateFrequencyType(3)//
-                .maxInterestRatePerPeriod(10.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_ALL_CHARGES,
-                responseLoanProductsRequestLP2AdvPaymentInstallmentFeeAllCharges);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + multidisbursal
+            // charges - Installment Fee Flat + Interest %
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_FLAT_INTEREST_CHARGES_TRANCHE)
+            final String name121 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_FLAT_INTEREST_CHARGES_TRANCHE.getName();
+            final List<LoanProductChargeData> chargesInstallmentFeeFlatPlusInterest = new ArrayList<>();
+            chargesInstallmentFeeFlatPlusInterest
+                    .add(new LoanProductChargeData().id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT)));
+            chargesInstallmentFeeFlatPlusInterest.add(new LoanProductChargeData()
+                    .id(chargeProductResolver.resolve(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST)));
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .charges(chargesInstallmentFeePercentInterest)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestRateFrequencyType(3)//
+                    .maxInterestRatePerPeriod(10.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .name(name121)//
+                    .shortName(loanProductsRequestFactory.generateShortNameSafely())//
+                    .charges(chargesInstallmentFeeFlatPlusInterest)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_FLAT_INTEREST_CHARGES_TRANCHE,
+                    responseLoanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + multidisbursal
-        // charges - Installment Fee Flat + Interest %
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_FLAT_INTEREST_CHARGES_TRANCHE)
-        final String name121 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_FLAT_INTEREST_CHARGES_TRANCHE.getName();
-        final List<LoanProductChargeData> chargesInstallmentFeeFlatPlusInterest = new ArrayList<>();
-        chargesInstallmentFeeFlatPlusInterest.add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_FLAT.value));
-        chargesInstallmentFeeFlatPlusInterest
-                .add(new LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.value));
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse = loanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges//
-                .name(name121)//
-                .shortName(loanProductsRequestFactory.generateShortNameSafely())//
-                .charges(chargesInstallmentFeeFlatPlusInterest)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_FLAT_INTEREST_CHARGES_TRANCHE,
-                responseLoanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse);
+        tasks.add(() -> {
+            // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
+            // Multi-disbursement + 360/30
+            // (LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE)
+            final String name122 = DefaultLoanProduct.LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE.getName();
+            final PostLoanProductsRequest loanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat()//
+                    .name(name122)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement = createLoanProductIdempotent(
+                    loanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE,
+                    responseLoanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement);
+        });
 
-        // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
-        // Multi-disbursement + 360/30
-        // (LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE)
-        final String name122 = DefaultLoanProduct.LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE.getName();
-        final PostLoanProductsRequest loanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat()//
-                .name(name122)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .installmentAmountInMultiplesOf(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement = createLoanProductIdempotent(
-                loanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE,
-                responseLoanProductsRequestAdvPaymentAllocationInterestFlat36030MultiDisbursement);
+        tasks.add(() -> {
+            // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
+            // Multi-disbursement + allowPartialPeriodInterestCalculation disabled
+            // (LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED)
+            final String name123 = DefaultLoanProduct.LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED.getName();
+            final PostLoanProductsRequest loanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat()//
+                    .name(name123)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled = createLoanProductIdempotent(
+                    loanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED,
+                    responseLoanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled);
+        });
 
-        // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
-        // Multi-disbursement + allowPartialPeriodInterestCalculation disabled
-        // (LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED)
-        final String name123 = DefaultLoanProduct.LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED.getName();
-        final PostLoanProductsRequest loanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat()//
-                .name(name123)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .installmentAmountInMultiplesOf(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowPartialPeriodInterestCalculation(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled = createLoanProductIdempotent(
-                loanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED,
-                responseLoanProductsRequestAdvInterestFlatMultiDisbPartialPeriodInterestCalculationDisabled);
+        tasks.add(() -> {
+            // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
+            // Multi-disbursement + 360/30 + allowPartialPeriodInterestCalculation disabled
+            // (LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED)
+            final String name124 = DefaultLoanProduct.LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat()//
+                    .name(name124)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled = createLoanProductIdempotent(
+                    loanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED,
+                    responseLoanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled);
+        });
 
-        // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
-        // Multi-disbursement + 360/30 + allowPartialPeriodInterestCalculation disabled
-        // (LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED)
-        final String name124 = DefaultLoanProduct.LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED.getName();
-        final PostLoanProductsRequest loanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat()//
-                .name(name124)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .installmentAmountInMultiplesOf(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowPartialPeriodInterestCalculation(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled = createLoanProductIdempotent(
-                loanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_360_30_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED,
-                responseLoanProductsRequestAdvInterestFlat36030MultiDisbPartialPeriodInterestCalculationDisabled);
+        tasks.add(() -> {
+            // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
+            // Multi-disbursement
+            // (LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE)
+            final String name125 = DefaultLoanProduct.LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE.getName();
+            final PostLoanProductsRequest loanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat()//
+                    .name(name125)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement = createLoanProductIdempotent(
+                    loanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE,
+                    responseLoanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement);
+        });
 
-        // LP2 with advanced payment allocation + progressive loan schedule + horizontal + interest Flat +
-        // Multi-disbursement
-        // (LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE)
-        final String name125 = DefaultLoanProduct.LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE.getName();
-        final PostLoanProductsRequest loanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat()//
-                .name(name125)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .installmentAmountInMultiplesOf(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement = createLoanProductIdempotent(
-                loanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE,
-                responseLoanProductsRequestAdvPaymentAllocationInterestFlatMultiDisbursement);
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal + interest
+            // Flat
+            // + Multi-disbursement + allowPartialPeriodInterestCalculation disabled
+            // (LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED)
+            final String name126 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartialPeriodInterestCalcDisabled = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestFlat()//
+                    .name(name126)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartPeriodIntCalcDisabled = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartialPeriodInterestCalcDisabled);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED,
+                    responseLoanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartPeriodIntCalcDisabled);
+        });
 
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + horizontal + interest Flat
-        // + Multi-disbursement + allowPartialPeriodInterestCalculation disabled
-        // (LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED)
-        final String name126 = DefaultLoanProduct.LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartialPeriodInterestCalcDisabled = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestFlat()//
-                .name(name126)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableAutoRepaymentForDownPayment(false)//
-                .installmentAmountInMultiplesOf(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowPartialPeriodInterestCalculation(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartPeriodIntCalcDisabled = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartialPeriodInterestCalcDisabled);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_INTEREST_FLAT_ADV_PMT_ALLOC_MULTIDISBURSE_PART_PERIOD_CALC_DISABLED,
-                responseLoanProductsRequestDownPaymentAdvInterestFlatMultiDisbPartPeriodIntCalcDisabled);
+        tasks.add(() -> {
+            // LP2 without Down-payment + interest recalculation disabled + advanced payment allocation + progressive
+            // loan
+            // schedule + horizontal + allocation penalty first
+            // (LP2_NO_INTEREST_RECALCULATION_ALLOCATION_PENALTY_FIRST)
+            String name127 = DefaultLoanProduct.LP2_NO_INTEREST_RECALCULATION_ALLOCATION_PENALTY_FIRST.getName();
+            PostLoanProductsRequest loanProductsRequestNoInterestRecalculationAllocationPenaltyFirst = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2()//
+                    .name(name127)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .loanScheduleProcessingType("HORIZONTAL")//
+                    .enableDownPayment(false)//
+                    .enableAutoRepaymentForDownPayment(null)//
+                    .disbursedAmountPercentageForDownPayment(null)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE)));//
+            PostLoanProductsResponse responseLoanProductsRequestNoInterestRecalculationAllocationPenaltyFirst = createLoanProductIdempotent(
+                    loanProductsRequestNoInterestRecalculationAllocationPenaltyFirst);
+            TestContext.INSTANCE.set(TestContextKey.LP2_NO_INTEREST_RECALCULATION_ALLOCATION_PENALTY_FIRST_RESPONSE,
+                    responseLoanProductsRequestNoInterestRecalculationAllocationPenaltyFirst);
+        });
 
-        // LP2 without Down-payment + interest recalculation disabled + advanced payment allocation + progressive loan
-        // schedule + horizontal + allocation penalty first
-        // (LP2_NO_INTEREST_RECALCULATION_ALLOCATION_PENALTY_FIRST)
-        String name127 = DefaultLoanProduct.LP2_NO_INTEREST_RECALCULATION_ALLOCATION_PENALTY_FIRST.getName();
-        PostLoanProductsRequest loanProductsRequestNoInterestRecalculationAllocationPenaltyFirst = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2()//
-                .name(name127)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .loanScheduleProcessingType("HORIZONTAL")//
-                .enableDownPayment(false)//
-                .enableAutoRepaymentForDownPayment(null)//
-                .disbursedAmountPercentageForDownPayment(null)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "LAST_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE)));//
-        PostLoanProductsResponse responseLoanProductsRequestNoInterestRecalculationAllocationPenaltyFirst = createLoanProductIdempotent(
-                loanProductsRequestNoInterestRecalculationAllocationPenaltyFirst);
-        TestContext.INSTANCE.set(TestContextKey.LP2_NO_INTEREST_RECALCULATION_ALLOCATION_PENALTY_FIRST_RESPONSE,
-                responseLoanProductsRequestNoInterestRecalculationAllocationPenaltyFirst);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // charge-off reasons to GL account mapping
+            // + interest recalculation, buy down fees enabled
+            final String name128 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_CHARGE_OFF_REASON.getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappingsWithBuyDownFee()//
+                    .name(name128)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_CHARGE_OFF_REASON,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // charge-off reasons to GL account mapping
-        // + interest recalculation, buy down fees enabled
-        final String name128 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_CHARGE_OFF_REASON.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappingsWithBuyDownFee()//
-                .name(name128)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_CHARGE_OFF_REASON,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // capitalized income enabled; allow approved/disbursed amount over applied amount is enabled with
+            // percentage
+            // type
+            final String name129 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name129)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                    .overAppliedNumber(50)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // capitalized income enabled; allow approved/disbursed amount over applied amount is enabled with percentage
-        // type
-        final String name129 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name129)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
-                .overAppliedNumber(50)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome);
+        tasks.add(() -> {
+            // LP1 with new due-penalty-fee-interest-principal-in-advance-principal-penalty-fee-interest-strategy
+            // payment
+            // strategy and with 12% FLAT interest
+            // multidisbursal that expects tranche(s)
+            // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT)
+            String name130 = DefaultLoanProduct.LP1_MULTIDISBURSAL_EXPECTS_TRANCHES.getName();
+            PostLoanProductsRequest loanProductsRequestMultidisbursalExpectTranches = loanProductsRequestFactory
+                    // .defaultLoanProductsRequestLP1InterestFlat()//
+                    // .interestType(INTEREST_TYPE_DECLINING_BALANCE)//
+                    .defaultLoanProductsRequestLP1() //
+                    .interestCalculationPeriodType(0)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    // .allowApprovedDisbursedAmountsOverApplied(false)//
+                    .name(name130)//
+                    .transactionProcessingStrategyCode(
+                            TransactionProcessingStrategyCode.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST.value)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductMultidisbursalExpectTranches = createLoanProductIdempotent(
+                    loanProductsRequestMultidisbursalExpectTranches);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_MULTIDISBURSAL_EXPECTS_TRANCHES,
+                    responseLoanProductMultidisbursalExpectTranches);
+        });
 
-        // LP1 with new due-penalty-fee-interest-principal-in-advance-principal-penalty-fee-interest-strategy payment
-        // strategy and with 12% FLAT interest
-        // multidisbursal that expects tranche(s)
-        // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT)
-        String name130 = DefaultLoanProduct.LP1_MULTIDISBURSAL_EXPECTS_TRANCHES.getName();
-        PostLoanProductsRequest loanProductsRequestMultidisbursalExpectTranches = loanProductsRequestFactory
-                // .defaultLoanProductsRequestLP1InterestFlat()//
-                // .interestType(INTEREST_TYPE_DECLINING_BALANCE)//
-                .defaultLoanProductsRequestLP1() //
-                .interestCalculationPeriodType(0)//
-                .allowPartialPeriodInterestCalculation(false)//
-                // .allowApprovedDisbursedAmountsOverApplied(false)//
-                .name(name130)//
-                .transactionProcessingStrategyCode(
-                        TransactionProcessingStrategyCode.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST.value)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductMultidisbursalExpectTranches = createLoanProductIdempotent(
-                loanProductsRequestMultidisbursalExpectTranches);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_MULTIDISBURSAL_EXPECTS_TRANCHES,
-                responseLoanProductMultidisbursalExpectTranches);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal +
+            // interest Declining balance, Same as repayment period
+            // interest recalculation enabled - daily
+            // EMI + 360/30
+            // multidisbursement - calculate partial period enabled
+            // (LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_PARTIAL_PERIOD)
+            final String name131 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_PARTIAL_PERIOD
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name131)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .interestType(InterestType.DECLINING_BALANCE.getValue())//
+                    .isEqualAmortization(false)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.getValue())//
+                    .isInterestRecalculationEnabled(true)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
+                    .preClosureInterestCalculationStrategy(PreClosureInterestCalculationRule.TILL_PRE_CLOSE_DATE.value)//
+                    .rescheduleStrategyMethod(AdvancePaymentsAdjustmentType.ADJUST_LAST_UNPAID_PERIOD.value)//
+                    .interestRecalculationCompoundingMethod(InterestRecalculationCompoundingMethod.NONE.value)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .allowPartialPeriodInterestCalculation(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_PARTIAL_PERIOD,
+                    responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial);
+        });
 
-        // LP2 with progressive loan schedule + horizontal +
-        // interest Declining balance, Same as repayment period
-        // interest recalculation enabled - daily
-        // EMI + 360/30
-        // multidisbursement - calculate partial period enabled
-        // (LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_PARTIAL_PERIOD)
-        final String name131 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_PARTIAL_PERIOD
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name131)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .interestType(InterestType.DECLINING_BALANCE.getValue())//
-                .isEqualAmortization(false)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.getValue())//
-                .isInterestRecalculationEnabled(true)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
-                .preClosureInterestCalculationStrategy(PreClosureInterestCalculationRule.TILL_PRE_CLOSE_DATE.value)//
-                .rescheduleStrategyMethod(AdvancePaymentsAdjustmentType.ADJUST_LAST_UNPAID_PERIOD.value)//
-                .interestRecalculationCompoundingMethod(InterestRecalculationCompoundingMethod.NONE.value)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .allowPartialPeriodInterestCalculation(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_PARTIAL_PERIOD,
-                responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630IntRecalcDailyMutiDisbPartial);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal +
+            // interest Declining balance, Same as repayment period
+            // interest recalculation disabled
+            // EMI + 360/30
+            // multidisbursement - calculate partial period enabled
+            // (LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_PARTIAL_PERIOD)
+            final String name132 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_PARTIAL_PERIOD
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name132)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .interestType(InterestType.DECLINING_BALANCE.getValue())//
+                    .isEqualAmortization(false)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.getValue())//
+                    .isInterestRecalculationEnabled(false)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .allowPartialPeriodInterestCalculation(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_PARTIAL_PERIOD,
+                    responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial);
+        });
 
-        // LP2 with progressive loan schedule + horizontal +
-        // interest Declining balance, Same as repayment period
-        // interest recalculation disabled
-        // EMI + 360/30
-        // multidisbursement - calculate partial period enabled
-        // (LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_PARTIAL_PERIOD)
-        final String name132 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_PARTIAL_PERIOD
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name132)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .interestType(InterestType.DECLINING_BALANCE.getValue())//
-                .isEqualAmortization(false)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.getValue())//
-                .isInterestRecalculationEnabled(false)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .allowPartialPeriodInterestCalculation(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_PARTIAL_PERIOD,
-                responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbPartial);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal +
+            // interest Declining balance, Same as repayment period
+            // interest recalculation disabled
+            // EMI + 360/30
+            // multidisbursement - calculate partial period disabled
+            // (LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_NO_PARTIAL_PERIOD)
+            final String name133 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_NO_PARTIAL_PERIOD
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name133)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .interestType(InterestType.DECLINING_BALANCE.getValue())//
+                    .isEqualAmortization(false)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.getValue())//
+                    .isInterestRecalculationEnabled(false)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_NO_PARTIAL_PERIOD,
+                    responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial);
+        });
 
-        // LP2 with progressive loan schedule + horizontal +
-        // interest Declining balance, Same as repayment period
-        // interest recalculation disabled
-        // EMI + 360/30
-        // multidisbursement - calculate partial period disabled
-        // (LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_NO_PARTIAL_PERIOD)
-        final String name133 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_NO_PARTIAL_PERIOD
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name133)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .interestType(InterestType.DECLINING_BALANCE.getValue())//
-                .isEqualAmortization(false)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.getValue())//
-                .isInterestRecalculationEnabled(false)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .allowPartialPeriodInterestCalculation(false)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DECL_BAL_SARP_EMI_360_30_NO_INT_RECALC_MULTIDISB_NO_PARTIAL_PERIOD,
-                responseLoanProductsRequestLP2AdvPmtIntDeclSarpEmi3630NoIntRecalcMutiDisbNoPartial);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // allow approved/disbursed amount over applied amount is enabled with percentage
+            // multidisbursal loan that expects tranches
+            // type
+            final String name134 = DefaultLoanProduct.LP2_PROGRESSIVE_ADV_PYMNT_INTEREST_RECALC_360_30_MULTIDISB_OVER_APPLIED_EXPECTED_TRANCHES
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name134)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                    .overAppliedNumber(50)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_INTEREST_RECALC_360_30_MULTIDISB_OVER_APPLIED_EXPECTED_TRANCHES,
+                    responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // allow approved/disbursed amount over applied amount is enabled with percentage
-        // multidisbursal loan that expects tranches
-        // type
-        final String name134 = DefaultLoanProduct.LP2_PROGRESSIVE_ADV_PYMNT_INTEREST_RECALC_360_30_MULTIDISB_OVER_APPLIED_EXPECTED_TRANCHES
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name134)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
-                .overAppliedNumber(50)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_INTEREST_RECALC_360_30_MULTIDISB_OVER_APPLIED_EXPECTED_TRANCHES,
-                responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedExpectTranches);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // interestRecalculationCompoundingMethod = none
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE)
+            // min interest rate / year 3 and max interest rate / year is 20
+            String name135 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_MIN_INT_3_MAX_INT_20
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseMinInt3MaxInt20 = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name135)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .minInterestRatePerPeriod(3D)//
+                    .interestRatePerPeriod(12D) //
+                    .maxInterestRatePerPeriod(20D)//
+                    .interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_YEAR).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterest36030InterestRecalcDailyTillPreCloseMinInt3MaxInt20 = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseMinInt3MaxInt20);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_MIN_INT_3_MAX_INT_20,
+                    responseLoanProductsRequestLP2AdvancedPaymentInterest36030InterestRecalcDailyTillPreCloseMinInt3MaxInt20);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // interestRecalculationCompoundingMethod = none
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE)
-        // min interest rate / year 3 and max interest rate / year is 20
-        String name135 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_MIN_INT_3_MAX_INT_20
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseMinInt3MaxInt20 = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name135)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .minInterestRatePerPeriod(3D)//
-                .interestRatePerPeriod(12D) //
-                .maxInterestRatePerPeriod(20D)//
-                .interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_YEAR).paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedPaymentInterest36030InterestRecalcDailyTillPreCloseMinInt3MaxInt20 = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyTillPrecloseMinInt3MaxInt20);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_MIN_INT_3_MAX_INT_20,
-                responseLoanProductsRequestLP2AdvancedPaymentInterest36030InterestRecalcDailyTillPreCloseMinInt3MaxInt20);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, buy down fees enabled, non-merchant
+            final String name136 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_NON_MERCHANT.getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2BuyDownFees()//
+                    .name(name136)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .merchantBuyDownFee(false).buyDownExpenseAccountId(null);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_NON_MERCHANT,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, buy down fees enabled, non-merchant
-        final String name136 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_NON_MERCHANT.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2BuyDownFees()//
-                .name(name136)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .merchantBuyDownFee(false).buyDownExpenseAccountId(null);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_NON_MERCHANT,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchant);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // charge-off reasons to GL account mapping
+            // + interest recalculation, buy down fees enabled, non-merchant
+            final String name137 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_NON_MERCHANT_CHARGE_OFF_REASON
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappingsWithBuyDownFee()//
+                    .name(name137)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .merchantBuyDownFee(false).buyDownExpenseAccountId(null);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_NON_MERCHANT_CHARGE_OFF_REASON,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // charge-off reasons to GL account mapping
-        // + interest recalculation, buy down fees enabled, non-merchant
-        final String name137 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_NON_MERCHANT_CHARGE_OFF_REASON
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappingsWithBuyDownFee()//
-                .name(name137)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .merchantBuyDownFee(false).buyDownExpenseAccountId(null);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_NON_MERCHANT_CHARGE_OFF_REASON,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesNonMerchantWithChargeOffReason);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // allow approved/disbursed amount over applied amount is enabled with percentage type
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED)
+            final String name138 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name138)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(false)//
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                    .overAppliedNumber(50)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED,
+                    responseLoanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // allow approved/disbursed amount over applied amount is enabled with percentage type
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED)
-        final String name138 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name138)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(false)//
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
-                .overAppliedNumber(50)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED,
-                responseLoanProductsRequestLP2AdvEmi36030IntRecalcDailyMultiDisbApprovedOverApplied);
+        tasks.add(() -> {
+            // LP2 + interest recalculation + advanced custom payment allocation + progressive loan schedule +
+            // horizontal
+            // charge-off behaviour - zero interest
+            // LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_ZERO_CHARGE_OFF
+            String name139 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_ZERO_CHARGE_OFF.getName();
 
-        // LP2 + interest recalculation + advanced custom payment allocation + progressive loan schedule + horizontal
-        // charge-off behaviour - zero interest
-        // LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_ZERO_CHARGE_OFF
-        String name139 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_ZERO_CHARGE_OFF.getName();
+            PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name139)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .enableAccrualActivityPosting(true) //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_ZERO_CHARGE_OFF,
+                    responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff);
+        });
 
-        PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name139)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .enableAccrualActivityPosting(true) //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))) //
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_ZERO_CHARGE_OFF,
-                responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleZeroChargeOff);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, buy down fees enabled
+            // + Classification income map
+            final String name140 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_CLASSIFICATION_INCOME_MAP
+                    .getName();
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, buy down fees enabled
-        // + Classification income map
-        final String name140 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_CLASSIFICATION_INCOME_MAP
-                .getName();
+            List<PostClassificationToIncomeAccountMappings> buydownfeeClassificationToIncomeAccountMappings = new ArrayList<>();
+            PostClassificationToIncomeAccountMappings classificationToIncomeAccountMappings = new PostClassificationToIncomeAccountMappings();
+            long classificationId = codeValueResolver.resolve(CodeNames.BUYDOWN_FEE_TRANSACTION_CLASSIFICATION.getValue(),
+                    CodeGlobalInitializerStep.BUYDOWN_FEE_TRANSACTION_CLASSIFICATION_VALUE);
+            classificationToIncomeAccountMappings.setClassificationCodeValueId(classificationId);
+            classificationToIncomeAccountMappings.setIncomeAccountId(accountTypeResolver.resolve(FEE_INCOME));
+            buydownfeeClassificationToIncomeAccountMappings.add(classificationToIncomeAccountMappings);
 
-        List<PostClassificationToIncomeAccountMappings> buydownfeeClassificationToIncomeAccountMappings = new ArrayList<>();
-        PostClassificationToIncomeAccountMappings classificationToIncomeAccountMappings = new PostClassificationToIncomeAccountMappings();
-        long classificationId = codeValueResolver.resolve(CodeNames.BUYDOWN_FEE_TRANSACTION_CLASSIFICATION.getValue(),
-                CodeGlobalInitializerStep.BUYDOWN_FEE_TRANSACTION_CLASSIFICATION_VALUE);
-        classificationToIncomeAccountMappings.setClassificationCodeValueId(classificationId);
-        classificationToIncomeAccountMappings.setIncomeAccountId(10L);
-        buydownfeeClassificationToIncomeAccountMappings.add(classificationToIncomeAccountMappings);
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2BuyDownFees()//
+                    .name(name140)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .buydownfeeClassificationToIncomeAccountMappings(buydownfeeClassificationToIncomeAccountMappings);//
 
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2BuyDownFees()//
-                .name(name140)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .buydownfeeClassificationToIncomeAccountMappings(buydownfeeClassificationToIncomeAccountMappings);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_CLASSIFICATION_INCOME_MAP,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap);
+        });
 
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_CLASSIFICATION_INCOME_MAP,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesClassificationIncomeMap);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + custom allocation capital
+            // adjustment
+            // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // capitalized income enabled + income type - fee
+            // + Classification income map
+            final String name141 = DefaultLoanProduct.LP2_PROGRESSIVE_ADV_PMNT_ALLOCATION_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC_CLASSIFICATION_INCOME_MAP
+                    .getName();
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + custom allocation capital
-        // adjustment
-        // + interest recalculation, preClosureInterestCalculationStrategy= till preclose,
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // capitalized income enabled + income type - fee
-        // + Classification income map
-        final String name141 = DefaultLoanProduct.LP2_PROGRESSIVE_ADV_PMNT_ALLOCATION_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC_CLASSIFICATION_INCOME_MAP
-                .getName();
+            List<PostClassificationToIncomeAccountMappings> capitalizedIncomeClassificationToIncomeAccountMappings = new ArrayList<>();
+            PostClassificationToIncomeAccountMappings classificationToIncomeAccountMappingsCapitalizedIncome = new PostClassificationToIncomeAccountMappings();
+            long capitalizedIncomeClassificationId = codeValueResolver.resolve(
+                    CodeNames.CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION.getValue(),
+                    CodeGlobalInitializerStep.CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION_VALUE);
+            classificationToIncomeAccountMappingsCapitalizedIncome.setClassificationCodeValueId(capitalizedIncomeClassificationId);
+            classificationToIncomeAccountMappingsCapitalizedIncome.setIncomeAccountId(accountTypeResolver.resolve(RECOVERIES));
+            capitalizedIncomeClassificationToIncomeAccountMappings.add(classificationToIncomeAccountMappingsCapitalizedIncome);
 
-        List<PostClassificationToIncomeAccountMappings> capitalizedIncomeClassificationToIncomeAccountMappings = new ArrayList<>();
-        PostClassificationToIncomeAccountMappings classificationToIncomeAccountMappingsCapitalizedIncome = new PostClassificationToIncomeAccountMappings();
-        long capitalizedIncomeClassificationId = codeValueResolver.resolve(
-                CodeNames.CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION.getValue(),
-                CodeGlobalInitializerStep.CAPITALIZED_INCOME_TRANSACTION_CLASSIFICATION_VALUE);
-        classificationToIncomeAccountMappingsCapitalizedIncome.setClassificationCodeValueId(capitalizedIncomeClassificationId);
-        classificationToIncomeAccountMappingsCapitalizedIncome.setIncomeAccountId(15L);
-        capitalizedIncomeClassificationToIncomeAccountMappings.add(classificationToIncomeAccountMappingsCapitalizedIncome);
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                    .name(name141)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("CAPITALIZED_INCOME_ADJUSTMENT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .capitalizedIncomeClassificationToIncomeAccountMappings(capitalizedIncomeClassificationToIncomeAccountMappings);//
 
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
-                .name(name141)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("CAPITALIZED_INCOME_ADJUSTMENT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .capitalizedIncomeClassificationToIncomeAccountMappings(capitalizedIncomeClassificationToIncomeAccountMappings);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap);
 
-        PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PMNT_ALLOCATION_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC_CLASSIFICATION_INCOME_MAP,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap);
+        });
 
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PMNT_ALLOCATION_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC_CLASSIFICATION_INCOME_MAP,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymAllocCapitaizedIncomeClassificationIncomeMap);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, buy down fees enabled
+            // + Write off reason expense map
+            final String name142 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_WRITE_OFF_REASON_MAP.getName();
+            final Long writeOffReasonCodeId = codeHelper.retrieveCodeByName("WriteOffReasons").getId();
+            final CodeValue writeOffReasonCodeValueBadDebt = DefaultCodeValue.valueOf("BAD_DEBT");
+            final CodeValue writeOffReasonCodeValueForgiven = DefaultCodeValue.valueOf("FORGIVEN");
+            final CodeValue writeOffReasonCodeValueTest = DefaultCodeValue.valueOf("TEST");
+            long writeOffReasonIdBadDebt = codeValueResolver.resolve(writeOffReasonCodeId, writeOffReasonCodeValueBadDebt);
+            long writeOffReasonIdForgiven = codeValueResolver.resolve(writeOffReasonCodeId, writeOffReasonCodeValueForgiven);
+            long writeOffReasonIdTest = codeValueResolver.resolve(writeOffReasonCodeId, writeOffReasonCodeValueTest);
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, buy down fees enabled
-        // + Write off reason expense map
-        final String name142 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_WRITE_OFF_REASON_MAP.getName();
-        final Long writeOffReasonCodeId = codeHelper.retrieveCodeByName("WriteOffReasons").getId();
-        final CodeValue writeOffReasonCodeValueBadDebt = DefaultCodeValue.valueOf("BAD_DEBT");
-        final CodeValue writeOffReasonCodeValueForgiven = DefaultCodeValue.valueOf("FORGIVEN");
-        final CodeValue writeOffReasonCodeValueTest = DefaultCodeValue.valueOf("TEST");
-        long writeOffReasonIdBadDebt = codeValueResolver.resolve(writeOffReasonCodeId, writeOffReasonCodeValueBadDebt);
-        long writeOffReasonIdForgiven = codeValueResolver.resolve(writeOffReasonCodeId, writeOffReasonCodeValueForgiven);
-        long writeOffReasonIdTest = codeValueResolver.resolve(writeOffReasonCodeId, writeOffReasonCodeValueTest);
+            List<PostWriteOffReasonToExpenseAccountMappings> writeOffReasonToExpenseAccountMappings = new ArrayList<>();
+            PostWriteOffReasonToExpenseAccountMappings writeOffReasonToExpenseAccountMappingsBadDebt = new PostWriteOffReasonToExpenseAccountMappings();
+            writeOffReasonToExpenseAccountMappingsBadDebt.setWriteOffReasonCodeValueId(String.valueOf(writeOffReasonIdBadDebt));
+            writeOffReasonToExpenseAccountMappingsBadDebt
+                    .setExpenseAccountId(((Long) accountTypeResolver.resolve(CREDIT_LOSS_BAD_DEBT)).toString()); // Credit
+                                                                                                                 // Loss/Bad
+                                                                                                                 // Debt
+            PostWriteOffReasonToExpenseAccountMappings writeOffReasonToExpenseAccountMappingsForgiven = new PostWriteOffReasonToExpenseAccountMappings();
+            writeOffReasonToExpenseAccountMappingsForgiven.setWriteOffReasonCodeValueId(String.valueOf(writeOffReasonIdForgiven));
+            writeOffReasonToExpenseAccountMappingsForgiven
+                    .setExpenseAccountId(((Long) accountTypeResolver.resolve(BUY_DOWN_EXPENSE)).toString()); // Buy Down
+                                                                                                             // Expense
+            PostWriteOffReasonToExpenseAccountMappings writeOffReasonToExpenseAccountMappingsTest = new PostWriteOffReasonToExpenseAccountMappings();
+            writeOffReasonToExpenseAccountMappingsTest.setWriteOffReasonCodeValueId(String.valueOf(writeOffReasonIdTest));
+            writeOffReasonToExpenseAccountMappingsTest.setExpenseAccountId(((Long) accountTypeResolver.resolve(WRITTEN_OFF)).toString()); // Written
+                                                                                                                                          // off
 
-        List<PostWriteOffReasonToExpenseAccountMappings> writeOffReasonToExpenseAccountMappings = new ArrayList<>();
-        PostWriteOffReasonToExpenseAccountMappings writeOffReasonToExpenseAccountMappingsBadDebt = new PostWriteOffReasonToExpenseAccountMappings();
-        writeOffReasonToExpenseAccountMappingsBadDebt.setWriteOffReasonCodeValueId(String.valueOf(writeOffReasonIdBadDebt));
-        writeOffReasonToExpenseAccountMappingsBadDebt.setExpenseAccountId("12"); // Credit Loss/Bad Debt
-        PostWriteOffReasonToExpenseAccountMappings writeOffReasonToExpenseAccountMappingsForgiven = new PostWriteOffReasonToExpenseAccountMappings();
-        writeOffReasonToExpenseAccountMappingsForgiven.setWriteOffReasonCodeValueId(String.valueOf(writeOffReasonIdForgiven));
-        writeOffReasonToExpenseAccountMappingsForgiven.setExpenseAccountId("23"); // Buy Down Expense
-        PostWriteOffReasonToExpenseAccountMappings writeOffReasonToExpenseAccountMappingsTest = new PostWriteOffReasonToExpenseAccountMappings();
-        writeOffReasonToExpenseAccountMappingsTest.setWriteOffReasonCodeValueId(String.valueOf(writeOffReasonIdTest));
-        writeOffReasonToExpenseAccountMappingsTest.setExpenseAccountId("16"); // Written off
+            writeOffReasonToExpenseAccountMappings.add(writeOffReasonToExpenseAccountMappingsBadDebt);
+            writeOffReasonToExpenseAccountMappings.add(writeOffReasonToExpenseAccountMappingsForgiven);
+            writeOffReasonToExpenseAccountMappings.add(writeOffReasonToExpenseAccountMappingsTest);
 
-        writeOffReasonToExpenseAccountMappings.add(writeOffReasonToExpenseAccountMappingsBadDebt);
-        writeOffReasonToExpenseAccountMappings.add(writeOffReasonToExpenseAccountMappingsForgiven);
-        writeOffReasonToExpenseAccountMappings.add(writeOffReasonToExpenseAccountMappingsTest);
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2BuyDownFees()//
+                    .name(name142)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .writeOffReasonsToExpenseMappings(writeOffReasonToExpenseAccountMappings);//
 
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2BuyDownFees()//
-                .name(name142)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .writeOffReasonsToExpenseMappings(writeOffReasonToExpenseAccountMappings);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_WRITE_OFF_REASON_MAP,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap);
+        });
 
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_WRITE_OFF_REASON_MAP,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentWriteOffReasonMap);
+        tasks.add(() -> {
+            // LP1 with 12% Flat interest, interest period: Same as repayment,
+            // Interest recalculation-Same as repayment, Multi-disbursement
+            String name143 = DefaultLoanProduct.LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_ACTUAL_ACTUAL_MULTIDISB.getName();
+            PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name143)//
+                    .interestType(INTEREST_TYPE_FLAT)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowPartialPeriodInterestCalculation(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                    .overAppliedNumber(50);//
+            PostLoanProductsResponse responseInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_ACTUAL_ACTUAL_MULTIDISB,
+                    responseInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement);
+        });
 
-        // LP1 with 12% Flat interest, interest period: Same as repayment,
-        // Interest recalculation-Same as repayment, Multi-disbursement
-        String name143 = DefaultLoanProduct.LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_ACTUAL_ACTUAL_MULTIDISB.getName();
-        PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name143)//
-                .interestType(INTEREST_TYPE_FLAT)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
-                .installmentAmountInMultiplesOf(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowPartialPeriodInterestCalculation(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
-                .overAppliedNumber(50);//
-        PostLoanProductsResponse responseInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_ACTUAL_ACTUAL_MULTIDISB,
-                responseInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursement);
+        tasks.add(() -> {
+            // LP1 with 12% Flat interest, interest period: Same as repayment,
+            // Interest recalculation-Daily, Multi-disbursement
+            String name144 = DefaultLoanProduct.LP1_INTEREST_FLAT_SAR_RECALCULATION_DAILY_360_30_APPROVED_OVER_APPLIED_MULTIDISB.getName();
+            PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name144)//
+                    .interestType(INTEREST_TYPE_FLAT)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowPartialPeriodInterestCalculation(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0)//
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                    .overAppliedNumber(50);//
+            PostLoanProductsResponse responseLoanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_SAR_RECALCULATION_DAILY_360_30_APPROVED_OVER_APPLIED_MULTIDISB,
+                    responseLoanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement);
+        });
 
-        // LP1 with 12% Flat interest, interest period: Same as repayment,
-        // Interest recalculation-Daily, Multi-disbursement
-        String name144 = DefaultLoanProduct.LP1_INTEREST_FLAT_SAR_RECALCULATION_DAILY_360_30_APPROVED_OVER_APPLIED_MULTIDISB.getName();
-        PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name144)//
-                .interestType(INTEREST_TYPE_FLAT)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
-                .recalculationRestFrequencyInterval(1)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .installmentAmountInMultiplesOf(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowPartialPeriodInterestCalculation(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0)//
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
-                .overAppliedNumber(50);//
-        PostLoanProductsResponse responseLoanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_SAR_RECALCULATION_DAILY_360_30_APPROVED_OVER_APPLIED_MULTIDISB,
-                responseLoanProductsRequestInterestFlatSaRRecalculationDailyMultiDisbursement);
+        tasks.add(() -> {
+            // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation-Daily,
+            // Multi-disbursement
+            String name145 = DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_RECALCULATION_DAILY_360_30_MULTIDISB.getName();
+            PostLoanProductsRequest loanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name145)//
+                    .interestType(INTEREST_TYPE_FLAT)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_DAILY_RECALCULATION_DAILY_360_30_MULTIDISB,
+                    responseLoanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement);
+        });
 
-        // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation-Daily,
-        // Multi-disbursement
-        String name145 = DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_RECALCULATION_DAILY_360_30_MULTIDISB.getName();
-        PostLoanProductsRequest loanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name145)//
-                .interestType(INTEREST_TYPE_FLAT)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
-                .allowPartialPeriodInterestCalculation(false)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
-                .recalculationRestFrequencyInterval(1)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .installmentAmountInMultiplesOf(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_DAILY_RECALCULATION_DAILY_360_30_MULTIDISB,
-                responseLoanProductsRequestInterestFlatDailyRecalculationDSameAsRepaymentMultiDisbursement);
+        tasks.add(() -> {
+            // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation-Daily
+            // Multi-disbursement with auto down payment
+            String name146 = DefaultLoanProduct.LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_MULTIDISB_AUTO_DOWNPAYMENT.getName();
+            PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(name146)//
+                    .interestType(INTEREST_TYPE_FLAT)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .enableDownPayment(true)//
+                    .enableAutoRepaymentForDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .allowPartialPeriodInterestCalculation(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_MULTIDISB_AUTO_DOWNPAYMENT,
+                    responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment);
+        });
 
-        // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation-Daily
-        // Multi-disbursement with auto down payment
-        String name146 = DefaultLoanProduct.LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_MULTIDISB_AUTO_DOWNPAYMENT.getName();
-        PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(name146)//
-                .interestType(INTEREST_TYPE_FLAT)//
-                .installmentAmountInMultiplesOf(null)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.SAME_AS_REPAYMENT_PERIOD.value)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .enableDownPayment(true)//
-                .enableAutoRepaymentForDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .allowPartialPeriodInterestCalculation(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_INTEREST_FLAT_SAR_RECALCULATION_SAME_AS_REPAYMENT_MULTIDISB_AUTO_DOWNPAYMENT,
-                responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementAUtoDownPayment);
+        tasks.add(() -> {
+            // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + interest recalculation
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            String name147 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY
+                    .getName();
+            PostLoanProductsRequest loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name147)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes) //
+                    .installmentAmountInMultiplesOf(null) //
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .enableAccrualActivityPosting(true) //
+                    .chargeOffBehaviour(ZERO_INTEREST.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE) //
+            ));//
+            PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily = createLoanProductIdempotent(
+                    loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY,
+                    responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily);
+        });
 
-        // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + interest recalculation
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        String name147 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY
-                .getName();
-        PostLoanProductsRequest loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name147)//
-                .supportedInterestRefundTypes(supportedInterestRefundTypes) //
-                .installmentAmountInMultiplesOf(null) //
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .enableAccrualActivityPosting(true) //
-                .chargeOffBehaviour(ZERO_INTEREST.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE) //
-                ));//
-        PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily = createLoanProductIdempotent(
-                loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY,
-                responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmi36030InterestRecalculationDaily);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement +
+            // contract termination with interest recognition
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION_INT_RECOGNITION)
+            final String name148 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION_INT_RECOGNITION
+                    .getName();
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement +
-        // contract termination with interest recognition
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION_INT_RECOGNITION)
-        final String name148 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION_INT_RECOGNITION
-                .getName();
+            final PostLoanProductsRequest loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .interestRecognitionOnDisbursementDate(true) //
+                    .name(name148)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION_INT_RECOGNITION,
+                    responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog);
+        });
 
-        final PostLoanProductsRequest loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .interestRecognitionOnDisbursementDate(true) //
-                .name(name148)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_CONTRACT_TERMINATION_INT_RECOGNITION,
-                responseLoanProductsRequestAdvCustomContractTerminationProgressiveLoanScheduleIntRecalcRecog);
+        tasks.add(() -> {
+            // (LP1_WITH_OVERRIDES) - Loan product with all attribute overrides ENABLED
+            final String nameWithOverrides = DefaultLoanProduct.LP1_WITH_OVERRIDES.getName();
+            final PostLoanProductsRequest loanProductsRequestWithOverrides = loanProductsRequestFactory.defaultLoanProductsRequestLP1() //
+                    .name(nameWithOverrides) //
+                    .interestRatePerPeriod(1.0) //
+                    .maxInterestRatePerPeriod(30.0) //
+                    .inArrearsTolerance(10) //
+                    .graceOnPrincipalPayment(1) //
+                    .graceOnInterestPayment(1) //
+                    .graceOnArrearsAgeing(3) //
+                    .numberOfRepayments(6) //
+                    .allowAttributeOverrides(new AllowAttributeOverrides() //
+                            .amortizationType(true) //
+                            .interestType(true) //
+                            .transactionProcessingStrategyCode(true) //
+                            .interestCalculationPeriodType(true) //
+                            .inArrearsTolerance(true) //
+                            .repaymentEvery(true) //
+                            .graceOnPrincipalAndInterestPayment(true) //
+                            .graceOnArrearsAgeing(true));
+            final PostLoanProductsResponse responseWithOverrides = createLoanProductIdempotent(loanProductsRequestWithOverrides);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_WITH_OVERRIDES, responseWithOverrides);
+        });
 
-        // (LP1_WITH_OVERRIDES) - Loan product with all attribute overrides ENABLED
-        final String nameWithOverrides = DefaultLoanProduct.LP1_WITH_OVERRIDES.getName();
-        final PostLoanProductsRequest loanProductsRequestWithOverrides = loanProductsRequestFactory.defaultLoanProductsRequestLP1() //
-                .name(nameWithOverrides) //
-                .interestRatePerPeriod(1.0) //
-                .maxInterestRatePerPeriod(30.0) //
-                .inArrearsTolerance(10) //
-                .graceOnPrincipalPayment(1) //
-                .graceOnInterestPayment(1) //
-                .graceOnArrearsAgeing(3) //
-                .numberOfRepayments(6) //
-                .allowAttributeOverrides(new AllowAttributeOverrides() //
-                        .amortizationType(true) //
-                        .interestType(true) //
-                        .transactionProcessingStrategyCode(true) //
-                        .interestCalculationPeriodType(true) //
-                        .inArrearsTolerance(true) //
-                        .repaymentEvery(true) //
-                        .graceOnPrincipalAndInterestPayment(true) //
-                        .graceOnArrearsAgeing(true));
-        final PostLoanProductsResponse responseWithOverrides = createLoanProductIdempotent(loanProductsRequestWithOverrides);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_WITH_OVERRIDES, responseWithOverrides);
+        tasks.add(() -> {
+            // (LP1_NO_OVERRIDES) - Loan product with all attribute overrides DISABLED
+            final String nameNoOverrides = DefaultLoanProduct.LP1_NO_OVERRIDES.getName();
+            final PostLoanProductsRequest loanProductsRequestNoOverrides = loanProductsRequestFactory.defaultLoanProductsRequestLP1() //
+                    .name(nameNoOverrides) //
+                    .interestRatePerPeriod(1.0) //
+                    .maxInterestRatePerPeriod(30.0) //
+                    .inArrearsTolerance(10) //
+                    .graceOnPrincipalPayment(1) //
+                    .graceOnInterestPayment(1) //
+                    .graceOnArrearsAgeing(3) //
+                    .numberOfRepayments(6) //
+                    .allowAttributeOverrides(new AllowAttributeOverrides() //
+                            .amortizationType(false) //
+                            .interestType(false) //
+                            .transactionProcessingStrategyCode(false) //
+                            .interestCalculationPeriodType(false) //
+                            .inArrearsTolerance(false) //
+                            .repaymentEvery(false) //
+                            .graceOnPrincipalAndInterestPayment(false) //
+                            .graceOnArrearsAgeing(false));
+            final PostLoanProductsResponse responseNoOverrides = createLoanProductIdempotent(loanProductsRequestNoOverrides);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_NO_OVERRIDES, responseNoOverrides);
+        });
 
-        // (LP1_NO_OVERRIDES) - Loan product with all attribute overrides DISABLED
-        final String nameNoOverrides = DefaultLoanProduct.LP1_NO_OVERRIDES.getName();
-        final PostLoanProductsRequest loanProductsRequestNoOverrides = loanProductsRequestFactory.defaultLoanProductsRequestLP1() //
-                .name(nameNoOverrides) //
-                .interestRatePerPeriod(1.0) //
-                .maxInterestRatePerPeriod(30.0) //
-                .inArrearsTolerance(10) //
-                .graceOnPrincipalPayment(1) //
-                .graceOnInterestPayment(1) //
-                .graceOnArrearsAgeing(3) //
-                .numberOfRepayments(6) //
-                .allowAttributeOverrides(new AllowAttributeOverrides() //
-                        .amortizationType(false) //
-                        .interestType(false) //
-                        .transactionProcessingStrategyCode(false) //
-                        .interestCalculationPeriodType(false) //
-                        .inArrearsTolerance(false) //
-                        .repaymentEvery(false) //
-                        .graceOnPrincipalAndInterestPayment(false) //
-                        .graceOnArrearsAgeing(false));
-        final PostLoanProductsResponse responseNoOverrides = createLoanProductIdempotent(loanProductsRequestNoOverrides);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_NO_OVERRIDES, responseNoOverrides);
+        tasks.add(() -> {
+            // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + interest recalculation
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            String name149 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OFF_ACCRUAL
+                    .getName();
+            PostLoanProductsRequest loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name149)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).installmentAmountInMultiplesOf(null) //
+                    .daysInYearType(DaysInYearType.ACTUAL.value)//
+                    .daysInMonthType(DaysInMonthType.ACTUAL.value)//
+                    .daysInYearCustomStrategy(FEB_29_PERIOD_ONLY.getValue()).isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .enableAccrualActivityPosting(true) //
+                    .chargeOffBehaviour(ZERO_INTEREST.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))); //
+            PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals = createLoanProductIdempotent(
+                    loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_CUSTOM_PMT_ALLOC_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OFF_ACCRUAL,
+                    responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals);
+        });
 
-        // LP2 advanced custom payment allocation + progressive loan schedule + horizontal + interest recalculation
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        String name149 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OFF_ACCRUAL
-                .getName();
-        PostLoanProductsRequest loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name149)//
-                .supportedInterestRefundTypes(supportedInterestRefundTypes).installmentAmountInMultiplesOf(null) //
-                .daysInYearType(DaysInYearType.ACTUAL.value)//
-                .daysInMonthType(DaysInMonthType.ACTUAL.value)//
-                .daysInYearCustomStrategy(FEB_29_PERIOD_ONLY.getValue()).isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .enableAccrualActivityPosting(true) //
-                .chargeOffBehaviour(ZERO_INTEREST.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"))); //
-        PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals = createLoanProductIdempotent(
-                loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_CUSTOM_PMT_ALLOC_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OFF_ACCRUAL,
-                responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffAccruals);
+        tasks.add(() -> {
+            // LP2 advanced + progressive loan schedule + horizontal + interest recalculation
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            PostLoanProductsRequest loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(DefaultLoanProduct.LP2_ADV_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OF_ACCRUAL.getName())//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).installmentAmountInMultiplesOf(null) //
+                    .daysInYearType(DaysInYearType.ACTUAL.value)//
+                    .daysInMonthType(DaysInMonthType.ACTUAL.value)//
+                    .daysInYearCustomStrategy(FEB_29_PERIOD_ONLY.getValue()).isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .enableAccrualActivityPosting(true) //
+                    .chargeOffBehaviour(ZERO_INTEREST.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"))); //
+            PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals = createLoanProductIdempotent(
+                    loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OF_ACCRUAL,
+                    responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals);
+        });
 
-        // LP2 advanced + progressive loan schedule + horizontal + interest recalculation
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        PostLoanProductsRequest loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(DefaultLoanProduct.LP2_ADV_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OF_ACCRUAL.getName())//
-                .supportedInterestRefundTypes(supportedInterestRefundTypes).installmentAmountInMultiplesOf(null) //
-                .daysInYearType(DaysInYearType.ACTUAL.value)//
-                .daysInMonthType(DaysInMonthType.ACTUAL.value)//
-                .daysInYearCustomStrategy(FEB_29_PERIOD_ONLY.getValue()).isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .enableAccrualActivityPosting(true) //
-                .chargeOffBehaviour(ZERO_INTEREST.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"))); //
-        PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals = createLoanProductIdempotent(
-                loanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OF_ACCRUAL,
-                responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals);
+        tasks.add(() -> {
+            // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation- Same as repayment
+            // Multi-disbursement that expects tranches
+            PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                    .name(DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES.getName())//
+                    .interestType(INTEREST_TYPE_FLAT)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches);
+            TestContext.INSTANCE.set(TestContextKey.LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES,
+                    responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches);
+        });
 
-        // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation- Same as repayment
-        // Multi-disbursement that expects tranches
-        PostLoanProductsRequest loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
-                .name(DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES.getName())//
-                .interestType(INTEREST_TYPE_FLAT)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
-                .allowPartialPeriodInterestCalculation(false)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
-                .recalculationRestFrequencyInterval(1)//
-                .installmentAmountInMultiplesOf(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches);
-        TestContext.INSTANCE.set(TestContextKey.LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES,
-                responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches);
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
+            // (LP2_ADV_PYMNT_360_30_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY)
+            final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(DefaultLoanProduct.LP2_ADV_PYMNT_360_30_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY.getName())//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")))
+                    .enableAccrualActivityPosting(true)//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            final PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_360_30_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity);
+        });
 
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal
-        // (LP2_ADV_PYMNT_360_30_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY)
-        final PostLoanProductsRequest loanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(DefaultLoanProduct.LP2_ADV_PYMNT_360_30_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY.getName())//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")))
-                .enableAccrualActivityPosting(true)//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        final PostLoanProductsResponse responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_360_30_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestAdvZeroInterestChargeOffBehaviourAccrualActivity);
+        tasks.add(() -> {
+            // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation- Actual
+            // Multi-disbursement that expects tranches
+            PostLoanProductsRequest loanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP1InterestFlat()//
+                    .name(DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES.getName())//
+                    .interestType(INTEREST_TYPE_FLAT)//
+                    .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
+                    .allowPartialPeriodInterestCalculation(false)//
+                    .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .installmentAmountInMultiplesOf(null)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(false)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches = createLoanProductIdempotent(
+                    loanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches);
+            TestContext.INSTANCE.set(TestContextKey.LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES,
+                    responseLoanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches);
+        });
 
-        // LP1 with 12% Flat interest, interest period: Daily, Interest recalculation- Actual
-        // Multi-disbursement that expects tranches
-        PostLoanProductsRequest loanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP1InterestFlat()//
-                .name(DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES.getName())//
-                .interestType(INTEREST_TYPE_FLAT)//
-                .interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
-                .allowPartialPeriodInterestCalculation(false)//
-                .recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyInterval(1)//
-                .installmentAmountInMultiplesOf(null)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(false)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches = createLoanProductIdempotent(
-                loanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches);
-        TestContext.INSTANCE.set(TestContextKey.LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES,
-                responseLoanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // chargeback - interest, fee, principal, penalty
+            String name151 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name151)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY"))//
+            ))//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // chargeback - interest, fee, principal, penalty
-        String name151 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name151)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY"))//
-                ))//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback);
+        tasks.add(() -> {
+            // LP2 + interest recalculation + advanced custom payment allocation + progressive loan schedule +
+            // horizontal
+            // (LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
+            String name152 = DefaultLoanProduct.LP2_ADV_PMT_ALLOC_ACTUAL_ACTUAL_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
 
-        // LP2 + interest recalculation + advanced custom payment allocation + progressive loan schedule + horizontal
-        // (LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL)
-        String name152 = DefaultLoanProduct.LP2_ADV_PMT_ALLOC_ACTUAL_ACTUAL_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL.getName();
+            PostLoanProductsRequest loanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name152)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .enableAccrualActivityPosting(true) //
+                    .daysInYearType(DaysInYearType.ACTUAL.value)//
+                    .daysInMonthType(DaysInMonthType.ACTUAL.value)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule = createLoanProductIdempotent(
+                    loanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_PAYMENT_ALLOCATION_ACTUAL_ACTUAL_PROGRESSIVE_LOAN_SCHEDULE,
+                    responseLoanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule);
+        });
 
-        PostLoanProductsRequest loanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name152)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .enableAccrualActivityPosting(true) //
-                .daysInYearType(DaysInYearType.ACTUAL.value)//
-                .daysInMonthType(DaysInMonthType.ACTUAL.value)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule = createLoanProductIdempotent(
-                loanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_PAYMENT_ALLOCATION_ACTUAL_ACTUAL_PROGRESSIVE_LOAN_SCHEDULE,
-                responseLoanProductsRequestAdvPaymentAllocationActualActualProgressiveLoanSchedule);
+        tasks.add(() -> {
+            // LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_PRINCIPAL_FIRST
+            // Same as LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL but with PRINCIPAL before INTEREST
+            // in payment allocation order
+            String name168 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_PRINCIPAL_FIRST.getName();
 
-        // LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_PRINCIPAL_FIRST
-        // Same as LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL but with PRINCIPAL before INTEREST
-        // in payment allocation order
-        String name168 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_PRINCIPAL_FIRST.getName();
+            PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
+                    .name(name168)//
+                    .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
+                    .enableAccrualActivityPosting(true) //
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            PostLoanProductsResponse responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_PRINCIPAL_FIRST,
+                    responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst);
+        });
 
-        PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2InterestDailyRecalculation()//
-                .name(name168)//
-                .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))//
-                .enableAccrualActivityPosting(true) //
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT",
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "REAMORTIZATION"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        PostLoanProductsResponse responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADVANCED_CUSTOM_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_PRINCIPAL_FIRST,
-                responseLoanProductsRequestAdvCustomPaymentAllocationProgressiveLoanSchedulePrincipalFirst);
+        tasks.add(() -> {
+            // LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_360_30_USD
+            // Similar to LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL but with 360/30 days and USD
+            // currency
+            String name169 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_360_30_USD.getName();
 
-        // LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_360_30_USD
-        // Similar to LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL but with 360/30 days and USD
-        // currency
-        String name169 = DefaultLoanProduct.LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_360_30_USD.getName();
+            PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiUSD()//
+                    .name(name169)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT", //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
+                                    LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("PENALTY", "FEE", "PRINCIPAL", "INTEREST"))//
+            ));//
+            PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD = createLoanProductIdempotent(
+                    loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_360_30_USD,
+                    responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD);
+        });
 
-        PostLoanProductsRequest loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiUSD()//
-                .name(name169)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT", //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.PAST_DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.DUE_INTEREST, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PENALTY, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_FEE, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_PRINCIPAL, //
-                                LoanProductPaymentAllocationRule.AllocationTypesEnum.IN_ADVANCE_INTEREST), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("PENALTY", "FEE", "PRINCIPAL", "INTEREST"))//
-                ));//
-        PostLoanProductsResponse responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD = createLoanProductIdempotent(
-                loanProductsRequestAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL_360_30_USD,
-                responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanScheduleHorizontalUSD);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement with full term tranche enabled
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_FULL_TERM_TRANCHE)
+            String name170 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_FULL_TERM_TRANCHE
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name170)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_FULL_TERM_TRANCHE,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement with full term tranche enabled
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_FULL_TERM_TRANCHE)
-        String name170 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_FULL_TERM_TRANCHE
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name170)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_FULL_TERM_TRANCHE,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTranche);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement with full term tranche enabled + Down Payment
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT)
+            final String name171 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name171)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .enableDownPayment(true)//
+                    .enableAutoRepaymentForDownPayment(false)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT,
+                    responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement with full term tranche enabled + Down Payment
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT)
-        final String name171 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name171)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .enableDownPayment(true)//
-                .enableAutoRepaymentForDownPayment(false)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT,
-                responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPayment);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement with full term tranche enabled + Down Payment auto enabled
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT_AUTO)
+            final String name172 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT_AUTO
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name172)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .enableDownPayment(true)//
+                    .enableAutoRepaymentForDownPayment(true)//
+                    .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT_AUTO,
+                    responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement with full term tranche enabled + Down Payment auto enabled
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT_AUTO)
-        final String name172 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT_AUTO
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name172)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .enableDownPayment(true)//
-                .enableAutoRepaymentForDownPayment(true)//
-                .disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DOWNPAYMENT_AUTO,
-                responseLoanProductsRequestLP2AdvPymntIntEmi36030IntRecalcDailyMultiDisbFullTermTrancheDownPaymentAuto);
+        tasks.add(() -> {
+            // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + interest recalculation
+            // +
+            // accrual activity posting
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF_ACCRUAL_ACTIVITY)
+            final String name173 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF_ACCRUAL_ACTIVITY
+                    .getName();
+            final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .maxTrancheCount(10)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .supportedInterestRefundTypes(supportedInterestRefundTypes).paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("INTEREST_REFUND", "NEXT_INSTALLMENT")))
+                    .name(name173)//
+                    .shortName(loanProductsRequestFactory.generateShortNameSafely())//
+                    .enableAccrualActivityPosting(true)//
+                    .allowApprovedDisbursedAmountsOverApplied(true)//
+                    .overAppliedCalculationType(OverAppliedCalculationType.FIXED_SIZE.value)//
+                    .overAppliedNumber(1000)//
+                    .enableInstallmentLevelDelinquency(true)//
+                    .interestRecognitionOnDisbursementDate(true)//
+                    .maxTrancheCount(500)//
+                    .chargeOffBehaviour("ZERO_INTEREST");//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF_ACCRUAL_ACTIVITY,
+                    responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity);
+        });
 
-        // LP2 + zero-interest chargeOff behaviour + progressive loan schedule + horizontal + interest recalculation +
-        // accrual activity posting
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF_ACCRUAL_ACTIVITY)
-        final String name173 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF_ACCRUAL_ACTIVITY
-                .getName();
-        final PostLoanProductsRequest loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity = loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull
-                .name(name173)//
-                .shortName(loanProductsRequestFactory.generateShortNameSafely())//
-                .enableAccrualActivityPosting(true)//
-                .allowApprovedDisbursedAmountsOverApplied(true)//
-                .overAppliedCalculationType(OverAppliedCalculationType.FIXED_SIZE.value)//
-                .overAppliedNumber(1000)//
-                .enableInstallmentLevelDelinquency(true)//
-                .interestRecognitionOnDisbursementDate(true)//
-                .maxTrancheCount(500)//
-                .chargeOffBehaviour("ZERO_INTEREST");//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF_ACCRUAL_ACTIVITY,
-                responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOffAccrualActivity);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement with full term tranche enabled
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DEFERRED_INCOME)
+            String name174 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DEFERRED_INCOME
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2EmiDeferredIncome()//
+                    .name(name174)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DEFERRED_INCOME,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement with full term tranche enabled
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        // (LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DEFERRED_INCOME)
-        String name174 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DEFERRED_INCOME
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2EmiDeferredIncome()//
-                .name(name174)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_DEFERRED_INCOME,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheDeferredIncome);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement with full term tranche enabled + chargeback allocation rules
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            String name175 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_CHARGEBACK
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name175)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .creditAllocation(List.of(//
+                            createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY")))) //
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_CHARGEBACK,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement with full term tranche enabled + chargeback allocation rules
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        String name175 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_CHARGEBACK
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name175)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .creditAllocation(List.of(//
-                        createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY")))) //
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_CHARGEBACK,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheChargeback);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement with full term tranche enabled + zero interest charge off
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            String name176 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ZERO_INT_CHARGE_OFF
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name176)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .chargeOffBehaviour(ZERO_INTEREST.value)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ZERO_CHARGE_OFF,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement with full term tranche enabled + zero interest charge off
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        String name176 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ZERO_INT_CHARGE_OFF
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name176)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .chargeOffBehaviour(ZERO_INTEREST.value)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ZERO_CHARGE_OFF,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheZeroIntChargeOff);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
+            // multidisbursement with full term tranche enabled + accelerate maturity charge-off
+            // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
+            String name177 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ACCELERATE_MATURITY
+                    .getName();
+            PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name177)//
+                    .daysInYearType(DaysInYearType.DAYS360.value)//
+                    .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
+                    .chargeOffBehaviour(ACCELERATE_MATURITY.value)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .maxTrancheCount(10)//
+                    .outstandingLoanBalance(10000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity = createLoanProductIdempotent(
+                    loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ACCELERATE_MATURITY,
+                    responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
-        // multidisbursement with full term tranche enabled + accelerate maturity charge-off
-        // Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
-        String name177 = DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ACCELERATE_MATURITY
-                .getName();
-        PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name177)//
-                .daysInYearType(DaysInYearType.DAYS360.value)//
-                .daysInMonthType(DaysInMonthType.DAYS30.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
-                .chargeOffBehaviour(ACCELERATE_MATURITY.value)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .maxTrancheCount(10)//
-                .outstandingLoanBalance(10000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity = createLoanProductIdempotent(
-                loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_FULL_TERM_TRANCHE_ACCELERATE_MATURITY,
-                responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseFullTermTrancheAccelerateMaturity);
+        tasks.add(() -> {
+            // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
+            // + interest recalculation, buy down fees enabled, FEE income type
+            final String name178 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_FEE_INCOME.getName();
+            final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2BuyDownFeesFeeIncome()//
+                    .name(name178)//
+                    .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
+                    .loanScheduleType("PROGRESSIVE") //
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
+                            createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
+                            createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
+            final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome = createLoanProductIdempotent(
+                    loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome);
+            TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_FEE_INCOME,
+                    responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome);
+        });
 
-        // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
-        // + interest recalculation, buy down fees enabled, FEE income type
-        final String name178 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES_FEE_INCOME.getName();
-        final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2BuyDownFeesFeeIncome()//
-                .name(name178)//
-                .transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
-                .loanScheduleType("PROGRESSIVE") //
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
-                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
-                        createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")));//
-        final PostLoanProductsResponse responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome = createLoanProductIdempotent(
-                loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_FEE_INCOME,
-                responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesFeeIncome);
+        tasks.add(() -> {
+            // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + vertical
+            // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL)
+            String name179 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL_INTEREST_RECALC.getName();
+            PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc = loanProductsRequestFactory
+                    .defaultLoanProductsRequestLP2Emi()//
+                    .name(name179)//
+                    .loanScheduleProcessingType("VERTICAL").daysInYearType(DaysInYearType.ACTUAL.value)//
+                    .daysInMonthType(DaysInMonthType.ACTUAL.value)//
+                    .isInterestRecalculationEnabled(true)//
+                    .preClosureInterestCalculationStrategy(1)//
+                    .rescheduleStrategyMethod(4)//
+                    .interestRecalculationCompoundingMethod(0)//
+                    .recalculationRestFrequencyType(2)//
+                    .recalculationRestFrequencyInterval(1)//
+                    .paymentAllocation(List.of(//
+                            createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
+                            createPaymentAllocation("REPAYMENT", "NEXT_INSTALLMENT"))) //
+                    .chargeOffBehaviour(ACCELERATE_MATURITY.value)//
+                    .multiDisburseLoan(true)//
+                    .disallowExpectedDisbursements(true)//
+                    .allowFullTermForTranche(true)//
+                    .maxTrancheCount(10)//
+                    .maxPrincipal(25000000.0)//
+                    .outstandingLoanBalance(25000000.0);//
+            PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc = createLoanProductIdempotent(
+                    loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc);
+            TestContext.INSTANCE.set(
+                    TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL_INTEREST_RECALC,
+                    responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc);
+        });
 
-        // LP2 with Down-payment + advanced payment allocation + progressive loan schedule + vertical
-        // (LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL)
-        String name179 = DefaultLoanProduct.LP2_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL_INTEREST_RECALC.getName();
-        PostLoanProductsRequest loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc = loanProductsRequestFactory
-                .defaultLoanProductsRequestLP2Emi()//
-                .name(name179)//
-                .loanScheduleProcessingType("VERTICAL").daysInYearType(DaysInYearType.ACTUAL.value)//
-                .daysInMonthType(DaysInMonthType.ACTUAL.value)//
-                .isInterestRecalculationEnabled(true)//
-                .preClosureInterestCalculationStrategy(1)//
-                .rescheduleStrategyMethod(4)//
-                .interestRecalculationCompoundingMethod(0)//
-                .recalculationRestFrequencyType(2)//
-                .recalculationRestFrequencyInterval(1)//
-                .paymentAllocation(List.of(//
-                        createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
-                        createPaymentAllocation("REPAYMENT", "NEXT_INSTALLMENT"))) //
-                .chargeOffBehaviour(ACCELERATE_MATURITY.value)//
-                .multiDisburseLoan(true)//
-                .disallowExpectedDisbursements(true)//
-                .allowFullTermForTranche(true)//
-                .maxTrancheCount(10)//
-                .maxPrincipal(25000000.0)//
-                .outstandingLoanBalance(25000000.0);//
-        PostLoanProductsResponse responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc = createLoanProductIdempotent(
-                loanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL_INTEREST_RECALC,
-                responseLoanProductsRequestDownPaymentAdvPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc);
+        ParallelExecutionHelper.runInParallel(tasks);
     }
 
     public static AdvancedPaymentData createPaymentAllocation(String transactionType, String futureInstallmentAllocationRule,
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/PaymentTypeGlobalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/PaymentTypeGlobalInitializerStep.java
index 3946d38..e9d78da 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/PaymentTypeGlobalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/PaymentTypeGlobalInitializerStep.java
@@ -28,6 +28,7 @@
 import org.apache.fineract.client.feign.FineractFeignClient;
 import org.apache.fineract.client.models.PaymentTypeCreateRequest;
 import org.apache.fineract.client.models.PaymentTypeData;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -70,14 +71,15 @@
         paymentTypeNames.add(PAYMENT_TYPE_REPAYMENT_ADJUSTMENT_CHARGEBACK);
         paymentTypeNames.add(PAYMENT_TYPE_REPAYMENT_ADJUSTMENT_REFUND);
 
-        paymentTypeNames.forEach(paymentTypeName -> {
+        ParallelExecutionHelper.runInParallel(paymentTypeNames, paymentTypeName -> {
+            int index = paymentTypeNames.indexOf(paymentTypeName);
             var paymentTypeExists = paymentTypes.stream().anyMatch(pt -> paymentTypeName.equals(pt.getName()));
 
             if (paymentTypeExists) {
                 return;
             }
 
-            var position = Integer.valueOf(paymentTypeNames.indexOf(paymentTypeName) + 2).longValue();
+            var position = Integer.valueOf(index + 2).longValue();
             var postPaymentTypesRequest = new PaymentTypeCreateRequest().name(paymentTypeName).description(paymentTypeName)
                     .isCashPayment(false).position(position);
 
diff --git a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
index ff11296..9555578 100644
--- a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
+++ b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
@@ -32,6 +32,7 @@
 import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsResponse;
 import org.apache.fineract.test.data.workingcapitalproduct.DefaultWorkingCapitalLoanProduct;
 import org.apache.fineract.test.factory.WorkingCapitalRequestFactory;
+import org.apache.fineract.test.helper.ParallelExecutionHelper;
 import org.apache.fineract.test.support.TestContext;
 import org.apache.fineract.test.support.TestContextKey;
 import org.springframework.stereotype.Component;
@@ -46,109 +47,59 @@
 
     @Override
     public void initialize() throws Exception {
-
-        final String workingCapitalProductDefaultName = DefaultWorkingCapitalLoanProduct.WCLP.getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest() //
-                .name(workingCapitalProductDefaultName); //
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPL = createWorkingCapitalLoanProductIdempotent(defaultWCPLRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP, responseDefaultWCPL);
-
-        final String workingCapitalProductDiscountDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_DISCOUNT.getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLPDiscountRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest() //
-                .name(workingCapitalProductDiscountDefaultName) //
-                .discount(new BigDecimal(50)); //
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLDiscount = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLPDiscountRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DISCOUNT,
-                responseDefaultWCPLDiscount);
-
-        final String workingCapitalProductDisallowOverridesDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_DISALLOW_ATTRIBUTES_OVERRIDE
-                .getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLDisallowOverridesRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductRequest() //
-                .name(workingCapitalProductDisallowOverridesDefaultName); //
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLDisallowOverrides = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLDisallowOverridesRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DISALLOW_OVERRIDES,
-                responseDefaultWCPLDisallowOverrides);
-
-        final String workingCapitalProductDiscountDisallowOverridesDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_DISCOUNT_DISALLOW_ATTRIBUTES_OVERRIDE
-                .getName();
         PostAllowAttributeOverrides allowAttributeOverridesDisabled = new PostAllowAttributeOverrides()
                 .delinquencyBucketClassification(false).discountDefault(false).periodPaymentFrequencyType(false)
                 .periodPaymentFrequency(false).breach(false);
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLDiscountDisallowOverridesRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductRequest() //
-                .name(workingCapitalProductDiscountDisallowOverridesDefaultName) //
-                .discount(new BigDecimal(50)) //
-                .allowAttributeOverrides(allowAttributeOverridesDisabled); //
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLDiscountDisallowOverrides = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLDiscountDisallowOverridesRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DISCOUNT_DISALLOW_OVERRIDES,
-                responseDefaultWCPLDiscountDisallowOverrides);
 
-        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);
-
-        final String workingCapitalProductDelinquencyRescheduleDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_DELINQUENCY_RESCHEDULE
-                .getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLDelinquencyRescheduleRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest() //
-                .name(workingCapitalProductDelinquencyRescheduleDefaultName);//
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLDelinquencyReschedules = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLDelinquencyRescheduleRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DELINQUENCY_RESCHEDULE,
-                responseDefaultWCPLDelinquencyReschedules);
-
-        final String workingCapitalProductBreachDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_BREACH.getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLBreachRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductBreachRequest() //
-                .name(workingCapitalProductBreachDefaultName);//
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLBreach = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLBreachRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH,
-                responseDefaultWCPLBreach);
-
-        final String workingCapitalProductBreachNearBreachDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_BREACH_NEAR_BREACH.getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLBreachNearBreachRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductBreachNearBreachRequest() //
-                .name(workingCapitalProductBreachNearBreachDefaultName);//
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLBreachNearBreach = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLBreachNearBreachRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH_NEAR_BREACH,
-                responseDefaultWCPLBreachNearBreach);
-
-        final String workingCapitalProductBreachDisallowOverridesDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE
-                .getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLBreachDisallowOverridesRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductBreachRequest() //
-                .allowAttributeOverrides(allowAttributeOverridesDisabled) //
-                .name(workingCapitalProductBreachDisallowOverridesDefaultName);//
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLBreachDisallowOverrides = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLBreachDisallowOverridesRequest);
-        TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH_DISALLOW_OVERRIDES,
-                responseDefaultWCPLBreachDisallowOverrides);
-
-        final String workingCapitalProductBreachNearBreachDisallowOverridesDefaultName = DefaultWorkingCapitalLoanProduct.WCLP_BREACH_NEAR_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE
-                .getName();
-        final PostWorkingCapitalLoanProductsRequest defaultWCPLBreachNearBreachDisallowOverridesRequest = workingCapitalRequestFactory
-                .defaultWorkingCapitalLoanProductBreachNearBreachRequest() //
-                .allowAttributeOverrides(allowAttributeOverridesDisabled) //
-                .name(workingCapitalProductBreachNearBreachDisallowOverridesDefaultName);//
-        final PostWorkingCapitalLoanProductsResponse responseDefaultWCPLBreachNearBreachDisallowOverrides = createWorkingCapitalLoanProductIdempotent(
-                defaultWCPLBreachNearBreachDisallowOverridesRequest);
-        TestContext.INSTANCE.set(
-                TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH_NEAR_BREACH_DISALLOW_OVERRIDES,
-                responseDefaultWCPLBreachNearBreachDisallowOverrides);
+        List<Runnable> items = List.of(
+                () -> TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP,
+                        createWorkingCapitalLoanProductIdempotent(
+                                workingCapitalRequestFactory.defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest()
+                                        .name(DefaultWorkingCapitalLoanProduct.WCLP.getName()))),
+                () -> TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DISCOUNT,
+                        createWorkingCapitalLoanProductIdempotent(
+                                workingCapitalRequestFactory.defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest()
+                                        .name(DefaultWorkingCapitalLoanProduct.WCLP_DISCOUNT.getName()).discount(new BigDecimal(50)))),
+                () -> TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DISALLOW_OVERRIDES,
+                        createWorkingCapitalLoanProductIdempotent(workingCapitalRequestFactory.defaultWorkingCapitalLoanProductRequest()
+                                .name(DefaultWorkingCapitalLoanProduct.WCLP_DISALLOW_ATTRIBUTES_OVERRIDE.getName()))),
+                () -> TestContext.INSTANCE.set(
+                        TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DISCOUNT_DISALLOW_OVERRIDES,
+                        createWorkingCapitalLoanProductIdempotent(workingCapitalRequestFactory.defaultWorkingCapitalLoanProductRequest()
+                                .name(DefaultWorkingCapitalLoanProduct.WCLP_DISCOUNT_DISALLOW_ATTRIBUTES_OVERRIDE.getName())
+                                .discount(new BigDecimal(50)).allowAttributeOverrides(allowAttributeOverridesDisabled))),
+                () -> {
+                    PostWorkingCapitalLoanProductsRequest req = workingCapitalRequestFactory.defaultWorkingCapitalLoanProductRequest()
+                            .name(DefaultWorkingCapitalLoanProduct.WCLP_FOR_UPDATE.getName());
+                    PostWorkingCapitalLoanProductsResponse response = createWorkingCapitalLoanProductIdempotent(req);
+                    TestContext.GLOBAL.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST_FOR_UPDATE_WCLP, req);
+                    TestContext.GLOBAL.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP, response);
+                },
+                () -> TestContext.INSTANCE.set(
+                        TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_DELINQUENCY_RESCHEDULE,
+                        createWorkingCapitalLoanProductIdempotent(
+                                workingCapitalRequestFactory.defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest()
+                                        .name(DefaultWorkingCapitalLoanProduct.WCLP_DELINQUENCY_RESCHEDULE.getName()))),
+                () -> TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH,
+                        createWorkingCapitalLoanProductIdempotent(
+                                workingCapitalRequestFactory.defaultWorkingCapitalLoanProductBreachRequest()
+                                        .name(DefaultWorkingCapitalLoanProduct.WCLP_BREACH.getName()))),
+                () -> TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH_NEAR_BREACH,
+                        createWorkingCapitalLoanProductIdempotent(
+                                workingCapitalRequestFactory.defaultWorkingCapitalLoanProductBreachNearBreachRequest()
+                                        .name(DefaultWorkingCapitalLoanProduct.WCLP_BREACH_NEAR_BREACH.getName()))),
+                () -> TestContext.INSTANCE.set(
+                        TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH_DISALLOW_OVERRIDES,
+                        createWorkingCapitalLoanProductIdempotent(workingCapitalRequestFactory
+                                .defaultWorkingCapitalLoanProductBreachRequest().allowAttributeOverrides(allowAttributeOverridesDisabled)
+                                .name(DefaultWorkingCapitalLoanProduct.WCLP_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE.getName()))),
+                () -> TestContext.INSTANCE.set(
+                        TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP_BREACH_NEAR_BREACH_DISALLOW_OVERRIDES,
+                        createWorkingCapitalLoanProductIdempotent(workingCapitalRequestFactory
+                                .defaultWorkingCapitalLoanProductBreachNearBreachRequest()
+                                .allowAttributeOverrides(allowAttributeOverridesDisabled)
+                                .name(DefaultWorkingCapitalLoanProduct.WCLP_BREACH_NEAR_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE.getName()))));
+        ParallelExecutionHelper.runInParallel(items);
     }
 
     private PostWorkingCapitalLoanProductsResponse createWorkingCapitalLoanProductIdempotent(
diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part1.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part1.feature
index 6e5bd97..36b64a7 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part1.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part1.feature
@@ -277,9 +277,9 @@
     When Admin sets the business date to "16 December 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 3       | RANGE_30 | 500.00 |
-      | 4       | RANGE_60 | 500.00 |
+      | Range    | Amount |
+      | RANGE_30 | 500.00 |
+      | RANGE_60 | 500.00 |
     Then Installment level delinquency event has correct data
 
   @TestRailId:C2980
@@ -294,17 +294,17 @@
     When Admin sets the business date to "16 November 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 250.00 |
-      | 3       | RANGE_30 | 500.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 250.00 |
+      | RANGE_30 | 500.00 |
     Then Installment level delinquency event has correct data
     When Admin sets the business date to "16 December 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 3       | RANGE_30 | 500.00 |
-      | 4       | RANGE_60 | 500.00 |
+      | Range    | Amount |
+      | RANGE_30 | 500.00 |
+      | RANGE_60 | 500.00 |
     Then Installment level delinquency event has correct data
 
   @TestRailId:C2981
@@ -319,9 +319,9 @@
     When Admin sets the business date to "16 December 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 3       | RANGE_30 | 500.00 |
-      | 4       | RANGE_60 | 500.00 |
+      | Range    | Amount |
+      | RANGE_30 | 500.00 |
+      | RANGE_60 | 500.00 |
     Then Installment level delinquency event has correct data
     When Admin sets the business date to "17 December 2023"
     And Customer makes "AUTOPAY" repayment on "17 December 2023" with 1000 EUR transaction amount
@@ -341,14 +341,14 @@
     When Admin runs inline COB job for Loan
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 500.00 |
+      | Range   | Amount |
+      | RANGE_3 | 500.00 |
     When Admin sets the business date to "26 October 2023"
     And Customer makes "AUTOPAY" repayment on "26 October 2023" with 250 EUR transaction amount
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
 
   @TestRailId:C2983
   Scenario: Verify Installment level loan delinquency - loan goes out from delinquency by Goodwill credit transaction
@@ -362,9 +362,9 @@
     When Admin sets the business date to "16 December 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 3       | RANGE_30 | 500.00 |
-      | 4       | RANGE_60 | 500.00 |
+      | Range    | Amount |
+      | RANGE_30 | 500.00 |
+      | RANGE_60 | 500.00 |
     Then Installment level delinquency event has correct data
     When Admin sets the business date to "17 December 2023"
     When Customer makes "GOODWILL_CREDIT" transaction with "AUTOPAY" payment type on "17 December 2023" with 1000 EUR transaction amount and system-generated Idempotency key
@@ -384,14 +384,14 @@
     When Admin runs inline COB job for Loan
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 500.00 |
+      | Range   | Amount |
+      | RANGE_3 | 500.00 |
     When Admin sets the business date to "26 October 2023"
     When Customer makes "GOODWILL_CREDIT" transaction with "AUTOPAY" payment type on "26 October 2023" with 250 EUR transaction amount and system-generated Idempotency key
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
 
   @TestRailId:C2985
   Scenario: Verify Installment level loan delinquency - loan with charges goes into delinquency bucket
@@ -408,9 +408,9 @@
     When Admin sets the business date to "16 December 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 3       | RANGE_30 | 520.00 |
-      | 4       | RANGE_60 | 520.00 |
+      | Range    | Amount |
+      | RANGE_30 | 520.00 |
+      | RANGE_60 | 520.00 |
     Then Installment level delinquency event has correct data
 
   @TestRailId:C2987
@@ -428,10 +428,10 @@
     When Admin sets the business date to "16 November 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 250.00 |
-      | 3       | RANGE_30 | 500.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 250.00 |
+      | RANGE_30 | 500.00 |
     Then Installment level delinquency event has correct data
     When Admin sets the business date to "17 November 2023"
     When Admin initiate a DELINQUENCY PAUSE with startDate: "17 November 2023" and endDate: "30 November 2023"
@@ -441,27 +441,27 @@
     When Admin runs inline COB job for Loan
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 250.00 |
-      | 3       | RANGE_30 | 500.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 250.00 |
+      | RANGE_30 | 500.00 |
     When Admin sets the business date to "30 November 2023"
     When Admin runs inline COB job for Loan
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 250.00 |
-      | 3       | RANGE_30 | 500.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 250.00 |
+      | RANGE_30 | 500.00 |
     When Admin sets the business date to "20 December 2023"
     When Admin runs inline COB job for Loan
     When Admin sets the business date to "01 January 2024"
     When Admin runs inline COB job for Loan
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 3       | RANGE_30 | 500.00 |
-      | 4       | RANGE_60 | 500.00 |
+      | Range    | Amount |
+      | RANGE_30 | 500.00 |
+      | RANGE_60 | 500.00 |
 
   @TestRailId:C2988
   Scenario: Verify Installment level loan delinquency - loan goes into delinquency pause then will be resumed
@@ -478,10 +478,10 @@
     When Admin sets the business date to "16 November 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 250.00 |
-      | 3       | RANGE_30 | 500.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 250.00 |
+      | RANGE_30 | 500.00 |
     Then Installment level delinquency event has correct data
     When Admin sets the business date to "17 November 2023"
     When Admin initiate a DELINQUENCY PAUSE with startDate: "17 November 2023" and endDate: "30 December 2023"
@@ -491,10 +491,10 @@
     When Admin runs inline COB job for Loan
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 250.00 |
-      | 3       | RANGE_30 | 500.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 250.00 |
+      | RANGE_30 | 500.00 |
     When Admin sets the business date to "01 December 2023"
     When Admin initiate a DELINQUENCY RESUME with startDate: "01 December 2023"
     Then Delinquency-actions have the following data:
@@ -504,10 +504,10 @@
     When Admin runs inline COB job for Loan
     Then Installment level delinquency event has correct data
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 250.00 |
-      | 3       | RANGE_30 | 500.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 250.00 |
+      | RANGE_30 | 500.00 |
 
   @TestRailId:C2990
   Scenario: Verify that a non-super user with CREATE_DELINQUENCY_ACTION permission can initiate a DELINQUENCY PAUSE
@@ -569,8 +569,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 1              | 4           |
 #   --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     When Admin sets the business date to "06 October 2023"
     When Admin initiate a DELINQUENCY PAUSE with startDate: "06 October 2023" and endDate: "30 October 2023"
     Then Loan Delinquency pause periods has the following data:
@@ -585,8 +585,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 2              | 5           |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     When Admin sets the business date to "30 October 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following LOAN level delinquency data:
@@ -597,8 +597,8 @@
       | true   | 06 October 2023  | 30 October 2023 |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     When Admin sets the business date to "31 October 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following LOAN level delinquency data:
@@ -609,9 +609,9 @@
       | false  | 06 October 2023  | 30 October 2023 |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 1       | RANGE_1 | 250.00 |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_1 | 250.00 |
+      | RANGE_3 | 250.00 |
 
   @TestRailId:C3000
   Scenario: Verify Loan delinquency pause E2E - PAUSE period with RESUME
@@ -637,8 +637,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 250.0            | 04 October 2023 | 11             | 14          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
 #    --- Delinquency resume ---
     When Admin sets the business date to "25 October 2023"
@@ -659,8 +659,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 500.0            | 04 October 2023 | 12             | 25          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
 
   @TestRailId:C3001
@@ -689,8 +689,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 250.0            | 04 October 2023 | 11             | 15          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
 #    --- Delinquency resume ---
     When Admin sets the business date to "25 October 2023"
@@ -711,8 +711,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 500.0            | 04 October 2023 | 12             | 25          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
 #   --- Delinquency runs ---
     When Admin sets the business date to "13 November 2023"
@@ -728,9 +728,9 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 750.0            | 04 October 2023 | 30             | 43          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 2       | RANGE_3  | 500.00 |
-      | 3       | RANGE_30 | 250.00 |
+      | Range    | Amount |
+      | RANGE_3  | 500.00 |
+      | RANGE_30 | 250.00 |
 #    --- Second delinquency pause ---
     When Admin sets the business date to "14 November 2023"
     When Admin initiate a DELINQUENCY PAUSE with startDate: "14 November 2023" and endDate: "30 November 2023"
@@ -748,9 +748,9 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 750.0            | 04 October 2023 | 31             | 44          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 2       | RANGE_3  | 500.00 |
-      | 3       | RANGE_30 | 250.00 |
+      | Range    | Amount |
+      | RANGE_3  | 500.00 |
+      | RANGE_30 | 250.00 |
     Then Installment level delinquency event has correct data
 #    --- Second delinquency ends ---
     When Admin sets the business date to "30 November 2023"
@@ -768,9 +768,9 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3       | 1000.0           | 04 October 2023 | 31             | 60          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 2       | RANGE_3  | 500.00 |
-      | 3       | RANGE_30 | 250.00 |
+      | Range    | Amount |
+      | RANGE_3  | 500.00 |
+      | RANGE_30 | 250.00 |
 #    --- Delinquency runs again ---
     When Admin sets the business date to "01 December 2023"
     When Admin runs inline COB job for Loan
@@ -787,10 +787,10 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_30       | 1000.0           | 04 October 2023 | 32             | 61          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 250.00 |
-      | 2       | RANGE_3  | 500.00 |
-      | 3       | RANGE_30 | 250.00 |
+      | Range    | Amount |
+      | RANGE_1  | 250.00 |
+      | RANGE_3  | 500.00 |
+      | RANGE_30 | 250.00 |
     Then Installment level delinquency event has correct data
 
   @TestRailId:C3002
@@ -818,8 +818,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 2              | 5           |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
 #    --- Full repayment for late/due date installments ---
     When Admin sets the business date to "16 October 2023"
@@ -834,8 +834,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 2              | 15          |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     And Customer makes "AUTOPAY" repayment on "16 October 2023" with 500 EUR transaction amount
     When Admin runs inline COB job for Loan
     Then Loan Delinquency pause periods has the following data:
@@ -874,8 +874,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 2              | 5           |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
 #    --- Full repayment for late/due date installments ---
     When Admin sets the business date to "16 October 2023"
@@ -890,8 +890,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 2              | 15          |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     And Customer makes "AUTOPAY" repayment on "16 October 2023" with 150 EUR transaction amount
     When Admin runs inline COB job for Loan
     Then Loan Delinquency pause periods has the following data:
@@ -905,8 +905,8 @@
       | RANGE_1        | 100.0            | 04 October 2023 | 2              | 15          |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 100.00 |
+      | Range   | Amount |
+      | RANGE_3 | 100.00 |
 
   @TestRailId:C3004
   Scenario: Verify Loan delinquency pause E2E - full repayment (only late) during PAUSE period then RESUME
@@ -933,8 +933,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 2              | 5           |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
 #    --- Full repayment for late/due date installments ---
     When Admin sets the business date to "16 October 2023"
@@ -949,8 +949,8 @@
       | RANGE_1        | 250.0            | 04 October 2023 | 2              | 15          |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     And Customer makes "AUTOPAY" repayment on "16 October 2023" with 250 EUR transaction amount
     When Admin runs inline COB job for Loan
     Then Loan Delinquency pause periods has the following data:
@@ -997,8 +997,8 @@
       | RANGE_3        | 500.0            | 19 October 2023 | 18             | 30          |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 500.00 |
+      | Range   | Amount |
+      | RANGE_3 | 500.00 |
     Then Installment level delinquency event has correct data
 
   @TestRailId:C3013
@@ -1052,8 +1052,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 500.0            | 04 October 2023 | 21             | 29          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 500.00 |
+      | Range   | Amount |
+      | RANGE_3 | 500.00 |
     When Admin sets the business date to "31 October 2023"
     Then Loan Delinquency pause periods has the following data:
       | active | pausePeriodStart | pausePeriodEnd  |
@@ -1063,8 +1063,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 500.0            | 04 October 2023 | 22             | 30          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 500.00 |
+      | Range   | Amount |
+      | RANGE_3 | 500.00 |
 
   @TestRailId:C3014
   Scenario: Verify that creating a loan with Advanced payment allocation with product no Advanced payment allocation set results an error
@@ -1089,8 +1089,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 500.0            | 04 October 2023 | 21             | 24          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 500.00 |
+      | Range   | Amount |
+      | RANGE_3 | 500.00 |
     When Admin sets the business date to "27 October 2023"
 #    event checks included in next steps
     When Admin initiate a DELINQUENCY PAUSE with startDate: "25 October 2023" and endDate: "15 November 2023"
@@ -1106,8 +1106,8 @@
       | classification | delinquentAmount | delinquentDate  | delinquentDays | pastDueDays |
       | RANGE_3        | 500.0            | 04 October 2023 | 21             | 26          |
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 500.00 |
+      | Range   | Amount |
+      | RANGE_3 | 500.00 |
 
   @TestRailId:C3016
   Scenario: Verify that for pause period calculations business date is being used instead of COB date
@@ -1154,8 +1154,8 @@
       | RANGE_1        | 250.0            | 19 October 2023 | 1              | 13          |
 #    --- Grace period applied only on Loan level, not on installment level ---
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range   | Amount |
-      | 2       | RANGE_3 | 250.00 |
+      | Range   | Amount |
+      | RANGE_3 | 250.00 |
     Then Installment level delinquency event has correct data
     Then Loan Delinquency pause periods has the following data:
       | active | pausePeriodStart | pausePeriodEnd  |
@@ -1315,9 +1315,9 @@
     When Admin sets the business date to "16 December 2023"
     When Admin runs inline COB job for Loan
     Then Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 3       | RANGE_30 | 500.00 |
-      | 4       | RANGE_60 | 500.00 |
+      | Range    | Amount |
+      | RANGE_30 | 500.00 |
+      | RANGE_60 | 500.00 |
     Then Installment level delinquency event has correct data
 
   @TestRailId:C3930
diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part2.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part2.feature
index 399f02e..e0ae169 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part2.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency-Part2.feature
@@ -407,11 +407,11 @@
       | classification | delinquentAmount | delinquentDate | delinquentDays | pastDueDays |
       | RANGE_60       | 875.0            | 31 May 2025    | 90             | 156         |
     And Loan has the following INSTALLMENT level delinquency data:
-      | rangeId | Range    | Amount |
-      | 1       | RANGE_1  | 125.00 |
-      | 3       | RANGE_30 | 125.00 |
-      | 4       | RANGE_60 | 375.00 |
-      | 5       | RANGE_90 | 250.00 |
+      | Range    | Amount |
+      | RANGE_1  | 125.00 |
+      | RANGE_30 | 125.00 |
+      | RANGE_60 | 375.00 |
+      | RANGE_90 | 250.00 |
 
   @TestRailId:C4140
   Scenario: Verify that loan delinquent days are correct when graceOnArrearsAgeing is set on loan product level (value=3)
diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanReschedule.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanReschedule.feature
index 3cf3825..f03e3f2 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/LoanReschedule.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanReschedule.feature
@@ -1507,7 +1507,7 @@
       | 01 January 2025  | Disbursement     | 100.0  | 0.0       | 0.0      | 0.0  | 0.0       | 100.0        | false    | false    |
     And Loan Reschedule tab has the following data:
       | From Date        | Reason | Status   |
-      | 01 February 2025 | None   | Approved |
+      | 01 February 2025 | Test   | Approved |
   #    --- second interest rate change ---
     When Admin creates and approves Loan reschedule with the following data:
       | rescheduleFromDate | submittedOnDate  | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
@@ -1529,8 +1529,8 @@
       | 01 January 2025  | Disbursement     | 100.0  | 0.0       | 0.0      | 0.0  | 0.0       | 100.0        | false    | false    |
     And Loan Reschedule tab has the following data:
       | From Date        | Reason | Status   |
-      | 01 February 2025 | None   | Approved |
-      | 01 February 2025 | None   | Approved |
+      | 01 February 2025 | Test   | Approved |
+      | 01 February 2025 | Test   | Approved |
 
   @TestRailId:C4575
   Scenario: Verify multiple interest rate changes on same day, UC2: on due date after repayment
@@ -1581,7 +1581,7 @@
       | 01 February 2025 | Repayment        | 17.16  | 16.34     | 0.82     | 0.0  | 0.0       | 83.66        | false    | true     |
     And Loan Reschedule tab has the following data:
       | From Date        | Reason | Status   |
-      | 01 February 2025 | None   | Approved |
+      | 01 February 2025 | Test   | Approved |
   #    --- second interest rate change ---
     When Admin creates and approves Loan reschedule with the following data:
       | rescheduleFromDate | submittedOnDate  | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
@@ -1604,8 +1604,8 @@
       | 01 February 2025 | Repayment        | 17.16  | 16.35     | 0.81     | 0.0  | 0.0       | 83.65        | false    | true    |
     And Loan Reschedule tab has the following data:
       | From Date        | Reason | Status   |
-      | 01 February 2025 | None   | Approved |
-      | 01 February 2025 | None   | Approved |
+      | 01 February 2025 | Test   | Approved |
+      | 01 February 2025 | Test   | Approved |
 
   @TestRailId:C4576
   Scenario: Verify multiple interest rate changes on same day, UC3: on midterm date
@@ -1653,7 +1653,7 @@
       | 01 January 2025  | Disbursement     | 100.0  | 0.0       | 0.0      | 0.0  | 0.0       | 100.0        | false    | false    |
     And Loan Reschedule tab has the following data:
       | From Date       | Reason | Status   |
-      | 15 January 2025 | None   | Approved |
+      | 15 January 2025 | Test   | Approved |
   #    --- second interest rate change ---
     When Admin creates and approves Loan reschedule with the following data:
       | rescheduleFromDate | submittedOnDate  | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
@@ -1675,8 +1675,8 @@
       | 01 January 2025  | Disbursement     | 100.0  | 0.0       | 0.0      | 0.0  | 0.0       | 100.0        | false    | false    |
     And Loan Reschedule tab has the following data:
       | From Date       | Reason | Status   |
-      | 15 January 2025 | None   | Approved |
-      | 15 January 2025 | None   | Approved |
+      | 15 January 2025 | Test   | Approved |
+      | 15 January 2025 | Test   | Approved |
 
   @TestRailId:C4577
   Scenario: Verify multiple interest rate changes on same day, UC4: on due date with third change
@@ -1724,7 +1724,7 @@
       | 01 January 2025  | Disbursement     | 100.0  | 0.0       | 0.0      | 0.0  | 0.0       | 100.0        | false    | false    |
     And Loan Reschedule tab has the following data:
       | From Date        | Reason | Status   |
-      | 01 February 2025 | None   | Approved |
+      | 01 February 2025 | Test   | Approved |
 #    --- second interest rate change ---
     When Admin creates and approves Loan reschedule with the following data:
       | rescheduleFromDate | submittedOnDate  | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
@@ -1746,8 +1746,8 @@
       | 01 January 2025  | Disbursement     | 100.0  | 0.0       | 0.0      | 0.0  | 0.0       | 100.0        | false    | false    |
     And Loan Reschedule tab has the following data:
       | From Date        | Reason | Status   |
-      | 01 February 2025 | None   | Approved |
-      | 01 February 2025 | None   | Approved |
+      | 01 February 2025 | Test   | Approved |
+      | 01 February 2025 | Test   | Approved |
 #    --- third interest rate change ---
     When Admin creates and approves Loan reschedule with the following data:
       | rescheduleFromDate | submittedOnDate  | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
@@ -1769,9 +1769,9 @@
       | 01 January 2025  | Disbursement     | 100.0  | 0.0       | 0.0      | 0.0  | 0.0       | 100.0        | false    | false    |
     And Loan Reschedule tab has the following data:
       | From Date        | Reason | Status   |
-      | 01 February 2025 | None   | Approved |
-      | 01 February 2025 | None   | Approved |
-      | 01 February 2025 | None   | Approved |
+      | 01 February 2025 | Test   | Approved |
+      | 01 February 2025 | Test   | Approved |
+      | 01 February 2025 | Test   | Approved |
 
   @TestRailId:C78849
   Scenario: Verify that reschedule after ReAge produces correct schedule and balance for downpayment product
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java
index 05c98ee..420cd9e 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java
@@ -285,4 +285,7 @@
 
     @Query("SELECT CASE WHEN COUNT(l) > 0 THEN TRUE ELSE FALSE END FROM Loan l WHERE l.id = :loanId and l.loanStatus in :allowedLoanStatuses")
     Boolean isLoanInAllowedStatus(@Param("loanId") Long loanId, @Param("allowedLoanStatuses") List<LoanStatus> allowedLoanStatuses);
+
+    @Query("SELECT MAX(lt.dateOf) FROM LoanTransaction lt, Loan l WHERE lt.loan=l AND l.loanStatus = org.apache.fineract.portfolio.loanaccount.domain.LoanStatus.ACTIVE")
+    LocalDate findMaxTransactionDateOfActiveLoans();
 }
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java
index 6624108..e56c9db 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java
@@ -317,4 +317,8 @@
     public boolean isLoanInAllowedStatus(Long loanId, List<LoanStatus> allowedLoanStatuses) {
         return repository.isLoanInAllowedStatus(loanId, allowedLoanStatuses);
     }
+
+    public LocalDate findMaxTransactionDateOfActiveLoans() {
+        return repository.findMaxTransactionDateOfActiveLoans();
+    }
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java
index 5b584df..705936f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java
@@ -26,6 +26,7 @@
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.UriInfo;
+import java.time.LocalDate;
 import java.time.OffsetDateTime;
 import java.util.List;
 import lombok.RequiredArgsConstructor;
@@ -130,6 +131,20 @@
         return advancedPaymentDataMapper.mapLoanPaymentAllocationRule(loan.getPaymentAllocationRules());
     }
 
+    @GET
+    @Path("maxTransactionDateOfActiveLoan")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @SuppressFBWarnings("SLF4J_SIGN_ONLY_FORMAT")
+    public LocalDate getMaxTransactionDateOfActiveLoans() {
+        log.warn("------------------------------------------------------------");
+        log.warn("                                                            ");
+        log.warn("Fetching max transaction date of active loans");
+        log.warn("                                                            ");
+        log.warn("------------------------------------------------------------");
+
+        return loanRepositoryWrapper.findMaxTransactionDateOfActiveLoans();
+    }
+
     private record AuditData(Long createdBy, OffsetDateTime createdDate, Long lastModifiedBy, OffsetDateTime lastModifiedDate) {
     }
 }
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java
index b1a0efa..a44efa8 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java
@@ -954,205 +954,130 @@
     @SuppressWarnings("unchecked")
     @Test
     public void testSavingsAccountPostInterestOnLastDayWithOverdraft() {
-        this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
+        try {
+            globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
+                    new PutGlobalConfigurationsRequest().enabled(true));
 
-        /***
-         * Create a client to apply for savings account (overdraft account).
-         */
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
-        // Assertions.assertNotNull(clientID);
-        final String minBalanceForInterestCalculation = null;
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, Utils.getLocalDateOfTenant());
+            this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
 
-        /***
-         * Create savings product with zero opening balance and overdraft enabled
-         */
-        final String zeroOpeningBalance = "0.0";
-        final String minRequiredBalance = null;
-        final String enforceMinRequiredBalance = "false";
-        final boolean allowOverdraft = true;
-        final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, zeroOpeningBalance,
-                minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
-        Assertions.assertNotNull(savingsProductID);
+            /***
+             * Create a client to apply for savings account (overdraft account).
+             */
+            final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+            ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+            // Assertions.assertNotNull(clientID);
+            final String minBalanceForInterestCalculation = null;
 
-        /***
-         * Apply for Savings account
-         */
-        final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
-        Assertions.assertNotNull(savingsProductID);
+            /***
+             * Create savings product with zero opening balance and overdraft enabled
+             */
+            final String zeroOpeningBalance = "0.0";
+            final String minRequiredBalance = null;
+            final String enforceMinRequiredBalance = "false";
+            final boolean allowOverdraft = true;
+            final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, zeroOpeningBalance,
+                    minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
+            Assertions.assertNotNull(savingsProductID);
 
-        HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
-                ACCOUNT_TYPE_INDIVIDUAL);
-        Assertions.assertTrue(modifications.containsKey("submittedOnDate"));
+            /***
+             * Apply for Savings account
+             */
+            final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID,
+                    ACCOUNT_TYPE_INDIVIDUAL);
+            Assertions.assertNotNull(savingsProductID);
 
-        HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
-        SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
+            HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
+                    ACCOUNT_TYPE_INDIVIDUAL);
+            Assertions.assertTrue(modifications.containsKey("submittedOnDate"));
 
-        /***
-         * Approve the savings account
-         */
-        savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
-        SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
+            HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
+            SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
 
-        final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US);
+            /***
+             * Approve the savings account
+             */
+            savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
+            SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
 
-        LocalDate todaysDate = Utils.getLocalDateOfTenant();
-        todaysDate = todaysDate.minusMonths(1);
+            final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US);
 
-        final String ACTIVATION_DATE = dateFormat.format(todaysDate);
+            LocalDate todaysDate = Utils.getLocalDateOfTenant();
+            todaysDate = todaysDate.minusMonths(1);
 
-        /***
-         * Activate the application and verify account status
-         *
-         * @param activationDate
-         *            this value is every time first day of previous month
-         */
-        savingsStatusHashMap = activateSavingsAccount(savingsId, ACTIVATION_DATE);
-        SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
-        /***
-         * Verify the account summary
-         */
-        final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId);
-        this.savingsAccountHelper.calculateInterestForSavings(savingsId);
-        HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsId);
-        assertEquals(summaryBefore, summary);
+            final String ACTIVATION_DATE = dateFormat.format(todaysDate);
 
-        final Integer lastDayOfMonth = todaysDate.lengthOfMonth();
-        todaysDate = todaysDate.withDayOfMonth(lastDayOfMonth);
-        final String WITHDRAWAL_DATE = dateFormat.format(todaysDate);
-        Float balance = Float.parseFloat(zeroOpeningBalance);
+            /***
+             * Activate the application and verify account status
+             *
+             * @param activationDate
+             *            this value is every time first day of previous month
+             */
+            savingsStatusHashMap = activateSavingsAccount(savingsId, ACTIVATION_DATE);
+            SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
+            /***
+             * Verify the account summary
+             */
+            final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId);
+            this.savingsAccountHelper.calculateInterestForSavings(savingsId);
+            HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsId);
+            assertEquals(summaryBefore, summary);
 
-        // DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM
-        // yyyy",Locale.US);
-        LocalDate transactionDate = Utils.getLocalDateOfTenant();
-        transactionDate = transactionDate.withDayOfMonth(2);
-        String transactionDateValue = dateFormat.format(transactionDate);
+            final Integer lastDayOfMonth = todaysDate.lengthOfMonth();
+            todaysDate = todaysDate.withDayOfMonth(lastDayOfMonth);
+            final String WITHDRAWAL_DATE = dateFormat.format(todaysDate);
+            Float balance = Float.parseFloat(zeroOpeningBalance);
 
-        /***
-         * Perform Deposit transaction on last day of month and verify account balance.
-         *
-         * @param transactionDate
-         *            this value is every time last day of previous month
-         */
-        Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, DEPOSIT_AMOUNT,
-                WITHDRAWAL_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
-        HashMap depositTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, depositTransactionId);
-        balance += Float.parseFloat(DEPOSIT_AMOUNT);
-        assertEquals(Float.parseFloat(DEPOSIT_AMOUNT), depositTransaction.get("amount"), "Verifying Deposit Amount");
-        assertEquals(balance, depositTransaction.get("runningBalance"), "Verifying Balance after Deposit");
+            // DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM
+            // yyyy",Locale.US);
+            LocalDate transactionDate = Utils.getLocalDateOfTenant();
+            transactionDate = transactionDate.withDayOfMonth(2);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            String transactionDateValue = dateFormat.format(transactionDate);
 
-        /***
-         * Calculate expected interest to be posted, interest should be posted for one day only because deposit
-         * transaction happened on last day of month before this account balance is negative.
-         */
-        this.savingsAccountHelper.postInterestForSavings(savingsId);
-        HashMap accountDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        Float accountDetailsPostInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
+            /***
+             * Perform Deposit transaction on last day of month and verify account balance.
+             *
+             * @param transactionDate
+             *            this value is every time last day of previous month
+             */
+            Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, DEPOSIT_AMOUNT,
+                    WITHDRAWAL_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
+            HashMap depositTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, depositTransactionId);
+            balance += Float.parseFloat(DEPOSIT_AMOUNT);
+            assertEquals(Float.parseFloat(DEPOSIT_AMOUNT), depositTransaction.get("amount"), "Verifying Deposit Amount");
+            assertEquals(balance, depositTransaction.get("runningBalance"), "Verifying Balance after Deposit");
 
-        Float nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        HashMap interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        Integer daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        double interestRateInFraction = nominalAnnualInterest / 100;
-        double perDay = (double) 1 / daysInYear;
-        double interestPerDay = interestRateInFraction * perDay;
-        Float interestPosted = (float) (interestPerDay * balance * 1);
+            /***
+             * Calculate expected interest to be posted, interest should be posted for one day only because deposit
+             * transaction happened on last day of month before this account balance is negative.
+             */
+            this.savingsAccountHelper.postInterestForSavings(savingsId);
+            HashMap accountDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            Float accountDetailsPostInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
 
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        DecimalFormat decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-
-        this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-        HashMap accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        Float accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-        nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        interestRateInFraction = nominalAnnualInterest / 100;
-        perDay = (double) 1 / daysInYear;
-        interestPerDay = interestRateInFraction * perDay;
-        interestPosted = (float) (interestPerDay * balance * 1);
-
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-        LOG.info("-----Post Interest As on Successfully Worked----------");
-
-        transactionDate = transactionDate.withDayOfMonth(3);
-        transactionDateValue = dateFormat.format(transactionDate);
-
-        this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-        accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-        nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        interestRateInFraction = nominalAnnualInterest / 100;
-        perDay = (double) 1 / daysInYear;
-        interestPerDay = interestRateInFraction * perDay;
-        interestPosted = (float) (interestPerDay * balance * 1);
-
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-        LOG.info("-----Post Interest As on Successfully Worked-------");
-
-        transactionDate = transactionDate.withDayOfMonth(22);
-        transactionDateValue = dateFormat.format(transactionDate);
-        if (Calendar.DAY_OF_MONTH >= 22) {
-            this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-            summary = (HashMap) accountTransactionDetails.get("summary");
-            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-            nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-            interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-            daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-            interestRateInFraction = nominalAnnualInterest / 100;
-            perDay = (double) 1 / daysInYear;
-            interestPerDay = interestRateInFraction * perDay;
-            interestPosted = (float) (interestPerDay * balance * 19);
+            Float nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+            HashMap interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+            Integer daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+            double interestRateInFraction = nominalAnnualInterest / 100;
+            double perDay = (double) 1 / daysInYear;
+            double interestPerDay = interestRateInFraction * perDay;
+            Float interestPosted = (float) (interestPerDay * balance * 1);
 
             /***
              * Apply rounding on interestPosted, actualInterestPosted and verify both are same
              */
-            decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+            DecimalFormat decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
             decimalFormat.applyPattern("#.###");
             interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
             accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
             assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-            LOG.info("-----Post Interest As on Successfully Worked----------");
-        }
-
-        LocalDate postedLastDate = Utils.getLocalDateOfTenant();
-        int numberOfDateOfMonth = postedLastDate.lengthOfMonth();
-        transactionDateValue = dateFormat.format(transactionDate);
-
-        if (Calendar.DAY_OF_MONTH == numberOfDateOfMonth) {
 
             this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-            summary = (HashMap) accountTransactionDetails.get("summary");
-            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+            HashMap accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            Float accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
 
             nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
             interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
@@ -1160,7 +1085,7 @@
             interestRateInFraction = nominalAnnualInterest / 100;
             perDay = (double) 1 / daysInYear;
             interestPerDay = interestRateInFraction * perDay;
-            interestPosted = (float) (interestPerDay * balance * 8);
+            interestPosted = (float) (interestPerDay * balance * 1);
 
             /***
              * Apply rounding on interestPosted, actualInterestPosted and verify both are same
@@ -1172,250 +1097,261 @@
             assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
             LOG.info("-----Post Interest As on Successfully Worked----------");
 
+            transactionDate = transactionDate.withDayOfMonth(3);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            transactionDateValue = dateFormat.format(transactionDate);
+
+            this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+            nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+            interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+            daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+            interestRateInFraction = nominalAnnualInterest / 100;
+            perDay = (double) 1 / daysInYear;
+            interestPerDay = interestRateInFraction * perDay;
+            interestPosted = (float) (interestPerDay * balance * 1);
+
+            /***
+             * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+             */
+            decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+            decimalFormat.applyPattern("#.###");
+            interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+            accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+            assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+            LOG.info("-----Post Interest As on Successfully Worked-------");
+
+            transactionDate = transactionDate.withDayOfMonth(22);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            transactionDateValue = dateFormat.format(transactionDate);
+            if (Calendar.DAY_OF_MONTH >= 22) {
+                this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+                accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+                summary = (HashMap) accountTransactionDetails.get("summary");
+                accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+                nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+                interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+                daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+                interestRateInFraction = nominalAnnualInterest / 100;
+                perDay = (double) 1 / daysInYear;
+                interestPerDay = interestRateInFraction * perDay;
+                interestPosted = (float) (interestPerDay * balance * 19);
+
+                /***
+                 * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+                 */
+                decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+                decimalFormat.applyPattern("#.###");
+                interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+                accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+                assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+                LOG.info("-----Post Interest As on Successfully Worked----------");
+            }
+
+            LocalDate postedLastDate = Utils.getLocalDateOfTenant();
+            int numberOfDateOfMonth = postedLastDate.lengthOfMonth();
+            transactionDateValue = dateFormat.format(transactionDate);
+
+            if (Calendar.DAY_OF_MONTH == numberOfDateOfMonth) {
+
+                this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+                accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+                summary = (HashMap) accountTransactionDetails.get("summary");
+                accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+                nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+                interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+                daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+                interestRateInFraction = nominalAnnualInterest / 100;
+                perDay = (double) 1 / daysInYear;
+                interestPerDay = interestRateInFraction * perDay;
+                interestPosted = (float) (interestPerDay * balance * 8);
+
+                /***
+                 * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+                 */
+                decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+                decimalFormat.applyPattern("#.###");
+                interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+                accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+                assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+                LOG.info("-----Post Interest As on Successfully Worked----------");
+
+            }
+            transactionDate = transactionDate.withDayOfMonth(1);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            transactionDateValue = dateFormat.format(transactionDate);
+            final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
+            final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
+            validationErrorHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountTransactionDetails.get("summary");
+            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+            nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+            interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+            daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+            interestRateInFraction = nominalAnnualInterest / 100;
+            perDay = (double) 1 / daysInYear;
+            interestPerDay = interestRateInFraction * perDay;
+            interestPosted = (float) (interestPerDay * balance * 1);
+
+            /***
+             * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+             */
+            decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+            decimalFormat.applyPattern("#.###");
+            interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+            accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+            assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+            LOG.info("-----Post Interest As on Successfully Worked----------");
+        } finally {
+            globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
+                    new PutGlobalConfigurationsRequest().enabled(false));
         }
-        transactionDate = transactionDate.withDayOfMonth(1);
-        transactionDateValue = dateFormat.format(transactionDate);
-        final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
-        final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
-        validationErrorHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-        accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountTransactionDetails.get("summary");
-        accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-        nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        interestRateInFraction = nominalAnnualInterest / 100;
-        perDay = (double) 1 / daysInYear;
-        interestPerDay = interestRateInFraction * perDay;
-        interestPosted = (float) (interestPerDay * balance * 1);
-
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-        LOG.info("-----Post Interest As on Successfully Worked----------");
-
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void testSavingsAccountPostInterestOnLastDayWithdrawalWithOverdraft() {
-        final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US);
-        this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
+        try {
+            globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
+                    new PutGlobalConfigurationsRequest().enabled(true));
 
-        /***
-         * Create a client to apply for savings account (overdraft account).
-         */
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
-        // Assertions.assertNotNull(clientID);
-        final String minBalanceForInterestCalculation = null;
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, Utils.getLocalDateOfTenant());
+            final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US);
+            this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
 
-        /***
-         * Create savings product with zero opening balance and overdraft enabled
-         */
-        final String zeroOpeningBalance = "0.0";
-        final String minRequiredBalance = null;
-        final String enforceMinRequiredBalance = "false";
-        final boolean allowOverdraft = true;
-        final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, zeroOpeningBalance,
-                minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
-        Assertions.assertNotNull(savingsProductID);
+            /***
+             * Create a client to apply for savings account (overdraft account).
+             */
+            final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+            ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+            // Assertions.assertNotNull(clientID);
+            final String minBalanceForInterestCalculation = null;
 
-        /***
-         * Apply for Savings account
-         */
-        final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
-        Assertions.assertNotNull(savingsProductID);
+            /***
+             * Create savings product with zero opening balance and overdraft enabled
+             */
+            final String zeroOpeningBalance = "0.0";
+            final String minRequiredBalance = null;
+            final String enforceMinRequiredBalance = "false";
+            final boolean allowOverdraft = true;
+            final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, zeroOpeningBalance,
+                    minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
+            Assertions.assertNotNull(savingsProductID);
 
-        HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
-                ACCOUNT_TYPE_INDIVIDUAL);
-        Assertions.assertTrue(modifications.containsKey("submittedOnDate"));
+            /***
+             * Apply for Savings account
+             */
+            final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID,
+                    ACCOUNT_TYPE_INDIVIDUAL);
+            Assertions.assertNotNull(savingsProductID);
 
-        HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
-        SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
+            HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
+                    ACCOUNT_TYPE_INDIVIDUAL);
+            Assertions.assertTrue(modifications.containsKey("submittedOnDate"));
 
-        /***
-         * Approve the savings account
-         */
-        savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
-        SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
+            HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
+            SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
 
-        LocalDate todaysDate = Utils.getLocalDateOfTenant();
-        todaysDate = todaysDate.minusMonths(1);
+            /***
+             * Approve the savings account
+             */
+            savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
+            SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
 
-        final String ACTIVATION_DATE = dateFormat.format(todaysDate);
+            LocalDate todaysDate = Utils.getLocalDateOfTenant();
+            todaysDate = todaysDate.minusMonths(1);
 
-        /***
-         * Activate the application and verify account status
-         *
-         * @param activationDate
-         *            this value is every time first day of previous month
-         */
-        savingsStatusHashMap = activateSavingsAccount(savingsId, ACTIVATION_DATE);
-        SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
-        /***
-         * Verify the account summary
-         */
-        final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId);
-        this.savingsAccountHelper.calculateInterestForSavings(savingsId);
-        HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsId);
-        assertEquals(summaryBefore, summary);
+            final String ACTIVATION_DATE = dateFormat.format(todaysDate);
 
-        final Integer lastDayOfMonth = todaysDate.lengthOfMonth();
-        todaysDate = todaysDate.withDayOfMonth(lastDayOfMonth);
-        final String WITHDRAWAL_DATE = dateFormat.format(todaysDate);
-        Float balance = Float.parseFloat(zeroOpeningBalance);
+            /***
+             * Activate the application and verify account status
+             *
+             * @param activationDate
+             *            this value is every time first day of previous month
+             */
+            savingsStatusHashMap = activateSavingsAccount(savingsId, ACTIVATION_DATE);
+            SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
+            /***
+             * Verify the account summary
+             */
+            final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId);
+            this.savingsAccountHelper.calculateInterestForSavings(savingsId);
+            HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsId);
+            assertEquals(summaryBefore, summary);
 
-        // DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM
-        // yyyy", Locale.US);
-        LocalDate transactionDate = Utils.getLocalDateOfTenant();
-        transactionDate = transactionDate.withDayOfMonth(2);
-        String transactionDateValue = dateFormat.format(transactionDate);
+            final Integer lastDayOfMonth = todaysDate.lengthOfMonth();
+            todaysDate = todaysDate.withDayOfMonth(lastDayOfMonth);
+            final String WITHDRAWAL_DATE = dateFormat.format(todaysDate);
+            Float balance = Float.parseFloat(zeroOpeningBalance);
 
-        /***
-         * Perform withdraw transaction, verify account balance(account balance will go to negative as no deposits are
-         * there prior to this transaction)
-         */
-        Integer withdrawTransactionId = (Integer) this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, WITHDRAW_AMOUNT,
-                ACTIVATION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
-        HashMap withdrawTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, withdrawTransactionId);
-        balance -= Float.parseFloat(WITHDRAW_AMOUNT);
-        assertEquals(Float.parseFloat(WITHDRAW_AMOUNT), withdrawTransaction.get("amount"), "Verifying Withdrawal Amount");
-        assertEquals(balance, withdrawTransaction.get("runningBalance"), "Verifying Balance after Withdrawal");
+            // DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM
+            // yyyy", Locale.US);
+            LocalDate transactionDate = Utils.getLocalDateOfTenant();
+            transactionDate = transactionDate.withDayOfMonth(2);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            String transactionDateValue = dateFormat.format(transactionDate);
 
-        /***
-         * Perform Deposit transaction on last day of month and verify account balance.
-         *
-         * @param transactionDate
-         *            this value is every time last day of previous month
-         */
-        Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, DEPOSIT_AMOUNT,
-                WITHDRAWAL_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
-        HashMap depositTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, depositTransactionId);
-        balance += Float.parseFloat(DEPOSIT_AMOUNT);
-        assertEquals(Float.parseFloat(DEPOSIT_AMOUNT), depositTransaction.get("amount"), "Verifying Deposit Amount");
-        assertEquals(balance, depositTransaction.get("runningBalance"), "Verifying Balance after Deposit");
+            /***
+             * Perform withdraw transaction, verify account balance(account balance will go to negative as no deposits
+             * are there prior to this transaction)
+             */
+            Integer withdrawTransactionId = (Integer) this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, WITHDRAW_AMOUNT,
+                    ACTIVATION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
+            HashMap withdrawTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, withdrawTransactionId);
+            balance -= Float.parseFloat(WITHDRAW_AMOUNT);
+            assertEquals(Float.parseFloat(WITHDRAW_AMOUNT), withdrawTransaction.get("amount"), "Verifying Withdrawal Amount");
+            assertEquals(balance, withdrawTransaction.get("runningBalance"), "Verifying Balance after Withdrawal");
 
-        /***
-         * Calculate expected interest to be posted, interest should be posted for one day only because deposit
-         * transaction happened on last day of month before this account balance is negative.
-         */
-        this.savingsAccountHelper.postInterestForSavings(savingsId);
-        HashMap accountDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        Float accountDetailsPostInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
+            /***
+             * Perform Deposit transaction on last day of month and verify account balance.
+             *
+             * @param transactionDate
+             *            this value is every time last day of previous month
+             */
+            Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, DEPOSIT_AMOUNT,
+                    WITHDRAWAL_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
+            HashMap depositTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, depositTransactionId);
+            balance += Float.parseFloat(DEPOSIT_AMOUNT);
+            assertEquals(Float.parseFloat(DEPOSIT_AMOUNT), depositTransaction.get("amount"), "Verifying Deposit Amount");
+            assertEquals(balance, depositTransaction.get("runningBalance"), "Verifying Balance after Deposit");
 
-        Float nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        HashMap interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        Integer daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        double interestRateInFraction = nominalAnnualInterest / 100;
-        double perDay = (double) 1 / daysInYear;
-        double interestPerDay = interestRateInFraction * perDay;
-        Float interestPosted = (float) (interestPerDay * balance * 1);
+            /***
+             * Calculate expected interest to be posted, interest should be posted for one day only because deposit
+             * transaction happened on last day of month before this account balance is negative.
+             */
+            this.savingsAccountHelper.postInterestForSavings(savingsId);
+            HashMap accountDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            Float accountDetailsPostInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
 
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        DecimalFormat decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-
-        this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-        HashMap accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        Float accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-        nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        interestRateInFraction = nominalAnnualInterest / 100;
-        perDay = (double) 1 / daysInYear;
-        interestPerDay = interestRateInFraction * perDay;
-        interestPosted = (float) (interestPerDay * balance * 1);
-
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-        LOG.info("-----Post Interest As on Successfully Worked----------");
-
-        transactionDate = transactionDate.withDayOfMonth(3);
-        transactionDateValue = dateFormat.format(transactionDate);
-
-        this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-        accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-        nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        interestRateInFraction = nominalAnnualInterest / 100;
-        perDay = (double) 1 / daysInYear;
-        interestPerDay = interestRateInFraction * perDay;
-        interestPosted = (float) (interestPerDay * balance * 1);
-
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-        LOG.info("-----Post Interest As on Successfully Worked-------");
-
-        // DateFormat transactionFormat = new SimpleDateFormat("dd MMMM yyyy",
-        // Locale.US);
-
-        transactionDate = transactionDate.withDayOfMonth(22);
-        transactionDateValue = dateFormat.format(transactionDate);
-        if (Calendar.DAY_OF_MONTH >= 22) {
-            this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-            summary = (HashMap) accountTransactionDetails.get("summary");
-            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-            nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-            interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-            daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-            interestRateInFraction = nominalAnnualInterest / 100;
-            perDay = (double) 1 / daysInYear;
-            interestPerDay = interestRateInFraction * perDay;
-            interestPosted = (float) (interestPerDay * balance * 19);
+            Float nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+            HashMap interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+            Integer daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+            double interestRateInFraction = nominalAnnualInterest / 100;
+            double perDay = (double) 1 / daysInYear;
+            double interestPerDay = interestRateInFraction * perDay;
+            Float interestPosted = (float) (interestPerDay * balance * 1);
 
             /***
              * Apply rounding on interestPosted, actualInterestPosted and verify both are same
              */
-            decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+            DecimalFormat decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
             decimalFormat.applyPattern("#.###");
             interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
             accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
             assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-            LOG.info("-----Post Interest As on Successfully Worked----------");
-        }
-        LocalDate postedLastDate = Utils.getLocalDateOfTenant();
-        int numberOfDateOfMonth = postedLastDate.lengthOfMonth();
-        transactionDateValue = dateFormat.format(transactionDate);
-
-        if (Calendar.DAY_OF_MONTH == numberOfDateOfMonth) {
 
             this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-            summary = (HashMap) accountTransactionDetails.get("summary");
-            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+            HashMap accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            Float accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
 
             nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
             interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
@@ -1423,7 +1359,7 @@
             interestRateInFraction = nominalAnnualInterest / 100;
             perDay = (double) 1 / daysInYear;
             interestPerDay = interestRateInFraction * perDay;
-            interestPosted = (float) (interestPerDay * balance * 8);
+            interestPosted = (float) (interestPerDay * balance * 1);
 
             /***
              * Apply rounding on interestPosted, actualInterestPosted and verify both are same
@@ -1435,199 +1371,302 @@
             assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
             LOG.info("-----Post Interest As on Successfully Worked----------");
 
+            transactionDate = transactionDate.withDayOfMonth(3);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            transactionDateValue = dateFormat.format(transactionDate);
+
+            this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+            nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+            interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+            daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+            interestRateInFraction = nominalAnnualInterest / 100;
+            perDay = (double) 1 / daysInYear;
+            interestPerDay = interestRateInFraction * perDay;
+            interestPosted = (float) (interestPerDay * balance * 1);
+
+            /***
+             * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+             */
+            decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+            decimalFormat.applyPattern("#.###");
+            interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+            accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+            assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+            LOG.info("-----Post Interest As on Successfully Worked-------");
+
+            // DateFormat transactionFormat = new SimpleDateFormat("dd MMMM yyyy",
+            // Locale.US);
+
+            transactionDate = transactionDate.withDayOfMonth(22);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            transactionDateValue = dateFormat.format(transactionDate);
+            if (Calendar.DAY_OF_MONTH >= 22) {
+                this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+                accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+                summary = (HashMap) accountTransactionDetails.get("summary");
+                accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+                nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+                interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+                daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+                interestRateInFraction = nominalAnnualInterest / 100;
+                perDay = (double) 1 / daysInYear;
+                interestPerDay = interestRateInFraction * perDay;
+                interestPosted = (float) (interestPerDay * balance * 19);
+
+                /***
+                 * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+                 */
+                decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+                decimalFormat.applyPattern("#.###");
+                interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+                accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+                assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+                LOG.info("-----Post Interest As on Successfully Worked----------");
+            }
+            LocalDate postedLastDate = Utils.getLocalDateOfTenant();
+            int numberOfDateOfMonth = postedLastDate.lengthOfMonth();
+            transactionDateValue = dateFormat.format(transactionDate);
+
+            if (Calendar.DAY_OF_MONTH == numberOfDateOfMonth) {
+
+                this.savingsAccountHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+                accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+                summary = (HashMap) accountTransactionDetails.get("summary");
+                accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+                nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+                interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+                daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+                interestRateInFraction = nominalAnnualInterest / 100;
+                perDay = (double) 1 / daysInYear;
+                interestPerDay = interestRateInFraction * perDay;
+                interestPosted = (float) (interestPerDay * balance * 8);
+
+                /***
+                 * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+                 */
+                decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+                decimalFormat.applyPattern("#.###");
+                interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+                accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+                assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+                LOG.info("-----Post Interest As on Successfully Worked----------");
+
+            }
+            transactionDate = transactionDate.withDayOfMonth(1);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate);
+            transactionDateValue = dateFormat.format(transactionDate);
+            final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
+            final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
+            validationErrorHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
+            accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountTransactionDetails.get("summary");
+            accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
+
+            nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+            interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+            daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+            interestRateInFraction = nominalAnnualInterest / 100;
+            perDay = (double) 1 / daysInYear;
+            interestPerDay = interestRateInFraction * perDay;
+            interestPosted = (float) (interestPerDay * balance * 1);
+
+            /***
+             * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+             */
+            decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+            decimalFormat.applyPattern("#.###");
+            interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+            accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+            assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+            LOG.info("-----Post Interest As on Successfully Worked----------");
+        } finally {
+            globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
+                    new PutGlobalConfigurationsRequest().enabled(false));
         }
-        transactionDate = transactionDate.withDayOfMonth(1);
-        transactionDateValue = dateFormat.format(transactionDate);
-        final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
-        final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
-        validationErrorHelper.postInterestAsOnSavings(savingsId, transactionDateValue);
-        accountTransactionDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountTransactionDetails.get("summary");
-        accountDetailsPostInterest = Float.parseFloat(summary.get("totalInterestPosted").toString());
-
-        nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        interestRateInFraction = nominalAnnualInterest / 100;
-        perDay = (double) 1 / daysInYear;
-        interestPerDay = interestRateInFraction * perDay;
-        interestPosted = (float) (interestPerDay * balance * 1);
-
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        accountDetailsPostInterestPosted = Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-        LOG.info("-----Post Interest As on Successfully Worked----------");
-
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void testSavingsAccountPostInterestWithOverdraft() {
-        final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US);
-        this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
-        final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
+        try {
+            globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
+                    new PutGlobalConfigurationsRequest().enabled(true));
 
-        /***
-         * Create a client to apply for savings account (overdraft account).
-         */
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
-        // Assertions.assertNotNull(clientID);
-        final String minBalanceForInterestCalculation = null;
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, Utils.getLocalDateOfTenant());
+            final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US);
+            this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
+            final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
 
-        /***
-         * Create savings product with zero opening balance and overdraft enabled
-         */
-        final String zeroOpeningBalance = "0.0";
-        final String minRequiredBalance = null;
-        final String enforceMinRequiredBalance = "false";
-        final boolean allowOverdraft = true;
-        final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, zeroOpeningBalance,
-                minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
-        Assertions.assertNotNull(savingsProductID);
+            /***
+             * Create a client to apply for savings account (overdraft account).
+             */
+            final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+            ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+            // Assertions.assertNotNull(clientID);
+            final String minBalanceForInterestCalculation = null;
 
-        /***
-         * Apply for Savings account
-         */
-        final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
-        Assertions.assertNotNull(savingsProductID);
+            /***
+             * Create savings product with zero opening balance and overdraft enabled
+             */
+            final String zeroOpeningBalance = "0.0";
+            final String minRequiredBalance = null;
+            final String enforceMinRequiredBalance = "false";
+            final boolean allowOverdraft = true;
+            final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, zeroOpeningBalance,
+                    minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
+            Assertions.assertNotNull(savingsProductID);
 
-        HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
-                ACCOUNT_TYPE_INDIVIDUAL);
-        Assertions.assertTrue(modifications.containsKey("submittedOnDate"));
+            /***
+             * Apply for Savings account
+             */
+            final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID,
+                    ACCOUNT_TYPE_INDIVIDUAL);
+            Assertions.assertNotNull(savingsProductID);
 
-        HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
-        SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
+            HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
+                    ACCOUNT_TYPE_INDIVIDUAL);
+            Assertions.assertTrue(modifications.containsKey("submittedOnDate"));
 
-        /***
-         * Approve the savings account
-         */
-        savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
-        SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
+            HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
+            SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
 
-        LocalDate todaysDate = Utils.getLocalDateOfTenant();
-        todaysDate = todaysDate.minusMonths(1);
-        todaysDate = todaysDate.withDayOfMonth(1);
-        final String ACTIVATION_DATE = dateFormat.format(todaysDate);
-        final Integer lastDayOfMonth = todaysDate.lengthOfMonth();
-        todaysDate = todaysDate.withDayOfMonth(lastDayOfMonth);
-        final String TRANSACTION_DATE = dateFormat.format(todaysDate);
+            /***
+             * Approve the savings account
+             */
+            savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
+            SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
 
-        LocalDate postedDate = Utils.getLocalDateOfTenant();
-        postedDate = postedDate.withDayOfMonth(2);
+            LocalDate todaysDate = Utils.getLocalDateOfTenant();
+            todaysDate = todaysDate.minusMonths(1);
+            todaysDate = todaysDate.withDayOfMonth(1);
+            final String ACTIVATION_DATE = dateFormat.format(todaysDate);
+            final Integer lastDayOfMonth = todaysDate.lengthOfMonth();
+            todaysDate = todaysDate.withDayOfMonth(lastDayOfMonth);
+            final String TRANSACTION_DATE = dateFormat.format(todaysDate);
 
-        final String POSTED_TRANSACTION_DATE = dateFormat.format(postedDate);
+            LocalDate postedDate = Utils.getLocalDateOfTenant();
+            postedDate = postedDate.withDayOfMonth(2);
+            BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, postedDate);
 
-        /***
-         * Activate the application and verify account status
-         *
-         * @param activationDate
-         *            this value is every time first day of previous month
-         */
-        savingsStatusHashMap = activateSavingsAccount(savingsId, ACTIVATION_DATE);
-        SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
+            final String POSTED_TRANSACTION_DATE = dateFormat.format(postedDate);
 
-        /***
-         * Verify the account summary
-         */
-        final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId);
-        this.savingsAccountHelper.calculateInterestForSavings(savingsId);
-        HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsId);
-        assertEquals(summaryBefore, summary);
+            /***
+             * Activate the application and verify account status
+             *
+             * @param activationDate
+             *            this value is every time first day of previous month
+             */
+            savingsStatusHashMap = activateSavingsAccount(savingsId, ACTIVATION_DATE);
+            SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
 
-        Float balance = Float.parseFloat(zeroOpeningBalance);
+            /***
+             * Verify the account summary
+             */
+            final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId);
+            this.savingsAccountHelper.calculateInterestForSavings(savingsId);
+            HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsId);
+            assertEquals(summaryBefore, summary);
 
-        /***
-         * Perform withdraw transaction, verify account balance(account balance will go to negative as no deposits are
-         * there prior to this transaction)
-         */
-        Integer withdrawTransactionId = (Integer) this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, WITHDRAW_AMOUNT,
-                ACTIVATION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
-        HashMap withdrawTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, withdrawTransactionId);
-        balance -= Float.parseFloat(WITHDRAW_AMOUNT);
-        assertEquals(Float.parseFloat(WITHDRAW_AMOUNT), withdrawTransaction.get("amount"), "Verifying Withdrawal Amount");
-        assertEquals(balance, withdrawTransaction.get("runningBalance"), "Verifying Balance after Withdrawal");
+            Float balance = Float.parseFloat(zeroOpeningBalance);
 
-        /***
-         * Perform Deposit transaction on last day of month and verify account balance.
-         *
-         * @param transactionDate
-         *            this value is every time last day of previous month
-         */
-        Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, DEPOSIT_AMOUNT,
-                TRANSACTION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
-        HashMap depositTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, depositTransactionId);
-        balance += Float.parseFloat(DEPOSIT_AMOUNT);
-        assertEquals(Float.parseFloat(DEPOSIT_AMOUNT), depositTransaction.get("amount"), "Verifying Deposit Amount");
-        assertEquals(balance, depositTransaction.get("runningBalance"), "Verifying Balance after Deposit");
+            /***
+             * Perform withdraw transaction, verify account balance(account balance will go to negative as no deposits
+             * are there prior to this transaction)
+             */
+            Integer withdrawTransactionId = (Integer) this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, WITHDRAW_AMOUNT,
+                    ACTIVATION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
+            HashMap withdrawTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, withdrawTransactionId);
+            balance -= Float.parseFloat(WITHDRAW_AMOUNT);
+            assertEquals(Float.parseFloat(WITHDRAW_AMOUNT), withdrawTransaction.get("amount"), "Verifying Withdrawal Amount");
+            assertEquals(balance, withdrawTransaction.get("runningBalance"), "Verifying Balance after Withdrawal");
 
-        /***
-         * Perform Post interest transaction and verify the posted amount
-         */
-        this.savingsAccountHelper.postInterestForSavings(savingsId);
-        HashMap accountDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        Float actualInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
+            /***
+             * Perform Deposit transaction on last day of month and verify account balance.
+             *
+             * @param transactionDate
+             *            this value is every time last day of previous month
+             */
+            Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, DEPOSIT_AMOUNT,
+                    TRANSACTION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
+            HashMap depositTransaction = this.savingsAccountHelper.getSavingsTransaction(savingsId, depositTransactionId);
+            balance += Float.parseFloat(DEPOSIT_AMOUNT);
+            assertEquals(Float.parseFloat(DEPOSIT_AMOUNT), depositTransaction.get("amount"), "Verifying Deposit Amount");
+            assertEquals(balance, depositTransaction.get("runningBalance"), "Verifying Balance after Deposit");
 
-        /***
-         * Calculate expected interest to be posted, interest should be posted for one day only because deposit
-         * transaction happened on last day of month before this account balance is negative.
-         */
-        this.savingsAccountHelper.postInterestAsOnSavings(savingsId, POSTED_TRANSACTION_DATE);
-        HashMap accountDetailsPostInterest = this.savingsAccountHelper.getSavingsDetails(savingsId);
-        summary = (HashMap) accountDetails.get("summary");
-        ArrayList interestPostingTransaction = (ArrayList) ((HashMap) ((ArrayList) accountDetails.get("transactions")).get(0)).get("date");
-        Float accountDetailsPostInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
+            /***
+             * Perform Post interest transaction and verify the posted amount
+             */
+            this.savingsAccountHelper.postInterestForSavings(savingsId);
+            HashMap accountDetails = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            Float actualInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
 
-        /***
-         * Calculate expected interest to be posted, interest should be posted for one day only because deposit
-         * transaction happened on last day of month before this account balance is negative.
-         */
-        final Float nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
-        final HashMap interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
-        final Integer daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
-        double interestRateInFraction = nominalAnnualInterest / 100;
-        double perDay = (double) 1 / daysInYear;
-        double interestPerDay = interestRateInFraction * perDay;
-        Float interestPosted = (float) (interestPerDay * balance * 1);
+            /***
+             * Calculate expected interest to be posted, interest should be posted for one day only because deposit
+             * transaction happened on last day of month before this account balance is negative.
+             */
+            this.savingsAccountHelper.postInterestAsOnSavings(savingsId, POSTED_TRANSACTION_DATE);
+            HashMap accountDetailsPostInterest = this.savingsAccountHelper.getSavingsDetails(savingsId);
+            summary = (HashMap) accountDetails.get("summary");
+            ArrayList interestPostingTransaction = (ArrayList) ((HashMap) ((ArrayList) accountDetails.get("transactions")).get(0))
+                    .get("date");
+            Float accountDetailsPostInterestPosted = Float.parseFloat(summary.get("totalInterestPosted").toString());
 
-        /***
-         * Apply rounding on interestPosted, actualInterestPosted and verify both are same
-         */
-        DecimalFormat decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
-        decimalFormat.applyPattern("#.###");
-        interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
-        // actualInterestPosted =
-        // Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
-        assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
-        LOG.info("------Post Interest As On After doing a post interest Successfully worked--------");
+            /***
+             * Calculate expected interest to be posted, interest should be posted for one day only because deposit
+             * transaction happened on last day of month before this account balance is negative.
+             */
+            final Float nominalAnnualInterest = Float.parseFloat(accountDetails.get("nominalAnnualInterestRate").toString());
+            final HashMap interestCalculationDaysInYearType = (HashMap) accountDetails.get("interestCalculationDaysInYearType");
+            final Integer daysInYear = Integer.valueOf(interestCalculationDaysInYearType.get("id").toString());
+            double interestRateInFraction = nominalAnnualInterest / 100;
+            double perDay = (double) 1 / daysInYear;
+            double interestPerDay = interestRateInFraction * perDay;
+            Float interestPosted = (float) (interestPerDay * balance * 1);
 
-        todaysDate = Utils.getLocalDateOfTenant();
-        final String CLOSEDON_DATE = dateFormat.format(todaysDate);
+            /***
+             * Apply rounding on interestPosted, actualInterestPosted and verify both are same
+             */
+            DecimalFormat decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
+            decimalFormat.applyPattern("#.###");
+            interestPosted = Float.parseFloat(decimalFormat.format(interestPosted));
+            // actualInterestPosted =
+            // Float.parseFloat(decimalFormat.format(accountDetailsPostInterestPosted));
+            assertEquals(interestPosted, accountDetailsPostInterestPosted, "Verifying interest posted");
+            LOG.info("------Post Interest As On After doing a post interest Successfully worked--------");
 
-        LocalDate interestPostingDate = LocalDate.of((int) interestPostingTransaction.get(0), (int) interestPostingTransaction.get(1),
-                (int) interestPostingTransaction.get(2));
-        LocalDate todysDate = Utils.getLocalDateOfTenant();
+            todaysDate = Utils.getLocalDateOfTenant().plusDays(1);
+            final String CLOSEDON_DATE = dateFormat.format(todaysDate);
 
-        final String INTEREST_POSTING_DATE = dateFormat.format(interestPostingDate);
-        final String TODYS_POSTING_DATE = dateFormat.format(todysDate);
-        String withdrawBalance = "true";
+            LocalDate interestPostingDate = LocalDate.of((int) interestPostingTransaction.get(0), (int) interestPostingTransaction.get(1),
+                    (int) interestPostingTransaction.get(2));
+            LocalDate todysDate = Utils.getLocalDateOfTenant();
 
-        if (TODYS_POSTING_DATE.equalsIgnoreCase(INTEREST_POSTING_DATE)) {
-            final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, responseSpec);
-            validationErrorHelper.closeSavingsAccountPostInterestAndGetBackRequiredField(savingsId, withdrawBalance,
-                    CommonConstants.RESPONSE_ERROR, CLOSEDON_DATE);
-        } else {
-            final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
-            ArrayList<HashMap> savingsAccountErrorData = (ArrayList<HashMap>) validationErrorHelper
-                    .closeSavingsAccountPostInterestAndGetBackRequiredField(savingsId, withdrawBalance, CommonConstants.RESPONSE_ERROR,
-                            CLOSEDON_DATE);
-            assertEquals("error.msg.postInterest.notDone", savingsAccountErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE));
+            final String INTEREST_POSTING_DATE = dateFormat.format(interestPostingDate);
+            final String TODYS_POSTING_DATE = dateFormat.format(todysDate);
+            String withdrawBalance = "true";
+
+            if (TODYS_POSTING_DATE.equalsIgnoreCase(INTEREST_POSTING_DATE)) {
+                final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, responseSpec);
+                validationErrorHelper.closeSavingsAccountPostInterestAndGetBackRequiredField(savingsId, withdrawBalance,
+                        CommonConstants.RESPONSE_ERROR, CLOSEDON_DATE);
+            } else {
+                final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
+                ArrayList<HashMap> savingsAccountErrorData = (ArrayList<HashMap>) validationErrorHelper
+                        .closeSavingsAccountPostInterestAndGetBackRequiredField(savingsId, withdrawBalance, CommonConstants.RESPONSE_ERROR,
+                                CLOSEDON_DATE);
+                assertEquals("error.msg.postInterest.notDone",
+                        savingsAccountErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE));
+            }
+        } finally {
+            globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
+                    new PutGlobalConfigurationsRequest().enabled(false));
         }
     }
 
@@ -2511,15 +2550,15 @@
         assertEquals(balance, summary.get("availableBalance"), "Verifying available Balance is -500");
 
         Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, "2000", // available
-                                                                                                                      // to
-                                                                                                                      // use
-                                                                                                                      // 1100
-                                                                                                                      // and
-                                                                                                                      // another
-                                                                                                                      // 1000
-                                                                                                                      // on
-                                                                                                                      // transactional
-                                                                                                                      // hold
+                // to
+                // use
+                // 1100
+                // and
+                // another
+                // 1000
+                // on
+                // transactional
+                // hold
 
                 SavingsAccountHelper.TRANSACTION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
         DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
@@ -2528,7 +2567,7 @@
 
         ArrayList<HashMap> savingsAccountErrorData = (ArrayList<HashMap>) validationErrorHelper.withdrawalFromSavingsAccount(savingsId,
                 "1600", TRANSACTION_DATE, CommonConstants.RESPONSE_ERROR);// can not withdraw: amount on transactional
-                                                                          // hold
+        // hold
 
         assertEquals("error.msg.savingsaccount.transaction.insufficient.account.balance",
                 savingsAccountErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE));
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyActionIntegrationTests.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyActionIntegrationTests.java
index e53f63c..0106e0e 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyActionIntegrationTests.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyActionIntegrationTests.java
@@ -772,51 +772,39 @@
     public void testPauseUsesBusinessDateNotCOBDate() {
         final Long[] loanIdHolder = new Long[1];
 
-        runAt("28 May 2025", () -> {
+        runAt("01 January 2025", () -> {
             Long clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
             Long loanProductId = createLoanProductWithDelinquencyBucketNoDownPayment(true, true, 3);
-            Long loanId = applyAndApproveLoan(clientId, loanProductId, "28 May 2025", 1000.0, 7, req -> {
-                req.setLoanTermFrequency(210);
-                req.setRepaymentEvery(30);
+            Long loanId = applyAndApproveLoan(clientId, loanProductId, "01 January 2025", 1000.0, 4, req -> {
+                req.setLoanTermFrequency(40);
+                req.setRepaymentEvery(10);
                 req.setGraceOnArrearsAgeing(3);
             });
-            disburseLoan(loanId, BigDecimal.valueOf(1000.00), "28 May 2025");
+            disburseLoan(loanId, BigDecimal.valueOf(1000.00), "01 January 2025");
             loanIdHolder[0] = loanId;
         });
 
-        runAt("15 June 2025", () -> {
+        runAt("07 January 2025", () -> {
             final InlineLoanCOBHelper inlineLoanCOBHelper = new InlineLoanCOBHelper(requestSpec, responseSpec);
             Long loanId = loanIdHolder[0];
             inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
 
-            loanTransactionHelper.createLoanDelinquencyAction(loanId, PAUSE, "17 June 2025", "19 August 2025");
+            loanTransactionHelper.createLoanDelinquencyAction(loanId, PAUSE, "09 January 2025", "20 January 2025");
         });
 
-        runAt("01 July 2025", () -> {
+        runAt("15 January 2025", () -> {
             final InlineLoanCOBHelper inlineLoanCOBHelper = new InlineLoanCOBHelper(requestSpec, responseSpec);
             Long loanId = loanIdHolder[0];
             inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
         });
 
-        runAt("01 August 2025", () -> {
+        runAt("25 January 2025", () -> {
             final InlineLoanCOBHelper inlineLoanCOBHelper = new InlineLoanCOBHelper(requestSpec, responseSpec);
             Long loanId = loanIdHolder[0];
             inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
         });
 
-        runAt("01 September 2025", () -> {
-            final InlineLoanCOBHelper inlineLoanCOBHelper = new InlineLoanCOBHelper(requestSpec, responseSpec);
-            Long loanId = loanIdHolder[0];
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-
-        runAt("01 October 2025", () -> {
-            final InlineLoanCOBHelper inlineLoanCOBHelper = new InlineLoanCOBHelper(requestSpec, responseSpec);
-            Long loanId = loanIdHolder[0];
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-
-        runAt("31 October 2025", () -> {
+        runAt("10 February 2025", () -> {
             final InlineLoanCOBHelper inlineLoanCOBHelper = new InlineLoanCOBHelper(requestSpec, responseSpec);
             Long loanId = loanIdHolder[0];
             inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
@@ -825,20 +813,20 @@
             assertNotNull(loanDetails.getDelinquent(), "Loan delinquent data should not be null");
 
             Integer loanLevelPastDueDays = loanDetails.getDelinquent().getPastDueDays();
-            assertEquals(126, loanLevelPastDueDays,
-                    "Loan level past due days should be 126 (June 27 to Oct 31) - First installment due June 27 (30 days after May 28)");
+            assertEquals(30, loanLevelPastDueDays,
+                    "Loan level past due days should be 30 (Jan 11 to Feb 10) - First installment due Jan 11 (10 days after Jan 1)");
 
             Integer loanLevelDelinquentDays = loanDetails.getDelinquent().getDelinquentDays();
-            assertEquals(70, loanLevelDelinquentDays,
-                    "Loan level delinquent days should be 70 (125 overdue days from June 28 to Oct 31, minus 52 paused days from June 28 to Aug 19, minus 3 grace)");
+            assertEquals(18, loanLevelDelinquentDays,
+                    "Loan level delinquent days should be 18 (29 overdue days from Jan 12 to Feb 10, minus 8 paused days from Jan 12 to Jan 20, minus 3 grace)");
 
             LocalDate loanLevelDelinquentDate = loanDetails.getDelinquent().getDelinquentDate();
-            assertEquals(LocalDate.parse("30 June 2025", dateTimeFormatter), loanLevelDelinquentDate,
-                    "Loan level delinquent date should be June 30, 2025 (first installment due June 27 + 3 days grace)");
+            assertEquals(LocalDate.parse("14 January 2025", dateTimeFormatter), loanLevelDelinquentDate,
+                    "Loan level delinquent date should be Jan 14, 2025 (first installment due Jan 11 + 3 days grace)");
 
             Map<String, BigDecimal> expectedTotals = calculateExpectedBucketTotals(loanDetails,
-                    LocalDate.parse("31 October 2025", dateTimeFormatter));
-            assertInstallmentDelinquencyBuckets(loanDetails, LocalDate.parse("31 October 2025", dateTimeFormatter), expectedTotals);
+                    LocalDate.parse("10 February 2025", dateTimeFormatter));
+            assertInstallmentDelinquencyBuckets(loanDetails, LocalDate.parse("10 February 2025", dateTimeFormatter), expectedTotals);
         });
     }
 
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/HookIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/HookIntegrationTest.java
index c148def..df893e2 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/HookIntegrationTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/HookIntegrationTest.java
@@ -32,7 +32,6 @@
 import org.apache.fineract.integrationtests.common.HookHelper;
 import org.apache.fineract.integrationtests.common.OfficeHelper;
 import org.apache.fineract.integrationtests.common.Utils;
-import org.apache.http.conn.HttpHostConnectException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -71,25 +70,22 @@
         try {
             // sleep for a three seconds after each failure to increase the likelihood of the previous request for
             // creating office completing
-            for (int i = 0; i < 6; i++) {
+            for (int i = 0; i < 10; i++) {
                 try {
                     final String json = RestAssured.get(payloadURL.replace("?", "")).asString();
                     final Integer notificationOfficeId = JsonPath.with(json).get("officeId");
                     Assertions.assertEquals(createdOfficeID, notificationOfficeId,
                             "Equality check for created officeId and hook received payload officeId");
                     LOG.info("Notification Office Id - {}", notificationOfficeId);
-                    i = 6;
+                    i = 10;
                 } catch (Exception e) {
-                    TimeUnit.SECONDS.sleep(3);
+                    TimeUnit.SECONDS.sleep(1);
                     i++;
                 }
             }
 
         } catch (final Exception e) {
-            if (e instanceof HttpHostConnectException) {
-                fail("Failed to connect to https://echo-webhook.herokuapp.com platform");
-            }
-            throw new RuntimeException(e);
+            fail("Failed to connect to https://echo-webhook.herokuapp.com platform");
         } finally {
             this.hookHelper.deleteHook(hookId.longValue());
         }
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java
index c22516c..8404477 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java
@@ -461,29 +461,25 @@
             executeInlineCOB(loanId);
         });
         runAt("30 December 2024", () -> {
+            executeInlineCOB(loanIdRef.get());
             Long loanId = loanIdRef.get();
             loanTransactionHelper.makeLoanRepayment(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN)
                     .transactionDate("30 December 2024").locale("en").transactionAmount(200.0));
+            // Accruals around installment due dates are as expected
+            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
+            // Accruals around installment due dates are as expected
+            validateTransactionsExist(loanDetails, //
+                    transaction(0.3, "Accrual", "21 December 2024", 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 0.0) //
+            );
         });
-        runAt("22 March 2025", () -> {
+        runAt("01 January 2025", () -> {
             Long loanId = loanIdRef.get();
             executeInlineCOB(loanId);
 
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-
-            // No unexpected big accruals or any accrual adjustments
-            Assertions.assertTrue(
-                    loanDetails.getTransactions().stream().noneMatch(t -> (t.getType().getAccrual() && t.getAmount().doubleValue() > 0.31)
-                            || "loanTransactionType.accrualAdjustment".equals(t.getType().getCode())));
-
             // Accruals around installment due dates are as expected
             validateTransactionsExist(loanDetails, //
-                    transaction(0.17, "Accrual", "20 January 2025", 0.0, 0.0, 0.17, 0.0, 0.0, 0.0, 0.0), //
-                    transaction(0.16, "Accrual", "21 January 2025", 0.0, 0.0, 0.16, 0.0, 0.0, 0.0, 0.0), //
-                    transaction(0.16, "Accrual", "20 February 2025", 0.0, 0.0, 0.16, 0.0, 0.0, 0.0, 0.0), //
-                    transaction(0.18, "Accrual", "21 February 2025", 0.0, 0.0, 0.18, 0.0, 0.0, 0.0, 0.0), //
-                    transaction(0.18, "Accrual", "20 March 2025", 0.0, 0.0, 0.18, 0.0, 0.0, 0.0, 0.0), //
-                    transaction(0.16, "Accrual", "21 March 2025", 0.0, 0.0, 0.16, 0.0, 0.0, 0.0, 0.0) //
+                    transaction(0.16, "Accrual", "31 December 2024", 0.0, 0.0, 0.16, 0.0, 0.0, 0.0, 0.0) //
             );
         });
 
@@ -498,19 +494,14 @@
 
         runAt("20 December 2024", () -> {
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "20 December 2024",
-                    430.0, 26.0, 6, null);
+                    430.0, 26.0, 1, null);
 
             loanIdRef.set(loanId);
 
             disburseLoan(loanId, BigDecimal.valueOf(430), "20 December 2024");
 
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 January 2025", 67.88, 0, 0, 9.32);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "20 February 2025", 69.35, 0, 0, 7.85);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "20 March 2025", 70.86, 0, 0, 6.34);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "20 April 2025", 72.39, 0, 0, 4.81);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 5, "20 May 2025", 73.96, 0, 0, 3.24);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 6, "20 June 2025", 75.56, 0, 0, 1.64);
+            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 January 2025", 430.0, 0, 0, 9.32);
 
             verifyTransactions(loanId, transaction(430.0d, "Disbursement", "20 December 2024"));
             executeInlineCOB(loanId);
@@ -525,13 +516,13 @@
                     transaction(0.30d, "Accrual", "20 December 2024", 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 0.0, false));
         });
         // last installment due date is excluded
-        runAt("21 June 2025", () -> {
+        runAt("21 January 2025", () -> {
             Long loanId = loanIdRef.get();
             executeInlineCOB(loanId);
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
 
             Assertions.assertTrue(loanDetails.getTransactions().stream()
-                    .noneMatch(t -> t.getDate().equals(LocalDate.of(2025, 6, 20)) && t.getType().getAccrual()));
+                    .noneMatch(t -> t.getDate().equals(LocalDate.of(2025, 1, 20)) && t.getType().getAccrual()));
         });
     }
 
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRecalculationCOBTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRecalculationCOBTest.java
index c25bcf4..1591078 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRecalculationCOBTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRecalculationCOBTest.java
@@ -190,20 +190,6 @@
             validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.23, 0.0, 0.0, 33.61);
             validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2025.55, 0.0, 0.0, 16.88);
         });
-        runAt("20 February 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1980.46, 0.0, 0.0, 61.38);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.14, 0.0, 0.0, 33.7);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2036.23, 0.0, 0.0, 16.97);
-
-        });
         runAt("1 March 2023", () -> {
             Long loanId = loanIdRef.get();
 
@@ -218,21 +204,7 @@
             validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2041.57, 0.0, 0.0, 17.01);
 
         });
-        runAt("20 April 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2074.49, 0.0, 0.0, 48.56);
-
-        });
-        payoffOnDateAndVerifyStatus("1 February 2023", loanIdRef.get());
+        payoffOnDateAndVerifyStatus("1 March 2023", loanIdRef.get());
     }
 
     private void payoffOnDateAndVerifyStatus(final String date, final Long loanId) {
@@ -250,6 +222,11 @@
         });
     }
 
+    private void executeInterestRecalculationJobs() {
+        schedulerJobHelper.executeAndAwaitJob("Update Loan Arrears Ageing");
+        schedulerJobHelper.executeAndAwaitJob("Recalculate Interest For Loans");
+    }
+
     @Test
     public void verifyLoanInstallmentRecalculatedIfThereIsOverdueInstallmentOn4IProgressiveLoanCOBStepLatePayPayOnDuePayLatePayOnDateDaily() {
         AtomicReference<Long> loanIdRef = new AtomicReference<>();
@@ -334,20 +311,7 @@
             validateFullyPaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.14, 0.0, 0.0, 33.7, 2041.84);
             validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2036.23, 0.0, 0.0, 21.99);
         });
-        runAt("20 April 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyPaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67, 2041.84);
-            validateFullyPaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1980.46, 0.0, 0.0, 61.38);
-            validateFullyPaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.14, 0.0, 0.0, 33.7, 2041.84);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2036.23, 0.0, 0.0, 21.99);
-        });
-        payoffOnDateAndVerifyStatus("20 April 2023", loanIdRef.get());
+        payoffOnDateAndVerifyStatus("10 April 2023", loanIdRef.get());
     }
 
     @Test
@@ -500,19 +464,6 @@
             validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.23, 0.0, 0.0, 33.61);
             validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2025.55, 0.0, 0.0, 16.88);
         });
-        runAt("20 February 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1980.46, 0.0, 0.0, 61.38);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.14, 0.0, 0.0, 33.7);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2036.23, 0.0, 0.0, 16.97);
-        });
         runAt("2 March 2023", () -> {
             Long loanId = loanIdRef.get();
 
@@ -526,7 +477,7 @@
             validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2007.03, 0.0, 0.0, 34.81);
             validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2042.63, 0.0, 0.0, 17.02);
         });
-        payoffOnDateAndVerifyStatus("1 February 2023", loanIdRef.get());
+        payoffOnDateAndVerifyStatus("2 March 2023", loanIdRef.get());
     }
 
     @Test
@@ -937,20 +888,7 @@
             validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2007.69, 0.0, 0.0, 34.15);
             validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2025.51, 0.0, 0.0, 16.88);
         });
-        runAt("20 March 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyPaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1991.63, 0.0, 0.0, 50.21);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 1998.06, 0.0, 0.0, 43.78);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2035.14, 0.0, 0.0, 16.96);
-        });
-        payoffOnDateAndVerifyStatus("1 March 2023", loanIdRef.get());
+        payoffOnDateAndVerifyStatus("2 March 2023", loanIdRef.get());
     }
 
     @Test
@@ -1009,35 +947,12 @@
 
             disburseLoan(loanId, BigDecimal.valueOf(8000), "1 January 2023");
 
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1991.63, 0.0, 0.0, 50.21);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.23, 0.0, 0.0, 33.61);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2024.97, 0.0, 0.0, 16.87);
-
         });
 
-        runAt("1 February 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            schedulerJobHelper.executeAndAwaitJob("Update Loan Arrears Ageing");
-            schedulerJobHelper.executeAndAwaitJob("Recalculate Interest For Loans");
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1991.63, 0.0, 0.0, 50.21);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.23, 0.0, 0.0, 33.61);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2024.97, 0.0, 0.0, 16.87);
-        });
         runAt("2 February 2023", () -> {
             Long loanId = loanIdRef.get();
 
-            schedulerJobHelper.executeAndAwaitJob("Update Loan Arrears Ageing");
-            schedulerJobHelper.executeAndAwaitJob("Recalculate Interest For Loans");
+            executeInterestRecalculationJobs();
 
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
             logLoanDetails(loanDetails);
@@ -1047,35 +962,7 @@
             validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.23, 0.0, 0.0, 33.61);
             validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2025.55, 0.0, 0.0, 16.88);
         });
-        runAt("20 February 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            schedulerJobHelper.executeAndAwaitJob("Update Loan Arrears Ageing");
-            schedulerJobHelper.executeAndAwaitJob("Recalculate Interest For Loans");
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1980.46, 0.0, 0.0, 61.38);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2008.14, 0.0, 0.0, 33.7);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2036.23, 0.0, 0.0, 16.97);
-        });
-        runAt("2 March 2023", () -> {
-            Long loanId = loanIdRef.get();
-
-            schedulerJobHelper.executeAndAwaitJob("Update Loan Arrears Ageing");
-            schedulerJobHelper.executeAndAwaitJob("Recalculate Interest For Loans");
-
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            logLoanDetails(loanDetails);
-
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "01 February 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 2, "01 March 2023", 1975.17, 0.0, 0.0, 66.67);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 3, "01 April 2023", 2007.03, 0.0, 0.0, 34.81);
-            validateFullyUnpaidRepaymentPeriod(loanDetails, 4, "01 May 2023", 2042.63, 0.0, 0.0, 17.02);
-        });
-        payoffOnDateAndVerifyStatus("1 February 2023", loanIdRef.get());
+        payoffOnDateAndVerifyStatus("2 February 2023", loanIdRef.get());
     }
 
     @Test
@@ -1104,18 +991,11 @@
 
             disburseLoan(loanId, BigDecimal.valueOf(8000), "1 January 2023");
 
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-
-            validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2023, 2, 1), 3783.06, 0.0, 3783.06, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 817.94,
-                    0.0, 817.94, 0.0, 0.0);
-            validateRepaymentPeriod(loanDetails, 2, LocalDate.of(2023, 3, 1), 4216.94, 0.0, 4216.94, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 385.53,
-                    0.0, 385.53, 0.0, 0.0);
         });
         runAt("2 February 2023", () -> {
             Long loanId = loanIdRef.get();
 
-            schedulerJobHelper.executeAndAwaitJob("Update Loan Arrears Ageing");
-            schedulerJobHelper.executeAndAwaitJob("Recalculate Interest For Loans");
+            executeInterestRecalculationJobs();
 
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
 
@@ -1206,8 +1086,7 @@
         runAt("8 February 2023", () -> {
             Long loanId = loanIdRef.get();
 
-            schedulerJobHelper.executeAndAwaitJob("Update Loan Arrears Ageing");
-            schedulerJobHelper.executeAndAwaitJob("Recalculate Interest For Loans");
+            executeInterestRecalculationJobs();
 
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
             logLoanDetails(loanDetails);
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRefundTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRefundTest.java
index 047c7ee..16f8cf9 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRefundTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestRefundTest.java
@@ -1553,50 +1553,42 @@
         });
 
         runAt("04 April 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             Long response = loanTransactionHelper.makeLoanRepayment(loanIdRef.get(), "Repayment", "04 April 2025", 48.91).getResourceId();
             Assertions.assertNotNull(response);
         });
 
         runAt("02 May 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             Long response = loanTransactionHelper.makeLoanRepayment(loanIdRef.get(), "Repayment", "02 May 2025", 48.91).getResourceId();
             Assertions.assertNotNull(response);
         });
 
         runAt("30 May 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             Long response = loanTransactionHelper.makeLoanRepayment(loanIdRef.get(), "Repayment", "30 May 2025", 48.91).getResourceId();
             Assertions.assertNotNull(response);
         });
 
         runAt("27 June 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             Long response = loanTransactionHelper.makeLoanRepayment(loanIdRef.get(), "Repayment", "27 June 2025", 48.91).getResourceId();
             Assertions.assertNotNull(response);
         });
 
         runAt("08 August 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             Long response = loanTransactionHelper.makeLoanRepayment(loanIdRef.get(), "Repayment", "08 August 2025", 48.91).getResourceId();
             Assertions.assertNotNull(response);
         });
 
         runAt("05 September 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             Long response = loanTransactionHelper.makeLoanRepayment(loanIdRef.get(), "Repayment", "05 September 2025", 48.91)
                     .getResourceId();
             Assertions.assertNotNull(response);
         });
 
         runAt("03 October 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             Long response = loanTransactionHelper.makeLoanRepayment(loanIdRef.get(), "Repayment", "03 October 2025", 48.91).getResourceId();
             Assertions.assertNotNull(response);
         });
 
         runAt("08 October 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             for (int i = 0; i < totalTransactions; i++) {
                 final String transactionExternalId = UUID.randomUUID().toString();
                 PostLoansLoanIdTransactionsResponse refundResponse = loanTransactionHelper.makeMerchantIssuedRefund(loanIdRef.get(),
@@ -1609,7 +1601,6 @@
         });
 
         runAt("09 October 2025", () -> {
-            executeInlineCOB(loanIdRef.get());
             loanTransactionHelper.makeCreditBalanceRefund(loanIdRef.get(), new PostLoansLoanIdTransactionsRequest()
                     .dateFormat(DATETIME_PATTERN).transactionDate("09 October 2025").locale(LOCALE).transactionAmount(225.15));
 
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPrepayAmountTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPrepayAmountTest.java
index 96d395c..3c81b5d 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPrepayAmountTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPrepayAmountTest.java
@@ -72,7 +72,6 @@
             loanId = postLoansResponse.getLoanId();
             loanTransactionHelper.approveLoan(loanId, approveLoanRequest(296.79, "15 March 2025"));
             disburseLoan(loanId, BigDecimal.valueOf(296.79), "15 March 2025");
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
         });
         runAt("16 March 2025", () -> {
             loanTransactionHelper.makeLoanRepayment(loanId, "Repayment", "16 March 2025", 59.0);
@@ -83,10 +82,10 @@
                     "16 March 2025", DATETIME_PATTERN);
             Assertions.assertEquals(BigDecimal.valueOf(prepayAmountResponse.getInterestPortion()).stripTrailingZeros(),
                     loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
         });
-        for (int i = 0; i <= 45; i++) {
-            LocalDate date = LocalDate.of(2025, 3, 17).plusDays(i);
+        for (int i = 1; i < 4; i++) {
+            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
+            LocalDate date = LocalDate.of(2025, 3, 17).plusDays(i * 11);
             String formattedDate = DateTimeFormatter.ofPattern(DATETIME_PATTERN).format(date);
             runAt(formattedDate, () -> {
                 GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
@@ -94,7 +93,6 @@
                         formattedDate, DATETIME_PATTERN);
                 Assertions.assertEquals(loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros(),
                         BigDecimal.valueOf(prepayAmountResponse.getInterestPortion()).stripTrailingZeros());
-                inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
             });
         }
     }
@@ -120,7 +118,6 @@
                     "16 March 2025", DATETIME_PATTERN);
             Assertions.assertEquals(BigDecimal.valueOf(44.43).stripTrailingZeros(),
                     BigDecimal.valueOf(prepayAmountResponse.getInterestPortion()).stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
         });
     }
 }
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSummaryTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSummaryTest.java
index 4b18ac9..8610564 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSummaryTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSummaryTest.java
@@ -148,34 +148,6 @@
                     loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
             inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
         });
-        runAt("19 March 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(0.69),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-        runAt("20 March 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(0.92),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-        runAt("21 March 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(1.15),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-        runAt("22 March 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(1.38),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
         runAt("14 May 2025", () -> {
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
             Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
@@ -191,41 +163,7 @@
                     loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
             inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
         });
-        runAt("16 May 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(14.28),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-        runAt("17 May 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(14.51),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-        runAt("18 May 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(14.74),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-        runAt("19 May 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(14.97),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
-        runAt("20 May 2025", () -> {
-            GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
-            Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
-            Assertions.assertEquals(BigDecimal.valueOf(15.20),
-                    loanDetails.getSummary().getTotalUnpaidPayableNotDueInterest().stripTrailingZeros());
-            inlineLoanCOBHelper.executeInlineCOB(List.of(loanId));
-        });
+
         runAt("14 June 2025", () -> {
             GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
             Assertions.assertEquals(BigDecimal.ZERO, loanDetails.getSummary().getTotalUnpaidPayableDueInterest().stripTrailingZeros());
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java
index df505cc..adb8b1d 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java
@@ -69,15 +69,6 @@
 
             disburseLoan(loanId, BigDecimal.valueOf(430), "20 December 2024");
         });
-        runAt("21 December 2024", () -> {
-            executeInlineCOB(loanIdRef.get());
-        });
-        runAt("20 January 2025", () -> {
-            Long loanId = loanIdRef.get();
-            executeInlineCOB(loanId);
-
-            loanTransactionHelper.makeLoanRepayment(loanId, "Repayment", "20 January 2025", 82.20);
-        });
         runAt("20 February 2025", () -> {
             Long loanId = loanIdRef.get();
             executeInlineCOB(loanId);
@@ -87,9 +78,9 @@
         runAt("23 February 2025", () -> {
             Long loanId = loanIdRef.get();
             executeInlineCOB(loanId);
-
+            loanTransactionHelper.makeLoanRepayment(loanId, "Repayment", "23 February 2025", 82.20);
             final GetLoansLoanIdTransactionsResponse allLoanTransactionsPage = loanTransactionHelper.getLoanTransactions(loanId);
-            Assertions.assertEquals(67L, allLoanTransactionsPage.getTotalElements());
+            Assertions.assertEquals(7L, allLoanTransactionsPage.getTotalElements());
 
             final GetLoansLoanIdTransactionsResponse nonAccrualLoanTransactionsPage = loanTransactionHelper.getLoanTransactions(loanId,
                     List.of(TransactionType.ACCRUAL));
@@ -97,7 +88,7 @@
 
             final GetLoansLoanIdTransactionsResponse allLoanTransactionsByExternalIdPage = loanTransactionHelper
                     .getLoanTransactionsByExternalId(loanExternalIdStr);
-            Assertions.assertEquals(67L, allLoanTransactionsByExternalIdPage.getTotalElements());
+            Assertions.assertEquals(7L, allLoanTransactionsByExternalIdPage.getTotalElements());
 
             final GetLoansLoanIdTransactionsResponse nonAccrualLoanTransactionsByExternalIdPage = loanTransactionHelper
                     .getLoanTransactionsByExternalId(loanExternalIdStr, List.of(TransactionType.ACCRUAL));
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccountTransactionTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccountTransactionTest.java
index 935570b..d8bad10 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccountTransactionTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccountTransactionTest.java
@@ -28,7 +28,6 @@
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import com.google.common.base.Strings;
@@ -42,15 +41,17 @@
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import org.apache.fineract.batch.domain.BatchRequest;
 import org.apache.fineract.batch.domain.BatchResponse;
@@ -84,10 +85,18 @@
     private static final Logger log = LoggerFactory.getLogger(SavingsAccountTransactionTest.class);
 
     public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL";
+    private static final int CONCURRENT_SAVINGS_ITERATIONS = 10;
+    private static final int CONCURRENT_SAVINGS_THREAD_COUNT = CONCURRENT_SAVINGS_ITERATIONS;
+    private static final int CONCURRENT_BATCH_ITERATIONS = 5;
+    private static final int CONCURRENT_BATCH_THREAD_COUNT = CONCURRENT_BATCH_ITERATIONS * 2;
+    private static final int DEADLOCK_BATCH_ITERATIONS = 5;
+    private static final int DEADLOCK_BATCH_THREAD_COUNT = DEADLOCK_BATCH_ITERATIONS * 2;
+    private static final int EXECUTOR_TIMEOUT_SECONDS = 30;
     final String startDateString = "03 June 2023";
     final String depositDateString = "05 June 2023";
     final String withdrawDateString = "10 June 2023";
 
+    private String authenticationKey;
     private ResponseSpecification responseSpec;
     private ResponseSpecification concurrentResponseSpec;
     private ResponseSpecification deadlockResponseSpec;
@@ -101,7 +110,8 @@
     public void setup() {
         Utils.initializeRESTAssured();
         this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
-        this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
+        this.authenticationKey = Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey();
+        this.requestSpec.header("Authorization", "Basic " + authenticationKey);
         this.responseSpec = new ResponseSpecBuilder().expectStatusCode(SC_OK).build();
         this.concurrentResponseSpec = new ResponseSpecBuilder().expectStatusCode(anyOf(is(SC_OK), is(SC_CONFLICT))).build();
         this.deadlockResponseSpec = new ResponseSpecBuilder().expectStatusCode(anyOf(is(SC_OK), is(SC_CONFLICT), is(SC_FORBIDDEN))).build();
@@ -149,24 +159,7 @@
         HashMap savingsStatusHashMap = this.savingsAccountHelper.activateSavings(savingsId);
         SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
 
-        SavingsAccountHelper concurrentHelper = new SavingsAccountHelper(requestSpec, concurrentResponseSpec);
-        String transactionDate = SavingsAccountHelper.TRANSACTION_DATE;
-        String transactionAmount = "10";
-        ExecutorService executor = Executors.newFixedThreadPool(30);
-        for (int i = 0; i < 10; i++) {
-            log.info("Starting concurrent transaction number {}", i);
-            SavingsTransactionData transactionData = SavingsTransactionData.builder().transactionDate(transactionDate)
-                    .transactionAmount(transactionAmount).paymentTypeId(PAYMENT_TYPE_ID).note("note_" + i).build();
-            Runnable worker = new TransactionExecutor(concurrentHelper, savingsId, transactionData);
-            executor.execute(worker);
-        }
-
-        executor.shutdown();
-        // Wait until all threads are finish
-        while (!executor.isTerminated()) {
-
-        }
-        log.info("\nFinished all threads");
+        runConcurrentSavingsTransactions(savingsId);
     }
 
     @Test
@@ -199,39 +192,11 @@
         String datatableJson = new Gson().toJson(columnMap);
         this.datatableHelper.createDatatable(datatableJson, "");
 
-        SavingsAccountHelper batchWithTransactionHelper = new SavingsAccountHelper(requestSpec, concurrentResponseSpec);
-        SavingsAccountHelper batchWithoutTransactionHelper = new SavingsAccountHelper(requestSpec,
-                new ResponseSpecBuilder().expectStatusCode(anyOf(is(SC_OK), is(SC_CONFLICT), is(SC_FORBIDDEN))).build());
-        String transactionDate = SavingsAccountHelper.TRANSACTION_DATE;
-        String transactionAmount = "10";
-        ExecutorService executor = Executors.newFixedThreadPool(30);
-        ArrayList<Future<?>> results = new ArrayList<>();
-        for (int i = 0; i < 5; i++) {
-            log.info("Starting concurrent transaction number {}", i);
-            SavingsTransactionData transactionData = SavingsTransactionData.builder().transactionDate(transactionDate)
-                    .transactionAmount(transactionAmount).paymentTypeId(PAYMENT_TYPE_ID).note("note_" + i).build();
-            Runnable workerWithTransaction = new TransactionExecutor(batchWithTransactionHelper, savingsId, transactionData, true,
-                    datatableName, columnNames);
-            results.add(executor.submit(workerWithTransaction));
-            Runnable workerWithoutTransaction = new TransactionExecutor(batchWithoutTransactionHelper, savingsId, transactionData, false,
-                    datatableName, columnNames);
-            results.add(executor.submit(workerWithoutTransaction));
-        }
-
-        executor.shutdown();
-        // Wait until all threads are finish
-        while (!executor.isTerminated()) {
-
-        }
-        this.datatableHelper.deleteDatatable(datatableName);
         try {
-            for (Future<?> result : results) {
-                assertNull(result.get());
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+            runConcurrentSavingsBatchTransactions(savingsId, datatableName, columnNames);
+        } finally {
+            this.datatableHelper.deleteDatatable(datatableName);
         }
-        log.info("\nFinished all threads");
     }
 
     @Test
@@ -250,46 +215,16 @@
         savingsAccountHelper.approveSavings(savingsId2);
         savingsAccountHelper.activateSavings(savingsId2);
 
-        SavingsAccountHelper batchWithTransactionHelper = new SavingsAccountHelper(requestSpec, deadlockResponseSpec);
-        String transactionDate = SavingsAccountHelper.TRANSACTION_DATE;
-        String transactionAmount = "10";
-
-        ExecutorService executor = Executors.newFixedThreadPool(30);
-        ArrayList<Future<?>> results = new ArrayList<>();
-        for (int i = 0; i < 5; i++) {
-            log.info("Starting concurrent transaction number {}", i);
-            SavingsTransactionData transactionData1 = SavingsTransactionData.builder().transactionDate(transactionDate)
-                    .transactionAmount(transactionAmount).paymentTypeId(PAYMENT_TYPE_ID).note("note1_" + i).build();
-            results.add(executor.submit(() -> {
-                runDeadlockBatch(batchWithTransactionHelper, savingsId1, savingsId2, transactionData1);
-            }));
-            SavingsTransactionData transactionData2 = SavingsTransactionData.builder().transactionDate(transactionDate)
-                    .transactionAmount(transactionAmount).paymentTypeId(PAYMENT_TYPE_ID).note("note2_" + i).build();
-            results.add(executor.submit(() -> {
-                runDeadlockBatch(batchWithTransactionHelper, savingsId2, savingsId1, transactionData2);
-            }));
-        }
-
-        executor.shutdown();
-        // Wait until all threads are finish
-        while (!executor.isTerminated()) {
-
-        }
-        try {
-            for (Future<?> result : results) {
-                assertNull(result.get());
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        log.info("\nFinished all threads");
+        runConcurrentDeadlockSavingsBatchTransactions(savingsId1, savingsId2);
     }
 
     private void performSavingsTransaction(Integer savingsId, String amount, LocalDate transactionDate, boolean isDeposit) {
         String transactionType = isDeposit ? "Deposit" : "Withdrawal";
+        String formattedTransactionDate = Utils.dateFormatter.format(transactionDate);
         Integer transactionId = isDeposit
-                ? (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, amount, depositDateString, RESPONSE_RESOURCE_ID)
-                : (Integer) this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, amount, withdrawDateString,
+                ? (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, amount, formattedTransactionDate,
+                        RESPONSE_RESOURCE_ID)
+                : (Integer) this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, amount, formattedTransactionDate,
                         RESPONSE_RESOURCE_ID);
 
         assertNotNull(transactionId);
@@ -326,92 +261,216 @@
         return SavingsProductHelper.createSavingsProduct(savingsProductJSON, requestSpec, responseSpec);
     }
 
+    private void runConcurrentSavingsTransactions(Integer savingsId) {
+        ExecutorService executor = Executors.newFixedThreadPool(CONCURRENT_SAVINGS_THREAD_COUNT);
+        CountDownLatch startLatch = new CountDownLatch(1);
+        CountDownLatch doneLatch = new CountDownLatch(CONCURRENT_SAVINGS_THREAD_COUNT);
+        List<String> failures = Collections.synchronizedList(new ArrayList<>());
+
+        for (int i = 0; i < CONCURRENT_SAVINGS_ITERATIONS; i++) {
+            SavingsTransactionData transactionData = SavingsTransactionData.builder().transactionDate(SavingsAccountHelper.TRANSACTION_DATE)
+                    .transactionAmount("10").paymentTypeId(PAYMENT_TYPE_ID).note("note_" + i).build();
+            executor.execute(() -> {
+                try {
+                    startLatch.await();
+                    new TransactionExecutor(new SavingsAccountHelper(newConcurrentRequestSpecification(), concurrentResponseSpec),
+                            savingsId, transactionData).run();
+                } catch (AssertionError | Exception e) {
+                    String failure = "concurrent savings transaction failed for note " + transactionData.getNote() + ": " + e.getMessage();
+                    failures.add(failure);
+                    log.error(failure, e);
+                } finally {
+                    doneLatch.countDown();
+                }
+            });
+        }
+
+        awaitExecutorCompletion(executor, startLatch, doneLatch, "Concurrent savings transactions", failures);
+    }
+
+    private void runConcurrentSavingsBatchTransactions(Integer savingsId, String datatableName, List<String> columnNames) {
+        ExecutorService executor = Executors.newFixedThreadPool(CONCURRENT_BATCH_THREAD_COUNT);
+        CountDownLatch startLatch = new CountDownLatch(1);
+        CountDownLatch doneLatch = new CountDownLatch(CONCURRENT_BATCH_THREAD_COUNT);
+        List<String> failures = Collections.synchronizedList(new ArrayList<>());
+
+        for (int i = 0; i < CONCURRENT_BATCH_ITERATIONS; i++) {
+            SavingsTransactionData transactionData = SavingsTransactionData.builder().transactionDate(SavingsAccountHelper.TRANSACTION_DATE)
+                    .transactionAmount("10").paymentTypeId(PAYMENT_TYPE_ID).note("note_" + i).build();
+            submitConcurrentSavingsBatch(executor, startLatch, doneLatch, failures, savingsId, transactionData, true, datatableName,
+                    columnNames);
+            submitConcurrentSavingsBatch(executor, startLatch, doneLatch, failures, savingsId, transactionData, false, datatableName,
+                    columnNames);
+        }
+
+        awaitExecutorCompletion(executor, startLatch, doneLatch, "Concurrent savings batch transactions", failures);
+    }
+
+    private void submitConcurrentSavingsBatch(ExecutorService executor, CountDownLatch startLatch, CountDownLatch doneLatch,
+            List<String> failures, Integer savingsId, SavingsTransactionData transactionData, boolean enclosingTransaction,
+            String datatableName, List<String> columnNames) {
+        executor.execute(() -> {
+            try {
+                startLatch.await();
+                executeSavingsBatchTransaction(savingsId, transactionData, enclosingTransaction, datatableName, columnNames);
+            } catch (AssertionError | Exception e) {
+                String batchType = enclosingTransaction ? "enclosing-transaction" : "non-enclosing-transaction";
+                String failure = batchType + " batch failed for note " + transactionData.getNote() + ": " + e.getMessage();
+                failures.add(failure);
+                log.error(failure, e);
+            } finally {
+                doneLatch.countDown();
+            }
+        });
+    }
+
+    private void executeSavingsBatchTransaction(Integer savingsId, SavingsTransactionData transactionData, boolean enclosingTransaction,
+            String datatableName, List<String> columnNames) {
+        final BatchRequest depositRequest = BatchHelper.depositSavingAccount(1L, savingsId.longValue(), transactionData);
+        Set<Header> headers = Optional.ofNullable(depositRequest.getHeaders()).orElse(new HashSet<>(1));
+        headers.add(new Header("Idempotency-Key", UUID.randomUUID().toString()));
+        depositRequest.setHeaders(headers);
+
+        BatchRequest addEntryRequest = BatchHelper.createDatatableEntryRequest("$.resourceId", datatableName, columnNames);
+        addEntryRequest.setReference(1L);
+        BatchRequest deleteEntryRequest = BatchHelper.deleteDatatableEntryRequest("$.transactionId", datatableName, null);
+
+        final BatchRequest withdrawRequest = BatchHelper.withdrawSavingAccount(2L, savingsId.longValue(), transactionData);
+        headers = Optional.ofNullable(withdrawRequest.getHeaders()).orElse(new HashSet<>(1));
+        headers.add(new Header("Idempotency-Key", UUID.randomUUID().toString()));
+        withdrawRequest.setHeaders(headers);
+
+        String json = BatchHelper.toJsonString(Arrays.asList(depositRequest, addEntryRequest, deleteEntryRequest, withdrawRequest));
+        SavingsAccountHelper savingsHelper = new SavingsAccountHelper(newConcurrentRequestSpecification(),
+                enclosingTransaction ? concurrentResponseSpec : deadlockResponseSpec);
+        final List<BatchResponse> responses = enclosingTransaction
+                ? BatchHelper.postBatchRequestsWithEnclosingTransaction(savingsHelper.getRequestSpec(), savingsHelper.getResponseSpec(),
+                        json)
+                : BatchHelper.postBatchRequestsWithoutEnclosingTransaction(savingsHelper.getRequestSpec(), savingsHelper.getResponseSpec(),
+                        json);
+
+        assertNotNull(responses, "Responses");
+        if (enclosingTransaction) {
+            assertEnclosingTransactionBatchResponses(responses);
+        } else {
+            assertNonEnclosingTransactionBatchResponses(responses);
+        }
+    }
+
+    private RequestSpecification newConcurrentRequestSpecification() {
+        return new RequestSpecBuilder().setContentType(ContentType.JSON).addHeader("Authorization", "Basic " + authenticationKey).build();
+    }
+
+    private void runConcurrentDeadlockSavingsBatchTransactions(Integer savingsId1, Integer savingsId2) {
+        ExecutorService executor = Executors.newFixedThreadPool(DEADLOCK_BATCH_THREAD_COUNT);
+        CountDownLatch startLatch = new CountDownLatch(1);
+        CountDownLatch doneLatch = new CountDownLatch(DEADLOCK_BATCH_THREAD_COUNT);
+        List<String> failures = Collections.synchronizedList(new ArrayList<>());
+
+        for (int i = 0; i < DEADLOCK_BATCH_ITERATIONS; i++) {
+            SavingsTransactionData transactionData1 = SavingsTransactionData.builder()
+                    .transactionDate(SavingsAccountHelper.TRANSACTION_DATE).transactionAmount("10").paymentTypeId(PAYMENT_TYPE_ID)
+                    .note("note1_" + i).build();
+            submitDeadlockBatch(executor, startLatch, doneLatch, failures, savingsId1, savingsId2, transactionData1);
+
+            SavingsTransactionData transactionData2 = SavingsTransactionData.builder()
+                    .transactionDate(SavingsAccountHelper.TRANSACTION_DATE).transactionAmount("10").paymentTypeId(PAYMENT_TYPE_ID)
+                    .note("note2_" + i).build();
+            submitDeadlockBatch(executor, startLatch, doneLatch, failures, savingsId2, savingsId1, transactionData2);
+        }
+
+        awaitExecutorCompletion(executor, startLatch, doneLatch, "Concurrent deadlock savings batch transactions", failures);
+    }
+
+    private void submitDeadlockBatch(ExecutorService executor, CountDownLatch startLatch, CountDownLatch doneLatch, List<String> failures,
+            Integer savingsId1, Integer savingsId2, SavingsTransactionData transactionData) {
+        executor.execute(() -> {
+            try {
+                startLatch.await();
+                runDeadlockBatch(new SavingsAccountHelper(newConcurrentRequestSpecification(), deadlockResponseSpec), savingsId1,
+                        savingsId2, transactionData);
+            } catch (AssertionError | Exception e) {
+                String failure = "deadlock batch failed for note " + transactionData.getNote() + ": " + e.getMessage();
+                failures.add(failure);
+                log.error(failure, e);
+            } finally {
+                doneLatch.countDown();
+            }
+        });
+    }
+
+    private void awaitExecutorCompletion(ExecutorService executor, CountDownLatch startLatch, CountDownLatch doneLatch, String description,
+            List<String> failures) {
+        startLatch.countDown();
+        try {
+            assertTrue(doneLatch.await(EXECUTOR_TIMEOUT_SECONDS, TimeUnit.SECONDS), description + " did not complete within timeout");
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new IllegalStateException("Interrupted while waiting for " + description.toLowerCase(), e);
+        } finally {
+            executor.shutdown();
+        }
+
+        try {
+            assertTrue(executor.awaitTermination(EXECUTOR_TIMEOUT_SECONDS, TimeUnit.SECONDS), "ExecutorService should terminate");
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new IllegalStateException("Interrupted while waiting for executor shutdown", e);
+        }
+        assertTrue(failures.isEmpty(), String.join(System.lineSeparator(), failures));
+    }
+
+    private void assertEnclosingTransactionBatchResponses(List<BatchResponse> responses) {
+        Integer statusCode1 = responses.get(0).getStatusCode();
+        assertNotNull(statusCode1, "First enclosingTransaction response status code");
+        assertTrue(SC_OK == statusCode1 || SC_CONFLICT == statusCode1, "Status code: " + statusCode1);
+        if (SC_OK == statusCode1) {
+            assertEquals(4, responses.size(), "Response size for enclosingTransaction OK response");
+            Integer statusCode4 = responses.get(3).getStatusCode();
+            assertNotNull(statusCode4, "Last enclosingTransaction OK response status code");
+            assertEquals(SC_OK, statusCode4, "Last enclosingTransaction OK response status code");
+        } else {
+            assertEquals(1, responses.size(), "Response size for enclosingTransaction failed response");
+        }
+    }
+
+    private void assertNonEnclosingTransactionBatchResponses(List<BatchResponse> responses) {
+        assertEquals(4, responses.size(), "Response size for non-enclosingTransaction response");
+        Integer statusCode1 = responses.get(0).getStatusCode();
+        assertNotNull(statusCode1, "First non-enclosingTransaction response status code");
+        assertTrue(SC_OK == statusCode1 || SC_CONFLICT == statusCode1,
+                "First non-enclosingTransaction response status code: " + statusCode1);
+
+        Integer statusCode4 = responses.get(3).getStatusCode();
+        assertNotNull(statusCode4, "Last non-enclosingTransaction response status code");
+        assertTrue(
+                SC_OK == statusCode1 ? (SC_OK == statusCode4 || SC_CONFLICT == statusCode4)
+                        : (SC_FORBIDDEN == statusCode4 || SC_CONFLICT == statusCode4),
+                "Last non-enclosingTransaction response status code: " + statusCode4);
+    }
+
     public static class TransactionExecutor implements Runnable {
 
         private final SavingsAccountHelper savingsHelper;
         private final Integer savingsId;
         SavingsTransactionData transactionData;
-        private final boolean batch;
-        private final boolean enclosingTransaction;
-        private final String datatableName;
-        private final List<String> columnNames;
-
-        private TransactionExecutor(SavingsAccountHelper savingsHelper, Integer savingsId, SavingsTransactionData transactionData,
-                boolean batch, boolean enclosingTransaction, String datatableName, List<String> columnNames) {
-            this.savingsId = savingsId;
-            this.savingsHelper = savingsHelper;
-            this.transactionData = transactionData;
-            this.batch = batch;
-            this.enclosingTransaction = enclosingTransaction;
-            this.datatableName = datatableName;
-            this.columnNames = columnNames;
-        }
 
         TransactionExecutor(SavingsAccountHelper savingsAccountHelper, Integer savingsId, SavingsTransactionData transactionData) {
-            this(savingsAccountHelper, savingsId, transactionData, false, false, null, null);
-        }
-
-        TransactionExecutor(SavingsAccountHelper batchHelper, Integer savingsId, SavingsTransactionData transactionData,
-                boolean enclosingTransaction, String datatableName, List<String> columnNames) {
-            this(batchHelper, savingsId, transactionData, true, enclosingTransaction, datatableName, columnNames);
+            this.savingsId = savingsId;
+            this.savingsHelper = savingsAccountHelper;
+            this.transactionData = transactionData;
         }
 
         @Override
         public void run() {
             log.info("Details of passed concurrent transaction, details (date, amount, note, savingsId) are {},{},{},{}",
                     transactionData.getTransactionDate(), transactionData.getTransactionAmount(), transactionData.getNote(), savingsId);
-            if (batch) {
-                final BatchRequest depositRequest = BatchHelper.depositSavingAccount(1L, savingsId.longValue(), transactionData);
-                Set<Header> headers = Optional.ofNullable(depositRequest.getHeaders()).orElse(new HashSet<>(1));
-                headers.add(new Header("Idempotency-Key", UUID.randomUUID().toString()));
-                depositRequest.setHeaders(headers);
-                BatchRequest addEntryRequest = BatchHelper.createDatatableEntryRequest("$.resourceId", datatableName, columnNames);
-                addEntryRequest.setReference(1L);
-                BatchRequest deleteEntryRequest = BatchHelper.deleteDatatableEntryRequest("$.transactionId", datatableName, null);
-                final BatchRequest withdrawRequest = BatchHelper.withdrawSavingAccount(2L, savingsId.longValue(), transactionData);
-                headers = Optional.ofNullable(withdrawRequest.getHeaders()).orElse(new HashSet<>(1));
-                headers.add(new Header("Idempotency-Key", UUID.randomUUID().toString()));
-                withdrawRequest.setHeaders(headers);
-                String json = BatchHelper.toJsonString(Arrays.asList(depositRequest, addEntryRequest, deleteEntryRequest, withdrawRequest));
-                RequestSpecification requestSpec = savingsHelper.getRequestSpec();
-                ResponseSpecification responseSpec = savingsHelper.getResponseSpec();
-                final List<BatchResponse> responses = enclosingTransaction
-                        ? BatchHelper.postBatchRequestsWithEnclosingTransaction(requestSpec, responseSpec, json)
-                        : BatchHelper.postBatchRequestsWithoutEnclosingTransaction(requestSpec, responseSpec, json);
-                assertNotNull(responses, "Responses");
-                if (enclosingTransaction) {
-                    Integer statusCode1 = responses.get(0).getStatusCode();
-                    assertNotNull(statusCode1, "First enlosingTransaction response status code");
-                    assertTrue(SC_OK == statusCode1 || SC_CONFLICT == statusCode1, "Status code: " + statusCode1);
-                    if (SC_OK == statusCode1) {
-                        assertEquals(4, responses.size(), "Response size for enlosingTransaction OK response");
-                        Integer statusCode4 = responses.get(3).getStatusCode();
-                        assertNotNull(statusCode4, "Last enlosingTransaction OK response status code");
-                        assertEquals(SC_OK, statusCode4, "Last enlosingTransaction OK response status code");
-                    } else {
-                        assertEquals(1, responses.size(), "Response size for enlosingTransaction failed response");
-                    }
-                } else {
-                    assertEquals(4, responses.size(), "Response size for without-enlosingTransaction response");
-                    Integer statusCode1 = responses.get(0).getStatusCode();
-                    assertNotNull(statusCode1, "First without-enlosingTransaction response status code");
-                    assertTrue(SC_OK == statusCode1 || SC_CONFLICT == statusCode1,
-                            "First without-enlosingTransaction response status code: " + statusCode1);
-                    Integer statusCode4 = responses.get(3).getStatusCode();
-                    assertNotNull(statusCode4, "Last without-enlosingTransaction response status code");
-                    assertTrue(
-                            SC_OK == statusCode1 ? (SC_OK == statusCode4 || SC_CONFLICT == statusCode4)
-                                    : (SC_FORBIDDEN == statusCode4 || SC_CONFLICT == statusCode4),
-                            "Last without-enlosingTransaction response status code: " + statusCode4);
-                }
-            } else {
-                String json = transactionData.getJson();
-                String response = (String) this.savingsHelper.depositToSavingsAccount(savingsId, json, null);
-                boolean success = checkConcurrentResponse(response);
-                if (success) {
-                    response = (String) this.savingsHelper.withdrawalFromSavingsAccount(savingsId, json, null);
-                    checkConcurrentResponse(response);
-                }
+            String json = transactionData.getJson();
+            String response = (String) this.savingsHelper.depositToSavingsAccount(savingsId, json, null);
+            boolean success = checkConcurrentResponse(response);
+            if (success) {
+                response = (String) this.savingsHelper.withdrawalFromSavingsAccount(savingsId, json, null);
+                checkConcurrentResponse(response);
             }
         }
 
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingTest.java
index 3f436fb..284b312 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingTest.java
@@ -32,20 +32,24 @@
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.IntStream;
 import org.apache.fineract.client.models.PostSavingsAccountsAccountIdRequest;
 import org.apache.fineract.infrastructure.core.service.MathUtil;
 import org.apache.fineract.integrationtests.common.ClientHelper;
 import org.apache.fineract.integrationtests.common.CommonConstants;
-import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper;
+import org.apache.fineract.integrationtests.common.ParallelExecutionHelper;
 import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
 import org.apache.fineract.integrationtests.common.Utils;
 import org.apache.fineract.integrationtests.common.accounting.Account;
 import org.apache.fineract.integrationtests.common.accounting.AccountHelper;
-import org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper;
 import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
 import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
 import org.apache.fineract.integrationtests.common.savings.SavingsTestLifecycleExtension;
@@ -68,12 +72,11 @@
     private SavingsAccountHelper savingsAccountHelper;
     private SchedulerJobHelper schedulerJobHelper;
     public static final String MINIMUM_OPENING_BALANCE = "1000.0";
-    private GlobalConfigurationHelper globalConfigurationHelper;
     private SavingsProductHelper productHelper;
-    private JournalEntryHelper journalEntryHelper;
 
     private static final String ACCRUALS_JOB_NAME = "Add Accrual Transactions For Savings";
     private static final String POST_INTEREST_JOB_NAME = "Post Interest For Savings";
+    private final Set<Long> createdSavingsAccountIds = Collections.synchronizedSet(new LinkedHashSet<>());
 
     @BeforeEach
     public void setup() {
@@ -84,8 +87,6 @@
         this.schedulerJobHelper = new SchedulerJobHelper(this.requestSpec);
         this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec);
         this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
-        this.journalEntryHelper = new JournalEntryHelper(this.requestSpec, this.responseSpec);
-        this.globalConfigurationHelper = new GlobalConfigurationHelper();
     }
 
     @AfterEach
@@ -114,8 +115,7 @@
             final LocalDate startDate = LocalDate.of(2025, 2, 1);
             final String startDateString = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US).format(startDate);
 
-            final Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
-                    SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startDateString);
+            final Integer accountId = createTrackedSavingsAccount(clientId, productId, startDateString);
             savingsAccountHelper.approveSavingsOnDate(accountId, startDateString);
             savingsAccountHelper.activateSavings(accountId, startDateString);
             savingsAccountHelper.depositToSavingsAccount(accountId, amount, startDateString, CommonConstants.RESPONSE_RESOURCE_ID);
@@ -161,8 +161,7 @@
             final LocalDate startDate = LocalDate.of(2025, 2, 1);
             final String startDateString = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US).format(startDate);
 
-            final Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
-                    SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startDateString);
+            final Integer accountId = createTrackedSavingsAccount(clientId, productId, startDateString);
             savingsAccountHelper.approveSavingsOnDate(accountId, startDateString);
             savingsAccountHelper.activateSavings(accountId, startDateString);
             savingsAccountHelper.withdrawalFromSavingsAccount(accountId, amount, startDateString, CommonConstants.RESPONSE_RESOURCE_ID);
@@ -212,8 +211,7 @@
             final LocalDate startDate = LocalDate.of(2025, 2, 1);
             final String startStr = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US).format(startDate);
 
-            final Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
-                    SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startStr);
+            final Integer accountId = createTrackedSavingsAccount(clientId, productId, startStr);
             savingsAccountHelper.approveSavingsOnDate(accountId, startStr);
             savingsAccountHelper.activateSavings(accountId, startStr);
             savingsAccountHelper.depositToSavingsAccount(accountId, amountDeposit, startStr, CommonConstants.RESPONSE_RESOURCE_ID);
@@ -278,8 +276,7 @@
             final LocalDate startDate = LocalDate.of(2025, 2, 1);
             final String startStr = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US).format(startDate);
 
-            final Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
-                    SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startStr);
+            final Integer accountId = createTrackedSavingsAccount(clientId, productId, startStr);
             savingsAccountHelper.approveSavingsOnDate(accountId, startStr);
             savingsAccountHelper.activateSavings(accountId, startStr);
             savingsAccountHelper.withdrawalFromSavingsAccount(accountId, amountWithdrawal, startStr, CommonConstants.RESPONSE_RESOURCE_ID);
@@ -343,8 +340,7 @@
             final LocalDate startDate = LocalDate.of(2025, 1, 1);
             final String startStr = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US).format(startDate);
 
-            final Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
-                    SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startStr);
+            final Integer accountId = createTrackedSavingsAccount(clientId, productId, startStr);
             savingsAccountHelper.approveSavingsOnDate(accountId, startStr);
             savingsAccountHelper.activateSavings(accountId, startStr);
             savingsAccountHelper.depositToSavingsAccount(accountId, amountDeposit, startStr, CommonConstants.RESPONSE_RESOURCE_ID);
@@ -419,28 +415,26 @@
 
             final LocalDate startDate = LocalDate.of(2025, 2, 1);
 
-            List<Integer> accountIdList = new ArrayList<>();
-            for (int i = 0; i < 800; i++) {
-
+            final String startDateString = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US).format(startDate);
+            List<Integer> accountIdList = new CopyOnWriteArrayList<>();
+            ParallelExecutionHelper.runInParallel(IntStream.range(0, 200).boxed().toList(), (i) -> {
                 final Integer clientId = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2025");
-                final String startDateString = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.US).format(startDate);
-                final Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
-                        SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startDateString);
+                final Integer accountId = createTrackedSavingsAccount(clientId, productId, startDateString);
 
                 savingsAccountHelper.approveSavingsOnDate(accountId, startDateString);
                 savingsAccountHelper.activateSavings(accountId, startDateString);
                 savingsAccountHelper.depositToSavingsAccount(accountId, amount, startDateString, CommonConstants.RESPONSE_RESOURCE_ID);
-
                 accountIdList.add(accountId);
-            }
-            Assertions.assertEquals(800, accountIdList.size(), "ERROR: Expected 800");
+            });
+            Assertions.assertEquals(200, accountIdList.size(), "ERROR: Expected 200");
 
             schedulerJobHelper.executeAndAwaitJob(POST_INTEREST_JOB_NAME);
+            schedulerJobHelper.executeAndAwaitJob(POST_INTEREST_JOB_NAME);
 
-            for (Integer accountId : accountIdList) {
+            ParallelExecutionHelper.runInParallel(accountIdList, (accountId) -> {
                 List<HashMap> txs = getInterestTransactions(accountId);
                 Assertions.assertEquals(1, txs.size(), "ERROR: Duplicate interest postings exist.");
-            }
+            });
         });
     }
 
@@ -465,8 +459,7 @@
                     .build();
             final Integer productId = SavingsProductHelper.createSavingsProduct(savingsProductJSON, requestSpec, responseSpec);
 
-            final Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
-                    SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, accountOpeningDate);
+            final Integer accountId = createTrackedSavingsAccount(clientId, productId, accountOpeningDate);
 
             savingsAccountHelper.approveSavingsOnDate(accountId, accountOpeningDate);
             savingsAccountHelper.activateSavings(accountId, accountOpeningDate);
@@ -511,11 +504,10 @@
         try {
             LOG.info("Starting cleanup of savings accounts after duplicate prevention test");
 
-            List<Long> savingsIds = SavingsAccountHelper.getSavingsIdsByStatusId(300);
-            if (!savingsIds.isEmpty()) {
-                LOG.info("Found {} savings accounts to cleanup", savingsIds.size());
+            if (!createdSavingsAccountIds.isEmpty()) {
+                LOG.info("Found {} tracked savings accounts to cleanup", createdSavingsAccountIds.size());
 
-                savingsIds.forEach(savingsId -> {
+                createdSavingsAccountIds.forEach(savingsId -> {
                     try {
 
                         savingsAccountHelper.postInterestForSavings(savingsId.intValue());
@@ -529,16 +521,24 @@
                         LOG.warn("Unable to close savings account {}: {}", savingsId, e.getMessage());
                     }
                 });
+                createdSavingsAccountIds.clear();
 
                 LOG.info("Savings accounts cleanup completed");
             } else {
-                LOG.info("No savings accounts found to cleanup");
+                LOG.info("No tracked savings accounts found to cleanup");
             }
         } catch (Exception e) {
             LOG.error("Error during savings accounts cleanup: {}", e.getMessage(), e);
         }
     }
 
+    private Integer createTrackedSavingsAccount(Integer clientId, Integer productId, String submittedOnDate) {
+        Integer accountId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientId, productId,
+                SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, submittedOnDate);
+        createdSavingsAccountIds.add(accountId.longValue());
+        return accountId;
+    }
+
     private List<HashMap> getInterestTransactions(Integer savingsAccountId) {
         List<HashMap> all = savingsAccountHelper.getSavingsTransactions(savingsAccountId);
         List<HashMap> filtered = new ArrayList<>();
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java
index d64af4b..08b88e8 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java
@@ -25,14 +25,15 @@
 import io.restassured.http.ContentType;
 import io.restassured.specification.RequestSpecification;
 import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 import org.apache.fineract.client.models.PutGlobalConfigurationsRequest;
 import org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants;
 import org.apache.fineract.infrastructure.jobs.service.JobName;
 import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper;
+import org.apache.fineract.integrationtests.common.ParallelExecutionHelper;
 import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
 import org.apache.fineract.integrationtests.common.Utils;
 import org.junit.jupiter.api.AfterEach;
@@ -43,7 +44,7 @@
 @Order(1)
 public class SchedulerJobsTest {
 
-    private final Map<Integer, Boolean> originalJobStatus = new HashMap<>();
+    private final Map<Integer, Boolean> originalJobStatus = new ConcurrentHashMap<>();
     private RequestSpecification requestSpec;
     private SchedulerJobHelper schedulerJobHelper;
     private Boolean originalSchedulerStatus;
@@ -57,20 +58,19 @@
         requestSpec.header("Fineract-Platform-TenantId", "default");
         schedulerJobHelper = new SchedulerJobHelper(requestSpec);
         originalSchedulerStatus = schedulerJobHelper.getSchedulerStatus();
-        for (Integer jobId : schedulerJobHelper.getAllSchedulerJobIds()) {
+        ParallelExecutionHelper.runInParallel(schedulerJobHelper.getAllSchedulerJobIds(), (jobId) -> {
             Map<String, Object> schedulerJob = schedulerJobHelper.getSchedulerJobById(jobId);
             Boolean active = (Boolean) schedulerJob.get("active");
             originalJobStatus.put(jobId, active);
-        }
+        });
         globalConfigurationHelper = new GlobalConfigurationHelper();
     }
 
     @AfterEach
     public void tearDown() {
         schedulerJobHelper.updateSchedulerStatus(originalSchedulerStatus);
-        for (Integer jobId : schedulerJobHelper.getAllSchedulerJobIds()) {
-            schedulerJobHelper.updateSchedulerJob(jobId, originalJobStatus.get(jobId));
-        }
+        ParallelExecutionHelper.runInParallel(schedulerJobHelper.getAllSchedulerJobIds(),
+                (jobId) -> schedulerJobHelper.updateSchedulerJob(jobId, originalJobStatus.get(jobId)));
     }
 
     @Test // FINERACT-926
@@ -117,22 +117,24 @@
         schedulerJobHelper.updateSchedulerStatus(false);
 
         // For each retrieved scheduled job (by ID)...
-        for (Integer jobId : schedulerJobHelper.getAllSchedulerJobIds()) {
-            // Retrieving Scheduler Job by ID
-            Map<String, Object> schedulerJob = schedulerJobHelper.getSchedulerJobById(jobId);
+        ParallelExecutionHelper.runInParallel(schedulerJobHelper.getAllSchedulerJobIds(), this::updateJobStatus);
+    }
 
-            Boolean active = (Boolean) schedulerJob.get("active");
-            active = !active;
+    private void updateJobStatus(Integer jobId) {
+        // Retrieving Scheduler Job by ID
+        Map<String, Object> schedulerJob = schedulerJobHelper.getSchedulerJobById(jobId);
 
-            // Updating Scheduler Job
-            Map<String, Object> changes = schedulerJobHelper.updateSchedulerJob(jobId, active);
+        Boolean active = (Boolean) schedulerJob.get("active");
+        active = !active;
 
-            // Verifying Scheduler Job updates
-            assertEquals(active, changes.get("active"), "Verifying Scheduler Job Updates");
+        // Updating Scheduler Job
+        Map<String, Object> changes = schedulerJobHelper.updateSchedulerJob(jobId, active);
 
-            schedulerJob = schedulerJobHelper.getSchedulerJobById(jobId);
-            assertEquals(active, schedulerJob.get("active"), "Verifying Get Scheduler Job");
-        }
+        // Verifying Scheduler Job updates
+        assertEquals(active, changes.get("active"), "Verifying Scheduler Job Updates");
+
+        schedulerJob = schedulerJobHelper.getSchedulerJobById(jobId);
+        assertEquals(active, schedulerJob.get("active"), "Verifying Get Scheduler Job");
     }
 
     @Test
@@ -140,9 +142,8 @@
         try {
             globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
                     new PutGlobalConfigurationsRequest().enabled(true));
-            for (String jobName : schedulerJobHelper.getAllSchedulerJobNames()) {
-                schedulerJobHelper.executeAndAwaitJob(jobName);
-            }
+
+            ParallelExecutionHelper.runInParallel(schedulerJobHelper.getAllSchedulerJobNames(), schedulerJobHelper::executeAndAwaitJob);
         } finally {
             globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
                     new PutGlobalConfigurationsRequest().enabled(false));
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
index ebbc0b0..ee47125 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
@@ -1375,9 +1375,9 @@
                     .getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), penaltyCharge1AddedDate, "10", null));
 
             this.schedulerJobHelper.updateSchedulerStatus(true);
-            this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().active(true).cronExpression("0/5 * * * * ?"));
+            this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().active(true).cronExpression("0/1 * * * * ?"));
 
-            Thread.sleep(11000);
+            Thread.sleep(2000);
             GetLoansLoanIdResponse loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanId);
             assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(1).getDate());
         } finally {
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java
index f553d5a..9f2033b 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java
@@ -142,7 +142,7 @@
         Assertions.assertNotNull(importDocumentId);
 
         // Wait for the creation of output excel
-        Thread.sleep(10000);
+        Thread.sleep(1000);
 
         // check status column of output excel
         String location = LocalContentStorageUtil.path(clientHelper.getOutputTemplateLocation(importDocumentId));
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java
index c1b6210..b149b09 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java
@@ -243,7 +243,7 @@
         Assertions.assertNotNull(importDocumentId);
 
         // Wait for the creation of output excel
-        Thread.sleep(10000);
+        Thread.sleep(1000);
 
         // check status column of output excel
         String location = LocalContentStorageUtil.path(loanTransactionHelper.getOutputTemplateLocation(importDocumentId));
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java
index 7486810..0dc930a 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java
@@ -96,7 +96,7 @@
         Assertions.assertNotNull(importDocumentId);
 
         // Wait for the creation of output excel
-        Thread.sleep(10000);
+        Thread.sleep(1000);
 
         // check status column of output excel
         String location = LocalContentStorageUtil.path(getOutputTemplateLocation(importDocumentId));
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/feign/tests/FeignLoanAccrualOnClosedLoanTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/feign/tests/FeignLoanAccrualOnClosedLoanTest.java
index 092e4c8..d32a591 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/feign/tests/FeignLoanAccrualOnClosedLoanTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/feign/tests/FeignLoanAccrualOnClosedLoanTest.java
@@ -43,61 +43,59 @@
 
     private static final DateTimeFormatter ISO_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     private static final String DATETIME_PATTERN = LoanTestData.DATETIME_PATTERN;
+    private static final String LOAN_START_DATE = "01 January 2026";
+    private static final double PRINCIPAL = 100000.0;
+    private static final double ANNUAL_INTEREST_RATE = 12.0;
+
+    private Long createCumulativeLoan(final int numberOfRepayments) {
+        Long clientId = createClient(LOAN_START_DATE);
+
+        PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
+                .currencyCode("USD")//
+                .principal(PRINCIPAL)//
+                .minPrincipal(1000.0)//
+                .maxPrincipal(200000.0)//
+                .numberOfRepayments(numberOfRepayments)//
+                .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
+                .interestRatePerPeriod(ANNUAL_INTEREST_RATE)//
+                .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
+                .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
+                .allowPartialPeriodInterestCalculation(true);
+
+        Long productId = createLoanProduct(productRequest);
+        Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, LOAN_START_DATE, PRINCIPAL,
+                numberOfRepayments, ANNUAL_INTEREST_RATE));
+        approveLoan(loanId, LoanRequestBuilders.approveLoan(PRINCIPAL, LOAN_START_DATE));
+        disburseLoan(loanId, LoanRequestBuilders.disburseLoan(PRINCIPAL, LOAN_START_DATE));
+        return loanId;
+    }
+
+    private List<GetLoansLoanIdTransactions> getNonReversedTransactions(final GetLoansLoanIdResponse loanDetails,
+            final String transactionTypeCode) {
+        return loanDetails.getTransactions().stream().filter(tx -> transactionTypeCode.equals(tx.getType().getCode()))
+                .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed()).toList();
+    }
+
+    private List<GetLoansLoanIdTransactions> getPostClosureAccruals(final GetLoansLoanIdResponse loanDetails, final LocalDate closureDate) {
+        return getNonReversedTransactions(loanDetails, "loanTransactionType.accrual").stream()
+                .filter(tx -> tx.getDate().isAfter(closureDate)).toList();
+    }
+
+    private double sumInterestPortion(final List<GetLoansLoanIdTransactions> transactions) {
+        return transactions.stream().mapToDouble(tx -> Utils.getDoubleValue(tx.getInterestPortion())).sum();
+    }
 
     @Test
     void testPrepayLoanShouldNotReceiveAccrualAfterClosure() {
         final Long[] loanIdHolder = new Long[1];
 
-        runAt("2026-01-01", () -> {
-            Long clientId = createClient("01 January 2026");
-
-            PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
-                    .currencyCode("USD")//
-                    .principal(100000.0)//
-                    .minPrincipal(1000.0)//
-                    .maxPrincipal(200000.0)//
-                    .numberOfRepayments(12)//
-                    .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
-                    .interestRatePerPeriod(12.0)//
-                    .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
-                    .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
-                    .allowPartialPeriodInterestCalculation(true);
-
-            Long productId = createLoanProduct(productRequest);
-
-            Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, "01 January 2026", 100000.0, 12, 12.0));
-            approveLoan(loanId, LoanRequestBuilders.approveLoan(100000.0, "01 January 2026"));
-            disburseLoan(loanId, LoanRequestBuilders.disburseLoan(100000.0, "01 January 2026"));
-            loanIdHolder[0] = loanId;
-        });
+        runAt("2026-01-01", () -> loanIdHolder[0] = createCumulativeLoan(12));
 
         Long loanId = loanIdHolder[0];
 
-        for (LocalDate date = LocalDate.of(2026, 1, 2); !date.isAfter(LocalDate.of(2026, 2, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-02-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            assertNotNull(loanDetails.getRepaymentSchedule());
-
-            var firstInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 1).findFirst().orElseThrow();
-
-            double firstInstallmentAmount = Utils.getDoubleValue(firstInstallment.getTotalDueForPeriod());
-            log.info("First installment amount: {}", firstInstallmentAmount);
-
-            addRepayment(loanId, repayment(firstInstallmentAmount, "01 February 2026"));
-        });
-
-        for (LocalDate date = LocalDate.of(2026, 2, 2); !date.isAfter(LocalDate.of(2026, 2, 15)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-02-15", () -> {
-            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 February 2026", DATETIME_PATTERN);
+        runAt("2026-01-15", () -> {
+            executeInlineCOB(loanId);
+            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 January 2026", DATETIME_PATTERN);
             assertNotNull(prepayTemplate);
 
             double prepayAmount = prepayTemplate.getAmount();
@@ -105,7 +103,7 @@
             log.info("Prepay template interest portion: {}", prepayTemplate.getInterestPortion());
             log.info("Prepay template principal portion: {}", prepayTemplate.getPrincipalPortion());
 
-            addRepayment(loanId, repayment(prepayAmount, "15 February 2026"));
+            addRepayment(loanId, repayment(prepayAmount, "15 January 2026"));
 
             GetLoansLoanIdResponse loanAfterPrepay = getLoanDetails(loanId);
             log.info("Loan status after prepay: {}", loanAfterPrepay.getStatus().getCode());
@@ -114,7 +112,7 @@
                     "Total outstanding should be 0 after prepay");
         });
 
-        runAt("2026-02-16", () -> {
+        runAt("2026-01-16", () -> {
             executeInlineCOB(loanId);
 
             GetLoansLoanIdResponse loanAfterCOB = getLoanDetails(loanId);
@@ -130,11 +128,8 @@
             List<GetLoansLoanIdTransactions> transactions = loanAfterCOB.getTransactions();
             assertNotNull(transactions);
 
-            LocalDate prepayDate = LocalDate.of(2026, 2, 15);
-            List<GetLoansLoanIdTransactions> postClosureAccruals = transactions.stream()
-                    .filter(tx -> "loanTransactionType.accrual".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getDate().isAfter(prepayDate))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed()).toList();
+            LocalDate prepayDate = LocalDate.of(2026, 1, 15);
+            List<GetLoansLoanIdTransactions> postClosureAccruals = getPostClosureAccruals(loanAfterCOB, prepayDate);
 
             log.info("Post-closure accrual transactions found: {}", postClosureAccruals.size());
             for (GetLoansLoanIdTransactions accrual : postClosureAccruals) {
@@ -153,63 +148,20 @@
     void testPrepayAmountShouldIncludeFullAccruedInterest() {
         final Long[] loanIdHolder = new Long[1];
 
-        runAt("2026-01-01", () -> {
-            Long clientId = createClient("01 January 2026");
-
-            PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
-                    .currencyCode("USD")//
-                    .principal(100000.0)//
-                    .minPrincipal(1000.0)//
-                    .maxPrincipal(200000.0)//
-                    .numberOfRepayments(12)//
-                    .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
-                    .interestRatePerPeriod(12.0)//
-                    .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
-                    .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
-                    .allowPartialPeriodInterestCalculation(true);
-
-            Long productId = createLoanProduct(productRequest);
-
-            Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, "01 January 2026", 100000.0, 12, 12.0));
-            approveLoan(loanId, LoanRequestBuilders.approveLoan(100000.0, "01 January 2026"));
-            disburseLoan(loanId, LoanRequestBuilders.disburseLoan(100000.0, "01 January 2026"));
-            loanIdHolder[0] = loanId;
-        });
+        runAt("2026-01-01", () -> loanIdHolder[0] = createCumulativeLoan(12));
 
         Long loanId = loanIdHolder[0];
 
-        for (LocalDate date = LocalDate.of(2026, 1, 2); !date.isAfter(LocalDate.of(2026, 2, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-02-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var firstInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 1).findFirst().orElseThrow();
-            addRepayment(loanId, repayment(Utils.getDoubleValue(firstInstallment.getTotalDueForPeriod()), "01 February 2026"));
-        });
-
-        for (LocalDate date = LocalDate.of(2026, 2, 2); !date.isAfter(LocalDate.of(2026, 2, 15)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-02-15", () -> {
+        runAt("2026-01-15", () -> {
+            executeInlineCOB(loanId);
             GetLoansLoanIdResponse loanBeforePrepay = getLoanDetails(loanId);
-            double totalAccruedInterest = loanBeforePrepay.getTransactions().stream()
-                    .filter(tx -> "loanTransactionType.accrual".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed())
-                    .mapToDouble(tx -> Utils.getDoubleValue(tx.getInterestPortion())).sum();
-            double totalInterestPaid = loanBeforePrepay.getTransactions().stream()
-                    .filter(tx -> "loanTransactionType.repayment".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed())
-                    .mapToDouble(tx -> Utils.getDoubleValue(tx.getInterestPortion())).sum();
+            double totalAccruedInterest = sumInterestPortion(getNonReversedTransactions(loanBeforePrepay, "loanTransactionType.accrual"));
+            double totalInterestPaid = sumInterestPortion(getNonReversedTransactions(loanBeforePrepay, "loanTransactionType.repayment"));
             double unpaidAccruedInterest = totalAccruedInterest - totalInterestPaid;
             log.info("Before prepay - totalAccrued: {}, totalPaid: {}, unpaidAccrued: {}", totalAccruedInterest, totalInterestPaid,
                     unpaidAccruedInterest);
 
-            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 February 2026", DATETIME_PATTERN);
+            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 January 2026", DATETIME_PATTERN);
             double prepayAmount = prepayTemplate.getAmount();
             double templateInterest = prepayTemplate.getInterestPortion() != null ? prepayTemplate.getInterestPortion() : 0.0;
             log.info("Prepay template - amount: {}, interest: {}, principal: {}", prepayAmount, templateInterest,
@@ -219,13 +171,13 @@
                     "Prepay template interest (" + templateInterest + ") should cover all unpaid accrued interest (" + unpaidAccruedInterest
                             + "). Shortfall: " + (unpaidAccruedInterest - templateInterest));
 
-            addRepayment(loanId, repayment(prepayAmount, "15 February 2026"));
+            addRepayment(loanId, repayment(prepayAmount, "15 January 2026"));
 
             GetLoansLoanIdResponse loanAfterPrepay = getLoanDetails(loanId);
             verifyLoanStatus(loanAfterPrepay, GetLoansLoanIdStatus::getClosedObligationsMet);
         });
 
-        runAt("2026-02-16", () -> {
+        runAt("2026-01-16", () -> {
             executeInlineCOB(loanId);
 
             GetLoansLoanIdResponse loanAfterCOB = getLoanDetails(loanId);
@@ -251,108 +203,34 @@
     void testMaturedLoanPrepayAmountShouldIncludePostMaturityInterest() {
         final Long[] loanIdHolder = new Long[1];
 
-        // Step 1: Create and disburse a 3-installment loan on Jan 1
-        runAt("2026-01-01", () -> {
-            Long clientId = createClient("01 January 2026");
-
-            PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
-                    .currencyCode("USD")//
-                    .principal(100000.0)//
-                    .minPrincipal(1000.0)//
-                    .maxPrincipal(200000.0)//
-                    .numberOfRepayments(3)//
-                    .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
-                    .interestRatePerPeriod(12.0)//
-                    .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
-                    .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
-                    .allowPartialPeriodInterestCalculation(true);
-
-            Long productId = createLoanProduct(productRequest);
-
-            Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, "01 January 2026", 100000.0, 3, 12.0));
-            approveLoan(loanId, LoanRequestBuilders.approveLoan(100000.0, "01 January 2026"));
-            disburseLoan(loanId, LoanRequestBuilders.disburseLoan(100000.0, "01 January 2026"));
-            loanIdHolder[0] = loanId;
-        });
+        runAt("2026-01-01", () -> loanIdHolder[0] = createCumulativeLoan(1));
 
         Long loanId = loanIdHolder[0];
 
-        // Step 2: Run daily COB from Jan 2 to Feb 1
-        for (LocalDate date = LocalDate.of(2026, 1, 2); !date.isAfter(LocalDate.of(2026, 2, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        // Step 3: Pay 1st installment on Feb 1
-        runAt("2026-02-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var firstInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 1).findFirst().orElseThrow();
-            double firstAmount = Utils.getDoubleValue(firstInstallment.getTotalDueForPeriod());
-            log.info("Paying 1st installment: {}", firstAmount);
-            addRepayment(loanId, repayment(firstAmount, "01 February 2026"));
-        });
-
-        // Step 4: Run daily COB from Feb 2 to Mar 1
-        for (LocalDate date = LocalDate.of(2026, 2, 2); !date.isAfter(LocalDate.of(2026, 3, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        // Step 5: Pay 2nd installment on Mar 1
-        runAt("2026-03-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var secondInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 2).findFirst().orElseThrow();
-            double secondAmount = Utils.getDoubleValue(secondInstallment.getTotalDueForPeriod());
-            log.info("Paying 2nd installment: {}", secondAmount);
-            addRepayment(loanId, repayment(secondAmount, "01 March 2026"));
-        });
-
-        // Step 6: Run daily COB from Mar 2 through Apr 15
-        // 3rd installment due date (Apr 1) passes WITHOUT payment — loan matures
-        for (LocalDate date = LocalDate.of(2026, 3, 2); !date.isAfter(LocalDate.of(2026, 4, 15)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        // Step 7: On Apr 15 — all installments past due, loan matured
-        // Query prepay template and verify it includes post-maturity interest
-        runAt("2026-04-15", () -> {
+        runAt("2026-02-15", () -> {
+            executeInlineCOB(loanId);
             GetLoansLoanIdResponse loanBeforePrepay = getLoanDetails(loanId);
             log.info("Loan status before prepay: {}", loanBeforePrepay.getStatus().getCode());
 
-            // Calculate total accrued interest and total interest already paid
-            double totalAccruedInterest = loanBeforePrepay.getTransactions().stream()
-                    .filter(tx -> "loanTransactionType.accrual".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed())
-                    .mapToDouble(tx -> Utils.getDoubleValue(tx.getInterestPortion())).sum();
-            double totalInterestPaid = loanBeforePrepay.getTransactions().stream()
-                    .filter(tx -> "loanTransactionType.repayment".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed())
-                    .mapToDouble(tx -> Utils.getDoubleValue(tx.getInterestPortion())).sum();
+            double totalAccruedInterest = sumInterestPortion(getNonReversedTransactions(loanBeforePrepay, "loanTransactionType.accrual"));
+            double totalInterestPaid = sumInterestPortion(getNonReversedTransactions(loanBeforePrepay, "loanTransactionType.repayment"));
             double unpaidAccruedInterest = totalAccruedInterest - totalInterestPaid;
             log.info("Before prepay - totalAccrued: {}, totalPaid: {}, unpaidAccrued: {}", totalAccruedInterest, totalInterestPaid,
                     unpaidAccruedInterest);
 
-            // Query prepay template
-            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 April 2026", DATETIME_PATTERN);
+            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 February 2026", DATETIME_PATTERN);
             assertNotNull(prepayTemplate);
             double prepayAmount = prepayTemplate.getAmount();
             double templateInterest = prepayTemplate.getInterestPortion() != null ? prepayTemplate.getInterestPortion() : 0.0;
             log.info("Prepay template - amount: {}, interest: {}, principal: {}", prepayAmount, templateInterest,
                     prepayTemplate.getPrincipalPortion());
 
-            // KEY ASSERTION: prepay template interest must cover all unpaid accrued interest
-            // This includes post-maturity interest for Apr 1 → Apr 15
             assertTrue(templateInterest >= unpaidAccruedInterest,
                     "Prepay template interest (" + templateInterest + ") should cover all unpaid accrued interest (" + unpaidAccruedInterest
                             + ") including post-maturity period. Shortfall: " + (unpaidAccruedInterest - templateInterest));
 
-            // Pay the prepay amount
-            addRepayment(loanId, repayment(prepayAmount, "15 April 2026"));
+            addRepayment(loanId, repayment(prepayAmount, "15 February 2026"));
 
-            // Verify loan closes
             GetLoansLoanIdResponse loanAfterPrepay = getLoanDetails(loanId);
             log.info("Loan status after prepay: {}", loanAfterPrepay.getStatus().getCode());
             verifyLoanStatus(loanAfterPrepay, GetLoansLoanIdStatus::getClosedObligationsMet);
@@ -360,8 +238,7 @@
                     "Total outstanding should be 0 after prepay");
         });
 
-        // Step 8: Run COB the next day — verify no spurious accruals
-        runAt("2026-04-16", () -> {
+        runAt("2026-02-16", () -> {
             executeInlineCOB(loanId);
 
             GetLoansLoanIdResponse loanAfterCOB = getLoanDetails(loanId);
@@ -383,11 +260,8 @@
             List<GetLoansLoanIdTransactions> transactions = loanAfterCOB.getTransactions();
             assertNotNull(transactions);
 
-            LocalDate prepayDate = LocalDate.of(2026, 4, 15);
-            List<GetLoansLoanIdTransactions> postClosureAccruals = transactions.stream()
-                    .filter(tx -> "loanTransactionType.accrual".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getDate().isAfter(prepayDate))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed()).toList();
+            LocalDate prepayDate = LocalDate.of(2026, 2, 15);
+            List<GetLoansLoanIdTransactions> postClosureAccruals = getPostClosureAccruals(loanAfterCOB, prepayDate);
 
             log.info("Post-closure accrual transactions found: {}", postClosureAccruals.size());
             for (GetLoansLoanIdTransactions accrual : postClosureAccruals) {
@@ -406,65 +280,12 @@
     void testN1InstallmentExistsAfterPostMaturityPrepay() {
         final Long[] loanIdHolder = new Long[1];
 
-        // Step 1: Create and disburse a 3-installment loan on Jan 1
-        runAt("2026-01-01", () -> {
-            Long clientId = createClient("01 January 2026");
-
-            PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
-                    .currencyCode("USD")//
-                    .principal(100000.0)//
-                    .minPrincipal(1000.0)//
-                    .maxPrincipal(200000.0)//
-                    .numberOfRepayments(3)//
-                    .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
-                    .interestRatePerPeriod(12.0)//
-                    .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
-                    .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
-                    .allowPartialPeriodInterestCalculation(true);
-
-            Long productId = createLoanProduct(productRequest);
-
-            Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, "01 January 2026", 100000.0, 3, 12.0));
-            approveLoan(loanId, LoanRequestBuilders.approveLoan(100000.0, "01 January 2026"));
-            disburseLoan(loanId, LoanRequestBuilders.disburseLoan(100000.0, "01 January 2026"));
-            loanIdHolder[0] = loanId;
-        });
+        runAt("2026-01-01", () -> loanIdHolder[0] = createCumulativeLoan(1));
 
         Long loanId = loanIdHolder[0];
 
-        // Step 2: Run daily COB and pay installments 1 and 2
-        for (LocalDate date = LocalDate.of(2026, 1, 2); !date.isAfter(LocalDate.of(2026, 2, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-02-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var firstInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 1).findFirst().orElseThrow();
-            addRepayment(loanId, repayment(Utils.getDoubleValue(firstInstallment.getTotalDueForPeriod()), "01 February 2026"));
-        });
-
-        for (LocalDate date = LocalDate.of(2026, 2, 2); !date.isAfter(LocalDate.of(2026, 3, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-03-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var secondInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 2).findFirst().orElseThrow();
-            addRepayment(loanId, repayment(Utils.getDoubleValue(secondInstallment.getTotalDueForPeriod()), "01 March 2026"));
-        });
-
-        // Step 3: Let installment 3 (Apr 1) pass unpaid, COB runs through Apr 15
-        for (LocalDate date = LocalDate.of(2026, 3, 2); !date.isAfter(LocalDate.of(2026, 4, 15)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        // Step 4: Before prepay — verify schedule has exactly 3 installment periods
-        runAt("2026-04-15", () -> {
+        runAt("2026-02-15", () -> {
+            executeInlineCOB(loanId);
             GetLoansLoanIdResponse loanBeforePrepay = getLoanDetails(loanId);
             List<GetLoansLoanIdRepaymentPeriod> periodsBeforePrepay = loanBeforePrepay.getRepaymentSchedule().getPeriods().stream()
                     .filter(p -> p.getPeriod() != null).toList();
@@ -474,13 +295,11 @@
                         p.getInterestDue());
             }
 
-            // Prepay on Apr 15
-            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 April 2026", DATETIME_PATTERN);
+            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 February 2026", DATETIME_PATTERN);
             double prepayAmount = prepayTemplate.getAmount();
             log.info("Prepay amount: {}", prepayAmount);
-            addRepayment(loanId, repayment(prepayAmount, "15 April 2026"));
+            addRepayment(loanId, repayment(prepayAmount, "15 February 2026"));
 
-            // After prepay — verify N+1 installment exists
             GetLoansLoanIdResponse loanAfterPrepay = getLoanDetails(loanId);
             verifyLoanStatus(loanAfterPrepay, GetLoansLoanIdStatus::getClosedObligationsMet);
 
@@ -492,21 +311,18 @@
                         p.getDueDate(), p.getInterestDue(), p.getPrincipalDue());
             }
 
-            assertTrue(periodsAfterPrepay.size() > 3,
-                    "After post-maturity prepay, schedule should have more than 3 periods (N+1 installment). Found: "
+            assertTrue(periodsAfterPrepay.size() > 1,
+                    "After post-maturity prepay, schedule should have more than 1 period (N+1 installment). Found: "
                             + periodsAfterPrepay.size());
 
-            // Find the N+1 period (period 4)
-            GetLoansLoanIdRepaymentPeriod n1Period = periodsAfterPrepay.stream().filter(p -> p.getPeriod() == 4).findFirst()
+            GetLoansLoanIdRepaymentPeriod n1Period = periodsAfterPrepay.stream().filter(p -> p.getPeriod() == 2).findFirst()
                     .orElse(periodsAfterPrepay.get(periodsAfterPrepay.size() - 1));
 
-            // N+1 period should cover from Apr 1 onwards
             assertNotNull(n1Period.getFromDate(), "N+1 period should have a fromDate");
             assertNotNull(n1Period.getDueDate(), "N+1 period should have a dueDate");
-            assertEquals(LocalDate.of(2026, 4, 1), n1Period.getFromDate(),
-                    "N+1 period should start from last installment due date (Apr 1)");
+            assertEquals(LocalDate.of(2026, 2, 1), n1Period.getFromDate(),
+                    "N+1 period should start from last installment due date (Feb 1)");
 
-            // N+1 period should have interest > 0
             double n1Interest = Utils.getDoubleValue(n1Period.getInterestDue());
             log.info("N+1 period interest: {}", n1Interest);
             assertTrue(n1Interest > 0, "N+1 period should carry post-maturity interest. Found: " + n1Interest);
@@ -520,87 +336,28 @@
     void testPostMaturityInterestAccruesDaily() {
         final Long[] loanIdHolder = new Long[1];
 
-        // Step 1: Create and disburse a 3-installment loan on Jan 1
-        runAt("2026-01-01", () -> {
-            Long clientId = createClient("01 January 2026");
-
-            PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
-                    .currencyCode("USD")//
-                    .principal(100000.0)//
-                    .minPrincipal(1000.0)//
-                    .maxPrincipal(200000.0)//
-                    .numberOfRepayments(3)//
-                    .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
-                    .interestRatePerPeriod(12.0)//
-                    .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
-                    .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
-                    .allowPartialPeriodInterestCalculation(true);
-
-            Long productId = createLoanProduct(productRequest);
-
-            Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, "01 January 2026", 100000.0, 3, 12.0));
-            approveLoan(loanId, LoanRequestBuilders.approveLoan(100000.0, "01 January 2026"));
-            disburseLoan(loanId, LoanRequestBuilders.disburseLoan(100000.0, "01 January 2026"));
-            loanIdHolder[0] = loanId;
-        });
+        runAt("2026-01-01", () -> loanIdHolder[0] = createCumulativeLoan(1));
 
         Long loanId = loanIdHolder[0];
 
-        // Step 2: Pay installments 1 and 2 on time
-        for (LocalDate date = LocalDate.of(2026, 1, 2); !date.isAfter(LocalDate.of(2026, 2, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-02-01", () -> {
+        runAt("2026-02-15", () -> {
+            executeInlineCOB(loanId);
             GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var firstInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
+
+            var installment = loanDetails.getRepaymentSchedule().getPeriods().stream()
                     .filter(p -> p.getPeriod() != null && p.getPeriod() == 1).findFirst().orElseThrow();
-            addRepayment(loanId, repayment(Utils.getDoubleValue(firstInstallment.getTotalDueForPeriod()), "01 February 2026"));
-        });
+            double installmentTotalDue = Utils.getDoubleValue(installment.getTotalDueForPeriod());
+            log.info("Installment total due: {}", installmentTotalDue);
 
-        for (LocalDate date = LocalDate.of(2026, 2, 2); !date.isAfter(LocalDate.of(2026, 3, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-03-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var secondInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 2).findFirst().orElseThrow();
-            addRepayment(loanId, repayment(Utils.getDoubleValue(secondInstallment.getTotalDueForPeriod()), "01 March 2026"));
-        });
-
-        // Step 3: Let installment 3 (Apr 1) pass unpaid, COB runs through Apr 10
-        for (LocalDate date = LocalDate.of(2026, 3, 2); !date.isAfter(LocalDate.of(2026, 4, 10)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        // Step 4: Verify prepay amount on Apr 15 includes post-maturity interest
-        runAt("2026-04-15", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-
-            // Get installment 3's total due (principal + scheduled interest for the period)
-            var installment3 = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 3).findFirst().orElseThrow();
-            double installment3TotalDue = Utils.getDoubleValue(installment3.getTotalDueForPeriod());
-            log.info("Installment 3 total due: {}", installment3TotalDue);
-
-            // Get prepay amount on Apr 15 (14 days after last installment due date)
-            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 April 2026", DATETIME_PATTERN);
+            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 February 2026", DATETIME_PATTERN);
             double prepayAmount = prepayTemplate.getAmount();
-            log.info("Prepay amount on Apr 15: {}", prepayAmount);
+            log.info("Prepay amount on Feb 15: {}", prepayAmount);
 
-            // Prepay amount must be greater than installment 3's total due because it includes
-            // post-maturity interest (Apr 1 → Apr 15). This proves the schedule generator correctly
-            // computes additional interest during prepayment calculation.
-            assertTrue(prepayAmount > installment3TotalDue,
-                    "Prepay amount should include post-maturity interest beyond installment 3 total due. " + "Prepay amount: "
-                            + prepayAmount + ", Installment 3 total due: " + installment3TotalDue);
+            assertTrue(prepayAmount > installmentTotalDue,
+                    "Prepay amount should include post-maturity interest beyond installment total due. " + "Prepay amount: " + prepayAmount
+                            + ", Installment total due: " + installmentTotalDue);
 
-            // Prepay and verify loan closes successfully
-            addRepayment(loanId, repayment(prepayAmount, "15 April 2026"));
+            addRepayment(loanId, repayment(prepayAmount, "15 February 2026"));
 
             GetLoansLoanIdResponse loanAfterPrepay = getLoanDetails(loanId);
             verifyLoanStatus(loanAfterPrepay, GetLoansLoanIdStatus::getClosedObligationsMet);
@@ -611,53 +368,19 @@
     void testPostMaturityPrepayWithNoInstallmentsPaid() {
         final Long[] loanIdHolder = new Long[1];
 
-        // Step 1: Create and disburse a 3-installment loan on Jan 1
-        runAt("2026-01-01", () -> {
-            Long clientId = createClient("01 January 2026");
-
-            PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
-                    .currencyCode("USD")//
-                    .principal(100000.0)//
-                    .minPrincipal(1000.0)//
-                    .maxPrincipal(200000.0)//
-                    .numberOfRepayments(3)//
-                    .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
-                    .interestRatePerPeriod(12.0)//
-                    .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
-                    .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
-                    .allowPartialPeriodInterestCalculation(true);
-
-            Long productId = createLoanProduct(productRequest);
-
-            Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, "01 January 2026", 100000.0, 3, 12.0));
-            approveLoan(loanId, LoanRequestBuilders.approveLoan(100000.0, "01 January 2026"));
-            disburseLoan(loanId, LoanRequestBuilders.disburseLoan(100000.0, "01 January 2026"));
-            loanIdHolder[0] = loanId;
-        });
+        runAt("2026-01-01", () -> loanIdHolder[0] = createCumulativeLoan(1));
 
         Long loanId = loanIdHolder[0];
 
-        // Step 2: NO payments at all — run COB from Jan 2 through Apr 15
-        // All 3 installments (Feb 1, Mar 1, Apr 1) pass unpaid
-        for (LocalDate date = LocalDate.of(2026, 1, 2); !date.isAfter(LocalDate.of(2026, 4, 15)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        // Step 3: Prepay on Apr 15 for the full amount
-        runAt("2026-04-15", () -> {
+        runAt("2026-02-15", () -> {
+            executeInlineCOB(loanId);
             GetLoansLoanIdResponse loanBeforePrepay = getLoanDetails(loanId);
             log.info("Loan status before prepay (no installments paid): {}", loanBeforePrepay.getStatus().getCode());
 
-            // Calculate total accrued interest (should include post-maturity accruals on full 100k principal)
-            double totalAccruedInterest = loanBeforePrepay.getTransactions().stream()
-                    .filter(tx -> "loanTransactionType.accrual".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed())
-                    .mapToDouble(tx -> Utils.getDoubleValue(tx.getInterestPortion())).sum();
+            double totalAccruedInterest = sumInterestPortion(getNonReversedTransactions(loanBeforePrepay, "loanTransactionType.accrual"));
             log.info("Total accrued interest (all on full principal, no payments): {}", totalAccruedInterest);
 
-            // Query prepay template
-            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 April 2026", DATETIME_PATTERN);
+            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 February 2026", DATETIME_PATTERN);
             assertNotNull(prepayTemplate);
             double prepayAmount = prepayTemplate.getAmount();
             double templateInterest = prepayTemplate.getInterestPortion() != null ? prepayTemplate.getInterestPortion() : 0.0;
@@ -670,10 +393,8 @@
                             + ") including post-maturity period on full 100k principal. Shortfall: "
                             + (totalAccruedInterest - templateInterest));
 
-            // Pay the prepay amount
-            addRepayment(loanId, repayment(prepayAmount, "15 April 2026"));
+            addRepayment(loanId, repayment(prepayAmount, "15 February 2026"));
 
-            // Verify loan closes
             GetLoansLoanIdResponse loanAfterPrepay = getLoanDetails(loanId);
             log.info("Loan status after prepay: {}", loanAfterPrepay.getStatus().getCode());
             verifyLoanStatus(loanAfterPrepay, GetLoansLoanIdStatus::getClosedObligationsMet);
@@ -681,8 +402,7 @@
                     "Total outstanding should be 0 after prepay");
         });
 
-        // Step 4: Run COB the next day — verify no spurious accruals
-        runAt("2026-04-16", () -> {
+        runAt("2026-02-16", () -> {
             executeInlineCOB(loanId);
 
             GetLoansLoanIdResponse loanAfterCOB = getLoanDetails(loanId);
@@ -692,12 +412,8 @@
             assertEquals(0.0, Utils.getDoubleValue(loanAfterCOB.getSummary().getInterestOutstanding()),
                     "Interest outstanding should be 0 after COB");
 
-            // Verify no accrual transactions posted after closure
-            LocalDate prepayDate = LocalDate.of(2026, 4, 15);
-            List<GetLoansLoanIdTransactions> postClosureAccruals = loanAfterCOB.getTransactions().stream()
-                    .filter(tx -> "loanTransactionType.accrual".equals(tx.getType().getCode()))
-                    .filter(tx -> tx.getDate().isAfter(prepayDate))
-                    .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed()).toList();
+            LocalDate prepayDate = LocalDate.of(2026, 2, 15);
+            List<GetLoansLoanIdTransactions> postClosureAccruals = getPostClosureAccruals(loanAfterCOB, prepayDate);
 
             log.info("Post-closure accrual transactions found: {}", postClosureAccruals.size());
             assertTrue(postClosureAccruals.isEmpty(),
@@ -710,79 +426,24 @@
     void testMultipleCOBCyclesAfterClosureProduceNoAccruals() {
         final Long[] loanIdHolder = new Long[1];
 
-        // Step 1: Create and disburse a 3-installment loan on Jan 1
-        runAt("2026-01-01", () -> {
-            Long clientId = createClient("01 January 2026");
-
-            PostLoanProductsRequest productRequest = fourInstallmentsCumulativeWithInterestRecalculation()//
-                    .currencyCode("USD")//
-                    .principal(100000.0)//
-                    .minPrincipal(1000.0)//
-                    .maxPrincipal(200000.0)//
-                    .numberOfRepayments(3)//
-                    .amortizationType(LoanTestData.AmortizationType.EQUAL_PRINCIPAL)//
-                    .interestRatePerPeriod(12.0)//
-                    .interestRateFrequencyType(LoanTestData.InterestRateFrequencyType.YEARS)//
-                    .interestCalculationPeriodType(LoanTestData.InterestCalculationPeriodType.SAME_AS_REPAYMENT_PERIOD)//
-                    .allowPartialPeriodInterestCalculation(true);
-
-            Long productId = createLoanProduct(productRequest);
-
-            Long loanId = applyForLoan(LoanRequestBuilders.applyCumulativeLoan(clientId, productId, "01 January 2026", 100000.0, 3, 12.0));
-            approveLoan(loanId, LoanRequestBuilders.approveLoan(100000.0, "01 January 2026"));
-            disburseLoan(loanId, LoanRequestBuilders.disburseLoan(100000.0, "01 January 2026"));
-            loanIdHolder[0] = loanId;
-        });
+        runAt("2026-01-01", () -> loanIdHolder[0] = createCumulativeLoan(1));
 
         Long loanId = loanIdHolder[0];
 
-        // Step 2: Pay installments 1 and 2 on time
-        for (LocalDate date = LocalDate.of(2026, 1, 2); !date.isAfter(LocalDate.of(2026, 2, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-02-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var firstInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 1).findFirst().orElseThrow();
-            addRepayment(loanId, repayment(Utils.getDoubleValue(firstInstallment.getTotalDueForPeriod()), "01 February 2026"));
-        });
-
-        for (LocalDate date = LocalDate.of(2026, 2, 2); !date.isAfter(LocalDate.of(2026, 3, 1)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        runAt("2026-03-01", () -> {
-            GetLoansLoanIdResponse loanDetails = getLoanDetails(loanId);
-            var secondInstallment = loanDetails.getRepaymentSchedule().getPeriods().stream()
-                    .filter(p -> p.getPeriod() != null && p.getPeriod() == 2).findFirst().orElseThrow();
-            addRepayment(loanId, repayment(Utils.getDoubleValue(secondInstallment.getTotalDueForPeriod()), "01 March 2026"));
-        });
-
-        // Step 3: Let installment 3 (Apr 1) pass unpaid, COB through Apr 15
-        for (LocalDate date = LocalDate.of(2026, 3, 2); !date.isAfter(LocalDate.of(2026, 4, 15)); date = date.plusDays(1)) {
-            final String dateStr = ISO_FORMAT.format(date);
-            runAt(dateStr, () -> executeInlineCOB(loanId));
-        }
-
-        // Step 4: Prepay on Apr 15
-        runAt("2026-04-15", () -> {
-            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 April 2026", DATETIME_PATTERN);
+        runAt("2026-02-15", () -> {
+            executeInlineCOB(loanId);
+            GetLoansLoanIdTransactionsTemplateResponse prepayTemplate = getPrepaymentAmount(loanId, "15 February 2026", DATETIME_PATTERN);
             double prepayAmount = prepayTemplate.getAmount();
             log.info("Prepay amount: {}", prepayAmount);
-            addRepayment(loanId, repayment(prepayAmount, "15 April 2026"));
+            addRepayment(loanId, repayment(prepayAmount, "15 February 2026"));
 
             GetLoansLoanIdResponse loanAfterPrepay = getLoanDetails(loanId);
             verifyLoanStatus(loanAfterPrepay, GetLoansLoanIdStatus::getClosedObligationsMet);
         });
 
-        // Step 5: Run COB for 5 consecutive days after closure (Apr 16 → Apr 20)
-        // Verify durability of accrual cap on each day
-        LocalDate closureDate = LocalDate.of(2026, 4, 15);
+        LocalDate closureDate = LocalDate.of(2026, 2, 15);
 
-        for (LocalDate date = LocalDate.of(2026, 4, 16); !date.isAfter(LocalDate.of(2026, 4, 20)); date = date.plusDays(1)) {
+        for (LocalDate date = LocalDate.of(2026, 2, 16); !date.isAfter(LocalDate.of(2026, 2, 18)); date = date.plusDays(1)) {
             final String dateStr = ISO_FORMAT.format(date);
             final LocalDate currentDate = date;
             runAt(dateStr, () -> {
@@ -804,10 +465,7 @@
                         "Interest outstanding should be 0 after COB on " + currentDate + ". Found: " + interestOutstanding);
 
                 // No new non-reversed accrual transactions after closure
-                List<GetLoansLoanIdTransactions> postClosureAccruals = loanAfterCOB.getTransactions().stream()
-                        .filter(tx -> "loanTransactionType.accrual".equals(tx.getType().getCode()))
-                        .filter(tx -> tx.getDate().isAfter(closureDate))
-                        .filter(tx -> tx.getManuallyReversed() == null || !tx.getManuallyReversed()).toList();
+                List<GetLoansLoanIdTransactions> postClosureAccruals = getPostClosureAccruals(loanAfterCOB, closureDate);
 
                 log.info("COB on {} - postClosureAccruals: {}, totalOutstanding: {}, interestOutstanding: {}", currentDate,
                         postClosureAccruals.size(), totalOutstanding, interestOutstanding);
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ParallelExecutionHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ParallelExecutionHelper.java
new file mode 100644
index 0000000..866bcec
--- /dev/null
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ParallelExecutionHelper.java
@@ -0,0 +1,62 @@
+/**
+ * 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.integrationtests.common;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+public final class ParallelExecutionHelper {
+
+    private ParallelExecutionHelper() {}
+
+    private static final int CLEANUP_THREAD_COUNT = 10;
+
+    public static <T, R> void runInParallel(List<T> items, Consumer<T> action) {
+        mapInParallel(items, id -> {
+            action.accept(id);
+            return null;
+        });
+    }
+
+    public static <T, R> List<R> mapInParallel(List<T> items, Function<T, R> action) {
+        if (items.isEmpty()) {
+            return List.of();
+        }
+        try (ExecutorService executor = Executors.newFixedThreadPool(Math.min(CLEANUP_THREAD_COUNT, items.size()))) {
+            List<Future<R>> futures = items.stream().map(item -> executor.submit(() -> action.apply(item))).toList();
+            return futures.stream().map(ParallelExecutionHelper::getFutureResult).toList();
+        }
+    }
+
+    public static <T> T getFutureResult(Future<T> future) {
+        try {
+            return future.get();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new IllegalStateException("Interrupted during parallel loan cleanup", e);
+        } catch (ExecutionException e) {
+            throw new IllegalStateException("Parallel loan cleanup failed", e);
+        }
+    }
+}
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java
index 2fac87b..b67d215 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java
@@ -55,7 +55,7 @@
 
     private static final Logger LOG = LoggerFactory.getLogger(ProvisioningIntegrationTest.class);
     private static final String NONE = "1";
-    private static final int LOANPRODUCTS_SIZE = 10;
+    private static final int LOANPRODUCTS_SIZE = 2;
 
     private RequestSpecification requestSpec;
     private ResponseSpecification responseSpec;
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java
index 144bf29..8dff862 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java
@@ -33,6 +33,7 @@
 import org.apache.fineract.infrastructure.core.service.MathUtil;
 import org.apache.fineract.integrationtests.common.BusinessDateHelper;
 import org.apache.fineract.integrationtests.common.FineractClientHelper;
+import org.apache.fineract.integrationtests.common.ParallelExecutionHelper;
 import org.apache.fineract.integrationtests.common.Utils;
 import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeEachCallback;
@@ -60,66 +61,54 @@
             this.loanTransactionHelper = new LoanTransactionHelper(null, null);
 
             List<Long> loanIds = LoanTransactionHelper.getLoanIdsByStatusId(300);
-            loanIds.forEach(loanId -> {
-                GetLoansLoanIdResponse loanResponse = Calls
-                        .ok(FineractClientHelper.getFineractClient().loans.retrieveLoan((long) loanId, null, "all", null, null));
-                if (MathUtil.isLessThan(loanResponse.getApprovedPrincipal(), loanResponse.getProposedPrincipal())) {
-                    PutLoansApprovedAmountRequest request = new PutLoansApprovedAmountRequest().amount(loanResponse.getProposedPrincipal())
-                            .locale("en");
-                    Calls.ok(FineractClientHelper.getFineractClient().loans.modifyLoanApprovedAmount(loanId, request));
-                }
-                loanResponse.getDisbursementDetails().forEach(disbursementDetail -> {
-                    if (disbursementDetail.getActualDisbursementDate() == null) {
-                        loanTransactionHelper.disburseLoan((long) loanId,
-                                new PostLoansLoanIdRequest()
-                                        .actualDisbursementDate(dateFormatter.format(disbursementDetail.getExpectedDisbursementDate()))
-                                        .dateFormat(DATE_FORMAT).locale("en").transactionAmount(disbursementDetail.getPrincipal()));
-                    }
-                });
-                loanResponse = Calls
-                        .ok(FineractClientHelper.getFineractClient().loans.retrieveLoan((long) loanId, null, "all", null, null));
-                GetLoansLoanIdTransactionsTemplateResponse prepayDetail = this.loanTransactionHelper.getPrepaymentAmount(loanId,
-                        dateFormatter.format(cleanupDate), DATE_FORMAT);
-                LocalDate transactionDate = prepayDetail.getDate();
-                Double amount = prepayDetail.getAmount();
-                Double netDisbursalAmount = prepayDetail.getNetDisbursalAmount();
-                Double repayAmount = Double.compare(amount, 0.0) > 0 ? amount : netDisbursalAmount;
-                loanTransactionHelper.makeLoanRepayment(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat(DATE_FORMAT)
-                        .transactionDate(dateFormatter.format(transactionDate)).locale("en").transactionAmount(repayAmount));
-            });
+            ParallelExecutionHelper.runInParallel(loanIds, loanId -> closeActiveLoan(loanId, cleanupDate));
             loanIds = LoanTransactionHelper.getLoanIdsByStatusId(200);
-            loanIds.forEach(loanId -> {
-                loanTransactionHelper.undoApprovalForLoan(loanId, new PostLoansLoanIdRequest());
-            });
+            ParallelExecutionHelper.runInParallel(loanIds,
+                    loanId -> loanTransactionHelper.undoApprovalForLoan(loanId, new PostLoansLoanIdRequest()));
             loanIds = LoanTransactionHelper.getLoanIdsByStatusId(100);
-            loanIds.forEach(loanId -> {
-                GetLoansLoanIdResponse details = loanTransactionHelper.getLoanDetails((long) loanId);
-                loanTransactionHelper.rejectLoan(loanId,
-                        new PostLoansLoanIdRequest().rejectedOnDate(dateFormatter.format(details.getTimeline().getSubmittedOnDate()))
-                                .locale("en").dateFormat(DATE_FORMAT));
-            });
+            ParallelExecutionHelper.runInParallel(loanIds, this::rejectSubmittedLoan);
             loanIds = LoanTransactionHelper.getLoanIdsByStatusId(300);
             assertEquals(0, loanIds.size());
         });
     }
 
+    private void closeActiveLoan(Long loanId, LocalDate cleanupDate) {
+        GetLoansLoanIdResponse loanResponse = Calls
+                .ok(FineractClientHelper.getFineractClient().loans.retrieveLoan(loanId, null, "all", null, null));
+        if (MathUtil.isLessThan(loanResponse.getApprovedPrincipal(), loanResponse.getProposedPrincipal())) {
+            PutLoansApprovedAmountRequest request = new PutLoansApprovedAmountRequest().amount(loanResponse.getProposedPrincipal())
+                    .locale("en");
+            Calls.ok(FineractClientHelper.getFineractClient().loans.modifyLoanApprovedAmount(loanId, request));
+        }
+        loanResponse.getDisbursementDetails().forEach(disbursementDetail -> {
+            if (disbursementDetail.getActualDisbursementDate() == null) {
+                loanTransactionHelper.disburseLoan(loanId,
+                        new PostLoansLoanIdRequest()
+                                .actualDisbursementDate(dateFormatter.format(disbursementDetail.getExpectedDisbursementDate()))
+                                .dateFormat(DATE_FORMAT).locale("en").transactionAmount(disbursementDetail.getPrincipal()));
+            }
+        });
+        GetLoansLoanIdTransactionsTemplateResponse prepayDetail = this.loanTransactionHelper.getPrepaymentAmount(loanId,
+                dateFormatter.format(cleanupDate), DATE_FORMAT);
+        LocalDate transactionDate = prepayDetail.getDate();
+        Double amount = prepayDetail.getAmount();
+        Double netDisbursalAmount = prepayDetail.getNetDisbursalAmount();
+        Double repayAmount = Double.compare(amount, 0.0) > 0 ? amount : netDisbursalAmount;
+        loanTransactionHelper.makeLoanRepayment(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat(DATE_FORMAT)
+                .transactionDate(dateFormatter.format(transactionDate)).locale("en").transactionAmount(repayAmount));
+    }
+
+    private void rejectSubmittedLoan(Long loanId) {
+        GetLoansLoanIdResponse details = loanTransactionHelper.getLoanDetails(loanId);
+        loanTransactionHelper.rejectLoan(loanId, new PostLoansLoanIdRequest()
+                .rejectedOnDate(dateFormatter.format(details.getTimeline().getSubmittedOnDate())).locale("en").dateFormat(DATE_FORMAT));
+    }
+
     private LocalDate determineCleanupDate() {
         LocalDate tenantDate = Utils.getLocalDateOfTenant();
         try {
-            List<Long> activeLoanIds = LoanTransactionHelper.getLoanIdsByStatusId(300);
-            LocalDate maxTxDate = tenantDate;
-            for (Long loanId : activeLoanIds) {
-                GetLoansLoanIdResponse loanResponse = Calls
-                        .ok(FineractClientHelper.getFineractClient().loans.retrieveLoan(loanId, null, "all", null, null));
-                if (loanResponse.getTransactions() != null) {
-                    for (var tx : loanResponse.getTransactions()) {
-                        if (tx.getDate() != null && tx.getDate().isAfter(maxTxDate)) {
-                            maxTxDate = tx.getDate();
-                        }
-                    }
-                }
-            }
-            return maxTxDate;
+            LocalDate maxTxnDate = LoanTransactionHelper.getMaxTransactionDateOfActiveLoans();
+            return maxTxnDate.isAfter(tenantDate) ? maxTxnDate : tenantDate;
         } catch (Exception e) {
             return tenantDate;
         }
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
index 44fda1d..3d921bb 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
@@ -155,6 +155,10 @@
         this.paymentTypeHelper = new PaymentTypeHelper();
     }
 
+    public static LocalDate getMaxTransactionDateOfActiveLoans() {
+        return Calls.ok(FineractClientHelper.getFineractClient().legacy.getMaxTransactionDateOfActiveLoans());
+    }
+
     // TODO: Rewrite to use fineract-client instead!
     // Example: org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long,
     // org.apache.fineract.client.models.PostLoansLoanIdRequest)
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsTestLifecycleExtension.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsTestLifecycleExtension.java
index f24e62b..5b926cb 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsTestLifecycleExtension.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsTestLifecycleExtension.java
@@ -27,7 +27,13 @@
 import java.math.MathContext;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.function.Consumer;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.client.models.PostSavingsAccountTransactionsRequest;
 import org.apache.fineract.client.models.PostSavingsAccountsAccountIdRequest;
@@ -47,6 +53,7 @@
     private SavingsAccountHelper savingsAccountHelper;
     private SchedulerJobHelper schedulerJobHelper;
     public static final String DATE_FORMAT = "dd MMMM yyyy";
+    private static final int CLEANUP_THREAD_COUNT = 10;
     private final DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().appendPattern(DATE_FORMAT).toFormatter();
 
     @Override
@@ -58,32 +65,53 @@
             ResponseSpecification responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
             this.savingsAccountHelper = new SavingsAccountHelper(requestSpec, responseSpec);
             this.schedulerJobHelper = new SchedulerJobHelper(requestSpec);
-
+            String jobName = "Post Interest For Savings";
+            schedulerJobHelper.executeAndAwaitJob(jobName);
             // Close open savings accounts
             List<Long> savingsIds = SavingsAccountHelper.getSavingsIdsByStatusId(300);
-            savingsIds.forEach(savingsId -> {
-                try {
-                    this.savingsAccountHelper.postInterestForSavings(savingsId.intValue());
-                    SavingsAccountData savingsAccountData = Calls.ok(
-                            FineractClientHelper.getFineractClient().savingsAccounts.retrieveSavingsAccount(savingsId, false, null, "all"));
-                    BigDecimal accountBalance = MathUtil.subtract(savingsAccountData.getSummary().getAvailableBalance(),
-                            savingsAccountData.getMinRequiredBalance(), MathContext.DECIMAL64);
-                    if (accountBalance.compareTo(BigDecimal.ZERO) > 0) {
-                        savingsAccountHelper.closeSavingsAccount(savingsId,
-                                new PostSavingsAccountsAccountIdRequest().locale("en").dateFormat(DATE_FORMAT)
-                                        .closedOnDate(dateFormatter.format(Utils.getLocalDateOfTenant())).withdrawBalance(true));
-                    } else if (accountBalance.compareTo(BigDecimal.ZERO) < 0) {
-                        savingsAccountHelper.depositIntoSavingsAccount(savingsId,
-                                new PostSavingsAccountTransactionsRequest().locale("en").dateFormat(DATE_FORMAT)
-                                        .transactionDate(dateFormatter.format(Utils.getLocalDateOfTenant()))
-                                        .transactionAmount(accountBalance.abs()).paymentTypeId(1));
-                        savingsAccountHelper.closeSavingsAccount(savingsId, new PostSavingsAccountsAccountIdRequest().locale("en")
-                                .dateFormat(DATE_FORMAT).closedOnDate(dateFormatter.format(Utils.getLocalDateOfTenant())));
-                    }
-                } catch (Exception e) {
-                    log.warn("Unable to close savings account: {}, Reason: {}", savingsId, e.getMessage());
-                }
-            });
+            runInParallel(savingsIds, this::closeSavingsAccount);
         });
     }
+
+    private void closeSavingsAccount(Long savingsId) {
+        try {
+            SavingsAccountData savingsAccountData = Calls
+                    .ok(FineractClientHelper.getFineractClient().savingsAccounts.retrieveSavingsAccount(savingsId, false, null, "all"));
+            BigDecimal accountBalance = MathUtil.subtract(savingsAccountData.getSummary().getAvailableBalance(),
+                    savingsAccountData.getMinRequiredBalance(), MathContext.DECIMAL64);
+            if (accountBalance.compareTo(BigDecimal.ZERO) > 0) {
+                savingsAccountHelper.closeSavingsAccount(savingsId, new PostSavingsAccountsAccountIdRequest().locale("en")
+                        .dateFormat(DATE_FORMAT).closedOnDate(dateFormatter.format(Utils.getLocalDateOfTenant())).withdrawBalance(true));
+            } else if (accountBalance.compareTo(BigDecimal.ZERO) < 0) {
+                savingsAccountHelper.depositIntoSavingsAccount(savingsId,
+                        new PostSavingsAccountTransactionsRequest().locale("en").dateFormat(DATE_FORMAT)
+                                .transactionDate(dateFormatter.format(Utils.getLocalDateOfTenant())).transactionAmount(accountBalance.abs())
+                                .paymentTypeId(1));
+                savingsAccountHelper.closeSavingsAccount(savingsId, new PostSavingsAccountsAccountIdRequest().locale("en")
+                        .dateFormat(DATE_FORMAT).closedOnDate(dateFormatter.format(Utils.getLocalDateOfTenant())));
+            }
+        } catch (Exception e) {
+            log.warn("Unable to close savings account: {}, Reason: {}", savingsId, e.getMessage());
+        }
+    }
+
+    private void runInParallel(List<Long> ids, Consumer<Long> action) {
+        if (ids.isEmpty()) {
+            return;
+        }
+        try (ExecutorService executor = Executors.newFixedThreadPool(Math.min(CLEANUP_THREAD_COUNT, ids.size()))) {
+            try {
+                List<Future<?>> futures = new ArrayList<>();
+                ids.forEach(id -> futures.add(executor.submit(() -> action.accept(id))));
+                for (Future<?> future : futures) {
+                    future.get();
+                }
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new IllegalStateException("Interrupted during parallel savings cleanup", e);
+            } catch (ExecutionException e) {
+                throw new IllegalStateException("Parallel savings cleanup failed", e);
+            }
+        }
+    }
 }
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/penalty/LoanPenaltyBackdatedTransactionTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/penalty/LoanPenaltyBackdatedTransactionTest.java
index 50221ed..8e0e58d 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/penalty/LoanPenaltyBackdatedTransactionTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/loan/penalty/LoanPenaltyBackdatedTransactionTest.java
@@ -119,14 +119,11 @@
             );
         });
 
-        runFromToInclusive("01 January 2023", "09 January 2023", () -> {
+        runAt("09 January 2023", () -> {
+            Long loanId = aLoanId.get();
             // run accrual posting
             schedulerJobHelper.executeAndAwaitJob("Apply penalty to overdue loans");
             schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions");
-        });
-
-        runAt("09 January 2023", () -> {
-            Long loanId = aLoanId.get();
 
             // verify transactions
             verifyTransactions(loanId, //
@@ -232,14 +229,12 @@
             );
         });
 
-        runFromToInclusive("01 January 2023", "09 January 2023", () -> {
+        runAt("09 January 2023", () -> {
+            Long loanId = aLoanId.get();
+
             // run accrual posting
             schedulerJobHelper.executeAndAwaitJob("Apply penalty to overdue loans");
             schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions");
-        });
-
-        runAt("09 January 2023", () -> {
-            Long loanId = aLoanId.get();
 
             // verify transactions
             verifyTransactions(loanId, //
@@ -346,14 +341,12 @@
             );
         });
 
-        runFromToInclusive("01 January 2023", "09 January 2023", () -> {
+        runAt("09 January 2023", () -> {
+            Long loanId = aLoanId.get();
+
             // run accrual posting
             schedulerJobHelper.executeAndAwaitJob("Apply penalty to overdue loans");
             schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions");
-        });
-
-        runAt("09 January 2023", () -> {
-            Long loanId = aLoanId.get();
 
             // verify transactions
             verifyTransactions(loanId, //
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/savings/SavingsInterestPostingTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/savings/SavingsInterestPostingTest.java
deleted file mode 100644
index 8138d85..0000000
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/savings/SavingsInterestPostingTest.java
+++ /dev/null
@@ -1,112 +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.integrationtests.savings;
-
-import java.math.BigDecimal;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.IntStream;
-import org.apache.fineract.client.models.PostSavingsAccountsResponse;
-import org.apache.fineract.client.models.PostSavingsProductsRequest;
-import org.apache.fineract.client.models.PostSavingsProductsResponse;
-import org.apache.fineract.client.models.SavingsAccountData;
-import org.apache.fineract.client.models.SavingsAccountTransactionData;
-import org.apache.fineract.integrationtests.common.ClientHelper;
-import org.apache.fineract.integrationtests.common.savings.SavingsTestLifecycleExtension;
-import org.apache.fineract.integrationtests.savings.base.BaseSavingsIntegrationTest;
-import org.junit.jupiter.api.Order;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-
-@Order(2)
-@ExtendWith({ SavingsTestLifecycleExtension.class })
-public class SavingsInterestPostingTest extends BaseSavingsIntegrationTest {
-
-    @Test
-    public void testSavingsInterestPosting_Works_ForMultipleAccounts() {
-        List<AccountWithDepositAmount> accounts = new ArrayList<>();
-
-        runAt("01 January 2023", () -> {
-            // Create Client
-            Long clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
-
-            // Create product
-            PostSavingsProductsRequest productsRequest = dailyInterestPostingProduct();
-            PostSavingsProductsResponse product = createProduct(productsRequest);
-            Long productId = product.getResourceId();
-
-            // Create accounts
-            IntStream.range(0, 200)//
-                    .parallel().mapToObj(i -> applySavingsRequest(clientId, productId, "01 January 2023"))//
-                    .map(this::applySavingsAccount) //
-                    .mapToLong(PostSavingsAccountsResponse::getResourceId) //
-                    .forEach(savingsId -> {
-                        approveSavingsAccount(savingsId, "01 January 2023");
-                        activateSavingsAccount(savingsId, "01 January 2023");
-                        accounts.add(new AccountWithDepositAmount(savingsId));
-                    });
-        });
-
-        runFromToInclusive("02 January 2023", "10 January 2023", (date) -> {
-            SecureRandom rnd = new SecureRandom();
-            accounts.parallelStream().forEach(account -> {
-                long lAmount = rnd.nextLong(10_000_000L);
-                BigDecimal amount = BigDecimal.valueOf(lAmount);
-                deposit(account.savingsId, date, amount);
-                account.addDeposit(amount);
-            });
-        });
-
-        runAt("11 January 2023", () -> {
-            String jobName = "Post Interest For Savings";
-            schedulerJobHelper.executeAndAwaitJob(jobName);
-
-            accounts.parallelStream().forEach(account -> {
-                SavingsAccountData accountData = getSavingsAccount(account.savingsId);
-                BigDecimal accountBalance = accountData.getSummary().getAccountBalance();
-                BigDecimal accountBalanceByTransactions = accountData.getTransactions().stream()
-                        .map(SavingsAccountTransactionData::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-                assertThat(accountBalance)
-                        .withFailMessage("Account balance (%s) and calculated balance (%s) from transactions do not match", accountBalance,
-                                accountBalanceByTransactions)
-                        .isEqualByComparingTo(accountBalanceByTransactions);
-                BigDecimal summedDepositAmount = accountData.getTransactions().stream().filter(tx -> tx.getTransactionType().getDeposit())
-                        .map(SavingsAccountTransactionData::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-                assertThat(summedDepositAmount).withFailMessage(
-                        "Calculated balance (%s) from deposit transactions and submitted deposit balance (%s) do not match", accountBalance,
-                        summedDepositAmount).isEqualByComparingTo(account.depositedAmount);
-            });
-        });
-    }
-
-    static class AccountWithDepositAmount {
-
-        public Long savingsId;
-        public BigDecimal depositedAmount = BigDecimal.ZERO;
-
-        AccountWithDepositAmount(Long savingsId) {
-            this.savingsId = savingsId;
-        }
-
-        public void addDeposit(BigDecimal amount) {
-            depositedAmount = depositedAmount.add(amount);
-        }
-    }
-}
