Fixed ranking issue

This commit is contained in:
rajesh
2026-04-15 16:12:59 +05:30
parent eef2d621f8
commit c9534187af
4 changed files with 381 additions and 5 deletions

View File

@@ -1173,26 +1173,57 @@ public class ApplicationDao {
validateRankingActionRequest(rankingActionType, manualRanking);
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
if (rankingActionType == null) {
compactManualRanksAfterLeavingReposition(applicationEntity);
applicationEntity.setRankingActionType(null);
applicationEntity.setManualRanking(null);
} else {
if (rankingActionType == ApplicationRankingActionTypeEnum.REPOSITION
&& applicationRepository.existsByCallIdAndManualRankingAndIsDeletedFalseAndIdNot(
applicationEntity.getCall().getId(), manualRanking, applicationEntity.getId())) {
throw new CustomValidationException(Status.BAD_REQUEST,
Translator.toLocale(GepafinConstant.APPLICATION_RANKING_ACTION_INVALID));
if (rankingActionType == ApplicationRankingActionTypeEnum.REPOSITION) {
shiftOtherManualRanksForReposition(applicationEntity, manualRanking);
} else if (rankingActionType == ApplicationRankingActionTypeEnum.REMOVE) {
compactManualRanksAfterLeavingReposition(applicationEntity);
}
applicationEntity.setRankingActionType(rankingActionType.getValue());
applicationEntity.setManualRanking(
rankingActionType == ApplicationRankingActionTypeEnum.REPOSITION ? manualRanking : null);
}
applicationEntity = applicationRepository.save(applicationEntity);
normalizeDenseManualRanksForCall(applicationEntity.getCall().getId());
applicationEntity = applicationRepository.findById(applicationEntity.getId()).orElse(applicationEntity);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE)
.oldData(oldApplicationEntity).newData(applicationEntity).build());
return getApplicationResponse(applicationEntity);
}
/**
* Keeps stored manual ranks in {@code 1..N} for the call (same count as repositioned rows with a manual value),
* preserving relative order. Prevents gaps or values above the pool size (e.g. 2,3,4,5 with four apps → 1,2,3,4).
*/
private void normalizeDenseManualRanksForCall(Long callId) {
String reposition = ApplicationRankingActionTypeEnum.REPOSITION.getValue();
List<ApplicationEntity> repositioned = applicationRepository.findByCallIdAndIsDeletedFalse(callId).stream()
.filter(a -> ApplicationStatusTypeEnum.APPROVED.getValue().equals(a.getStatus()))
.filter(a -> reposition.equalsIgnoreCase(StringUtils.trimToEmpty(a.getRankingActionType())))
.filter(a -> a.getManualRanking() != null)
.sorted(Comparator.comparing(ApplicationEntity::getManualRanking).thenComparing(ApplicationEntity::getId))
.collect(Collectors.toList());
if (repositioned.isEmpty()) {
return;
}
boolean changed = false;
long slot = 1L;
for (ApplicationEntity a : repositioned) {
if (!Objects.equals(a.getManualRanking(), slot)) {
a.setManualRanking(slot);
changed = true;
}
slot++;
}
if (changed) {
applicationRepository.saveAll(repositioned);
}
}
public CallRankingSummaryResponse getApplicationRanking(Long callId,
List<ApplicationRankingActionTypeEnum> rankingActionTypes) {
CallEntity call = callRepository.findById(callId)
@@ -1269,6 +1300,48 @@ public class ApplicationDao {
}
}
/**
* When an application stops using manual REPOSITION (cleared or REMOVE), every other manual rank above its
* old slot shifts down by one so ranks stay dense (e.g. after removing rank 1, 2 and 3 become 1 and 2).
*/
private void compactManualRanksAfterLeavingReposition(ApplicationEntity applicationEntity) {
String repositionType = ApplicationRankingActionTypeEnum.REPOSITION.getValue();
if (!repositionType.equalsIgnoreCase(StringUtils.trimToEmpty(applicationEntity.getRankingActionType()))) {
return;
}
Long releasedRank = applicationEntity.getManualRanking();
if (releasedRank == null) {
return;
}
applicationRepository.compactRepositionedManualRankingAfterSlotFreed(
applicationEntity.getCall().getId(),
applicationEntity.getId(),
releasedRank,
repositionType);
}
private void shiftOtherManualRanksForReposition(ApplicationEntity applicationEntity, Long newRank) {
Long callId = applicationEntity.getCall().getId();
Long applicationId = applicationEntity.getId();
String repositionType = ApplicationRankingActionTypeEnum.REPOSITION.getValue();
Long oldRank = applicationEntity.getManualRanking();
if (Objects.equals(oldRank, newRank)) {
return;
}
if (oldRank == null) {
applicationRepository.bumpRepositionedManualRankingFromRankInclusive(callId, applicationId, newRank,
repositionType);
return;
}
if (newRank < oldRank) {
applicationRepository.bumpRepositionedManualRankingUpInHalfOpenInterval(callId, applicationId, newRank,
oldRank, repositionType);
} else {
applicationRepository.bumpRepositionedManualRankingDownInHalfOpenInterval(callId, applicationId, oldRank,
newRank, repositionType);
}
}
/**
* Sets all non-terminal amendments, the application evaluation (if any), and the assigned application row to CLOSE.
*/