RED-2661 Removing a dossier member or deleting a user must not change the status of a file
- renamed currentReviewer to assignee, "Unassigned" status into "NEW" - added lastApprover - modified logic for setCurrentAssignee, setUnderReview, setUnderApproval and setApproved - integration tests updated
This commit is contained in:
parent
37ea0c3f2c
commit
104f44b06f
@ -30,8 +30,9 @@ public class FileModel {
|
|||||||
private OffsetDateTime lastProcessed;
|
private OffsetDateTime lastProcessed;
|
||||||
private OffsetDateTime lastIndexed;
|
private OffsetDateTime lastIndexed;
|
||||||
private int numberOfAnalyses;
|
private int numberOfAnalyses;
|
||||||
private String currentReviewer;
|
private String assignee;
|
||||||
private String lastReviewer;
|
private String lastReviewer;
|
||||||
|
private String lastApprover;
|
||||||
private OffsetDateTime lastManualRedaction;
|
private OffsetDateTime lastManualRedaction;
|
||||||
private boolean hasRedactions;
|
private boolean hasRedactions;
|
||||||
private boolean hasHints;
|
private boolean hasHints;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file;
|
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file;
|
||||||
|
|
||||||
public enum WorkflowStatus {
|
public enum WorkflowStatus {
|
||||||
UNASSIGNED, UNDER_REVIEW, UNDER_APPROVAL, APPROVED
|
NEW, UNDER_REVIEW, UNDER_APPROVAL, APPROVED
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,8 @@ public interface StatusResource {
|
|||||||
String EXCLUDED_STATUS_PARAM = "excluded";
|
String EXCLUDED_STATUS_PARAM = "excluded";
|
||||||
|
|
||||||
String APPROVER_ID_REQUEST_PARAM = "approverId";
|
String APPROVER_ID_REQUEST_PARAM = "approverId";
|
||||||
String REVIEWER_ID_REQUEST_PARAM = "reviewerId";
|
String ASSIGNEE_ID_REQUEST_PARAM = "assigneeId";
|
||||||
|
String USER_ID_REQUEST_PARAM = "userId";
|
||||||
|
|
||||||
|
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@ -55,20 +56,20 @@ public interface StatusResource {
|
|||||||
FileModel getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
|
FileModel getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
|
||||||
|
|
||||||
|
|
||||||
@PostMapping(value = STATUS_PATH + "/reviewer" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
|
@PostMapping(value = STATUS_PATH + "/assignee" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||||
void setCurrentFileReviewer(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId,
|
void setCurrentFileAssignee(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId,
|
||||||
@RequestParam(value = REVIEWER_ID_REQUEST_PARAM, required =false) String reviewerId);
|
@RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required =false) String assigneeId);
|
||||||
|
|
||||||
|
|
||||||
@PostMapping(value = STATUS_PATH + "/underreview" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
@PostMapping(value = STATUS_PATH + "/underreview" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
||||||
void setStatusUnderReview(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
|
void setStatusUnderReview(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = USER_ID_REQUEST_PARAM, required = false) String userId);
|
||||||
|
|
||||||
@PostMapping(value = STATUS_PATH + "/underapproval" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
@PostMapping(value = STATUS_PATH + "/underapproval" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
||||||
void setStatusUnderApproval(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId);
|
void setStatusUnderApproval(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId);
|
||||||
|
|
||||||
|
|
||||||
@PostMapping(value = STATUS_PATH + "/approved" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
@PostMapping(value = STATUS_PATH + "/approved" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
||||||
void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
|
void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId);
|
||||||
|
|
||||||
@PostMapping(value = STATUS_PATH + "/toggle-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
@PostMapping(value = STATUS_PATH + "/toggle-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
|
||||||
void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excluded);
|
void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excluded);
|
||||||
|
|||||||
@ -60,11 +60,14 @@ public class FileEntity {
|
|||||||
private int numberOfAnalyses;
|
private int numberOfAnalyses;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String currentReviewer;
|
private String assignee;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String lastReviewer;
|
private String lastReviewer;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String lastApprover;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private OffsetDateTime lastManualRedaction;
|
private OffsetDateTime lastManualRedaction;
|
||||||
|
|
||||||
|
|||||||
@ -41,7 +41,7 @@ public class FileStatusPersistenceService {
|
|||||||
file.setDossier(dossierRepository.getOne(dossierId));
|
file.setDossier(dossierRepository.getOne(dossierId));
|
||||||
file.setFilename(filename);
|
file.setFilename(filename);
|
||||||
file.setProcessingStatus(ProcessingStatus.UNPROCESSED);
|
file.setProcessingStatus(ProcessingStatus.UNPROCESSED);
|
||||||
file.setWorkflowStatus(WorkflowStatus.UNASSIGNED);
|
file.setWorkflowStatus(WorkflowStatus.NEW);
|
||||||
file.setNumberOfPages(0);
|
file.setNumberOfPages(0);
|
||||||
file.setAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
file.setAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||||
file.setUploader(uploader);
|
file.setUploader(uploader);
|
||||||
@ -254,14 +254,13 @@ public class FileStatusPersistenceService {
|
|||||||
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void setCurrentReviewer(String fileId, String currentReviewer, String lastReviewer) {
|
public void setAssignee(String fileId, String currentReviewer, String lastReviewer, String lastApprover) {
|
||||||
|
|
||||||
if (isFileDeleted(fileId)) {
|
if (isFileDeleted(fileId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int updateCount = fileRepository.setCurrentReviewer(fileId, currentReviewer, lastReviewer,
|
int updateCount = fileRepository.setAssignee(fileId, currentReviewer, lastReviewer, lastApprover,
|
||||||
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
|
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||||
currentReviewer == null ? WorkflowStatus.UNASSIGNED : WorkflowStatus.UNDER_REVIEW);
|
|
||||||
if (updateCount == 0) {
|
if (updateCount == 0) {
|
||||||
throw new NotFoundException("Unknown file=" + fileId);
|
throw new NotFoundException("Unknown file=" + fileId);
|
||||||
}
|
}
|
||||||
@ -288,7 +287,7 @@ public class FileStatusPersistenceService {
|
|||||||
});
|
});
|
||||||
|
|
||||||
int countUpdate = fileRepository.overwriteFile(fileId, filename, uploader, ProcessingStatus.FULLREPROCESS,
|
int countUpdate = fileRepository.overwriteFile(fileId, filename, uploader, ProcessingStatus.FULLREPROCESS,
|
||||||
WorkflowStatus.UNASSIGNED,
|
WorkflowStatus.NEW,
|
||||||
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
|
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
|
||||||
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||||
if (countUpdate == 0) {
|
if (countUpdate == 0) {
|
||||||
|
|||||||
@ -97,10 +97,9 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
|
|||||||
OffsetDateTime hardDeletedTime, OffsetDateTime deleted);
|
OffsetDateTime hardDeletedTime, OffsetDateTime deleted);
|
||||||
|
|
||||||
@Modifying
|
@Modifying
|
||||||
@Query("update FileEntity f set f.currentReviewer = :currentReviewer, f.lastReviewer = :lastReviewer," +
|
@Query("update FileEntity f set f.assignee = :assignee, f.lastReviewer = :lastReviewer, f.lastApprover = :lastApprover, " +
|
||||||
"f.lastUpdated = :lastUpdated, f.workflowStatus = :workflowStatus where f.id = :fileId")
|
"f.lastUpdated = :lastUpdated where f.id = :fileId")
|
||||||
int setCurrentReviewer(String fileId, String currentReviewer, String lastReviewer, OffsetDateTime lastUpdated,
|
int setAssignee(String fileId, String assignee, String lastReviewer, String lastApprover, OffsetDateTime lastUpdated);
|
||||||
WorkflowStatus workflowStatus);
|
|
||||||
|
|
||||||
@Modifying(clearAutomatically = true)
|
@Modifying(clearAutomatically = true)
|
||||||
@Query("update FileEntity f set f.excluded = :excluded, f.lastUpdated = :lastUpdated where f.id = :fileId")
|
@Query("update FileEntity f set f.excluded = :excluded, f.lastUpdated = :lastUpdated where f.id = :fileId")
|
||||||
@ -109,8 +108,8 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
|
|||||||
@Modifying
|
@Modifying
|
||||||
@Query("update FileEntity f set f.filename = :filename, f.uploader = :uploader, f.processingStatus = :processingStatus, " +
|
@Query("update FileEntity f set f.filename = :filename, f.uploader = :uploader, f.processingStatus = :processingStatus, " +
|
||||||
"f.workflowStatus = :workflowStatus, f.lastUploaded = :lastUploaded, f.lastUpdated = :lastUpdated, " +
|
"f.workflowStatus = :workflowStatus, f.lastUploaded = :lastUploaded, f.lastUpdated = :lastUpdated, " +
|
||||||
"f.lastOCRTime = null, f.excluded = false, f.lastProcessed = null, f.lastReviewer = null, " +
|
"f.lastOCRTime = null, f.excluded = false, f.lastProcessed = null, f.lastReviewer = null, f.lastApprover = null, " +
|
||||||
"f.currentReviewer = null, f.approvalDate = null, f.lastManualRedaction = null, " +
|
"f.assignee = null, f.approvalDate = null, f.lastManualRedaction = null, " +
|
||||||
"f.dictionaryVersion = 0, f.dossierDictionaryVersion = 0, f.rulesVersion = 0, f.hasImages = false, " +
|
"f.dictionaryVersion = 0, f.dossierDictionaryVersion = 0, f.rulesVersion = 0, f.hasImages = false, " +
|
||||||
"f.hasHints = false, f.hasRedactions = false, f.hasSuggestions = false, f.hasUpdates = false, " +
|
"f.hasHints = false, f.hasRedactions = false, f.hasSuggestions = false, f.hasUpdates = false, " +
|
||||||
"f.deleted = null, f.hardDeletedTime = null " +
|
"f.deleted = null, f.hardDeletedTime = null " +
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package com.iqser.red.service.peristence.v1.server.controller;
|
|||||||
import com.iqser.red.service.peristence.v1.server.service.*;
|
import com.iqser.red.service.peristence.v1.server.service.*;
|
||||||
import com.iqser.red.service.peristence.v1.server.utils.FileModelMapper;
|
import com.iqser.red.service.peristence.v1.server.utils.FileModelMapper;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
|
||||||
@ -77,42 +78,58 @@ public class FileStatusController implements StatusResource {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCurrentFileReviewer(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
public void setCurrentFileAssignee(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
||||||
@PathVariable(FILE_ID) String fileId,
|
@PathVariable(FILE_ID) String fileId,
|
||||||
@RequestParam(value = REVIEWER_ID_REQUEST_PARAM, required = false) String reviewerId) {
|
@RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId) {
|
||||||
|
fileStatusService.setAssignee(dossierId, fileId, assigneeId);
|
||||||
fileStatusService.setCurrentReviewer(dossierId, fileId, reviewerId);
|
|
||||||
fileStatusService.setStatusSuccessful(fileId, reviewerId != null ? WorkflowStatus.UNDER_REVIEW : WorkflowStatus.UNASSIGNED);
|
|
||||||
analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setStatusUnderReview(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
public void setStatusUnderReview(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
||||||
@PathVariable(FILE_ID) String fileId) {
|
@PathVariable(FILE_ID) String fileId,
|
||||||
|
@RequestParam(value = USER_ID_REQUEST_PARAM, required = false) String userId) {
|
||||||
|
|
||||||
|
|
||||||
FileEntity fileStatus = fileStatusService.getStatus(fileId);
|
FileEntity fileStatus = fileStatusService.getStatus(fileId);
|
||||||
String lastReviewer = fileStatus.getLastReviewer();
|
String assignee = fileStatus.getAssignee();
|
||||||
fileStatusService.setCurrentReviewer(dossierId, fileId, lastReviewer);
|
if (userId != null) {
|
||||||
fileStatusService.setStatusSuccessful(fileId, lastReviewer != null ? WorkflowStatus.UNDER_REVIEW : WorkflowStatus.UNASSIGNED);
|
assignee = userId;
|
||||||
|
fileStatusService.setAssignee(dossierId, fileId, assignee);
|
||||||
|
}
|
||||||
|
fileStatusService.setStatusSuccessful(fileId, assignee != null ? WorkflowStatus.UNDER_REVIEW : WorkflowStatus.NEW);
|
||||||
analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
|
analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setStatusUnderApproval(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
public void setStatusUnderApproval(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
||||||
@PathVariable(FILE_ID) String fileId,
|
@PathVariable(FILE_ID) String fileId,
|
||||||
@RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId) {
|
@RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId) {
|
||||||
|
|
||||||
fileStatusService.setCurrentReviewer(dossierId, fileId, approverId);
|
FileEntity fileStatus = fileStatusService.getStatus(fileId);
|
||||||
fileStatusService.setStatusSuccessful(fileId, approverId != null ? WorkflowStatus.UNDER_APPROVAL : WorkflowStatus.UNASSIGNED);
|
String assignee = fileStatus.getAssignee();
|
||||||
|
if (approverId != null) {
|
||||||
|
assignee = approverId;
|
||||||
|
|
||||||
|
}
|
||||||
|
fileStatusService.setAssignee(dossierId, fileId, approverId);
|
||||||
|
fileStatusService.setStatusSuccessful(fileId, assignee != null ? WorkflowStatus.UNDER_APPROVAL : WorkflowStatus.NEW);
|
||||||
analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
|
analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
public void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
||||||
@PathVariable(FILE_ID) String fileId) {
|
@PathVariable(FILE_ID) String fileId,
|
||||||
|
@RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId) {
|
||||||
|
|
||||||
|
FileEntity fileStatus = fileStatusService.getStatus(fileId);
|
||||||
|
String assignee = fileStatus.getAssignee();
|
||||||
|
if (assignee == null && approverId == null) {
|
||||||
|
throw new BadRequestException("No user assigned for the approval");
|
||||||
|
}
|
||||||
|
if (approverId != null) {
|
||||||
|
assignee = approverId;
|
||||||
|
}
|
||||||
|
fileStatusService.setAssignee(dossierId, fileId, assignee);
|
||||||
fileStatusService.setApprovalStatusSuccessful(fileId, WorkflowStatus.APPROVED);
|
fileStatusService.setApprovalStatusSuccessful(fileId, WorkflowStatus.APPROVED);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
public void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
|
||||||
|
|||||||
@ -33,7 +33,7 @@ public class AnalysisFlagsCalculationService {
|
|||||||
var file = fileStatusPersistenceService.getStatus(fileId);
|
var file = fileStatusPersistenceService.getStatus(fileId);
|
||||||
var redactionLog = redactionLogService.getRedactionLog(dossierId, fileId, true);
|
var redactionLog = redactionLogService.getRedactionLog(dossierId, fileId, true);
|
||||||
|
|
||||||
var viewedPagesForCurrentReviewer = viewedPagesPersistenceService.findViewedPages(fileId, file.getCurrentReviewer());
|
var viewedPagesForCurrentReviewer = viewedPagesPersistenceService.findViewedPages(fileId, file.getAssignee());
|
||||||
|
|
||||||
Map<Integer, OffsetDateTime> viewedPages = viewedPagesForCurrentReviewer.stream().collect(Collectors.toMap(ViewedPageEntity::getPage, ViewedPageEntity::getViewedTime));
|
Map<Integer, OffsetDateTime> viewedPages = viewedPagesForCurrentReviewer.stream().collect(Collectors.toMap(ViewedPageEntity::getPage, ViewedPageEntity::getViewedTime));
|
||||||
|
|
||||||
|
|||||||
@ -60,8 +60,8 @@ public class FileService {
|
|||||||
throw new ConflictException("File already exists in status APPROVED");
|
throw new ConflictException("File already exists in status APPROVED");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (existingStatus.getCurrentReviewer() != null && !request.getUploader()
|
if (existingStatus.getAssignee() != null && !request.getUploader()
|
||||||
.equalsIgnoreCase(existingStatus.getCurrentReviewer())) {
|
.equalsIgnoreCase(existingStatus.getAssignee())) {
|
||||||
throw new ConflictException("Only the reviewer can overwrite a file");
|
throw new ConflictException("Only the reviewer can overwrite a file");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
|
|||||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException;
|
import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
|
||||||
@ -195,17 +194,24 @@ public class FileStatusService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setCurrentReviewer(String dossierId, String fileId, String currentReviewer) {
|
public void setAssignee(String dossierId, String fileId, String currentReviewer) {
|
||||||
|
|
||||||
if (StringUtils.isNotEmpty(currentReviewer) && !dossierPersistenceService.getAndValidateDossier(dossierId)
|
if (StringUtils.isNotEmpty(currentReviewer) && !dossierPersistenceService.getAndValidateDossier(dossierId)
|
||||||
.getMemberIds()
|
.getMemberIds()
|
||||||
.contains(currentReviewer)) {
|
.contains(currentReviewer)) {
|
||||||
throw new UserNotFoundException("User=" + currentReviewer + " must be member or owner of dossier=" + dossierId);
|
throw new UserNotFoundException("User=" + currentReviewer + " must be member or owner of dossier=" + dossierId);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId);
|
FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId);
|
||||||
|
String lastReviewer = fileStatus.getLastReviewer();
|
||||||
|
String lastApprover = fileStatus.getLastApprover();
|
||||||
|
if(WorkflowStatus.UNDER_REVIEW.equals(fileStatus.getWorkflowStatus())) {
|
||||||
|
lastReviewer = currentReviewer;
|
||||||
|
}
|
||||||
|
if(WorkflowStatus.UNDER_APPROVAL.equals(fileStatus.getWorkflowStatus())) {
|
||||||
|
lastApprover = currentReviewer;
|
||||||
|
}
|
||||||
|
|
||||||
fileStatusPersistenceService.setCurrentReviewer(fileId, currentReviewer, fileStatus.getCurrentReviewer());
|
fileStatusPersistenceService.setAssignee(fileId, currentReviewer, lastReviewer, lastApprover);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -61,7 +61,7 @@ public class ReanalysisRequiredStatusService {
|
|||||||
if (ProcessingStatus.PROCESSED.equals(fileStatus.getProcessingStatus()) || ProcessingStatus.UNPROCESSED.equals(fileStatus.getProcessingStatus())) {
|
if (ProcessingStatus.PROCESSED.equals(fileStatus.getProcessingStatus()) || ProcessingStatus.UNPROCESSED.equals(fileStatus.getProcessingStatus())) {
|
||||||
|
|
||||||
switch (fileStatus.getWorkflowStatus()) {
|
switch (fileStatus.getWorkflowStatus()) {
|
||||||
case UNASSIGNED:
|
case NEW:
|
||||||
case UNDER_REVIEW:
|
case UNDER_REVIEW:
|
||||||
case UNDER_APPROVAL:
|
case UNDER_APPROVAL:
|
||||||
if (fileStatus.getLastProcessed() == null) {
|
if (fileStatus.getLastProcessed() == null) {
|
||||||
|
|||||||
@ -114,7 +114,7 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest {
|
|||||||
assertThat(dossierStats.isHasSuggestionsFilePresent()).isFalse();
|
assertThat(dossierStats.isHasSuggestionsFilePresent()).isFalse();
|
||||||
assertThat(dossierStats.isHasUpdatesFilePresent()).isFalse();
|
assertThat(dossierStats.isHasUpdatesFilePresent()).isFalse();
|
||||||
assertThat(dossierStats.isHasNoFlagsFilePresent()).isTrue();
|
assertThat(dossierStats.isHasNoFlagsFilePresent()).isTrue();
|
||||||
assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.UNASSIGNED)).isEqualTo(1);
|
assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.NEW)).isEqualTo(1);
|
||||||
assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.APPROVED)).isEqualTo(1);
|
assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.APPROVED)).isEqualTo(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,7 +52,7 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
|
|||||||
.dossierId(dossier.getId())
|
.dossierId(dossier.getId())
|
||||||
.build());
|
.build());
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNASSIGNED);
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW);
|
||||||
assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100);
|
assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100);
|
||||||
|
|
||||||
fileProcessingClient.ocrFailed(dossier.getId(), file.getId());
|
fileProcessingClient.ocrFailed(dossier.getId(), file.getId());
|
||||||
@ -75,7 +75,7 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
|
|||||||
|
|
||||||
fileProcessingClient.indexingSuccessful(dossier.getId(), file.getId());
|
fileProcessingClient.indexingSuccessful(dossier.getId(), file.getId());
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNASSIGNED);
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW);
|
||||||
assertThat(loadedFile.getLastIndexed()).isNotNull();
|
assertThat(loadedFile.getLastIndexed()).isNotNull();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -100,7 +100,7 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
|
|||||||
.dossierId(dossier.getId())
|
.dossierId(dossier.getId())
|
||||||
.build());
|
.build());
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNASSIGNED);
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW);
|
||||||
assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100);
|
assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100);
|
||||||
|
|
||||||
// Delete file
|
// Delete file
|
||||||
|
|||||||
@ -5,7 +5,10 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
@ -52,6 +55,9 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ManualRedactionClient manualRedactionClient;
|
private ManualRedactionClient manualRedactionClient;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DossierClient dossierClient;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEmptyFile() {
|
public void testEmptyFile() {
|
||||||
|
|
||||||
@ -97,6 +103,11 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
|||||||
public void testFile() {
|
public void testFile() {
|
||||||
|
|
||||||
var dossier = dossierTesterAndProvider.provideTestDossier();
|
var dossier = dossierTesterAndProvider.provideTestDossier();
|
||||||
|
// update
|
||||||
|
CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest();
|
||||||
|
BeanUtils.copyProperties(dossier, cru);
|
||||||
|
cru.getMemberIds().add("2");
|
||||||
|
var updated = dossierClient.updateDossier(cru, dossier.getId());
|
||||||
|
|
||||||
var file = fileTesterAndProvider.testAndProvideFile(dossier);
|
var file = fileTesterAndProvider.testAndProvideFile(dossier);
|
||||||
|
|
||||||
@ -104,10 +115,12 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
|||||||
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
|
|
||||||
|
|
||||||
fileClient.setCurrentFileReviewer(dossier.getId(), file.getId(), "1");
|
fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "1");
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
assertThat(loadedFile.getCurrentReviewer()).isEqualTo("1");
|
assertThat(loadedFile.getAssignee()).isEqualTo("1");
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW);
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isNull();
|
||||||
|
assertThat(loadedFile.getLastApprover()).isNull();
|
||||||
|
|
||||||
|
|
||||||
fileClient.excludePages(dossier.getId(), file.getId(), Sets.newHashSet(1));
|
fileClient.excludePages(dossier.getId(), file.getId(), Sets.newHashSet(1));
|
||||||
@ -120,30 +133,58 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
|||||||
assertThat(loadedFile.getExcludedPages()).isEmpty();
|
assertThat(loadedFile.getExcludedPages()).isEmpty();
|
||||||
|
|
||||||
|
|
||||||
fileClient.setCurrentFileReviewer(dossier.getId(), file.getId(), "1");
|
fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "1");
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
assertThat(loadedFile.getCurrentReviewer()).isEqualTo("1");
|
assertThat(loadedFile.getAssignee()).isEqualTo("1");
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW);
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isNull();
|
||||||
|
assertThat(loadedFile.getLastApprover()).isNull();
|
||||||
|
|
||||||
|
|
||||||
|
fileClient.setStatusUnderReview(dossier.getId(), file.getId(), null);
|
||||||
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
|
||||||
|
assertThat(loadedFile.getAssignee()).isEqualTo("1");
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isNull();
|
||||||
|
assertThat(loadedFile.getLastApprover()).isNull();
|
||||||
|
|
||||||
fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1");
|
fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1");
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL);
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL);
|
||||||
|
assertThat(loadedFile.getAssignee()).isEqualTo("1");
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isEqualTo("1");
|
||||||
|
assertThat(loadedFile.getLastApprover()).isNull();
|
||||||
|
|
||||||
|
fileClient.setStatusApproved(dossier.getId(), file.getId(), null);
|
||||||
fileClient.setStatusUnderReview(dossier.getId(), file.getId());
|
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
|
|
||||||
|
|
||||||
|
|
||||||
fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1");
|
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL);
|
|
||||||
|
|
||||||
|
|
||||||
fileClient.setStatusApproved(dossier.getId(), file.getId());
|
|
||||||
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED);
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED);
|
||||||
|
assertThat(loadedFile.getAssignee()).isEqualTo("1");
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isEqualTo("1");
|
||||||
|
assertThat(loadedFile.getLastApprover()).isEqualTo("1");
|
||||||
|
|
||||||
|
|
||||||
|
fileClient.setStatusUnderReview(dossier.getId(), file.getId(), "2");
|
||||||
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW);
|
||||||
|
assertThat(loadedFile.getAssignee()).isEqualTo("2");
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isEqualTo("1");
|
||||||
|
assertThat(loadedFile.getLastApprover()).isEqualTo("1");
|
||||||
|
|
||||||
|
|
||||||
|
fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "2");
|
||||||
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL);
|
||||||
|
assertThat(loadedFile.getAssignee()).isEqualTo("2");
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isEqualTo("2");
|
||||||
|
assertThat(loadedFile.getLastApprover()).isEqualTo("1");
|
||||||
|
|
||||||
|
|
||||||
|
fileClient.setStatusApproved(dossier.getId(), file.getId(), "2");
|
||||||
|
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
|
assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED);
|
||||||
|
assertThat(loadedFile.getAssignee()).isEqualTo("2");
|
||||||
|
assertThat(loadedFile.getLastReviewer()).isEqualTo("2");
|
||||||
|
assertThat(loadedFile.getLastApprover()).isEqualTo("2");
|
||||||
|
|
||||||
|
|
||||||
assertThat(uploadClient.getOriginal(dossier.getId(), file.getId())).isNotNull();
|
assertThat(uploadClient.getOriginal(dossier.getId(), file.getId())).isNotNull();
|
||||||
@ -153,7 +194,7 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
|||||||
assertThat(uploadClient.getAnnotated(dossier.getId(), file.getId())).isNotNull();
|
assertThat(uploadClient.getAnnotated(dossier.getId(), file.getId())).isNotNull();
|
||||||
|
|
||||||
|
|
||||||
fileClient.setStatusUnderReview(dossier.getId(), file.getId());
|
fileClient.setStatusUnderReview(dossier.getId(), file.getId(), null);
|
||||||
|
|
||||||
|
|
||||||
fileClient.toggleExclusion(dossier.getId(), file.getId(), true);
|
fileClient.toggleExclusion(dossier.getId(), file.getId(), true);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user