FINERACT-2081: Enable inline COB execution for locked loans

This commit is contained in:
Jose Alberto Hernandez
2024-11-27 10:09:49 +01:00
committed by Adam Saghy
parent 2e89c40e6e
commit 240a6dffc8
9 changed files with 163 additions and 4 deletions
@@ -36,6 +36,8 @@ public interface LoanAccountLockRepository
boolean existsByLoanIdAndLockOwner(Long loanId, LockOwner lockOwner);
boolean existsByLoanIdAndLockOwnerAndErrorIsNotNull(Long loanId, LockOwner lockOwner);
@Query("""
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)
@@ -27,5 +27,7 @@ public interface LoanAccountLockService {
boolean isLoanHardLocked(Long loanId);
boolean isLockOverrulable(Long loanId);
void updateCobAndRemoveLocks();
}
@@ -49,6 +49,12 @@ public class LoanAccountLockServiceImpl implements LoanAccountLockService {
|| loanAccountLockRepository.existsByLoanIdAndLockOwner(loanId, LockOwner.LOAN_INLINE_COB_PROCESSING);
}
@Override
public boolean isLockOverrulable(Long loanId) {
return loanAccountLockRepository.existsByLoanIdAndLockOwnerAndErrorIsNotNull(loanId, LockOwner.LOAN_COB_CHUNK_PROCESSING) //
|| loanAccountLockRepository.existsByLoanIdAndLockOwnerAndErrorIsNotNull(loanId, LockOwner.LOAN_INLINE_COB_PROCESSING);
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateCobAndRemoveLocks() {
@@ -186,6 +186,14 @@ public class LoanCOBFilterHelper implements InitializingBean {
return loanIds.stream().anyMatch(loanAccountLockService::isLoanHardLocked);
}
private boolean isLockOverrulable(Long... loanIds) {
return isLockOverrulable(Arrays.asList(loanIds));
}
private boolean isLockOverrulable(List<Long> loanIds) {
return loanIds.stream().anyMatch(loanAccountLockService::isLockOverrulable);
}
public boolean isLoanBehind(List<Long> loanIds) {
List<LoanIdAndLastClosedBusinessDate> loanIdAndLastClosedBusinessDates = new ArrayList<>();
List<List<Long>> partitions = Lists.partition(loanIds, fineractProperties.getQuery().getInClauseParameterSizeLimit());
@@ -217,7 +225,7 @@ public class LoanCOBFilterHelper implements InitializingBean {
// check the body for Loan ID
Long loanId = getTopLevelLoanIdFromBatchRequest(batchRequest);
if (loanId != null) {
if (isLoanHardLocked(loanId)) {
if (isLoanHardLocked(loanId) && !isLockOverrulable(loanId)) {
throw new LoanIdsHardLockedException(loanId);
} else {
loanIds.add(loanId);
@@ -240,7 +248,7 @@ public class LoanCOBFilterHelper implements InitializingBean {
private List<Long> getLoanIdsFromApi(String pathInfo) {
List<Long> loanIds = getLoanIdList(pathInfo);
if (isLoanHardLocked(loanIds)) {
if (isLoanHardLocked(loanIds) && !isLockOverrulable(loanIds)) {
throw new LoanIdsHardLockedException(loanIds.get(0));
} else {
return loanIds;