You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ad...@apache.org on 2023/05/26 10:48:51 UTC

[fineract] branch develop updated: FINERACT-1678-loan-cob-drop-softlocking-use-lastclosedbusinessdate

This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new e9bc0fe8c FINERACT-1678-loan-cob-drop-softlocking-use-lastclosedbusinessdate
e9bc0fe8c is described below

commit e9bc0fe8c265e95682f27151aaff47d9a6a95a0d
Author: Ruchi Dhamankar <ru...@gmail.com>
AuthorDate: Wed May 24 17:22:56 2023 +0530

    FINERACT-1678-loan-cob-drop-softlocking-use-lastclosedbusinessdate
---
 .../cob/domain/LoanAccountLockRepository.java      |   6 +-
 .../org/apache/fineract/cob/domain/LockOwner.java  |   2 +-
 .../fineract/cob/loan/ApplyLoanLockTasklet.java    |  19 +--
 .../cob/loan/LoanCOBManagerConfiguration.java      |  15 +-
 .../fineract/cob/loan/LoanLockingService.java      |   6 +-
 .../fineract/cob/loan/LoanLockingServiceImpl.java  |  33 ++--
 .../apache/fineract/cob/loan/LockLoanTasklet.java  |  59 -------
 .../service/InlineLoanCOBExecutorServiceImpl.java  |   2 +-
 .../cob/service/LoanAccountLockService.java        |   2 -
 .../cob/service/LoanAccountLockServiceImpl.java    |   7 +-
 .../jobs/filter/LoanCOBApiFilter.java              |  15 +-
 .../db/changelog/tenant/changelog-tenant.xml       |   1 +
 ...08_precondition_check_cob_loan_account_lock.xml |  30 ++++
 .../loan/ApplyLoanLockTaskletStepDefinitions.java  |   5 +-
 .../cob/loan/FetchAndLockLoanStepDefinitions.java  | 178 ---------------------
 .../jobs/filter/LoanCOBApiFilterTest.java          |  27 +---
 .../features/cob/loan/cob.loan.fetch.lock.feature  |  34 ----
 .../inlinecob/InlineLoanCOBTest.java               |   5 -
 18 files changed, 66 insertions(+), 380 deletions(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LoanAccountLockRepository.java b/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LoanAccountLockRepository.java
index d2dc59e05..9705fff60 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LoanAccountLockRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LoanAccountLockRepository.java
@@ -50,11 +50,9 @@ public interface LoanAccountLockRepository extends JpaRepository<LoanAccountLock
     void updateLoanFromAccountLocks();
 
     @Query("""
-            update LoanAccountLock lck set
-            lck.error = null, lck.lockOwner=org.apache.fineract.cob.domain.LockOwner.LOAN_COB_PARTITIONING
-            where lck.lockPlacedOnCobBusinessDate is not null and lck.error is not null and
+            delete from LoanAccountLock lck where lck.lockPlacedOnCobBusinessDate is not null and lck.error is not null and
             lck.lockOwner in (org.apache.fineract.cob.domain.LockOwner.LOAN_COB_CHUNK_PROCESSING,org.apache.fineract.cob.domain.LockOwner.LOAN_INLINE_COB_PROCESSING)
             """)
     @Modifying(flushAutomatically = true)
-    void updateToSoftLockByOwner();
+    void removeLockByOwner();
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LockOwner.java b/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LockOwner.java
index 5a6580d6c..252425e1e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LockOwner.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/domain/LockOwner.java
@@ -19,5 +19,5 @@
 package org.apache.fineract.cob.domain;
 
 public enum LockOwner {
-    LOAN_COB_PARTITIONING, LOAN_COB_CHUNK_PROCESSING, LOAN_INLINE_COB_PROCESSING;
+    LOAN_COB_CHUNK_PROCESSING, LOAN_INLINE_COB_PROCESSING;
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java
index 013c9ebae..443455d9f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java
@@ -22,10 +22,7 @@ import com.google.common.collect.Lists;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
-import java.util.function.Function;
-import java.util.stream.Collectors;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.cob.common.CustomJobParameterResolver;
@@ -69,23 +66,13 @@ public class ApplyLoanLockTasklet implements Tasklet {
         List<LoanAccountLock> accountLocks = new ArrayList<>();
         loanIdPartitions.forEach(loanIdPartition -> accountLocks.addAll(loanLockingService.findAllByLoanIdIn(loanIdPartition)));
 
-        Map<Long, LoanAccountLock> alreadySoftLockedAccountsMap = accountLocks.stream()
-                .filter(e -> LockOwner.LOAN_COB_PARTITIONING.equals(e.getLockOwner()))
-                .collect(Collectors.toMap(LoanAccountLock::getLoanId, Function.identity()));
-
         List<Long> alreadyLockedByChunkProcessingAccountIds = accountLocks.stream()
                 .filter(e -> LockOwner.LOAN_COB_CHUNK_PROCESSING.equals(e.getLockOwner())).map(LoanAccountLock::getLoanId).toList();
 
-        List<Long> toBeProcessedLoanIds = new ArrayList<>(alreadySoftLockedAccountsMap.keySet());
-
-        loanLockingService.upgradeLock(toBeProcessedLoanIds, LockOwner.LOAN_COB_CHUNK_PROCESSING);
-
-        toBeProcessedLoanIds.addAll(alreadyLockedByChunkProcessingAccountIds);
-        List<Long> alreadyLockedByInlineCOBOrProcessedLoanIds = new ArrayList<>(loanIds);
-        alreadyLockedByInlineCOBOrProcessedLoanIds.removeAll(toBeProcessedLoanIds);
-
-        loanIds.removeAll(alreadyLockedByInlineCOBOrProcessedLoanIds);
+        List<Long> toBeProcessedLoanIds = new ArrayList<>(loanIds);
+        toBeProcessedLoanIds.removeAll(alreadyLockedByChunkProcessingAccountIds);
 
+        loanLockingService.applyLock(toBeProcessedLoanIds, LockOwner.LOAN_COB_CHUNK_PROCESSING);
         return RepeatStatus.FINISHED;
     }
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java
index 4d6a04cb7..f5d8e5ab7 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java
@@ -73,8 +73,6 @@ public class LoanCOBManagerConfiguration {
     private BusinessEventNotifierService businessEventNotifierService;
     @Autowired
     private CustomJobParameterResolver customJobParameterResolver;
-    @Autowired
-    private LoanLockingService loanLockingService;
 
     @Bean
     @JobScope
@@ -93,11 +91,6 @@ public class LoanCOBManagerConfiguration {
         return localStepBuilderFactory.get("Set loan ID parameter - Step").tasklet(loanIdParameterTasklet()).build();
     }
 
-    @Bean
-    public Step lockStep() {
-        return localStepBuilderFactory.get("Lock loan accounts - Step").tasklet(lockLoanTasklet()).build();
-    }
-
     @Bean
     public Step resolveCustomJobParametersStep() {
         return localStepBuilderFactory.get("Resolve custom job parameters - Step").tasklet(resolveCustomJobParametersTasklet())
@@ -115,12 +108,6 @@ public class LoanCOBManagerConfiguration {
         return new LoanIdParameterTasklet(retrieveLoanIdService, customJobParameterResolver);
     }
 
-    @Bean
-    @JobScope
-    public LockLoanTasklet lockLoanTasklet() {
-        return new LockLoanTasklet(loanLockingService, customJobParameterResolver);
-    }
-
     @Bean
     @JobScope
     public ResolveLoanCOBCustomJobParametersTasklet resolveCustomJobParametersTasklet() {
@@ -138,7 +125,7 @@ public class LoanCOBManagerConfiguration {
         return jobBuilderFactory.get(JobName.LOAN_COB.name()) //
                 .listener(new COBExecutionListenerRunner(applicationContext, JobName.LOAN_COB.name())) //
                 .start(resolveCustomJobParametersStep()) //
-                .next(loanIdParameterStep()).next(lockStep()).next(loanCOBStep()).next(stayedLockedStep()) //
+                .next(loanIdParameterStep()).next(loanCOBStep()).next(stayedLockedStep()) //
                 .incrementer(new RunIdIncrementer()) //
                 .build();
     }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingService.java
index f049e1351..140a6e500 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingService.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingService.java
@@ -18,16 +18,12 @@
  */
 package org.apache.fineract.cob.loan;
 
-import java.time.LocalDate;
 import java.util.List;
-import org.apache.fineract.cob.data.LoanCOBParameter;
 import org.apache.fineract.cob.domain.LoanAccountLock;
 import org.apache.fineract.cob.domain.LockOwner;
 
 public interface LoanLockingService {
 
-    void applySoftLock(LocalDate lastClosedBusinessDate, LoanCOBParameter loanCOBParameter, boolean isCatchUp);
-
     void upgradeLock(List<Long> accountsToLock, LockOwner lockOwner);
 
     void deleteByLoanIdInAndLockOwner(List<Long> loanIds, LockOwner lockOwner);
@@ -35,4 +31,6 @@ public interface LoanLockingService {
     List<LoanAccountLock> findAllByLoanIdIn(List<Long> loanIds);
 
     LoanAccountLock findByLoanIdAndLockOwner(Long loanId, LockOwner lockOwner);
+
+    void applyLock(List<Long> loanIds, LockOwner lockOwner);
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingServiceImpl.java
index 3c44d2db6..dfb19ddc9 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanLockingServiceImpl.java
@@ -18,11 +18,11 @@
  */
 package org.apache.fineract.cob.loan;
 
+import java.sql.PreparedStatement;
 import java.time.LocalDate;
 import java.util.List;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.fineract.cob.data.LoanCOBParameter;
 import org.apache.fineract.cob.domain.LoanAccountLock;
 import org.apache.fineract.cob.domain.LoanAccountLockRepository;
 import org.apache.fineract.cob.domain.LockOwner;
@@ -53,25 +53,14 @@ public class LoanLockingServiceImpl implements LoanLockingService {
                     AND (? = loan.last_closed_business_date)
             """;
 
+    private static final String BATCH_LOAN_LOCK_INSERT = """
+                INSERT INTO m_loan_account_locks (loan_id, version, lock_owner, lock_placed_on, lock_placed_on_cob_business_date) VALUES (?,?,?,?,?)
+            """;
+
     private final JdbcTemplate jdbcTemplate;
     private final FineractProperties fineractProperties;
     private final LoanAccountLockRepository loanAccountLockRepository;
 
-    @Override
-    public void applySoftLock(LocalDate lastClosedBusinessDate, LoanCOBParameter loanCOBParameter, boolean isCatchUp) {
-
-        LocalDate cobBusinessDate = ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE);
-        jdbcTemplate.update(isCatchUp ? CATCH_UP_LOAN_INSERT : NORMAL_LOAN_INSERT, ps -> {
-            ps.setLong(1, 1);
-            ps.setString(2, LockOwner.LOAN_COB_PARTITIONING.name());
-            ps.setObject(3, DateUtils.getOffsetDateTimeOfTenant());
-            ps.setObject(4, cobBusinessDate);
-            ps.setObject(5, loanCOBParameter.getMinLoanId());
-            ps.setObject(6, loanCOBParameter.getMaxLoanId());
-            ps.setObject(7, lastClosedBusinessDate);
-        });
-    }
-
     @Override
     public void upgradeLock(List<Long> accountsToLock, LockOwner lockOwner) {
         jdbcTemplate.batchUpdate("""
@@ -96,6 +85,18 @@ public class LoanLockingServiceImpl implements LoanLockingService {
         });
     }
 
+    @Override
+    public void applyLock(List<Long> loanIds, LockOwner lockOwner) {
+        LocalDate cobBusinessDate = ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE);
+        jdbcTemplate.batchUpdate(BATCH_LOAN_LOCK_INSERT, loanIds, loanIds.size(), (PreparedStatement ps, Long loanId) -> {
+            ps.setLong(1, loanId);
+            ps.setLong(2, 1);
+            ps.setString(3, lockOwner.name());
+            ps.setObject(4, DateUtils.getOffsetDateTimeOfTenant());
+            ps.setObject(5, cobBusinessDate);
+        });
+    }
+
     @Override
     public void deleteByLoanIdInAndLockOwner(List<Long> loanIds, LockOwner lockOwner) {
         loanAccountLockRepository.deleteByLoanIdInAndLockOwner(loanIds, lockOwner);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LockLoanTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LockLoanTasklet.java
deleted file mode 100644
index d2d503974..000000000
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LockLoanTasklet.java
+++ /dev/null
@@ -1,59 +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.cob.loan;
-
-import java.time.LocalDate;
-import java.util.Objects;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.fineract.cob.common.CustomJobParameterResolver;
-import org.apache.fineract.cob.data.LoanCOBParameter;
-import org.jetbrains.annotations.NotNull;
-import org.springframework.batch.core.StepContribution;
-import org.springframework.batch.core.scope.context.ChunkContext;
-import org.springframework.batch.core.step.tasklet.Tasklet;
-import org.springframework.batch.repeat.RepeatStatus;
-
-@Slf4j
-@RequiredArgsConstructor
-public class LockLoanTasklet implements Tasklet {
-
-    private final LoanLockingService loanLockingService;
-    private final CustomJobParameterResolver customJobParameterResolver;
-
-    @Override
-    public RepeatStatus execute(@NotNull StepContribution contribution, @NotNull ChunkContext chunkContext) throws Exception {
-        String businessDateParameter = (String) contribution.getStepExecution().getJobExecution().getExecutionContext()
-                .get(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME);
-        LocalDate lastClosedBusinessDate = LocalDate.parse(Objects.requireNonNull(businessDateParameter))
-                .minusDays(LoanCOBConstant.NUMBER_OF_DAYS_BEHIND);
-        LoanCOBParameter loanCOBParameter = (LoanCOBParameter) contribution.getStepExecution().getJobExecution().getExecutionContext()
-                .get(LoanCOBConstant.LOAN_COB_PARAMETER);
-        if (Objects.isNull(loanCOBParameter)
-                || (Objects.isNull(loanCOBParameter.getMinLoanId()) && Objects.isNull(loanCOBParameter.getMaxLoanId()))) {
-            loanCOBParameter = new LoanCOBParameter(0L, 0L);
-        }
-        loanLockingService.applySoftLock(lastClosedBusinessDate, loanCOBParameter,
-                customJobParameterResolver
-                        .getCustomJobParameterById(contribution.getStepExecution(), LoanCOBConstant.IS_CATCH_UP_PARAMETER_NAME)
-                        .map(Boolean::parseBoolean).orElse(false));
-
-        return RepeatStatus.FINISHED;
-    }
-}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java
index 7576f603f..a1adf9349 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java
@@ -226,7 +226,7 @@ public class InlineLoanCOBExecutorServiceImpl implements InlineExecutorService<L
     }
 
     private boolean isLockOverrulable(LoanAccountLock loanAccountLock) {
-        if (LockOwner.LOAN_COB_PARTITIONING.equals(loanAccountLock.getLockOwner()) || isBypassUser()) {
+        if (isBypassUser()) {
             return true;
         } else {
             return StringUtils.isNotBlank(loanAccountLock.getError());
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockService.java
index 98760cc80..6d33f73ee 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockService.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockService.java
@@ -27,7 +27,5 @@ public interface LoanAccountLockService {
 
     boolean isLoanHardLocked(Long loanId);
 
-    boolean isLoanSoftLocked(Long loanId);
-
     void updateCobAndRemoveLocks();
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockServiceImpl.java
index 673eef2d5..2a7ef4837 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/LoanAccountLockServiceImpl.java
@@ -49,16 +49,11 @@ public class LoanAccountLockServiceImpl implements LoanAccountLockService {
                 || loanAccountLockRepository.existsByLoanIdAndLockOwner(loanId, LockOwner.LOAN_INLINE_COB_PROCESSING);
     }
 
-    @Override
-    public boolean isLoanSoftLocked(Long loanId) {
-        return loanAccountLockRepository.existsByLoanIdAndLockOwner(loanId, LockOwner.LOAN_COB_PARTITIONING);
-    }
-
     @Override
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void updateCobAndRemoveLocks() {
         loanAccountLockRepository.updateLoanFromAccountLocks();
-        loanAccountLockRepository.updateToSoftLockByOwner();
+        loanAccountLockRepository.removeLockByOwner();
     }
 
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java
index 9a410cb2e..01f19c3ea 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilter.java
@@ -121,7 +121,7 @@ public class LoanCOBApiFilter extends OncePerRequestFilter implements BatchReque
                 } else {
                     try {
                         List<Long> loanIds = calculateRelevantLoanIds(request.getPathInfo());
-                        if (!loanIds.isEmpty() && (isLoanSoftLocked(loanIds) || isLoanBehind(loanIds))) {
+                        if (!loanIds.isEmpty() && isLoanBehind(loanIds)) {
                             executeInlineCob(loanIds);
                         }
                         proceed(filterChain, request, response);
@@ -184,17 +184,8 @@ public class LoanCOBApiFilter extends OncePerRequestFilter implements BatchReque
         }
     }
 
-    private boolean isLoanSoftLocked(List<Long> loanIds) {
-        return isLoanLocked(loanIds, false);
-    }
-
     private boolean isLoanHardLocked(List<Long> loanIds) {
-        return isLoanLocked(loanIds, true);
-    }
-
-    private boolean isLoanLocked(List<Long> loanIds, boolean isHardLock) {
-        return isHardLock ? loanIds.stream().anyMatch(loanAccountLockService::isLoanHardLocked)
-                : loanIds.stream().anyMatch(loanAccountLockService::isLoanSoftLocked);
+        return loanIds.stream().anyMatch(loanAccountLockService::isLoanHardLocked);
     }
 
     private void proceed(FilterChain filterChain, HttpServletRequest request, HttpServletResponse response)
@@ -256,7 +247,7 @@ public class LoanCOBApiFilter extends OncePerRequestFilter implements BatchReque
                     boolean bypassUser = isBypassUser();
                     if (!bypassUser) {
                         List<Long> result = calculateRelevantLoanIds(relativeUrl);
-                        if (!result.isEmpty() && (isLoanSoftLocked(result) || isLoanBehind(result))) {
+                        if (!result.isEmpty() && isLoanBehind(result)) {
                             executeInlineCob(result);
                         }
                     }
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
index 55a65b82c..ce63f5053 100644
--- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
@@ -127,4 +127,5 @@
     <include file="parts/0105_add_indices_loan_table.xml" relativeToChangelogFile="true" />
     <include file="parts/0106_new_repayment_strategy.xml" relativeToChangelogFile="true" />
     <include file="parts/0107_add_configuration_charges_accrual_date.xml" relativeToChangelogFile="true" />
+    <include file="parts/0108_precondition_check_cob_loan_account_lock.xml" relativeToChangelogFile="true" />
 </databaseChangeLog>
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0108_precondition_check_cob_loan_account_lock.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0108_precondition_check_cob_loan_account_lock.xml
new file mode 100644
index 000000000..70a870921
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0108_precondition_check_cob_loan_account_lock.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
+    <changeSet author="fineract" id="1">
+        <preConditions onFail="HALT" onFailMessage="Loan COB check failed: There should not be any soft locks for loan account.">
+            <sqlCheck expectedResult="0">select count(*) from m_loan_account_locks where lock_owner = 'LOAN_COB_PARTITIONING'</sqlCheck>
+        </preConditions>
+    </changeSet>
+</databaseChangeLog>
diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java
index 0b437e085..7e2968ec4 100644
--- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java
+++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java
@@ -83,10 +83,9 @@ public class ApplyLoanLockTaskletStepDefinitions implements En {
                 lenient().when(loanLockingService.findAllByLoanIdIn(Mockito.anyList())).thenThrow(new RuntimeException("fail"));
             } else {
                 LoanAccountLock lock1 = new LoanAccountLock(1L, LockOwner.LOAN_COB_CHUNK_PROCESSING, LocalDate.now(ZoneId.systemDefault()));
-                LoanAccountLock lock2 = new LoanAccountLock(2L, LockOwner.LOAN_COB_PARTITIONING, LocalDate.now(ZoneId.systemDefault()));
                 LoanAccountLock lock3 = new LoanAccountLock(3L, LockOwner.LOAN_INLINE_COB_PROCESSING,
                         LocalDate.now(ZoneId.systemDefault()));
-                List<LoanAccountLock> accountLocks = List.of(lock1, lock2, lock3);
+                List<LoanAccountLock> accountLocks = List.of(lock1, lock3);
                 lenient().when(fineractProperties.getQuery()).thenReturn(fineractQueryProperties);
                 lenient().when(fineractQueryProperties.getInClauseParameterSizeLimit()).thenReturn(65000);
                 lenient().when(loanLockingService.findAllByLoanIdIn(Mockito.anyList())).thenReturn(accountLocks);
@@ -101,7 +100,7 @@ public class ApplyLoanLockTaskletStepDefinitions implements En {
 
         Then("ApplyLoanLockTasklet.execute result should match", () -> {
             assertEquals(RepeatStatus.FINISHED, resultItem);
-            verify(loanLockingService, Mockito.times(1)).upgradeLock(valueCaptor.capture(), lockOwnerValueCaptor.capture());
+            verify(loanLockingService, Mockito.times(1)).applyLock(valueCaptor.capture(), lockOwnerValueCaptor.capture());
             List<Long> values = valueCaptor.getValue();
             assertEquals(2L, values.get(0));
             assertEquals(LockOwner.LOAN_COB_CHUNK_PROCESSING, lockOwnerValueCaptor.getValue());
diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/FetchAndLockLoanStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/FetchAndLockLoanStepDefinitions.java
deleted file mode 100644
index b5cda2574..000000000
--- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/FetchAndLockLoanStepDefinitions.java
+++ /dev/null
@@ -1,178 +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.cob.loan;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.lenient;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import io.cucumber.java8.En;
-import java.time.LocalDate;
-import java.time.ZoneId;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
-import org.apache.fineract.cob.common.CustomJobParameterResolver;
-import org.apache.fineract.cob.data.LoanCOBParameter;
-import org.apache.fineract.cob.domain.LoanAccountLock;
-import org.apache.fineract.cob.domain.LoanAccountLockRepository;
-import org.apache.fineract.cob.domain.LockOwner;
-import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
-import org.apache.fineract.infrastructure.core.config.FineractProperties;
-import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
-import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mockito;
-import org.springframework.batch.core.JobExecution;
-import org.springframework.batch.core.StepContribution;
-import org.springframework.batch.core.StepExecution;
-import org.springframework.batch.repeat.RepeatStatus;
-
-public class FetchAndLockLoanStepDefinitions implements En {
-
-    private final LoanAccountLockRepository loanAccountLockRepository = mock(LoanAccountLockRepository.class);
-    private final FineractProperties fineractProperties = mock(FineractProperties.class);
-    private final FineractProperties.FineractQueryProperties fineractQueryProperties = mock(
-            FineractProperties.FineractQueryProperties.class);
-    StepContribution contribution;
-    ArgumentCaptor<LocalDate> dateValueCaptor = ArgumentCaptor.forClass(LocalDate.class);
-    ArgumentCaptor<LoanCOBParameter> loanCOBParameterValueCaptor = ArgumentCaptor.forClass(LoanCOBParameter.class);
-
-    ArgumentCaptor<Boolean> isCatchUpParameterCaptor = ArgumentCaptor.forClass(Boolean.class);
-    private LockLoanTasklet lockLoanTasklet;
-    private String action;
-    private RepeatStatus result;
-    private final LoanLockingService loanLockingService = mock(LoanLockingService.class);
-
-    private final CustomJobParameterResolver customJobParameterResolver = mock(CustomJobParameterResolver.class);
-
-    public FetchAndLockLoanStepDefinitions() {
-        Given("/^The FetchAndLockLoanTasklet.execute method with action (.*)$/", (String action) -> {
-            ThreadLocalContextUtil.setTenant(new FineractPlatformTenant(1L, "default", "Default", "Asia/Kolkata", null));
-            HashMap<BusinessDateType, LocalDate> businessDateMap = new HashMap<>();
-            businessDateMap.put(BusinessDateType.COB_DATE, LocalDate.now(ZoneId.systemDefault()));
-            ThreadLocalContextUtil.setBusinessDates(businessDateMap);
-            this.action = action;
-
-            JobExecution jobExecution = new JobExecution(1L);
-            StepExecution stepExecution = new StepExecution("step", jobExecution);
-            contribution = new StepContribution(stepExecution);
-            contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME,
-                    LocalDate.now(ZoneId.systemDefault()).toString());
-            lenient().when(customJobParameterResolver.getCustomJobParameterSet(Mockito.any())).thenReturn(Optional.empty());
-            if ("empty loanIds".equals(action)) {
-                contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.LOAN_COB_PARAMETER,
-                        new LoanCOBParameter(0L, 0L));
-            } else if ("good".equals(action)) {
-                contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.LOAN_COB_PARAMETER,
-                        new LoanCOBParameter(1L, 3L));
-                lenient().when(fineractProperties.getQuery()).thenReturn(fineractQueryProperties);
-                lenient().when(fineractQueryProperties.getInClauseParameterSizeLimit()).thenReturn(65000);
-                lenient().when(loanAccountLockRepository.findAllByLoanIdIn(Mockito.anyList())).thenReturn(Collections.emptyList());
-            } else if ("soft lock".equals(action)) {
-                contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.LOAN_COB_PARAMETER,
-                        new LoanCOBParameter(1L, 3L));
-                lenient().when(fineractProperties.getQuery()).thenReturn(fineractQueryProperties);
-                lenient().when(fineractQueryProperties.getInClauseParameterSizeLimit()).thenReturn(65000);
-                lenient().when(loanAccountLockRepository.findAllByLoanIdIn(Mockito.anyList())).thenReturn(
-                        List.of(new LoanAccountLock(1L, LockOwner.LOAN_COB_PARTITIONING, LocalDate.now(ZoneId.systemDefault()))));
-            } else if ("inline cob".equals(action)) {
-                contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.LOAN_COB_PARAMETER,
-                        new LoanCOBParameter(1L, 3L));
-                lenient().when(fineractProperties.getQuery()).thenReturn(fineractQueryProperties);
-                lenient().when(fineractQueryProperties.getInClauseParameterSizeLimit()).thenReturn(65000);
-                lenient().when(loanAccountLockRepository.findAllByLoanIdIn(Mockito.anyList())).thenReturn(
-                        List.of(new LoanAccountLock(2L, LockOwner.LOAN_INLINE_COB_PROCESSING, LocalDate.now(ZoneId.systemDefault()))));
-            } else if ("chunk processing".equals(action)) {
-                contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.LOAN_COB_PARAMETER,
-                        new LoanCOBParameter(1L, 3L));
-                lenient().when(fineractProperties.getQuery()).thenReturn(fineractQueryProperties);
-                lenient().when(fineractQueryProperties.getInClauseParameterSizeLimit()).thenReturn(65000);
-                lenient().when(loanAccountLockRepository.findAllByLoanIdIn(Mockito.anyList())).thenReturn(
-                        List.of(new LoanAccountLock(3L, LockOwner.LOAN_COB_CHUNK_PROCESSING, LocalDate.now(ZoneId.systemDefault()))));
-            }
-
-            lockLoanTasklet = new LockLoanTasklet(loanLockingService, customJobParameterResolver);
-        });
-
-        When("FetchAndLockLoanTasklet.execute method executed", () -> {
-            result = lockLoanTasklet.execute(contribution, null);
-        });
-
-        Then("FetchAndLockLoanTasklet.execute result should match", () -> {
-            if ("empty steps".equals(action)) {
-                assertEquals(RepeatStatus.FINISHED, result);
-            } else if ("good".equals(action)) {
-                verify(loanLockingService).applySoftLock(dateValueCaptor.capture(), loanCOBParameterValueCaptor.capture(),
-                        isCatchUpParameterCaptor.capture());
-                assertEquals(LocalDate.now(ZoneId.systemDefault()).minusDays(1), dateValueCaptor.getValue());
-                assertEquals(1L, loanCOBParameterValueCaptor.getValue().getMinLoanId());
-                assertEquals(3L, loanCOBParameterValueCaptor.getValue().getMaxLoanId());
-                assertEquals(RepeatStatus.FINISHED, result);
-                assertEquals(false, isCatchUpParameterCaptor.getValue());
-                LoanCOBParameter loanCOBParameter = (LoanCOBParameter) contribution.getStepExecution().getJobExecution()
-                        .getExecutionContext().get(LoanCOBConstant.LOAN_COB_PARAMETER);
-                assertEquals(2, loanCOBParameter.getMaxLoanId() - loanCOBParameter.getMinLoanId());
-                assertEquals(1L, loanCOBParameter.getMinLoanId());
-                assertEquals(3L, loanCOBParameter.getMaxLoanId());
-            } else if ("soft lock".equals(action)) {
-                verify(loanLockingService).applySoftLock(dateValueCaptor.capture(), loanCOBParameterValueCaptor.capture(),
-                        isCatchUpParameterCaptor.capture());
-                assertEquals(LocalDate.now(ZoneId.systemDefault()).minusDays(1), dateValueCaptor.getValue());
-                assertEquals(1L, loanCOBParameterValueCaptor.getValue().getMinLoanId());
-                assertEquals(3L, loanCOBParameterValueCaptor.getValue().getMaxLoanId());
-                assertEquals(RepeatStatus.FINISHED, result);
-                assertEquals(false, isCatchUpParameterCaptor.getValue());
-                LoanCOBParameter loanCOBParameter = (LoanCOBParameter) contribution.getStepExecution().getJobExecution()
-                        .getExecutionContext().get(LoanCOBConstant.LOAN_COB_PARAMETER);
-                assertEquals(2, loanCOBParameter.getMaxLoanId() - loanCOBParameter.getMinLoanId());
-                assertEquals(1L, loanCOBParameter.getMinLoanId());
-                assertEquals(3L, loanCOBParameter.getMaxLoanId());
-            } else if ("inline cob".equals(action)) {
-                verify(loanLockingService).applySoftLock(dateValueCaptor.capture(), loanCOBParameterValueCaptor.capture(),
-                        isCatchUpParameterCaptor.capture());
-                assertEquals(LocalDate.now(ZoneId.systemDefault()).minusDays(1), dateValueCaptor.getValue());
-                assertEquals(1L, loanCOBParameterValueCaptor.getValue().getMinLoanId());
-                assertEquals(3L, loanCOBParameterValueCaptor.getValue().getMaxLoanId());
-                assertEquals(RepeatStatus.FINISHED, result);
-                assertEquals(false, isCatchUpParameterCaptor.getValue());
-                LoanCOBParameter loanCOBParameter = (LoanCOBParameter) contribution.getStepExecution().getJobExecution()
-                        .getExecutionContext().get(LoanCOBConstant.LOAN_COB_PARAMETER);
-                assertEquals(2, loanCOBParameter.getMaxLoanId() - loanCOBParameter.getMinLoanId());
-                assertEquals(1L, loanCOBParameter.getMinLoanId());
-                assertEquals(3L, loanCOBParameter.getMaxLoanId());
-            } else if ("chunk processing".equals(action)) {
-                verify(loanLockingService).applySoftLock(dateValueCaptor.capture(), loanCOBParameterValueCaptor.capture(),
-                        isCatchUpParameterCaptor.capture());
-                assertEquals(LocalDate.now(ZoneId.systemDefault()).minusDays(1), dateValueCaptor.getValue());
-                assertEquals(1L, loanCOBParameterValueCaptor.getValue().getMinLoanId());
-                assertEquals(3L, loanCOBParameterValueCaptor.getValue().getMaxLoanId());
-                assertEquals(RepeatStatus.FINISHED, result);
-                assertEquals(false, isCatchUpParameterCaptor.getValue());
-                LoanCOBParameter loanCOBParameter = (LoanCOBParameter) contribution.getStepExecution().getJobExecution()
-                        .getExecutionContext().get(LoanCOBConstant.LOAN_COB_PARAMETER);
-                assertEquals(2, loanCOBParameter.getMaxLoanId() - loanCOBParameter.getMinLoanId());
-                assertEquals(1L, loanCOBParameter.getMinLoanId());
-                assertEquals(3L, loanCOBParameter.getMaxLoanId());
-            }
-        });
-    }
-}
diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilterTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilterTest.java
index 68e838eab..a54c5b921 100644
--- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilterTest.java
+++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBApiFilterTest.java
@@ -193,7 +193,6 @@ class LoanCOBApiFilterTest {
         given(request.getPathInfo()).willReturn("/v1/loans/2/charges");
         given(request.getMethod()).willReturn(HTTPMethods.POST.value());
         given(loanAccountLockService.isLoanHardLocked(2L)).willReturn(false);
-        given(loanAccountLockService.isLoanSoftLocked(2L)).willReturn(false);
         given(context.authenticatedUser()).willReturn(appUser);
         given(fineractProperties.getQuery()).willReturn(fineractQueryProperties);
         given(fineractQueryProperties.getInClauseParameterSizeLimit()).willReturn(65000);
@@ -221,7 +220,6 @@ class LoanCOBApiFilterTest {
         given(request.getPathInfo()).willReturn("/v1/loans/external-id/" + uuid + "/charges");
         given(request.getMethod()).willReturn(HTTPMethods.POST.value());
         given(loanAccountLockService.isLoanHardLocked(2L)).willReturn(false);
-        given(loanAccountLockService.isLoanSoftLocked(2L)).willReturn(false);
         given(context.authenticatedUser()).willReturn(appUser);
         given(loanRepository.findIdByExternalId(any())).willReturn(2L);
         given(fineractProperties.getQuery()).willReturn(fineractQueryProperties);
@@ -250,7 +248,6 @@ class LoanCOBApiFilterTest {
         given(request.getPathInfo()).willReturn("/v1/rescheduleloans/" + resourceId + "/charges");
         given(request.getMethod()).willReturn(HTTPMethods.POST.value());
         given(loanAccountLockService.isLoanHardLocked(2L)).willReturn(false);
-        given(loanAccountLockService.isLoanSoftLocked(2L)).willReturn(false);
         given(fineractProperties.getQuery()).willReturn(fineractQueryProperties);
         given(fineractQueryProperties.getInClauseParameterSizeLimit()).willReturn(65000);
         LoanRescheduleRequest rescheduleRequest = mock(LoanRescheduleRequest.class);
@@ -265,24 +262,6 @@ class LoanCOBApiFilterTest {
         verify(filterChain, times(1)).doFilter(request, response);
     }
 
-    @Test
-    void shouldRunInlineCOBAndProceedWhenLoanIsSoftLocked() throws ServletException, IOException {
-        MockHttpServletRequest request = mock(MockHttpServletRequest.class);
-        MockHttpServletResponse response = mock(MockHttpServletResponse.class);
-        FilterChain filterChain = mock(FilterChain.class);
-        AppUser appUser = mock(AppUser.class);
-
-        given(request.getPathInfo()).willReturn("/v1/loans/2/charges");
-        given(request.getMethod()).willReturn(HTTPMethods.POST.value());
-        given(loanAccountLockService.isLoanHardLocked(2L)).willReturn(false);
-        given(loanAccountLockService.isLoanSoftLocked(2L)).willReturn(true);
-        given(context.authenticatedUser()).willReturn(appUser);
-
-        testObj.doFilterInternal(request, response, filterChain);
-        verify(inlineLoanCOBExecutorService, times(1)).execute(Collections.singletonList(2L), "INLINE_LOAN_COB");
-        verify(filterChain, times(1)).doFilter(request, response);
-    }
-
     @Test
     void shouldRunInlineCOBAndProceedWhenLoanIsBehind() throws ServletException, IOException {
         MockHttpServletRequest request = mock(MockHttpServletRequest.class);
@@ -299,16 +278,15 @@ class LoanCOBApiFilterTest {
 
         LoanIdAndLastClosedBusinessDate result = mock(LoanIdAndLastClosedBusinessDate.class);
         given(result.getId()).willReturn(2L);
+        given(result.getLastClosedBusinessDate()).willReturn(businessDate.minusDays(2));
         given(request.getPathInfo()).willReturn("/v1/loans/2?command=approve");
         given(request.getMethod()).willReturn(HTTPMethods.POST.value());
         given(loanAccountLockService.isLoanHardLocked(2L)).willReturn(false);
-        given(loanAccountLockService.isLoanSoftLocked(2L)).willReturn(true);
         given(fineractProperties.getQuery()).willReturn(fineractQueryProperties);
         given(fineractQueryProperties.getInClauseParameterSizeLimit()).willReturn(65000);
-        given(loanRepository.findAllNonClosedLoansBehindOrNullByLoanIds(
+        given(loanRepository.findAllNonClosedLoansBehindByLoanIds(
                 eq(ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE)), anyList()))
                         .willReturn(Collections.singletonList(result));
-
         given(context.authenticatedUser()).willReturn(appUser);
 
         testObj.doFilterInternal(request, response, filterChain);
@@ -335,7 +313,6 @@ class LoanCOBApiFilterTest {
         given(request.getPathInfo()).willReturn("/v1/loans/2?command=approve");
         given(request.getMethod()).willReturn(HTTPMethods.POST.value());
         given(loanAccountLockService.isLoanHardLocked(2L)).willReturn(false);
-        given(loanAccountLockService.isLoanSoftLocked(2L)).willReturn(false);
         given(fineractProperties.getQuery()).willReturn(fineractQueryProperties);
         given(fineractQueryProperties.getInClauseParameterSizeLimit()).willReturn(65000);
         given(loanRepository.findAllNonClosedLoansBehindOrNullByLoanIds(
diff --git a/fineract-provider/src/test/resources/features/cob/loan/cob.loan.fetch.lock.feature b/fineract-provider/src/test/resources/features/cob/loan/cob.loan.fetch.lock.feature
deleted file mode 100644
index 9df96a0e6..000000000
--- a/fineract-provider/src/test/resources/features/cob/loan/cob.loan.fetch.lock.feature
+++ /dev/null
@@ -1,34 +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.
-#
-
-Feature: COB Loan fetch and (soft) lock Step
-
-  @cob
-  Scenario Outline: FetchAndLockLoanTasklet - run test
-    Given The FetchAndLockLoanTasklet.execute method with action <action>
-    When FetchAndLockLoanTasklet.execute method executed
-    Then FetchAndLockLoanTasklet.execute result should match
-
-    Examples:
-      |action|
-      |empty loanIds|
-      |good|
-      |soft lock|
-      |inline cob|
-      |chunk processing|
\ No newline at end of file
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java
index 50ca643cd..6d1b5d606 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java
@@ -284,7 +284,6 @@ public class InlineLoanCOBTest {
 
             requestSpec = UserHelper.getSimpleUserWithoutBypassPermission(requestSpec, responseSpec);
 
-            loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING");
             loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec);
 
             loanTransactionHelper.makeRepayment("10 March 2020", 10.0f, loanID);
@@ -399,8 +398,6 @@ public class InlineLoanCOBTest {
             BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10));
 
             requestSpec = UserHelper.getSimpleUserWithoutBypassPermission(requestSpec, responseSpec);
-
-            loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING");
             loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec);
 
             final BatchRequest br1 = BatchHelper.oldRepayLoanRequestWithGivenLoanId(4730L, loanID, "10", LocalDate.of(2020, 3, 10));
@@ -468,8 +465,6 @@ public class InlineLoanCOBTest {
             BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10));
 
             requestSpec = UserHelper.getSimpleUserWithoutBypassPermission(requestSpec, responseSpec);
-
-            loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING");
             loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec);
 
             final BatchRequest br1 = BatchHelper.repayLoanRequestWithGivenLoanId(4730L, loanID, "10", LocalDate.of(2020, 3, 10));