From 342257a9c65bc0dae87e81aa388126b7173ee58c Mon Sep 17 00:00:00 2001 From: Maverick Studer Date: Tue, 3 Sep 2024 13:49:47 +0200 Subject: [PATCH] RED-9947: Bulk-local redactions (replacement for group redactions) --- .../controller/ManualRedactionController.java | 175 +- .../resource/ManualRedactionResource.java | 45 +- .../build.gradle.kts | 2 +- .../configuration/MessagingConfiguration.java | 21 +- .../model/websocket/AnalyseStatus.java | 2 + .../service/EntityLogMergeService.java | 14 +- .../processor/service/FileStatusService.java | 50 + .../ManualRedactionService.java | 37 +- ...yFactory.java => PendingEntryFactory.java} | 45 +- ...SearchTermOccurrencesResponseReceiver.java | 123 + .../TenantExchangeMessageReceiverImpl.java | 8 + .../integration/tests/EntityLogMergeTest.java | 4 +- .../tests/EntityLogMongoServiceTest.java | 70 + .../tests/ManualRedactionTest.java | 202 +- .../tests/SearchTermOccurrencesTest.java | 150 + .../local-bulk-test.ENTITY_LOG.json | 120704 +++++++++++++++ .../v1/api/shared/model/AnalyzeRequest.java | 2 + .../v1/api/shared/model/BulkLocalRequest.java | 34 + .../api/shared/model/BulkLocalResponse.java | 43 + .../v1/api/shared/model/MessageType.java | 3 +- .../dossier/file/ProcessingStatus.java | 3 +- .../AddRedactionBulkLocalRequestModel.java | 43 + .../ForceRedactionBulkLocalRequestModel.java | 29 + ...RecategorizationBulkLocalRequestModel.java | 39 + .../RemoveRedactionBulkLocalRequestModel.java | 36 + ...ntityLogEntryDocumentCustomRepository.java | 13 + ...yLogEntryDocumentCustomRepositoryImpl.java | 95 + .../EntityLogEntryDocumentRepository.java | 12 + .../mongo/service/EntityLogMongoService.java | 47 +- 29 files changed, 121950 insertions(+), 101 deletions(-) rename persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/{PendingDictionaryEntryFactory.java => PendingEntryFactory.java} (85%) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SearchTermOccurrencesTest.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/entity-log/local-bulk-test.ENTITY_LOG.json create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalRequest.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalResponse.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddRedactionBulkLocalRequestModel.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ForceRedactionBulkLocalRequestModel.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RecategorizationBulkLocalRequestModel.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RemoveRedactionBulkLocalRequestModel.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepository.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepositoryImpl.java diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java index a6d2787af..f2dbc3a46 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java @@ -9,6 +9,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.roles.Ac import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; @@ -21,12 +22,16 @@ import com.iqser.red.service.persistence.management.v1.processor.service.AccessC import com.iqser.red.service.persistence.management.v1.processor.service.CommentService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionUndoService; +import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.PendingEntryFactory; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationComments; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Comment; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.CommentRequest; @@ -35,12 +40,16 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.EntityLogMongoService; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import lombok.AccessLevel; @@ -57,6 +66,7 @@ public class ManualRedactionController implements ManualRedactionResource { static final String FILE_ID = "fileId"; static final String DOSSIER_ID = "dossierId"; static final String ANNOTATION_ID = "annotationId"; + ManualRedactionService manualRedactionService; ManualRedactionUndoService manualRedactionUndoService; DossierManagementService dossierManagementService; @@ -64,9 +74,12 @@ public class ManualRedactionController implements ManualRedactionResource { AccessControlService accessControlService; CommentService commentService; FileStatusManagementService fileStatusManagementService; + FileStatusService fileStatusService; + EntityLogMongoService entityLogMongoService; + PendingEntryFactory pendingEntryFactory; + DictionaryPersistenceService dictionaryPersistenceService; - @Override @PreAuthorize("hasAuthority('" + DELETE_MANUAL_REDACTION + "')") public void undo(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @@ -82,7 +95,6 @@ public class ManualRedactionController implements ManualRedactionResource { } - @Override @PreAuthorize("hasAuthority('" + DELETE_COMMENT + "')") public void undoComment(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @@ -105,7 +117,6 @@ public class ManualRedactionController implements ManualRedactionResource { } - @Override @PreAuthorize("hasAuthority('" + READ_MANUAL_REDACTIONS + "')") public ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @@ -114,12 +125,12 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.checkDossierExistenceAndViewPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); + return manualRedactionService.getManualRedactions(fileId, ManualChangesQueryOptions.builder().includeOnlyUnprocessed(unprocessed).includeDictChanges(includeDictChanges).build()); } - @Override @PreAuthorize("hasAuthority('" + READ_MANUAL_REDACTIONS + "')") public AnnotationComments getComments(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { @@ -132,7 +143,6 @@ public class ManualRedactionController implements ManualRedactionResource { } - @Override @PreAuthorize("hasAuthority('" + ADD_COMMENT + "')") public CommentResponse addComment(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @@ -157,21 +167,16 @@ public class ManualRedactionController implements ManualRedactionResource { } - @Override @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") public ManualRedactionResponse addRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set addRedactionRequests) { var dossier = dossierManagementService.getDossierById(dossierId, false, false); - accessControlService.checkAccessPermissionsToDossier(dossierId); - accessControlService.verifyFileIsNotApproved(dossierId, fileId); - if (addRedactionRequests.stream() - .anyMatch(AddRedactionRequestModel::isAddToAllDossiers)) { - accessControlService.verifyUserIsApprover(dossierId); - } else { - accessControlService.verifyUserIsMemberOrApprover(dossierId); - } + verifyAccessForDossier(dossierId, + fileId, + addRedactionRequests.stream() + .anyMatch(AddRedactionRequestModel::isAddToAllDossiers)); List responseList = manualRedactionService.addAddRedaction(dossierId, fileId, addRedactionRequests, dossier); responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() @@ -186,6 +191,28 @@ public class ManualRedactionController implements ManualRedactionResource { } + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualRedactionResponse addRedactionBulkLocal(String dossierId, String fileId, AddRedactionBulkLocalRequestModel addRedactionRequest) { + + verifyAccess(dossierId, fileId); + + // check if type exists before sending the request to redaction service + dictionaryPersistenceService.getType(addRedactionRequest.getType()); + + fileStatusService.setStatusBulkLocalRedactionsProcessing(dossierId, fileId, addRedactionRequest); + + EntityLogEntry entityLogEntry = pendingEntryFactory.buildAddRedactionBulkLocalEntry(addRedactionRequest); + + return ManualRedactionResponse.builder() + .manualAddResponses(List.of(ManualAddResponse.builder() + .annotationId(manualRedactionService.getPendingBulkLocalAnnotationId(fileId, addRedactionRequest)) + .entityLogEntry(entityLogEntry) + .build())) + .build(); + + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") public ManualRedactionResponse removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @@ -193,14 +220,10 @@ public class ManualRedactionController implements ManualRedactionResource { @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { var dossier = dossierManagementService.getDossierById(dossierId, false, false); - accessControlService.checkAccessPermissionsToDossier(dossierId); - accessControlService.verifyFileIsNotApproved(dossierId, fileId); - if (removeRedactionRequests.stream() - .anyMatch(RemoveRedactionRequestModel::isRemoveFromAllDossiers)) { - accessControlService.verifyUserIsApprover(dossierId); - } else { - accessControlService.verifyUserIsMemberOrApprover(dossierId); - } + verifyAccessForDossier(dossierId, + fileId, + removeRedactionRequests.stream() + .anyMatch(RemoveRedactionRequestModel::isRemoveFromAllDossiers)); List responseList = manualRedactionService.addRemoveRedaction(dossierId, fileId, @@ -220,14 +243,40 @@ public class ManualRedactionController implements ManualRedactionResource { } + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualRedactionResponse removeRedactionBulkLocal(String dossierId, + String fileId, + RemoveRedactionBulkLocalRequestModel removeRedactionRequest, + boolean removeUnprocessed) { + + verifyAccess(dossierId, fileId); + + Set entryIds; + if (!removeRedactionRequest.isRectangle()) { + entryIds = entityLogMongoService.findEntryIdsByValueAndEngineManualWithFilters(removeRedactionRequest.getValue(), + removeRedactionRequest.getOriginTypes(), + removeRedactionRequest.getOriginLegalBases(), + removeRedactionRequest.getPageNumbers()); + } else { + entryIds = entityLogMongoService.findEntryIdsByMatchingFullPositionAndEngineManualWithFilters(removeRedactionRequest.getPosition().getRectangle(), + removeRedactionRequest.getOriginTypes(), + removeRedactionRequest.getOriginLegalBases(), + removeRedactionRequest.getPageNumbers()); + } + Set removeRedactionRequestModels = entryIds.stream() + .map(entryId -> RemoveRedactionRequestModel.builder().annotationId(entryId).build()) + .collect(Collectors.toSet()); + + return removeRedactionBulk(dossierId, fileId, removeRedactionRequestModels, removeUnprocessed); + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") public ManualRedactionResponse forceRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set forceRedactionRequests) { - accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); - accessControlService.verifyFileIsNotApproved(dossierId, fileId); - accessControlService.verifyUserIsMemberOrApprover(dossierId); + verifyAccessAndDossierExistence(dossierId, fileId); List responseList = manualRedactionService.addForceRedaction(dossierId, fileId, forceRedactionRequests); @@ -248,9 +297,7 @@ public class ManualRedactionController implements ManualRedactionResource { @PathVariable(FILE_ID) String fileId, @RequestBody Set legalBasisChangeRequests) { - accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); - accessControlService.verifyFileIsNotApproved(dossierId, fileId); - accessControlService.verifyUserIsMemberOrApprover(dossierId); + verifyAccessAndDossierExistence(dossierId, fileId); List responseList = manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequests); @@ -261,6 +308,7 @@ public class ManualRedactionController implements ManualRedactionResource { .message("Legal basis reason was changed") .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) .build())); + return ManualRedactionResponse.builder().manualAddResponses(responseList).build(); } @@ -272,9 +320,7 @@ public class ManualRedactionController implements ManualRedactionResource { @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { var dossier = dossierManagementService.getDossierById(dossierId, false, false); - accessControlService.checkAccessPermissionsToDossier(dossierId); - accessControlService.verifyFileIsNotApproved(dossierId, fileId); - accessControlService.verifyUserIsMemberOrApprover(dossierId); + verifyAccess(dossierId, fileId); List responseList = manualRedactionService.addRecategorization(dossierId, fileId, dossier, recategorizationRequests, includeUnprocessed); @@ -290,15 +336,47 @@ public class ManualRedactionController implements ManualRedactionResource { } + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualRedactionResponse recategorizeBulkLocal(String dossierId, + String fileId, + RecategorizationBulkLocalRequestModel recategorizationRequest, + boolean includeUnprocessed) { + + verifyAccess(dossierId, fileId); + + Set entryIds; + if (!recategorizationRequest.isRectangle()) { + entryIds = entityLogMongoService.findEntryIdsByValueAndEngineManualWithFilters(recategorizationRequest.getValue(), + recategorizationRequest.getOriginTypes(), + recategorizationRequest.getOriginLegalBases(), + recategorizationRequest.getPageNumbers()); + } else { + entryIds = entityLogMongoService.findEntryIdsByMatchingFullPositionAndEngineManualWithFilters(recategorizationRequest.getPosition().getRectangle(), + recategorizationRequest.getOriginTypes(), + recategorizationRequest.getOriginLegalBases(), + recategorizationRequest.getPageNumbers()); + } + Set recategorizationRequestModels = entryIds.stream() + .map(entryId -> RecategorizationRequestModel.builder() + .annotationId(entryId) + .type(recategorizationRequest.getType()) + .legalBasis(recategorizationRequest.getLegalBasis()) + .section(recategorizationRequest.getSection()) + .value(recategorizationRequest.getValue()) + .build()) + .collect(Collectors.toSet()); + + return recategorizeBulk(dossierId, fileId, recategorizationRequestModels, includeUnprocessed); + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") public ManualRedactionResponse resizeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set resizeRedactionRequests, @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) { - accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); - accessControlService.verifyFileIsNotApproved(dossierId, fileId); - accessControlService.verifyUserIsMemberOrApprover(dossierId); + verifyAccessAndDossierExistence(dossierId, fileId); List responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, resizeRedactionRequests, includeUnprocessed); @@ -309,7 +387,36 @@ public class ManualRedactionController implements ManualRedactionResource { .message("Skipped annotation was resized to be redacted") .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) .build())); + return ManualRedactionResponse.builder().manualAddResponses(responseList).build(); } + + private void verifyAccessForDossier(String dossierId, String fileId, boolean allDossiersAffected) { + + accessControlService.checkAccessPermissionsToDossier(dossierId); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + if (allDossiersAffected) { + accessControlService.verifyUserIsApprover(dossierId); + } else { + accessControlService.verifyUserIsMemberOrApprover(dossierId); + } + } + + + private void verifyAccess(String dossierId, String fileId) { + + accessControlService.checkAccessPermissionsToDossier(dossierId); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsMemberOrApprover(dossierId); + } + + + private void verifyAccessAndDossierExistence(String dossierId, String fileId) { + + accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsMemberOrApprover(dossierId); + } + } diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ManualRedactionResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ManualRedactionResource.java index cad373e9f..b6555bf70 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ManualRedactionResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ManualRedactionResource.java @@ -16,11 +16,14 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResp import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationComments; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactionResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequestModel; @@ -95,13 +98,38 @@ public interface ManualRedactionResource { @RequestBody Set addRedactionRequest); + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + + "/bulk-local/add" + + DOSSIER_ID_PATH_PARAM + + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a bulk of local redactions", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + ManualRedactionResponse addRedactionBulkLocal(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody AddRedactionBulkLocalRequestModel addRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + + "/bulk-local/remove" + + DOSSIER_ID_PATH_PARAM + + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Removes a bulk of local redactions", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + ManualRedactionResponse removeRedactionBulkLocal(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RemoveRedactionBulkLocalRequestModel removeRedactionRequest, + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed); + + @ResponseStatus(value = HttpStatus.OK) @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Removes the redactions list", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) ManualRedactionResponse removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set removeRedactionRequests, @@ -139,13 +167,26 @@ public interface ManualRedactionResource { + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Recategorizes the list of redaction log entries", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) ManualRedactionResponse recategorizeBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set recategorizationRequests, @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed); + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + + "/bulk-local/recategorize" + + DOSSIER_ID_PATH_PARAM + + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Recategorizes the list of redaction log entries", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + ManualRedactionResponse recategorizeBulkLocal(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RecategorizationBulkLocalRequestModel recategorizationRequest, + @RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed); + + @ResponseStatus(value = HttpStatus.OK) @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/resize" diff --git a/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts b/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts index b090438cf..a08c00cb1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts +++ b/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts @@ -44,7 +44,7 @@ dependencies { } implementation("com.knecon.fforesight:llm-service-api:1.13.0") api("com.knecon.fforesight:jobs-commons:0.10.0") - api("com.knecon.fforesight:tenant-commons:0.29.0") + api("com.knecon.fforesight:tenant-commons:0.30.0") api("com.knecon.fforesight:database-tenant-commons:0.24.0") { exclude(group = "com.knecon.fforesight", module = "tenant-commons") } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/MessagingConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/MessagingConfiguration.java index 51e29aa65..94175b126 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/MessagingConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/MessagingConfiguration.java @@ -36,6 +36,10 @@ public class MessagingConfiguration { public static final String REDACTION_RESPONSE_QUEUE_PREFIX = "redaction_response"; public static final String REDACTION_RESPONSE_EXCHANGE = "redaction_response_exchange"; + public static final String SEARCH_BULK_LOCAL_TERM_RESPONSE_QUEUE_PREFIX = "search_bulk_local_term_response"; + public static final String SEARCH_BULK_LOCAL_TERM_RESPONSE_EXCHANGE = "search_bulk_local_term_response_exchange"; + public static final String SEARCH_BULK_LOCAL_TERM_DLQ = "search_bulk_local_term_error"; + public static final String PDFTRON_RESPONSE_QUEUE_PREFIX = "pdftron_response"; public static final String PDFTRON_RESPONSE_EXCHANGE = "pdftron_response_exchange"; @@ -193,6 +197,20 @@ public class MessagingConfiguration { } + @Bean + public DirectExchange searchTermOccurrencesResponseExchange() { + + return new DirectExchange(SEARCH_BULK_LOCAL_TERM_RESPONSE_EXCHANGE); + } + + + @Bean + public Queue searchTermOccurrencesDLQ() { + + return QueueBuilder.durable(SEARCH_BULK_LOCAL_TERM_DLQ).build(); + } + + @Bean public DirectExchange reportResponseExchange() { @@ -451,9 +469,8 @@ public class MessagingConfiguration { return QueueBuilder.durable(ENTITY_DLQ).build(); } + // ---- azure-ner-service ---- - - @Bean public DirectExchange azureNerRequestExchange() { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/websocket/AnalyseStatus.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/websocket/AnalyseStatus.java index 5963f1f77..66198248b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/websocket/AnalyseStatus.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/websocket/AnalyseStatus.java @@ -4,6 +4,8 @@ public enum AnalyseStatus { READ_ONLY_PROCESSING, PROCESSING, OCR_PROCESSING, + BULK_LOCAL_REDACTIONS_PROCESSING, + BULK_LOCAL_REDACTIONS_PROCESSED, LAYOUT_UPDATE, FINISHED, ERROR diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java index 04cc7a892..5d832bc1a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EntityLogMergeService.java @@ -26,7 +26,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.configur import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.PendingDictionaryEntryFactory; +import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.PendingEntryFactory; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Change; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType; @@ -67,7 +67,7 @@ import lombok.extern.slf4j.Slf4j; public class EntityLogMergeService { DictionaryPersistenceService dictionaryPersistenceService; - PendingDictionaryEntryFactory pendingDictionaryEntryFactory; + PendingEntryFactory pendingEntryFactory; EntityLogMongoService entityLogMongoService; @@ -211,7 +211,7 @@ public class EntityLogMergeService { return unprocessedManualRedactions.getEntriesToAdd() .stream() .filter(manualAdd -> !manualAdd.isLocal()) - .map(pendingDictionaryEntryFactory::buildAddToDictionaryEntry); + .map(pendingEntryFactory::buildAddToDictionaryEntry); } @@ -239,11 +239,11 @@ public class EntityLogMergeService { if (dictionaryChange instanceof ManualRedactionEntry) { return null; // pending dictionaries are inserted before the manual changes loop } else if (dictionaryChange instanceof IdRemoval idRemoval) { - return pendingDictionaryEntryFactory.buildRemoveFromDictionary(idRemoval, entityLogEntry); + return pendingEntryFactory.buildRemoveFromDictionary(idRemoval, entityLogEntry); } else if (dictionaryChange instanceof ManualResizeRedaction manualResizeRedaction) { - return pendingDictionaryEntryFactory.buildResizeWithDictionary(manualResizeRedaction, entityLogEntry); + return pendingEntryFactory.buildResizeWithDictionary(manualResizeRedaction, entityLogEntry); } else if (dictionaryChange instanceof ManualRecategorization manualRecategorization) { - return pendingDictionaryEntryFactory.buildRecategorizeWithDictionary(manualRecategorization, entityLogEntry); + return pendingEntryFactory.buildRecategorizeWithDictionary(manualRecategorization, entityLogEntry); } else { throw new IllegalArgumentException(String.format("Manual change of type %s has no defined dictionary action!", dictionaryChange.getClass())); } @@ -484,7 +484,7 @@ public class EntityLogMergeService { && (entityLogEntry.getEntryType().equals(EntryType.IMAGE) || entityLogEntry.getEntryType().equals(EntryType.IMAGE_HINT))) { addChanges(entityLogEntry, changes); - return pendingDictionaryEntryFactory.buildPendingImageRecategorizationEntry(recategorization, entityLogEntry); + return pendingEntryFactory.buildPendingImageRecategorizationEntry(recategorization, entityLogEntry); } entityLogEntry.getEngines().add(Engine.MANUAL); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java index 6332436d7..067bb5838 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java @@ -52,6 +52,7 @@ import com.iqser.red.service.persistence.management.v1.processor.utils.FileModel import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.BulkLocalRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.NerServiceRequest; @@ -60,6 +61,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.ComponentLogMongoService; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.EntityLogMongoService; import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; @@ -216,6 +218,31 @@ public class FileStatusService { } + protected void addSearchTermOccurrencesAnalysisRequestToAnalysisQueue(FileEntity fileStatus, BulkLocalRequest bulkLocalRequest) { + + var dossierId = fileStatus.getDossierId(); + var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); + var fileId = fileStatus.getId(); + int analysisVersion = fileStatus.getAnalysisVersion(); + + MessageType searchBulkLocalTerm = MessageType.SEARCH_BULK_LOCAL_TERM; + log.info("Add file: {} from dossier {} to Analysis queue with MessageType {}", fileId, dossierId, searchBulkLocalTerm); + + var analyseRequest = AnalyzeRequest.builder() + .analysisNumber(analysisVersion) + .messageType(searchBulkLocalTerm) + .dossierId(dossierId) + .fileId(fileId) + .dossierTemplateId(dossier.getDossierTemplateId()) + .bulkLocalRequest(bulkLocalRequest) + .build(); + + rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_PRIORITY_REQUEST_EXCHANGE, TenantContext.getTenantId(), analyseRequest); + + websocketService.sendAnalysisEvent(dossierId, fileId, AnalyseStatus.BULK_LOCAL_REDACTIONS_PROCESSING, analysisVersion); + } + + @Transactional protected void addToAnalysisQueue(String dossierId, String fileId, boolean priority, Set sectionsToReanalyse, boolean manualRedactionReanalyse) { @@ -983,4 +1010,27 @@ public class FileStatusService { } } + + @Transactional + public void setStatusBulkLocalRedactionsProcessing(String dossierId, String fileId, AddRedactionBulkLocalRequestModel addRedactionBulkLocalRequestModel) { + + FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId); + + if (fileStatus.isExcluded()) { + log.debug("File {} is excluded", fileStatus.getId()); + return; + } + + fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.BULK_LOCAL_REDACTIONS_PROCESSING); + BulkLocalRequest bulkLocalRequest = BulkLocalRequest.builder() + .searchTerm(addRedactionBulkLocalRequestModel.getValue()) + .type(addRedactionBulkLocalRequestModel.getType()) + .reason(addRedactionBulkLocalRequestModel.getReason()) + .legalBasis(addRedactionBulkLocalRequestModel.getLegalBasis()) + .section(addRedactionBulkLocalRequestModel.getSection()) + .pageNumbers(addRedactionBulkLocalRequestModel.getPageNumbers()) + .build(); + addSearchTermOccurrencesAnalysisRequestToAnalysisQueue(fileStatus, bulkLocalRequest); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java index 6ca117fb6..d7bc8c602 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionService.java @@ -71,6 +71,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequestModel; @@ -111,7 +112,7 @@ public class ManualRedactionService { ManualRedactionMapper manualRedactionMapper; RabbitTemplate rabbitTemplate; EntityLogMergeService entityLogMergeService; - PendingDictionaryEntryFactory pendingDictionaryEntryFactory; + PendingEntryFactory pendingEntryFactory; @Transactional @@ -135,7 +136,7 @@ public class ManualRedactionService { manualRedactionDictionaryUpdateHandler.validateDictionariesForAdd(addRedactionRequest, addRedactionRequest.getValue()); validatePositions(fileId, addRedactionRequest); - String annotationId = hashFunction.hashString(fileId + addRedactionRequest, StandardCharsets.UTF_8).toString(); + String annotationId = hashString(fileId + addRedactionRequest); ManualRedactionEntryEntity manualRedactionEntryEntity = addRedactionPersistenceService.insert(fileId, annotationId, addRedactionRequest); manualRedactionEntryEntities.add(manualRedactionEntryEntity); @@ -154,9 +155,9 @@ public class ManualRedactionService { getAnalysisNumber(dossierId, fileId), dossierEntity); } else { - entityLogEntry = pendingDictionaryEntryFactory.buildAddToDictionaryEntry(MagicConverter.convert(manualRedactionEntryEntity, - ManualRedactionEntry.class, - new ManualRedactionEntryMapper())); + entityLogEntry = pendingEntryFactory.buildAddToDictionaryEntry(MagicConverter.convert(manualRedactionEntryEntity, + ManualRedactionEntry.class, + new ManualRedactionEntryMapper())); } Long commentId = commentService.addCommentAndGetId(fileId, annotationId, addRedactionRequest.getComment(), addRedactionRequest.getUser()); response.add(ManualAddResponse.builder().annotationId(annotationId).commentId(commentId).entityLogEntry(entityLogEntry).build()); @@ -254,7 +255,7 @@ public class ManualRedactionService { if (!idRemoval.isRemoveFromAllDossiers() && !idRemoval.isRemoveFromDictionary()) { entityLogMergeService.mergeIdToRemove(MagicConverter.convert(idRemoval, IdRemoval.class), entityLogEntry, getAnalysisNumber(dossierId, fileId)); } else { - entityLogEntry = pendingDictionaryEntryFactory.buildRemoveFromDictionary(MagicConverter.convert(idRemoval, IdRemoval.class), entityLogEntry); + entityLogEntry = pendingEntryFactory.buildRemoveFromDictionary(MagicConverter.convert(idRemoval, IdRemoval.class), entityLogEntry); } response.add(ManualAddResponse.builder().annotationId(removeRedactionRequest.getAnnotationId()).commentId(commentId).entityLogEntry(entityLogEntry).build()); } @@ -413,9 +414,9 @@ public class ManualRedactionService { entityLogEntry = entry; } } else { - entityLogEntry = pendingDictionaryEntryFactory.buildRecategorizeWithDictionary(MagicConverter.convert(recategorizationEntity, - ManualRecategorization.class, - new ManualRecategorizationMapper()), entityLogEntry); + entityLogEntry = pendingEntryFactory.buildRecategorizeWithDictionary(MagicConverter.convert(recategorizationEntity, + ManualRecategorization.class, + new ManualRecategorizationMapper()), entityLogEntry); } response.add(ManualAddResponse.builder().annotationId(recategorizationRequest.getAnnotationId()).commentId(commentId).entityLogEntry(entityLogEntry).build()); @@ -474,9 +475,9 @@ public class ManualRedactionService { entityLogEntry, getAnalysisNumber(dossierId, fileId)); } else { - entityLogEntry = pendingDictionaryEntryFactory.buildResizeWithDictionary(MagicConverter.convert(resizeRedaction, - ManualResizeRedaction.class, - new ManualResizeRedactionMapper()), entityLogEntry); + entityLogEntry = pendingEntryFactory.buildResizeWithDictionary(MagicConverter.convert(resizeRedaction, + ManualResizeRedaction.class, + new ManualResizeRedactionMapper()), entityLogEntry); } response.add(ManualAddResponse.builder().annotationId(resizeRedactionRequest.getAnnotationId()).commentId(commentId).entityLogEntry(entityLogEntry).build()); } @@ -699,4 +700,16 @@ public class ManualRedactionService { return analysisNumber.orElseThrow(() -> new BadRequestException("Can't load latest analysis number")); } + + public String getPendingBulkLocalAnnotationId(String fileId, AddRedactionBulkLocalRequestModel addRedactionBulkLocalRequestModel) { + + return hashString(fileId + addRedactionBulkLocalRequestModel); + } + + + private String hashString(String input) { + + return hashFunction.hashString(input, StandardCharsets.UTF_8).toString(); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/PendingDictionaryEntryFactory.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/PendingEntryFactory.java similarity index 85% rename from persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/PendingDictionaryEntryFactory.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/PendingEntryFactory.java index e8e5cf73c..4e4d922c4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/PendingDictionaryEntryFactory.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/PendingEntryFactory.java @@ -1,5 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.manualredactions; +import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -9,11 +11,14 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Engine; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualRedactionType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; @@ -24,9 +29,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionBulkLocalRequestModel; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; @Service -public class PendingDictionaryEntryFactory { +public class PendingEntryFactory { private static String shortenValueIfNecessary(String value) { @@ -96,6 +103,42 @@ public class PendingDictionaryEntryFactory { } + public EntityLogEntry buildAddRedactionBulkLocalEntry(AddRedactionBulkLocalRequestModel addRedactionBulkLocalRequestModel) { + + var manualChanges = List.of(ManualChange.builder() + .manualRedactionType(ManualRedactionType.ADD) + .requestedDate(OffsetDateTime.now()) + .processedDate(null) + .userId(KeycloakSecurity.getUserId()) + .propertyChanges(Map.of("value", addRedactionBulkLocalRequestModel.getValue())) + .build()); + + return EntityLogEntry.builder() + .id("") + .value(addRedactionBulkLocalRequestModel.getValue()) + .type(addRedactionBulkLocalRequestModel.getType()) + .entryType(EntryType.ENTITY) + .state(EntryState.PENDING) + .reason(addRedactionBulkLocalRequestModel.getReason()) + .legalBasis(addRedactionBulkLocalRequestModel.getLegalBasis()) + .matchedRule("") + .containingNodeId(Collections.emptyList()) + .closestHeadline("") + .section(addRedactionBulkLocalRequestModel.getSection()) + .positions(convertPositions(addRedactionBulkLocalRequestModel.getPositions())) + .textAfter("") + .textBefore("") + .startOffset(-1) + .endOffset(-1) + .changes(Collections.emptyList()) + .manualChanges(manualChanges) + .engines(Set.of(Engine.MANUAL)) + .reference(Collections.emptySet()) + .importedRedactionIntersections(Collections.emptySet()) + .build(); + } + + private List convertPositions(List rectangles) { return rectangles.stream() diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java new file mode 100644 index 000000000..7bd41629c --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/SearchTermOccurrencesResponseReceiver.java @@ -0,0 +1,123 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.queue; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.amqp.AmqpRejectAndDontRequeueException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.management.v1.processor.model.websocket.AnalyseStatus; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.websocket.WebsocketService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.BulkLocalResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class SearchTermOccurrencesResponseReceiver { + + public static final String SEARCH_BULK_LOCAL_TERM_RESPONSE_LISTENER = "search-bulk-local-term-response-listener"; + + ObjectMapper objectMapper; + + DossierManagementService dossierManagementService; + ManualRedactionService manualRedactionService; + AuditPersistenceService auditPersistenceService; + FileStatusPersistenceService fileStatusPersistenceService; + WebsocketService webSocketService; + + + @RabbitHandler + @RabbitListener(id = SEARCH_BULK_LOCAL_TERM_RESPONSE_LISTENER) + public void receive(Message message) throws IOException { + + BulkLocalResponse response = objectMapper.readValue(message.getBody(), new TypeReference<>() { + }); + + if (message.getMessageProperties().isRedelivered()) { + throw new AmqpRejectAndDontRequeueException(String.format("Error during last processing of bulk local term search for file %s in dossier %s, do not retry.", + response.getFileId(), + response.getDossierId())); + } + + receive(response); + + } + + + public void receive(BulkLocalResponse response) { + + var dossier = dossierManagementService.getDossierById(response.getDossierId(), false, false); + + Set addRedactionRequests = response.getPositions() + .stream() + .map(positions -> AddRedactionRequestModel.builder() + .type(response.getType()) + .value(response.getSearchTerm()) + .reason(response.getReason()) + .legalBasis(response.getLegalBasis()) + .positions(convertPositions(positions)) + .section(response.getSection()) + .build()) + .collect(Collectors.toSet()); + + log.info("Received manual redaction requests for file {} in dossier {} after term search", response.getFileId(), dossier.getId()); + + List manualAddResponses = manualRedactionService.addAddRedaction(response.getDossierId(), response.getFileId(), addRedactionRequests, dossier); + manualAddResponses.forEach(manualAddResponse -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(response.getFileId()) + .category(AuditCategory.DOCUMENT.name()) + .message("Manual annotation was added.") + .details(Map.of("dossierId", + response.getDossierId(), + "fileId", + response.getFileId(), + "annotationId", + manualAddResponse.getAnnotationId())) + .build())); + + fileStatusPersistenceService.updateProcessingStatus(response.getFileId(), ProcessingStatus.PROCESSED); + int analysisVersion = fileStatusPersistenceService.getStatus(response.getFileId()).getAnalysisVersion(); + webSocketService.sendAnalysisEvent(response.getDossierId(), + response.getFileId(), + AnalyseStatus.BULK_LOCAL_REDACTIONS_PROCESSED, analysisVersion); + log.info("Finished adding all manual redactions, the file is processed again"); + + } + + + private List convertPositions(List positions) { + + return positions.stream() + .map(position -> Rectangle.builder().page(position.getPageNumber()).height(position.h()).width(position.w()).topLeftX(position.x()).topLeftY(position.y()).build()) + .toList(); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/TenantExchangeMessageReceiverImpl.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/TenantExchangeMessageReceiverImpl.java index 8b21a7935..9f42f5100 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/TenantExchangeMessageReceiverImpl.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/queue/TenantExchangeMessageReceiverImpl.java @@ -17,6 +17,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.service. import static com.iqser.red.service.persistence.management.v1.processor.service.queue.OCRProcessingMessageReceiver.OCR_RESPONSE_LISTENER_ID; import static com.iqser.red.service.persistence.management.v1.processor.service.queue.OCRProcessingMessageReceiver.OCR_STATUS_UPDATE_LISTENER_ID; import static com.iqser.red.service.persistence.management.v1.processor.service.queue.RedactionAnalysisResponseReceiver.REDACTION_RESPONSE_LISTENER_ID; +import static com.iqser.red.service.persistence.management.v1.processor.service.queue.SearchTermOccurrencesResponseReceiver.SEARCH_BULK_LOCAL_TERM_RESPONSE_LISTENER; import static com.iqser.red.service.persistence.management.v1.processor.service.queue.VisualLayoutParsingMessageReceiver.VISUAL_LAYOUT_PARSING_RESPONSE_LISTENER_ID; import java.util.Map; @@ -78,6 +79,13 @@ public class TenantExchangeMessageReceiverImpl extends TenantExchangeMessageRece .dlqName(REDACTION_DLQ) .arguments(Map.of("x-max-priority", 2)) .build(), + TenantQueueConfiguration.builder() + .listenerId(SEARCH_BULK_LOCAL_TERM_RESPONSE_LISTENER) + .exchangeName(SEARCH_BULK_LOCAL_TERM_RESPONSE_EXCHANGE) + .queuePrefix(SEARCH_BULK_LOCAL_TERM_RESPONSE_QUEUE_PREFIX) + .dlqName(SEARCH_BULK_LOCAL_TERM_DLQ) + .arguments(Map.of("x-max-priority", 2)) + .build(), TenantQueueConfiguration.builder() .listenerId(PDFTRON_RESPONSE_LISTENER_ID) .exchangeName(PDFTRON_RESPONSE_EXCHANGE) diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java index 890c6d201..0cf5f79d6 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMergeTest.java @@ -34,7 +34,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.EntityL import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService; -import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.PendingDictionaryEntryFactory; +import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.PendingEntryFactory; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; @@ -103,7 +103,7 @@ public class EntityLogMergeTest { @BeforeEach public void setUp() { - entityLogMergeService = new EntityLogMergeService(dictionaryPersistenceService, new PendingDictionaryEntryFactory(), entityLogMongoService); + entityLogMergeService = new EntityLogMergeService(dictionaryPersistenceService, new PendingEntryFactory(), entityLogMongoService); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java index d4d4f4954..4ed33a278 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EntityLogMongoServiceTest.java @@ -3,8 +3,11 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.Set; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +32,7 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT private final String ENTITY_LOG2 = "files/entity-log/6f2a9d4b5d4e11211fc0d7732fd45b78.ENTITY_LOG.json"; private final String ENTITY_LOG3_BEFORE = "files/entity-log/c3b23116f2d277170d303bfc6fb82e6a-before.ENTITY_LOG.json"; private final String ENTITY_LOG3_AFTER = "files/entity-log/c3b23116f2d277170d303bfc6fb82e6a-after.ENTITY_LOG.json"; + private final String ENTITY_LOG_LOCAL_BULK = "files/entity-log/local-bulk-test.ENTITY_LOG.json"; private final String ENTITY_LOG_WITH_CHANGES = "files/entity-log/entitylog-with-changes.json"; private static final String TEST_DOSSIER_ID = "91ce8e90-9aec-473c-b8c3-cbe16443ad34"; @@ -326,4 +330,70 @@ public class EntityLogMongoServiceTest extends AbstractPersistenceServerServiceT assertEquals(response.getEntityLogEntry().size(), 14); } + + @Test + @SneakyThrows + public void testEntityLogMongoServiceMethodsForLocalBulk() { + + var file = new ClassPathResource(ENTITY_LOG_LOCAL_BULK); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + + EntityLog entityLog = objectMapper.readValue(file.getInputStream(), EntityLog.class); + + entityLogMongoService.saveEntityLog(TEST_DOSSIER_ID, TEST_FILE1_ID, entityLog); + + String akessonValue = "Akesson"; + Set akessonSet = entityLogMongoService.findEntryIdsOfManualsWithValue(akessonValue); + assertEquals(akessonSet.size(), 3); + + float[] akessonRectangle = {322.63608f, 308.1f, 41.375977f, 12.642f}; + Set akessonSetByPositions = entityLogMongoService.findEntryIdsOfManualsWithPositionRectangle(akessonRectangle); + assertEquals(akessonSetByPositions.size(), 3); + + Set akessonSetFilterQuery = entityLogMongoService.findEntryIdsByMatchingFullPositionAndEngineManualWithFilters(akessonRectangle, + Collections.emptySet(), + Collections.emptySet(), + Collections.emptySet()); + assertEquals(akessonSetFilterQuery.size(), 3); + + Set akessonSetFilterQueryByPositions = entityLogMongoService.findEntryIdsByValueAndEngineManualWithFilters(akessonValue, + Collections.emptySet(), + Collections.emptySet(), + Collections.emptySet()); + assertEquals(akessonSetFilterQueryByPositions.size(), 3); + + akessonSetFilterQuery = entityLogMongoService.findEntryIdsByMatchingFullPositionAndEngineManualWithFilters(akessonRectangle, + Collections.emptySet(), + Collections.emptySet(), + Set.of(1, 3)); + assertEquals(akessonSetFilterQuery.size(), 2); + + akessonSetFilterQueryByPositions = entityLogMongoService.findEntryIdsByValueAndEngineManualWithFilters(akessonValue, + Collections.emptySet(), + Collections.emptySet(), + Set.of(1, 3)); + assertEquals(akessonSetFilterQueryByPositions.size(), 2); + + String baldridgeValue = "Baldridge"; + Set baldridgeSet = entityLogMongoService.findEntryIdsByValueAndEngineManualWithFilters(baldridgeValue, + Collections.emptySet(), + Collections.emptySet(), + Collections.emptySet()); + assertEquals(baldridgeSet.size(), 4); + + Set baldridgeSetWithTypeFilter = entityLogMongoService.findEntryIdsByValueAndEngineManualWithFilters(baldridgeValue, + Set.of("CBI_author", "Test"), + Collections.emptySet(), + Collections.emptySet()); + assertEquals(baldridgeSetWithTypeFilter.size(), 2); + + Set baldridgeSetWithLegalBasesFilter = entityLogMongoService.findEntryIdsByValueAndEngineManualWithFilters(baldridgeValue, + Set.of("CBI_author", "Test"), + Set.of("Test"), + Collections.emptySet()); + assertEquals(baldridgeSetWithLegalBasesFilter.size(), 1); + + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index 8b27659b9..0208bbee2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -66,7 +66,9 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionBulkLocalRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; @@ -1736,26 +1738,34 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { entityLogMongoService.upsertEntityLog(file.getDossierId(), file.getFileId(), entityLog); ManualRedactionResponse forceResponse = manualRedactionClient.forceRedactionBulk(dossier.getId(), - file.getId(), - Set.of(ForceRedactionRequestModel.builder().annotationId("forceRedactionAnnotation").comment("comment").legalBasis("1").build())); + file.getId(), + Set.of(ForceRedactionRequestModel.builder() + .annotationId("forceRedactionAnnotation") + .comment("comment") + .legalBasis("1") + .build())); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); assertEquals(allManualRedactions.getForceRedactions().size(), 1); assertFalse(allManualRedactions.getForceRedactions() - .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation"))); - assertTrue(allManualRedactions.getForceRedactions() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals(forceResponse.getManualAddResponses().get(0).getAnnotationId()))); + .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation"))); + assertTrue(allManualRedactions.getForceRedactions() + .stream() + .anyMatch(entry -> entry.getAnnotationId() + .equals(forceResponse.getManualAddResponses() + .get(0).getAnnotationId()))); var unprocessedManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, true); assertEquals(unprocessedManualRedactions.getForceRedactions().size(), 1); assertFalse(unprocessedManualRedactions.getForceRedactions() - .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation"))); + .stream() + .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation"))); assertTrue(allManualRedactions.getForceRedactions() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals(forceResponse.getManualAddResponses().get(0).getAnnotationId()))); + .anyMatch(entry -> entry.getAnnotationId() + .equals(forceResponse.getManualAddResponses() + .get(0).getAnnotationId()))); fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), @@ -1768,32 +1778,42 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .build()); ManualRedactionResponse forceResponse2 = manualRedactionClient.forceRedactionBulk(dossier.getId(), - file.getId(), - Set.of(ForceRedactionRequestModel.builder().annotationId("forceRedactionAnnotation2").comment("comment").legalBasis("1").build())); + file.getId(), + Set.of(ForceRedactionRequestModel.builder() + .annotationId("forceRedactionAnnotation2") + .comment("comment") + .legalBasis("1") + .build())); allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); assertEquals(allManualRedactions.getForceRedactions().size(), 2); assertFalse(allManualRedactions.getForceRedactions() - .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation"))); - assertTrue(allManualRedactions.getForceRedactions() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals(forceResponse.getManualAddResponses().get(0).getAnnotationId()))); + .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation"))); + assertTrue(allManualRedactions.getForceRedactions() + .stream() + .anyMatch(entry -> entry.getAnnotationId() + .equals(forceResponse.getManualAddResponses() + .get(0).getAnnotationId()))); assertFalse(allManualRedactions.getForceRedactions() - .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation2"))); - assertTrue(allManualRedactions.getForceRedactions() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals(forceResponse2.getManualAddResponses().get(0).getAnnotationId()))); + .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation2"))); + assertTrue(allManualRedactions.getForceRedactions() + .stream() + .anyMatch(entry -> entry.getAnnotationId() + .equals(forceResponse2.getManualAddResponses() + .get(0).getAnnotationId()))); unprocessedManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, true); assertEquals(unprocessedManualRedactions.getForceRedactions().size(), 1); assertFalse(unprocessedManualRedactions.getForceRedactions() - .stream() - .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation2"))); + .stream() + .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation2"))); assertTrue(unprocessedManualRedactions.getForceRedactions() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals(forceResponse2.getManualAddResponses().get(0).getAnnotationId()))); + .anyMatch(entry -> entry.getAnnotationId() + .equals(forceResponse2.getManualAddResponses() + .get(0).getAnnotationId()))); fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), @@ -1812,13 +1832,17 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation"))); assertTrue(allManualRedactions.getForceRedactions() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals(forceResponse.getManualAddResponses().get(0).getAnnotationId()))); + .anyMatch(entry -> entry.getAnnotationId() + .equals(forceResponse.getManualAddResponses() + .get(0).getAnnotationId()))); assertFalse(allManualRedactions.getForceRedactions() .stream() .anyMatch(entry -> entry.getAnnotationId().equals("forceRedactionAnnotation2"))); assertTrue(allManualRedactions.getForceRedactions() .stream() - .anyMatch(entry -> entry.getAnnotationId().equals(forceResponse2.getManualAddResponses().get(0).getAnnotationId()))); + .anyMatch(entry -> entry.getAnnotationId() + .equals(forceResponse2.getManualAddResponses() + .get(0).getAnnotationId()))); unprocessedManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), true, true); assertTrue(unprocessedManualRedactions.getForceRedactions().isEmpty()); @@ -2576,10 +2600,12 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { List.of(entityLogEntry), List.of(new EntityLogLegalBasis("1.1 personal data (incl. geolocation); Article 39(e)(3)", "desc", - "Article 39(e)(3) of Regulation (EC) No 178/2002",""), + "Article 39(e)(3) of Regulation (EC) No 178/2002", + ""), new EntityLogLegalBasis("4. commercial information", "desc 2", - "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)","")), + "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)", + "")), 0, 0, 0, @@ -2646,10 +2672,12 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { List.of(entityLogEntry), List.of(new EntityLogLegalBasis("1.1 personal data (incl. geolocation); Article 39(e)(3)", "desc", - "Article 39(e)(3) of Regulation (EC) No 178/2002", ""), + "Article 39(e)(3) of Regulation (EC) No 178/2002", + ""), new EntityLogLegalBasis("4. commercial information", "desc 2", - "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)","")), + "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)", + "")), 0, 0, 0, @@ -3186,4 +3214,122 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { assertTrue(result.getMessage().contains("Maximum number of remove from dictionary requests is 100.")); } + + @Test + public void testBulkLocal() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + + var type1 = typeProvider.testAndProvideType(dossierTemplate, dossier, "test1", false, 70); + var type2 = typeProvider.testAndProvideType(dossierTemplate, dossier, "test2", false, 71); + var type3 = typeProvider.testAndProvideType(dossierTemplate, dossier, "test3", false, 72); + var newType = typeProvider.testAndProvideType(dossierTemplate, dossier, "newType", false, 73); + + List entityLogEntries = new ArrayList<>(); + String legal3 = "Legal 3"; + String darthVader = "Darth Vader"; + for (int i = 0; i < 101; i++) { + entityLogEntries.add(EntityLogEntry.builder() + .id("AnnotationId1" + i) + .type(type1.getType()) + .value("Luke Skywalker" + i) + .entryType(EntryType.ENTITY) + .state(EntryState.APPLIED) + .section("section") + .legalBasis("Legal 1") + .engines(Set.of(Engine.MANUAL)) + .build()); + entityLogEntries.add(EntityLogEntry.builder() + .id("AnnotationId2" + i) + .type(type2.getType()) + .value(darthVader) + .entryType(EntryType.ENTITY) + .state(EntryState.APPLIED) + .section("section") + .legalBasis("Legal 2") + .engines(Set.of(Engine.MANUAL)) + .build()); + entityLogEntries.add(EntityLogEntry.builder() + .id("AnnotationId3" + i) + .type(type3.getType()) + .value(darthVader) + .entryType(EntryType.ENTITY) + .state(EntryState.APPLIED) + .section("section") + .legalBasis(legal3) + .engines(Set.of(Engine.MANUAL)) + .build()); + } + var entityLog = new EntityLog(1, 1, entityLogEntries, null, 0, 0, 0, 0); + fileManagementStorageService.saveEntityLog(dossier.getId(), file.getId(), entityLog); + + when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog); + + String newLegal = "new Legal"; + String otherSection = "other section"; + ManualRedactionResponse manualRedactionResponse = manualRedactionClient.recategorizeBulkLocal(dossier.getId(), + file.getId(), + RecategorizationBulkLocalRequestModel.builder() + .rectangle(false) + .type(newType.getType()) + .legalBasis(newLegal) + .section(otherSection) + .value("Luke Skywalker37") + .build(), + false); + assertEquals(manualRedactionResponse.getManualAddResponses().size(), 1); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(0).getEntityLogEntry().getType(), newType.getType()); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(0).getEntityLogEntry().getLegalBasis(), newLegal); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(0).getEntityLogEntry().getSection(), otherSection); + + manualRedactionResponse = manualRedactionClient.recategorizeBulkLocal(dossier.getId(), + file.getId(), + RecategorizationBulkLocalRequestModel.builder() + .rectangle(false) + .type(newType.getType()) + .legalBasis(newLegal) + .section(otherSection) + .value(darthVader) + .originLegalBases(Set.of(legal3)) + .build(), + false); + assertEquals(manualRedactionResponse.getManualAddResponses().size(), 101); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(1).getEntityLogEntry().getType(), newType.getType()); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(29).getEntityLogEntry().getLegalBasis(), newLegal); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(79).getEntityLogEntry().getSection(), otherSection); + + manualRedactionResponse = manualRedactionClient.recategorizeBulkLocal(dossier.getId(), + file.getId(), + RecategorizationBulkLocalRequestModel.builder() + .rectangle(false) + .type(newType.getType()) + .legalBasis(newLegal) + .section(otherSection) + .value(darthVader) + .originTypes(Set.of(type2.getType())) + .build(), + false); + assertEquals(manualRedactionResponse.getManualAddResponses().size(), 101); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(0).getEntityLogEntry().getType(), newType.getType()); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(36).getEntityLogEntry().getLegalBasis(), newLegal); + assertEquals(manualRedactionResponse.getManualAddResponses() + .get(98).getEntityLogEntry().getSection(), otherSection); + + manualRedactionResponse = manualRedactionClient.removeRedactionBulkLocal(dossier.getId(), + file.getId(), + RemoveRedactionBulkLocalRequestModel.builder().rectangle(false).value(darthVader).build(), + false); + assertEquals(manualRedactionResponse.getManualAddResponses().size(), 202); + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SearchTermOccurrencesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SearchTermOccurrencesTest.java new file mode 100644 index 000000000..1693343fc --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SearchTermOccurrencesTest.java @@ -0,0 +1,150 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultMessage; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DownloadClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; +import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadCompressionMessageReceiver; +import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadReportMessageReceiver; +import com.iqser.red.service.persistence.management.v1.processor.service.download.RedactionResultMessageReceiver; +import com.iqser.red.service.persistence.management.v1.processor.service.job.DownloadReadyJob; +import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.PendingEntryFactory; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ManualRedactionRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.queue.SearchTermOccurrencesResponseReceiver; +import com.iqser.red.service.persistence.service.v1.api.shared.model.BulkLocalResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionBulkLocalRequestModel; +import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; +import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; +import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.model.TenantResponse; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.experimental.FieldDefaults; + +@FieldDefaults(level = AccessLevel.PRIVATE) +public class SearchTermOccurrencesTest extends AbstractPersistenceServerServiceTest { + + @Autowired + FileTesterAndProvider fileTesterAndProvider; + @Autowired + DossierTesterAndProvider dossierTesterAndProvider; + @Autowired + DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider; + @Autowired + TypeProvider typeProvider; + @Autowired + SearchTermOccurrencesResponseReceiver searchTermOccurrencesResponseReceiver; + @Autowired + FileStatusPersistenceService fileStatusPersistenceService; + @Autowired + ManualRedactionRepository manualRedactionRepository; + @Autowired + PendingEntryFactory pendingEntryFactory; + + + @Test + public void testBulkLocal() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + var type = typeProvider.testAndProvideType(dossierTemplate, dossier, "test", false, 70); + + fileStatusPersistenceService.updateProcessingStatus(file.getFileId(), ProcessingStatus.BULK_LOCAL_REDACTIONS_PROCESSING); + + searchTermOccurrencesResponseReceiver.receive(BulkLocalResponse.builder() + .fileId(file.getId()) + .dossierId(dossier.getId()) + .searchTerm("searchTerm") + .type(type.getType()) + .legalBasis("legalBasis") + .reason("reason") + .section("section") + .positions(List.of(List.of(new Position(new float[]{1f, 2f, 3f, 4f}, 1)))) + .build()); + + List newEntries = manualRedactionRepository.findByFileIdAndOptions(file.getId(), false, false, false); + assertEquals(newEntries.size(), 1); + assertEquals(newEntries.get(0).getValue(), "searchTerm"); + assertEquals(newEntries.get(0).getLegalBasis(), "legalBasis"); + assertEquals(newEntries.get(0).getReason(), "reason"); + assertEquals(newEntries.get(0).getSection(), "section"); + assertEquals(fileStatusPersistenceService.getStatus(file.getId()).getProcessingStatus(), ProcessingStatus.PROCESSED); + + } + + + @Test + public void testPendingEntryCreation() { + + AddRedactionBulkLocalRequestModel addRedactionBulkLocalRequestModel = AddRedactionBulkLocalRequestModel.builder() + .value("Max") + .type("123") + .legalBasis("legalbasis") + .reason("reason") + .section("section") + .positions(List.of(new Rectangle(333.92593f, 446.8f, 19.152008f, 11.81175f, 1))) + .build(); + EntityLogEntry entityLogEntry = pendingEntryFactory.buildAddRedactionBulkLocalEntry(addRedactionBulkLocalRequestModel); + List positions = convertPositions(addRedactionBulkLocalRequestModel.getPositions()); + assertEquals(entityLogEntry.getPositions().get(0), positions.get(0)); + assertEquals(entityLogEntry.getValue(), addRedactionBulkLocalRequestModel.getValue()); + assertEquals(entityLogEntry.getLegalBasis(), addRedactionBulkLocalRequestModel.getLegalBasis()); + assertEquals(entityLogEntry.getReason(), addRedactionBulkLocalRequestModel.getReason()); + assertEquals(entityLogEntry.getSection(), addRedactionBulkLocalRequestModel.getSection()); + + } + + + private List convertPositions(List rectangles) { + + return rectangles.stream() + .map(rectangle -> new Position(rectangle.getTopLeftX(), rectangle.getTopLeftY(), rectangle.getWidth(), rectangle.getHeight(), rectangle.getPage())) + .collect(Collectors.toList()); + } +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/entity-log/local-bulk-test.ENTITY_LOG.json b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/entity-log/local-bulk-test.ENTITY_LOG.json new file mode 100644 index 000000000..e717a1dcd --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/entity-log/local-bulk-test.ENTITY_LOG.json @@ -0,0 +1,120704 @@ +{ + "analysisVersion": 1, + "analysisNumber": 8, + "entityLogEntry": [ + { + "id": "715fac9474f3383918d19f60884f280f", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Altenbach", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 500.84808, + 722.1, + 49.19983, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Alscher, A. Alston ", + "textAfter": " Altenbach ME Altenberger", + "startOffset": 4658, + "endOffset": 4667, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "87eb85a37616f9d03985606ef2712601", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abbott", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 170.764, + 625.5, + 33.31201, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Abbay Abbd-Alrahman Abbitt ", + "textAfter": " Abbott L. Abbotts", + "startOffset": 686, + "endOffset": 692, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.95293822Z", + "requestedDate": "2024-03-13T08:45:49.005539Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "9db60b07b7d013a188a4e5af7046eb19", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Aldrige", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 253.74402, + 197.70004, + 36.600037, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Aldinger Aldrich Aldridge ", + "textAfter": " Aldrige D. Aldwinckle", + "startOffset": 3538, + "endOffset": 3545, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953008683Z", + "requestedDate": "2024-03-13T08:45:50.085292Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "34cc497eb5e3e94b7b29447fbda82320", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Aardema", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 103.084, + 639.3, + 43.908005, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Aalderink Aamlid Aardema ", + "textAfter": " M. Aaron Aarup", + "startOffset": 581, + "endOffset": 588, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "0245dbce0111d5ee2df270a8e78f3855", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alerman", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 112.9, + 170.1, + 41.892006, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Alemanni Alen Alenberger ", + "textAfter": " Alesandrini Alessi Aletrari", + "startOffset": 3703, + "endOffset": 3710, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953103862Z", + "requestedDate": "2024-03-13T08:45:48.462405Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "737aeb490a777186bcbfbd2999a83b30", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Bade T", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 156.364, + 432.3, + 34.71602, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Bacsi Badawy Bade ", + "textAfter": " Bade T.R. Badelt", + "startOffset": 11025, + "endOffset": 11031, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.953181237Z", + "requestedDate": "2024-03-13T08:48:18.188Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Bade T" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.953187249Z", + "requestedDate": "2024-03-13T08:48:18.799597Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "dcf307efe545ad90f3fec3ff43919dc5", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "A. Kwiatkowski A. Roth", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 263.03204, + 666.9, + 118.93201, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "A. H. Karrenbrock ", + "textAfter": " A. Shirmohammadi A.", + "startOffset": 425, + "endOffset": 447, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953236872Z", + "requestedDate": "2024-03-13T08:45:49.390631Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "3e94c3516b420a46b937db82d67b0ecb", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Baluch", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 477.02826, + 239.1, + 33.900055, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Balu Balu, K. ", + "textAfter": " Bamber Bames Bammer", + "startOffset": 12410, + "endOffset": 12416, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.95328361Z", + "requestedDate": "2024-03-13T08:48:18.535Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Baluch" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.953284351Z", + "requestedDate": "2024-03-13T08:48:18.594944Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "62ebb6143f9df4d82849bd30d667cef7", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Awoyemi", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 267.65207, + 584.1, + 46.212036, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Avril Awazu Awong ", + "textAfter": " Axelrod Ayadi Aydin-Sinan", + "startOffset": 10039, + "endOffset": 10046, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.953322433Z", + "requestedDate": "2024-03-13T08:48:18.194393Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.953323245Z", + "requestedDate": "2024-03-13T08:48:18.473Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Awoyemi" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "55d686c53c7748e6f24e0d38a3b1afee", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Makiko", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 285.71204, + 556.5, + 37.29602, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Anai M. Anai ", + "textAfter": " Anaka Anand Ananth", + "startOffset": 5670, + "endOffset": 5676, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 3, + "type": "ADDED", + "dateTime": "2024-03-13T08:47:11.339124572Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e4ab26a0961a71a582f763ca62cfb0fb", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Akhavan M", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 412.01205, + 308.1, + 56.96405, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Akerman Akesson Akhavan ", + "textAfter": " Akhavan M. Akhavein", + "startOffset": 2822, + "endOffset": 2831, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953399919Z", + "requestedDate": "2024-03-13T08:45:50.143058Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.953406241Z", + "requestedDate": "2024-03-13T08:59:29.965623Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "9cdab8f6406921cd4c757755d1fdf73b", + "type": "CBI_author", + "entryType": "RECOMMENDATION", + "state": "SKIPPED", + "value": "Anastacio Anastasiadou Anastasiadou P.", + "reason": "", + "matchedRule": "", + "legalBasis": "", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 542.7, + 193.15202, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Ananth Anas Anasaloni ", + "textAfter": " Anastasiou Anbari Ancay", + "startOffset": 5711, + "endOffset": 5749, + "imageHasTransparency": false, + "dictionaryEntry": false, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 4, + "type": "ADDED", + "dateTime": "2024-03-13T08:47:19.694336707Z" + } + ], + "manualChanges": [], + "engines": [ + "NER" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "1808156dd06beb1e924d71c4e3451e32", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Adair", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 482.68018, + 515.1, + 27.288025, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Zeist, NL Adair ", + "textAfter": " Jason Adam Adam", + "startOffset": 1475, + "endOffset": 1480, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "9d6d9c4461a0a0228f52fd32707eac30", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Banham PB.", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 314.59604, + 197.70004, + 60.660034, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "PB Banham PB, ", + "textAfter": " Banhan Banica Banicova", + "startOffset": 12643, + "endOffset": 12653, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.953519554Z", + "requestedDate": "2024-03-13T08:48:18.187Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Banham PB." + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.953520125Z", + "requestedDate": "2024-03-13T08:48:18.196436Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "0cdb91bf350b46ab43c323fe950be3af", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alekseyev", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 371.9921, + 183.90005, + 50.496033, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "AlejandroArias Alekperov Aleksashina ", + "textAfter": " Aleksunes Alemanni Alen", + "startOffset": 3658, + "endOffset": 3667, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953557135Z", + "requestedDate": "2024-03-13T08:45:49.063833Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "642f0942aab80d6afd4b0d8e1a46bd21", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abellan Martinez", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 72.796005, + 584.1, + 84.192, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Abellan Abellan M. ", + "textAfter": " Aberer Abernathy Abernethy", + "startOffset": 943, + "endOffset": 959, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953592241Z", + "requestedDate": "2024-03-13T08:45:48.60437Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e843c5de7636406d34198c8184730beb", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allsup", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 59.700043, + 31.979992, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Alllen Allochuku Allran ", + "textAfter": " Almaraz Almeida Almeida", + "startOffset": 4486, + "endOffset": 4492, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953626705Z", + "requestedDate": "2024-03-13T08:45:48.905789Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "21ed6c2f0e618aacc46d81b3c7319fad", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Adams", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 297.73602, + 487.5, + 33.960022, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "K. Adams RA ", + "textAfter": " Richard Adams S.", + "startOffset": 1613, + "endOffset": 1618, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "dafe2c394f2230fe891b872a56e69718", + "type": "CBI_author", + "entryType": "RECOMMENDATION", + "state": "SKIPPED", + "value": "Arnoux Arnus Arora Arpad Arpasy M.", + "reason": "", + "matchedRule": "", + "legalBasis": "", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 384.484, + 170.1, + 167.93994, + 12.642 + ], + "pageNumber": 2 + }, + { + "rectangle": [ + 56.8, + 156.30002, + 13.5960045, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Arnold Arnold D.W. ", + "textAfter": " Arpino Arrhenius Arrhenius", + "startOffset": 8285, + "endOffset": 8319, + "imageHasTransparency": false, + "dictionaryEntry": false, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 4, + "type": "ADDED", + "dateTime": "2024-03-13T08:47:19.694336707Z" + } + ], + "manualChanges": [], + "engines": [ + "NER" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "9225cc7c37f7b3a4fc2606103fb6e601", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Almeida A", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 290.02002, + 59.700043, + 52.344086, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "A Almeida A. ", + "textAfter": ".A. Almond Almond", + "startOffset": 4530, + "endOffset": 4539, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953732154Z", + "requestedDate": "2024-03-13T08:58:39.618107Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "31b190d20533e27230769116114e928b", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alex Charlton,", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 322.3841, + 170.1, + 71.26807, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Alessi Aletrari Alevra ", + "textAfter": " Alexander Alexander Gregory", + "startOffset": 3746, + "endOffset": 3760, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953766358Z", + "requestedDate": "2024-03-13T08:45:49.267467Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "f2788c6966d0e3edd5ca16bd1fa29fb9", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alban", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 287.392, + 239.1, + 29.292023, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "S Alba S. ", + "textAfter": " Albanese Albanese E.J.", + "startOffset": 3255, + "endOffset": 3260, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953800543Z", + "requestedDate": "2024-03-13T08:45:48.74127Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "8e71e92c29f08c1112f4742eb92f606d", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allen", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 468.48425, + 114.900055, + 26.592041, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Allchin Alleman Allemann ", + "textAfter": " Allen B.C. Allen", + "startOffset": 4165, + "endOffset": 4170, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953834937Z", + "requestedDate": "2024-03-13T08:45:48.594494Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "04d31e73df649fb4cbb8a76bc257f67f", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alba", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 177.73601, + 239.1, + 23.304, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Alavez Alawi Alba ", + "textAfter": " A Alba S", + "startOffset": 3233, + "endOffset": 3237, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953869392Z", + "requestedDate": "2024-03-13T08:58:39.431293Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "6eef8c459cc714eb1468d7f12760c647", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Balsa", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 163.06, + 239.1, + 26.604004, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Baloch Balog Balogh ", + "textAfter": " Balsaa Baltensperger Baltisberger", + "startOffset": 12346, + "endOffset": 12351, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.953906592Z", + "requestedDate": "2024-03-13T08:48:18.12Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Balsa" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.953907223Z", + "requestedDate": "2024-03-13T08:48:19.233261Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "0d74e644a7c36219f3de82a05c943d9e", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Aardema", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 639.3, + 43.908, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Aagaard Aalderink Aamlid ", + "textAfter": " Aardema M. Aaron", + "startOffset": 573, + "endOffset": 580, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953942039Z", + "requestedDate": "2024-03-13T08:45:48.545746Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "843c418ed58a97614165c9c5a4d4c6c9", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abildt", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 467.30817, + 584.1, + 30.61203, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "A. Abi-Akar Abildgard ", + "textAfter": " Abildt U. Abis", + "startOffset": 1019, + "endOffset": 1025, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.953976814Z", + "requestedDate": "2024-03-13T08:45:49.783535Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "ae58788da8854c1f42ff429def4aff98", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Adema", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 162.184, + 459.9, + 34.608, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Adelberger I Adelson ", + "textAfter": " Ademola Adham Adhihetty", + "startOffset": 1758, + "endOffset": 1763, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954011089Z", + "requestedDate": "2024-03-13T08:45:48.967729Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e5a6654664d689949e3823e1681d6272", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Akesson", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 322.63608, + 308.1, + 41.375977, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Akashi Akashiba Akerman ", + "textAfter": " Akhavan Akhavan M", + "startOffset": 2806, + "endOffset": 2813, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954045754Z", + "requestedDate": "2024-03-13T08:45:49.298559Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.954046415Z", + "requestedDate": "2024-03-13T08:59:29.8778Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e5a6654664d689949e3823e1681d6273", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Akesson", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 322.63608, + 308.1, + 41.375977, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Akashi Akashiba Akerman ", + "textAfter": " Akhavan Akhavan M", + "startOffset": 2806, + "endOffset": 2813, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954045754Z", + "requestedDate": "2024-03-13T08:45:49.298559Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.954046415Z", + "requestedDate": "2024-03-13T08:59:29.8778Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e5a6654664d689949e3823e1681d6274", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Akesson", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 322.63608, + 308.1, + 41.375977, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Akashi Akashiba Akerman ", + "textAfter": " Akhavan Akhavan M", + "startOffset": 2806, + "endOffset": 2813, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954045754Z", + "requestedDate": "2024-03-13T08:45:49.298559Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.954046415Z", + "requestedDate": "2024-03-13T08:59:29.8778Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "ad3096cde99eac5a9c41ec85058efcfe", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allen H.", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 249.004, + 101.100006, + 41.28006, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "J. Allen D.J. ", + "textAfter": " Allen J.A. Allen", + "startOffset": 4223, + "endOffset": 4231, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954081842Z", + "requestedDate": "2024-03-13T08:45:48.820661Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY", + "NER" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "26710321b5cbdec8ad8431117bb34d1e", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Baldridge", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 156.74799, + 294.3, + 47.208008, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Baldrick Baldrick P. ", + "textAfter": " Baldwin Baldwin M.K.", + "startOffset": 11954, + "endOffset": 11963, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954118551Z", + "requestedDate": "2024-03-13T08:48:18.084Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Baldridge" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954119092Z", + "requestedDate": "2024-03-13T08:48:19.244317Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "26710321b5cbdec8ad8431117bb34d1f", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Baldridge", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 156.74799, + 294.3, + 47.208008, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Baldrick Baldrick P. ", + "textAfter": " Baldwin Baldwin M.K.", + "startOffset": 11954, + "endOffset": 11963, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954118551Z", + "requestedDate": "2024-03-13T08:48:18.084Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Baldridge" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954119092Z", + "requestedDate": "2024-03-13T08:48:19.244317Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "26710321b5cbdec8ad8431117bb34d1g", + "type": "PII", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Baldridge", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 156.74799, + 294.3, + 47.208008, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Baldrick Baldrick P. ", + "textAfter": " Baldwin Baldwin M.K.", + "startOffset": 11954, + "endOffset": 11963, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954118551Z", + "requestedDate": "2024-03-13T08:48:18.084Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Baldridge" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954119092Z", + "requestedDate": "2024-03-13T08:48:19.244317Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "26710321b5cbdec8ad8431117bb34d1h", + "type": "Test", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Baldridge", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Test", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 156.74799, + 294.3, + 47.208008, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Baldrick Baldrick P. ", + "textAfter": " Baldwin Baldwin M.K.", + "startOffset": 11954, + "endOffset": 11963, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954118551Z", + "requestedDate": "2024-03-13T08:48:18.084Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Baldridge" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954119092Z", + "requestedDate": "2024-03-13T08:48:19.244317Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "711db44a5295a6a8ae96a58adfb8a23a", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Adams", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 511.58823, + 501.3, + 33.95993, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Adami Adamovics Adams ", + "textAfter": " Allen Adams D.", + "startOffset": 1565, + "endOffset": 1570, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "6f742899f1c6237f8504fe08dac27866", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Audrey V.", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 198.376, + 653.1, + 48.888016, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Audouze Audouze K. ", + "textAfter": " Audus Audy Auer", + "startOffset": 9572, + "endOffset": 9581, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954190456Z", + "requestedDate": "2024-03-13T08:48:18.342Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Audrey V." + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954191007Z", + "requestedDate": "2024-03-13T08:48:18.794003Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "3ec790054bdf095c6f9adace3a2cfabc", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Banwell", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 342.7961, + 183.90005, + 39.91205, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "A.J Bannwarth Banton ", + "textAfter": " Banyard Banyuls Banzar", + "startOffset": 12736, + "endOffset": 12743, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954225642Z", + "requestedDate": "2024-03-13T08:48:18.061524Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954226384Z", + "requestedDate": "2024-03-13T08:48:18.229Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Banwell" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "7cb0ead3fcfb00dfc24178941b028fdc", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Adams", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 136.77998, + 487.5, + 33.960007, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Allen Adams D. ", + "textAfter": " DS Adams K.", + "startOffset": 1586, + "endOffset": 1591, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "c2755a69d36ea2b74af9b082a0036a41", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Atreya NC", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 282.68802, + 694.5, + 52.272034, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "S. Atrashkova Atreya ", + "textAfter": " Atreys Atreyya Atsushi", + "startOffset": 9303, + "endOffset": 9312, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954296576Z", + "requestedDate": "2024-03-13T08:48:18.639Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Atreya NC" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954297127Z", + "requestedDate": "2024-03-13T08:48:18.830217Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "ae5c6edab43155a7f68b27546dda06aa", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abd-Alrahman", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 295.73203, + 625.5, + 72.57605, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Abbott L. Abbotts ", + "textAfter": " Abd-Ella AA Abdallah", + "startOffset": 711, + "endOffset": 723, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954332053Z", + "requestedDate": "2024-03-13T08:45:49.868331Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "a55989c7e9ed50c5532e83ec54d70d2b", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allen D.", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 99.78399, + 101.100006, + 41.27999, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "B.C. Allen C. ", + "textAfter": " Allen D. J.", + "startOffset": 4191, + "endOffset": 4199, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954366177Z", + "requestedDate": "2024-03-13T08:45:49.44948Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY", + "NER" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "4c59c27ca5762407b5ef65e527f0f1a5", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Aarup S.", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 230.64401, + 639.3, + 42.671997, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "M. Aaron Aarup ", + "textAfter": " Aarup V. Abadie", + "startOffset": 604, + "endOffset": 612, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954400942Z", + "requestedDate": "2024-03-13T08:45:49.907731Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "9246b04b4e87dcc82a91443e2712319c", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Aversa", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 235.576, + 597.9, + 33.107986, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Avault Aveline Aver ", + "textAfter": " Avery Aviado Avila", + "startOffset": 9934, + "endOffset": 9940, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954436649Z", + "requestedDate": "2024-03-13T08:48:18.293Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Aversa" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.95443716Z", + "requestedDate": "2024-03-13T08:48:18.558489Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "1031714e84ee17f996985991545a8b7f", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Aldinger", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 124.78, + 197.70004, + 42.588013, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "S. Aldershof SA ", + "textAfter": " Aldrich Aldridge Aldrige", + "startOffset": 3512, + "endOffset": 3520, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954471665Z", + "requestedDate": "2024-03-13T08:45:49.839363Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "8227c499c2cb6553a8268b176ec0fbe7", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allen", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 197.72798, + 101.100006, + 26.59201, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Allen D. J. ", + "textAfter": " D.J. Allen H.", + "startOffset": 4212, + "endOffset": 4217, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.95450595Z", + "requestedDate": "2024-03-13T08:58:39.402992Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "64c1106908b56e9d8fcde5e28a7b682f", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Aga", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 195.052, + 404.7, + 20.003998, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "AG Seville Aga ", + "textAfter": " D. S. Agarwal", + "startOffset": 2139, + "endOffset": 2142, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954540304Z", + "requestedDate": "2024-03-13T08:58:39.577173Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "529979f07c589a58324433de581f1970", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alger", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 399.42407, + 142.50003, + 27.288025, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "D.R. Algate Derek ", + "textAfter": " Ali Alim Aliouane", + "startOffset": 3951, + "endOffset": 3956, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954574799Z", + "requestedDate": "2024-03-13T08:45:48.538748Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "1bd5c4c513c146c62850cf8fe2502453", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Aldershof S", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 471.74808, + 211.50003, + 57.64798, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Aldershof Aldershof S ", + "textAfter": ". Aldershof SA", + "startOffset": 3486, + "endOffset": 3497, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954608853Z", + "requestedDate": "2024-03-13T08:58:39.293665Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "937df935fab632abb4038339f9d2ba2c", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Chamier", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 480.9162, + 722.1, + 41.27997, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Tummon 0. D. ", + "textAfter": " 0. W. Matheson", + "startOffset": 84, + "endOffset": 91, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954642727Z", + "requestedDate": "2024-03-13T08:58:39.548295Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "75b27037ff69dd81eb48894fe4f07a78", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Adamovics", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 418.3001, + 501.3, + 54.564087, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Adamczewska-Andrzejewska Adamczyk Adami ", + "textAfter": " Adams Adams Allen", + "startOffset": 1549, + "endOffset": 1558, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954676931Z", + "requestedDate": "2024-03-13T08:45:48.698964Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "0b973ec922774f6df9243e85cdc09a6f", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Atger", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 708.3, + 27.287998, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Atallah Y.H. Ataulla ", + "textAfter": " Athanaselis Atherton Athusi", + "startOffset": 9157, + "endOffset": 9162, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954712518Z", + "requestedDate": "2024-03-13T08:48:18.033968Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.9547134Z", + "requestedDate": "2024-03-13T08:48:18.136Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Atger" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "32c33ef8d4d1e6fddfafc2bf4e50f06c", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Magdalena", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 155.38, + 473.7, + 53.304, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Adamska Magdalen Adamska ", + "textAfter": " Adanyi Adaskaveg Adato", + "startOffset": 1669, + "endOffset": 1678, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "4f23721ab5580a7dfd5b6c49716e7e32", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Bach", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 383.1762, + 501.3, + 24.600037, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Baccarelli Bacchus Bacci ", + "textAfter": " Bach B. Bach", + "startOffset": 10609, + "endOffset": 10613, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954781448Z", + "requestedDate": "2024-03-13T08:48:18.153093Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.95478222Z", + "requestedDate": "2024-03-13T08:48:18.332Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Bach" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "10bbc22e5ccd549d0ff535563dbf7d82", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Aloni", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 242.42801, + 722.1, + 27.312012, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Almond Richard Alongi ", + "textAfter": " Aloph Alpendurada Alsadek", + "startOffset": 4607, + "endOffset": 4612, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "50c88533fe01a91f38e6b306d368a8c2", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Attique", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 333.29214, + 680.7, + 35.904053, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Attia Attila Attilio ", + "textAfter": " Atwa Atwal Atwood", + "startOffset": 9415, + "endOffset": 9422, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954854265Z", + "requestedDate": "2024-03-13T08:48:18.385Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Attique" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954854946Z", + "requestedDate": "2024-03-13T08:48:18.623858Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "dba9c6b2bf616e27a862e97a35ac29c4", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Abbott", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 206.45201, + 625.5, + 33.228012, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Abbd-Alrahman Abbitt Abbott ", + "textAfter": " L. Abbotts Abd-Alrahman", + "startOffset": 693, + "endOffset": 699, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "fa52ae8005f74a067472cd37e1e1ecf9", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allen", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 249.004, + 101.100006, + 26.592041, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "J. Allen D.J. ", + "textAfter": " H. Allen J.A.", + "startOffset": 4223, + "endOffset": 4228, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.954923896Z", + "requestedDate": "2024-03-13T08:58:39.422983Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "7d93e285f46c31d3e952755ed3c30508", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Baldez", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 410.17627, + 308.1, + 33.216064, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Baldamus Baldarelli Balderacchi ", + "textAfter": " Baldi Baldi B.", + "startOffset": 11911, + "endOffset": 11917, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.954959413Z", + "requestedDate": "2024-03-13T08:48:18.208Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Baldez" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.954959964Z", + "requestedDate": "2024-03-13T08:48:19.127545Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "11c3b3212fe0591e5d24066f37c8084e", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Adolphi H.", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 187.74399, + 432.3, + 53.976013, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Adolph S. Adolphi ", + "textAfter": " Adora Clark Adriaanse", + "startOffset": 1946, + "endOffset": 1956, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.95499509Z", + "requestedDate": "2024-03-13T08:45:48.928955Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "2c74180b4cac91a652842a78de9506ea", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Balluf", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 363.73618, + 252.90005, + 29.89206, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Ballet Ballet-Besnard Ballsutwe ", + "textAfter": " Balluff Balluff M.", + "startOffset": 12293, + "endOffset": 12299, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955030437Z", + "requestedDate": "2024-03-13T08:48:18.574Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Balluf" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955030938Z", + "requestedDate": "2024-03-13T08:48:18.685198Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e1a544ce45b4ae36eb94b3edd5dda8ca", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Al. Amin", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 442.01218, + 266.70004, + 44.676025, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Al-Sarar Al-Shaibani Al-Taher ", + "textAfter": " Aladjem Alagar Alamo", + "startOffset": 3097, + "endOffset": 3105, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955066274Z", + "requestedDate": "2024-03-13T08:45:49.558719Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "190f05c164689f7c37c7fb384f857468", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allin", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 209.74, + 73.50003, + 24.588013, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Allender Alley Allias ", + "textAfter": " Allingham Allinson Allison", + "startOffset": 4418, + "endOffset": 4423, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955100498Z", + "requestedDate": "2024-03-13T08:45:49.15997Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "d6886f051bd757a8e40c8e071aac1cfb", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Altenburger E.", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 299.74005, + 708.3, + 70.992096, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Altenberger Altenburg Altenburger ", + "textAfter": " Altenkirch Alterbuger Alterburger", + "startOffset": 4715, + "endOffset": 4729, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "7c948e439a62f8f2fa46e6d65eccdab0", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Abraham", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 445.03613, + 570.3, + 44.616028, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Abraham Abraham N. ", + "textAfter": " N.R. Abraham, N.R.", + "startOffset": 1107, + "endOffset": 1114, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "56facb7952f1c273d39204156840e84c", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "$ D Jones", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 722.1, + 47.26801, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "", + "textAfter": " $.Friedrich & Farrelly", + "startOffset": 0, + "endOffset": 9, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955207149Z", + "requestedDate": "2024-03-13T08:45:49.116166Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "d709ac992b5802bc56b695e4d479fac8", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "B. Schmid", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 437.10416, + 528.9, + 50.580048, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Pavlowitz B. Kerr, ", + "textAfter": " B.A. LACKEY Ba", + "startOffset": 10441, + "endOffset": 10450, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955242586Z", + "requestedDate": "2024-03-13T08:48:18.281118Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955243367Z", + "requestedDate": "2024-03-13T08:48:18.676Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "B. Schmid" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "ac29eda843f8e638355ee9443eb02827", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Ballantine L.G.", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 305.88412, + 280.5, + 74.2561, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Ballantine Ballantine L. ", + "textAfter": " Ballantine L.G.. Ballantyne", + "startOffset": 12075, + "endOffset": 12090, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955278593Z", + "requestedDate": "2024-03-13T08:48:18.327Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Ballantine L.G." + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955279094Z", + "requestedDate": "2024-03-13T08:48:18.737835Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "481ddcb3cfaf559d3c6889dc0c73f27f", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allen", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 482.18814, + 87.30002, + 26.592041, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "L. Allen, Lisa ", + "textAfter": ", M Allen,", + "startOffset": 4377, + "endOffset": 4382, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955314862Z", + "requestedDate": "2024-03-13T08:58:39.47052Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "bfe79514a1a2b0d9676ce945ca1048f8", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Bachmann K.", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 496.44443, + 473.7, + 51.20395, + 12.642 + ], + "pageNumber": 3 + }, + { + "rectangle": [ + 56.8, + 459.9, + 11.604, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Bachmann Bachmann B. ", + "textAfter": " Bachmann M Bachmann", + "startOffset": 10818, + "endOffset": 10829, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955349928Z", + "requestedDate": "2024-03-13T08:48:18.708Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Bachmann K." + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955350459Z", + "requestedDate": "2024-03-13T08:48:18.802243Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e01c212594ffb0f196febcd9a2c845f1", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Anderson", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 307.24, + 515.1, + 46.679993, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "L. Anderson M. ", + "textAfter": " Melanie Anderson R", + "startOffset": 5941, + "endOffset": 5949, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 4, + "type": "ADDED", + "dateTime": "2024-03-13T08:47:19.694336707Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "0fe2ed3fbdcf924cc9fd24f5be54b221", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alden", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 99.784, + 211.50003, + 29.291992, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "R. Alcock Aldcroft ", + "textAfter": " Aldenberg Alder Alder", + "startOffset": 3413, + "endOffset": 3418, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955421793Z", + "requestedDate": "2024-03-13T08:45:48.497638Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "892bd30cac5c286e0e226d94e41ab2ea", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Balogh", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 125.37999, + 239.1, + 34.59601, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Balmer Baloch Balog ", + "textAfter": " Balsa Balsaa Baltensperger", + "startOffset": 12339, + "endOffset": 12345, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.9554573Z", + "requestedDate": "2024-03-13T08:48:18.243Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Balogh" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955457801Z", + "requestedDate": "2024-03-13T08:48:18.592147Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "204e74d8fe7140031b1772c4b81d260a", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Roper", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 239.32002, + 722.1, + 29.292007, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "& Farrelly &M ", + "textAfter": " )avid Patton .", + "startOffset": 36, + "endOffset": 41, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 6, + "type": "ADDED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "2b2430421789aee957d772aa26a3ce51", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Alder", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 213.856, + 211.50003, + 27.28801, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Alden Aldenberg Alder ", + "textAfter": " L. Alderman Aldersdorf", + "startOffset": 3435, + "endOffset": 3440, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955531189Z", + "requestedDate": "2024-03-13T08:58:39.427068Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "5e38a2b746b98c73addae37b41645de6", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Aulerich", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 625.5, + 41.891994, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Augusiak J.A Aukema ", + "textAfter": " Auletta Auletta A.", + "startOffset": 9719, + "endOffset": 9727, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955567086Z", + "requestedDate": "2024-03-13T08:48:18.121789Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955567878Z", + "requestedDate": "2024-03-13T08:48:18.424Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Aulerich" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "a7599fec691d20fe9516d04637b8dfaa", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Aikens P.J.", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 299.60803, + 335.7, + 52.97998, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Aikens Aikens P. ", + "textAfter": " Airoldi Airs Airs", + "startOffset": 2617, + "endOffset": 2628, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955603665Z", + "requestedDate": "2024-03-13T08:45:49.276334Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.955604236Z", + "requestedDate": "2024-03-13T08:59:29.887062Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "b309589863695b5fa8443adb9aeb231a", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Altenkirch", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 373.12015, + 708.3, + 51.288086, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Altenburger Altenburger E. ", + "textAfter": " Alterbuger Alterburger Althaus", + "startOffset": 4730, + "endOffset": 4740, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "e188003edabb919da47e36fa779d0168", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Bandeira", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 392.18817, + 225.30002, + 43.212067, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Banasiak U. Bandeen ", + "textAfter": " Bandisode Bandong Bandow", + "startOffset": 12484, + "endOffset": 12492, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955674158Z", + "requestedDate": "2024-03-13T08:48:18.144Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Bandeira" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955674759Z", + "requestedDate": "2024-03-13T08:48:18.888585Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "6be7538b0c92a5be801e78d90321eda0", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abdulla", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 597.9, + 38.603992, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Abdou Abdu-Allah, G. ", + "textAfter": " Abdulrachman Abdurrachman Abe", + "startOffset": 846, + "endOffset": 853, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955710226Z", + "requestedDate": "2024-03-13T08:45:49.776213Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "8f7700281e46dbfcfe3d84e796bf1450", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Asuncion", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 309.71207, + 722.1, + 45.900024, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Aston Astoux Astuti ", + "textAfter": " Asya Lyon Atallah", + "startOffset": 9109, + "endOffset": 9117, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955745292Z", + "requestedDate": "2024-03-13T08:48:18.191Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Asuncion" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.955745813Z", + "requestedDate": "2024-03-13T08:48:19.237909Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "87198eb2e01366f976e65e2f7872fa4b", + "type": "PII", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Allen L. Allen", + "reason": "Personal Information found, removed by manual override", + "matchedRule": "PII.0.1", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 343.96005, + 101.100006, + 68.95209, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "H. Allen J.A. ", + "textAfter": " M Allen M.", + "startOffset": 4243, + "endOffset": 4257, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.95578148Z", + "requestedDate": "2024-03-13T08:58:39.566648Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "08714f9b70197e7bf845d66482bbf99c", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Campbell", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 344.23605, + 321.9, + 46.608063, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "R. Aizawa AJ ", + "textAfter": " Ajao Ajayi Ajimi", + "startOffset": 2723, + "endOffset": 2731, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955816375Z", + "requestedDate": "2024-03-13T08:58:39.450885Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.955817027Z", + "requestedDate": "2024-03-13T08:59:30.001836Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "365cb4dc259de6b724241def1b7f5a50", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abellan", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 475.98407, + 597.9, + 37.896057, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Abel P. Abell ", + "textAfter": " Abellan M. Abellan", + "startOffset": 924, + "endOffset": 931, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955851221Z", + "requestedDate": "2024-03-13T08:45:50.164702Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "764ef8428618fa427655beb66d25e21b", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Anderson", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 80.188, + 487.5, + 46.680008, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "A. Anderson, T.D. ", + "textAfter": "-Long Anderson. R.", + "startOffset": 6076, + "endOffset": 6084, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 4, + "type": "ADDED", + "dateTime": "2024-03-13T08:47:19.694336707Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "60e81a3af1ea0f1888d2a7afa315c5af", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Akalach", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 149.39201, + 308.1, + 39.98401, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Ajimoko Akahavan Akahori ", + "textAfter": " Akashi Akashiba Akerman", + "startOffset": 2774, + "endOffset": 2781, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955920642Z", + "requestedDate": "2024-03-13T08:45:48.512Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.955921393Z", + "requestedDate": "2024-03-13T08:59:29.927172Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "aaaac196160903fc9ea24e55998daaf9", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Balaz", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 447.1361, + 321.9, + 27.300049, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "J. A. Balasubramanian ", + "textAfter": " Balazs Balbinder Balchak", + "startOffset": 11830, + "endOffset": 11835, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.95595692Z", + "requestedDate": "2024-03-13T08:48:18.091077Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.955957671Z", + "requestedDate": "2024-03-13T08:48:18.174Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Balaz" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "a39cf861450d3703189062673a3421ba", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Almeida A.", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 232.348, + 59.700043, + 55.368027, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Almeida Almeida A ", + "textAfter": " Almeida A.A. Almond", + "startOffset": 4519, + "endOffset": 4529, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.955991976Z", + "requestedDate": "2024-03-13T08:45:49.033815Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "da5f8efdba9b5b598ae6dceaabe6e318", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Atkinson S.", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 131.06801, + 694.5, + 56.664, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "C. Atkinson K. ", + "textAfter": " Atrashkova Atreya Atreya", + "startOffset": 9273, + "endOffset": 9284, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.956027242Z", + "requestedDate": "2024-03-13T08:48:18.045557Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.956027993Z", + "requestedDate": "2024-03-13T08:48:18.082Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Atkinson S." + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "f97664e35d2b5592d00dada90fd53fd1", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Adams", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 475.28818, + 501.3, + 33.876038, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Adamczyk Adami Adamovics ", + "textAfter": " Adams Allen Adams", + "startOffset": 1559, + "endOffset": 1564, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956062779Z", + "requestedDate": "2024-03-13T08:45:49.959736Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "9d36c9be579098a6e234ac4f8d1cbb3c", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abernethy A.", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 301.03604, + 584.1, + 64.59604, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Aberer Abernathy Abernethy ", + "textAfter": " Abi-Akar Abildgard Abildt", + "startOffset": 987, + "endOffset": 999, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956096953Z", + "requestedDate": "2024-03-13T08:45:48.883216Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "cce741c3a7657f46ec31a88448cf11dd", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Ahouangninou", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 257.75198, + 349.5, + 71.29202, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Ahmed A. Ahn ", + "textAfter": " Ahr H Ahrens", + "startOffset": 2517, + "endOffset": 2529, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956131278Z", + "requestedDate": "2024-03-13T08:45:48.532984Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.956131939Z", + "requestedDate": "2024-03-13T08:59:29.933934Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "55a36bf818e46af966299ca4635bbd06", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Algate", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 215.92003, + 142.50003, + 31.992004, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Alford Alfred Algate ", + "textAfter": " D.R Algate D.R.", + "startOffset": 3915, + "endOffset": 3921, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956166133Z", + "requestedDate": "2024-03-13T08:58:39.583941Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "22d3381523bacd561d7a9a9087b0b609", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Abambres", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 398.2001, + 639.3, + 49.26004, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "V. Abadie Aballay ", + "textAfter": " Abanto Abass Abbay", + "startOffset": 637, + "endOffset": 645, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956201811Z", + "requestedDate": "2024-03-13T08:45:49.081005Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "0f22c6c8135b8d9e7c2a6be6c3c7b846", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "5SR Burke", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 161.68001, + 708.3, + 52.979996, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Matheson 0M Clarke ", + "textAfter": " 8 Wilson :tf:inia", + "startOffset": 117, + "endOffset": 126, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 2, + "type": "ADDED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 6, + "type": "REMOVED", + "dateTime": "2024-03-13T08:58:41.082712591Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956239672Z", + "requestedDate": "2024-03-13T08:58:39.397098Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "84801a4d899accc003ff6253f3403c83", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Akhavan M.", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 471.3041, + 308.1, + 59.988007, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Akhavan Akhavan M ", + "textAfter": " Akhavein Akhaven Akhtar", + "startOffset": 2832, + "endOffset": 2842, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956275239Z", + "requestedDate": "2024-03-13T08:45:48.522654Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "c2b0f6cc13c6c0970bcba981e3f179ee", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Anderson", + "reason": "Author found", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 1, + 0 + ], + "closestHeadline": "", + "section": "[1, 0]: Paragraph: Almond R.H. Almond Richard", + "color": null, + "positions": [ + { + "rectangle": [ + 458.488, + 515.1, + 46.679993, + 12.642 + ], + "pageNumber": 2 + } + ], + "textBefore": "Melanie Anderson R ", + "textAfter": " R. Anderson Rachel", + "startOffset": 5969, + "endOffset": 5977, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 4, + "type": "ADDED", + "dateTime": "2024-03-13T08:47:19.694336707Z" + } + ], + "manualChanges": [], + "engines": [ + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "10daaf609d6457147d05b6eecc0802d2", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Atallah", + "reason": "Recategorized entities are applied by default., legal basis was manually changed, recategorized by manual override", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 412.6721, + 722.1, + 35.196075, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Asuncion Asya Lyon ", + "textAfter": " Atallah Y.H. Ataulla", + "startOffset": 9128, + "endOffset": 9135, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.956346092Z", + "requestedDate": "2024-03-13T08:48:18.173Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Atallah" + } + }, + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.956346613Z", + "requestedDate": "2024-03-13T08:48:19.149614Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "b63d78af66d7287c39ec9ecdeed4370e", + "type": "CBI_address", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Aufmuth", + "reason": "Recategorized entities are applied by default., recategorized by manual override, legal basis was manually changed", + "matchedRule": "MAN.3.3", + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 2, + 0 + ], + "closestHeadline": "", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "color": null, + "positions": [ + { + "rectangle": [ + 56.8, + 639.3, + 43.283993, + 12.642 + ], + "pageNumber": 3 + } + ], + "textBefore": "Auerbach S Aufederheide ", + "textAfter": " Augello Augello A.", + "startOffset": 9631, + "endOffset": 9638, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "RECATEGORIZE", + "processedDate": "2024-03-13T09:05:21.956381889Z", + "requestedDate": "2024-03-13T08:48:18.048697Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "type": "CBI_address" + } + }, + { + "manualRedactionType": "LEGAL_BASIS_CHANGE", + "processedDate": "2024-03-13T09:05:21.956382731Z", + "requestedDate": "2024-03-13T08:48:18.545Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(2) of Regulation (EC) No 178/2002", + "section": "[2, 0]: Paragraph: Assaad Assad Assiagada Astete b", + "value": "Aufmuth" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "c79fbb403e8c1d31341aa30720d30626", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": "Akkan", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 442.94806, + 294.3, + 31.992004, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Akins Akintonwa Akiyama ", + "textAfter": " Akkan Z Akkan", + "startOffset": 2915, + "endOffset": 2920, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956418548Z", + "requestedDate": "2024-03-13T08:45:50.010924Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "d2c7d0bea4d75187e7aba26381b27280", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "APPLIED", + "value": "Airoldi", + "reason": "Author found, removed by manual override, forced by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 354.892, + 335.7, + 34.608032, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "P. Aikens P.J. ", + "textAfter": " Airs Airs D", + "startOffset": 2629, + "endOffset": 2636, + "imageHasTransparency": false, + "dictionaryEntry": true, + "dossierDictionaryEntry": false, + "excluded": false, + "changes": [ + { + "analysisNumber": 1, + "type": "ADDED", + "dateTime": "2024-03-13T08:44:54.811245839Z" + }, + { + "analysisNumber": 2, + "type": "REMOVED", + "dateTime": "2024-03-13T08:45:53.93986414Z" + }, + { + "analysisNumber": 7, + "type": "ADDED", + "dateTime": "2024-03-13T08:59:31.444615299Z" + } + ], + "manualChanges": [ + { + "manualRedactionType": "REMOVE", + "processedDate": "2024-03-13T09:05:21.956453654Z", + "requestedDate": "2024-03-13T08:45:49.352307Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": {} + }, + { + "manualRedactionType": "FORCE", + "processedDate": "2024-03-13T09:05:21.956454316Z", + "requestedDate": "2024-03-13T08:59:29.992948Z", + "userId": "abbc3e3a-c499-48da-9346-063e1863a7f5", + "propertyChanges": { + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002" + } + } + ], + "engines": [ + "MANUAL", + "DICTIONARY" + ], + "reference": [], + "importedRedactionIntersections": [], + "numberOfComments": 0 + }, + { + "id": "fdcd3f3b40058bb6f5cfa7ae3cde4ffc", + "type": "CBI_author", + "entryType": "ENTITY", + "state": "IGNORED", + "value": ":tf:inia F. Gruber", + "reason": "Author found, removed by manual override", + "matchedRule": "CBI.0.0", + "legalBasis": "Article 39(e)(3) of Regulation (EC) No 178/2002", + "imported": false, + "containingNodeId": [ + 0, + 0 + ], + "closestHeadline": "", + "section": "[0, 0]: Paragraph: $ D Jones $.Friedrich", + "color": null, + "positions": [ + { + "rectangle": [ + 263.63202, + 708.3, + 80.66412, + 12.642 + ], + "pageNumber": 1 + } + ], + "textBefore": "Burke 8 Wilson ", + "textAfter": " componentMappings = new ArrayList<>(); + private BulkLocalRequest bulkLocalRequest; + } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalRequest.java new file mode 100644 index 000000000..11e25954f --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalRequest.java @@ -0,0 +1,34 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.Collections; +import java.util.Set; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BulkLocalRequest { + + @NonNull + private String searchTerm; + + @NonNull + private String type; + + @NonNull + private String reason; + + private String legalBasis; + + private String section; + + @Builder.Default + private Set pageNumbers = Collections.emptySet(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalResponse.java new file mode 100644 index 000000000..f0c770d1a --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/BulkLocalResponse.java @@ -0,0 +1,43 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BulkLocalResponse { + + @NonNull + private String dossierId; + + @NonNull + private String fileId; + + @NonNull + private String searchTerm; + + @NonNull + private String type; + + @NonNull + private String reason; + + private String legalBasis; + + private String section; + + @NonNull + @Builder.Default + private List> positions = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java index 04076582a..1387dd7e3 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java @@ -5,5 +5,6 @@ public enum MessageType { ANALYSE, REANALYSE, SURROUNDING_TEXT_ANALYSIS, - IMPORTED_REDACTIONS_ONLY + IMPORTED_REDACTIONS_ONLY, + SEARCH_BULK_LOCAL_TERM } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/ProcessingStatus.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/ProcessingStatus.java index 80112f08f..557933917 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/ProcessingStatus.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/ProcessingStatus.java @@ -19,5 +19,6 @@ public enum ProcessingStatus { PRE_PROCESSED, FIGURE_DETECTION_ANALYZING, TABLE_PARSING_ANALYZING, - VISUAL_LAYOUT_PARSING_ANALYZING + VISUAL_LAYOUT_PARSING_ANALYZING, + BULK_LOCAL_REDACTIONS_PROCESSING } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddRedactionBulkLocalRequestModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddRedactionBulkLocalRequestModel.java new file mode 100644 index 000000000..53ba4d382 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddRedactionBulkLocalRequestModel.java @@ -0,0 +1,43 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AddRedactionBulkLocalRequestModel { + + @NonNull + private String type; + + @NonNull + private String value; + + @NonNull + private String reason; + + private String legalBasis; + + private String section; + + @NonNull + @Builder.Default + private List positions = new ArrayList<>(); + + @Builder.Default + private Set pageNumbers = Collections.emptySet(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ForceRedactionBulkLocalRequestModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ForceRedactionBulkLocalRequestModel.java new file mode 100644 index 000000000..75ab18fd8 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ForceRedactionBulkLocalRequestModel.java @@ -0,0 +1,29 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ForceRedactionBulkLocalRequestModel { + + @NonNull + private String annotationId; + + @NonNull + private String value; + + private String legalBasis; + + private boolean rectangle; + + private Position position; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RecategorizationBulkLocalRequestModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RecategorizationBulkLocalRequestModel.java new file mode 100644 index 000000000..c9d69f242 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RecategorizationBulkLocalRequestModel.java @@ -0,0 +1,39 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import java.util.Collections; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RecategorizationBulkLocalRequestModel { + + private String value; + + private String type; + private String legalBasis; + private String section; + + private boolean rectangle; + + private Position position; + + @Builder.Default + private Set originTypes = Collections.emptySet(); + + @Builder.Default + private Set originLegalBases = Collections.emptySet(); + + @Builder.Default + private Set pageNumbers = Collections.emptySet(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RemoveRedactionBulkLocalRequestModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RemoveRedactionBulkLocalRequestModel.java new file mode 100644 index 000000000..28da12ac0 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RemoveRedactionBulkLocalRequestModel.java @@ -0,0 +1,36 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import java.util.Collections; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RemoveRedactionBulkLocalRequestModel { + + private String value; + + private boolean rectangle; + + private Position position; + + + @Builder.Default + private Set originTypes = Collections.emptySet(); + + @Builder.Default + private Set originLegalBases = Collections.emptySet(); + + @Builder.Default + private Set pageNumbers = Collections.emptySet(); + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepository.java new file mode 100644 index 000000000..2bca322ee --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepository.java @@ -0,0 +1,13 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; + +import java.util.List; +import java.util.Set; + +public interface EntityLogEntryDocumentCustomRepository { + + List findEntryIdsByValueAndEngineManualWithFilters(String value, Set originTypes, Set originLegalBases, Set pageNumbers); + + + List findEntryIdsByMatchingPositionAndEngineManualWithFilters(float[] rectangle, Set originTypes, Set originLegalBases, Set pageNumbers); + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepositoryImpl.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepositoryImpl.java new file mode 100644 index 000000000..c4a26697e --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentCustomRepositoryImpl.java @@ -0,0 +1,95 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Repository; + +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogEntryDocument; + +import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Repository +@AllArgsConstructor +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class EntityLogEntryDocumentCustomRepositoryImpl implements EntityLogEntryDocumentCustomRepository { + + MongoTemplate mongoTemplate; + + + @Override + public List findEntryIdsByValueAndEngineManualWithFilters(String value, Set originTypes, Set originLegalBases, Set pageNumbers) { + + Query query = new Query(); + List criteriaList = new ArrayList<>(); + + criteriaList.add(Criteria.where("value").is(value)); + + addCommonCriteria(originTypes, originLegalBases, pageNumbers, criteriaList); + + Criteria mergedCriteria = new Criteria().andOperator(criteriaList.toArray(new Criteria[0])); + query.addCriteria(mergedCriteria); + + return executeQuery(query); + } + + + @Override + public List findEntryIdsByMatchingPositionAndEngineManualWithFilters(float[] rectangle, + Set originTypes, + Set originLegalBases, + Set pageNumbers) { + + Query query = new Query(); + List criteriaList = new ArrayList<>(); + + criteriaList.add(Criteria.where("positions").elemMatch(Criteria.where("rectangle").is(rectangle))); + + addCommonCriteria(originTypes, originLegalBases, pageNumbers, criteriaList); + + Criteria mergedCriteria = new Criteria().andOperator(criteriaList.toArray(new Criteria[0])); + query.addCriteria(mergedCriteria); + + return executeQuery(query); + } + + + @NotNull + private void addCommonCriteria(Set originTypes, Set originLegalBases, Set pageNumbers, List criteriaList) { + + criteriaList.add(Criteria.where("engines").is("MANUAL")); + + if (originTypes != null && !originTypes.isEmpty()) { + criteriaList.add(Criteria.where("type").in(originTypes)); + } + + if (originLegalBases != null && !originLegalBases.isEmpty()) { + criteriaList.add(Criteria.where("legalBasis").in(originLegalBases)); + } + + if (pageNumbers != null && !pageNumbers.isEmpty()) { + Criteria positionsCriteria = Criteria.where("positions").elemMatch(Criteria.where("pageNumber").in(pageNumbers)); + criteriaList.add(positionsCriteria); + } + } + + + private List executeQuery(Query query) { + + query.fields().include("entryId").exclude("id"); + + return mongoTemplate.find(query, EntityLogEntryDocument.class) + .stream() + .map(EntityLogEntryDocument::getEntryId) + .collect(Collectors.toList()); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentRepository.java index 2514da2c6..a0da56f71 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/EntityLogEntryDocumentRepository.java @@ -68,4 +68,16 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository findEntryIdsByValueAndEngineManual(String value); + + + @Query(value = "{ 'positions': { $elemMatch: { 'pageNumber': ?0, 'rectangle': ?1 } }, 'engines': 'MANUAL' }", fields = "{ 'entryId': 1, 'id': 0 }") + List findEntryIdsByMatchingFullPositionAndEngineManual(int pageNumber, float[] rectangle); + + + @Query(value = "{ 'positions': { $elemMatch: { 'rectangle': ?0 } }, 'engines': 'MANUAL' }", fields = "{ 'entryId': 1, 'id': 0 }") + List findEntryIdsByMatchingPositionAndEngineManual(float[] rectangle); + } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java index d2c017f05..7ec35498f 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java @@ -2,6 +2,7 @@ package com.iqser.red.service.persistence.service.v1.api.shared.mongo.service; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; @@ -16,27 +17,23 @@ import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.En import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.DocumentNotFoundException; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper.EntityLogDocumentMapper; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogDocumentRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogEntryDocumentCustomRepository; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogEntryDocumentRepository; +import lombok.RequiredArgsConstructor; + @Service +@RequiredArgsConstructor public class EntityLogMongoService { private final EntityLogDocumentRepository entityLogDocumentRepository; private final EntityLogEntryDocumentRepository entityLogEntryDocumentRepository; private final EntityLogDocumentUpdateService entityLogDocumentUpdateService; + private final EntityLogEntryDocumentCustomRepository entityLogEntryDocumentCustomRepository; + private final EntityLogDocumentMapper mapper = EntityLogDocumentMapper.INSTANCE; - public EntityLogMongoService(EntityLogDocumentRepository entityLogDocumentRepository, - EntityLogEntryDocumentRepository entityLogEntryDocumentRepository, - EntityLogDocumentUpdateService entityLogDocumentUpdateService) { - - this.entityLogDocumentRepository = entityLogDocumentRepository; - this.entityLogEntryDocumentRepository = entityLogEntryDocumentRepository; - this.entityLogDocumentUpdateService = entityLogDocumentUpdateService; - } - - public void insertEntityLog(String dossierId, String fileId, EntityLog entityLog) { EntityLogDocument entityLogDocument = entityLogDocumentRepository.insert(mapper.toLogDocument(dossierId, fileId, entityLog)); @@ -340,4 +337,34 @@ public class EntityLogMongoService { return entityLogEntryDocumentRepository.existsByEntityLogIdAndEngineImported(entityLogId); } + + public Set findEntryIdsOfManualsWithValue(String value) { + + return new HashSet<>(entityLogEntryDocumentRepository.findEntryIdsByValueAndEngineManual(value)); + } + + + public Set findEntryIdsOfManualsWithPositionRectangle(float[] rectangle) { + + return new HashSet<>(entityLogEntryDocumentRepository.findEntryIdsByMatchingPositionAndEngineManual(rectangle)); + } + + + public Set findEntryIdsByValueAndEngineManualWithFilters(String value, Set originTypes, Set originLegalBases, Set pageNumbers) { + + return new HashSet<>(entityLogEntryDocumentCustomRepository.findEntryIdsByValueAndEngineManualWithFilters(value, originTypes, originLegalBases, pageNumbers)); + } + + + public Set findEntryIdsByMatchingFullPositionAndEngineManualWithFilters(float[] rectangle, + Set originTypes, + Set originLegalBases, + Set pageNumbers) { + + return new HashSet<>(entityLogEntryDocumentCustomRepository.findEntryIdsByMatchingPositionAndEngineManualWithFilters(rectangle, + originTypes, + originLegalBases, + pageNumbers)); + } + }