Fixed ranking issue
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user