From 1b1280e5ecceed14512eaf69c734c3ef92d5a6df Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 20 Jul 2023 19:26:01 +0300 Subject: [PATCH 001/144] #12257 - first draft --- .../symeda/sormas/api/ArchivableFacade.java | 8 +- .../java/de/symeda/sormas/api/CoreFacade.java | 5 +- .../de/symeda/sormas/api/DeletableFacade.java | 5 +- .../api/PermanentlyDeletableFacade.java | 4 +- .../de/symeda/sormas/api/caze/CaseFacade.java | 11 +-- .../api/common/progress/ProcessedEntity.java | 31 ++++++++ .../progress/ProcessedEntityStatus.java | 23 ++++++ .../sormas/api/contact/ContactFacade.java | 3 +- .../symeda/sormas/api/event/EventFacade.java | 3 +- ...ernalSurveillanceToolRuntimeException.java | 3 + .../SormasToSormasRuntimeException.java | 3 + .../de/symeda/sormas/api/task/TaskFacade.java | 5 +- .../symeda/sormas/api/visit/VisitFacade.java | 1 - .../backend/campaign/CampaignFacadeEjb.java | 13 ++-- .../sormas/backend/caze/CaseFacadeEjb.java | 73 ++++++++++++----- .../sormas/backend/caze/CaseService.java | 2 +- .../backend/common/AbstractCoreFacadeEjb.java | 10 ++- .../backend/contact/ContactFacadeEjb.java | 33 ++++---- .../environment/EnvironmentFacadeEjb.java | 9 ++- .../sormas/backend/event/EventFacadeEjb.java | 36 ++++++--- .../event/EventParticipantFacadeEjb.java | 63 ++++++++------- .../ExternalMessageFacadeEjb.java | 10 ++- ...ernalSurveillanceToolGatewayFacadeEjb.java | 2 +- .../immunization/ImmunizationFacadeEjb.java | 22 +++--- .../AbstractInfrastructureFacadeEjb.java | 18 +++-- .../backend/sample/SampleFacadeEjb.java | 18 +++-- .../sormas/backend/task/TaskFacadeEjb.java | 42 ++++++---- .../travelentry/TravelEntryFacadeEjb.java | 26 ++++--- .../sormas/backend/visit/VisitFacadeEjb.java | 16 ++-- .../backend/caze/CaseFacadeEjbTest.java | 5 +- .../backend/contact/ContactFacadeEjbTest.java | 5 +- .../sormas/rest/resources/CaseResource.java | 3 +- .../rest/resources/CommunityResource.java | 12 ++- .../rest/resources/ContactResource.java | 8 +- .../rest/resources/ContinentResource.java | 8 +- .../rest/resources/CountryResource.java | 11 ++- .../rest/resources/DistrictResource.java | 5 +- .../sormas/rest/resources/EventResource.java | 3 +- .../rest/resources/FacilityResource.java | 5 +- .../rest/resources/ImmunizationResource.java | 3 +- .../rest/resources/PointOfEntryResource.java | 5 +- .../sormas/rest/resources/RegionResource.java | 5 +- .../rest/resources/SubcontinentResource.java | 5 +- .../sormas/rest/resources/TaskResource.java | 5 +- .../sormas/ui/utils/ArchiveHandlers.java | 61 +++++++++------ .../sormas/ui/utils/ArchivingController.java | 7 +- .../sormas/ui/utils/BulkOperationHandler.java | 78 +++++++++++++++++-- .../ui/utils/DeleteRestoreController.java | 5 +- .../ui/utils/DeleteRestoreHandlers.java | 30 ++++--- .../ui/utils/PermanentDeleteController.java | 3 +- .../components/progress/ProgressResult.java | 16 ++++ 51 files changed, 539 insertions(+), 247 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java index a29120c6fa0..940531ddf24 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java @@ -17,15 +17,17 @@ import java.util.List; +import de.symeda.sormas.api.common.progress.ProcessedEntity; + public interface ArchivableFacade { void archive(String uuid); - void dearchive(String uuid); + List dearchive(String uuid); - List archive(List entityUuid); + List archive(List entityUuid); - List dearchive(List entityUuids); + List dearchive(List entityUuids); boolean isArchived(String uuid); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java index 189489295ac..1160f35441b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java @@ -19,6 +19,7 @@ import java.util.Date; import java.util.List; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; import de.symeda.sormas.api.utils.criteria.BaseCriteria; @@ -36,9 +37,9 @@ public interface CoreFacade entityUuid); + List archive(List entityUuid); - void dearchive(List entityUuids, String dearchiveReason); + List dearchive(List entityUuids, String dearchiveReason); List getArchivedUuidsSince(Date since); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/DeletableFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/DeletableFacade.java index 11fb0cd300c..8656c362873 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/DeletableFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/DeletableFacade.java @@ -3,16 +3,17 @@ import java.util.List; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.common.progress.ProcessedEntity; public interface DeletableFacade { void delete(String uuid, DeletionDetails deletionDetails); - List delete(List uuids, DeletionDetails deletionDetails); + List delete(List uuids, DeletionDetails deletionDetails); void restore(String uuid); - List restore(List uuids); + List restore(List uuids); boolean isDeleted(String uuid); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/PermanentlyDeletableFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/PermanentlyDeletableFacade.java index 9843e82ba13..4134ba41184 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/PermanentlyDeletableFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/PermanentlyDeletableFacade.java @@ -2,9 +2,11 @@ import java.util.List; +import de.symeda.sormas.api.common.progress.ProcessedEntity; + public interface PermanentlyDeletableFacade { void delete(String uuid); - void delete(List uuids); + List delete(List uuids); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java index f7aceb299db..4ee63e71b56 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java @@ -38,6 +38,7 @@ import de.symeda.sormas.api.MergeFacade; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.event.EventParticipantReferenceDto; import de.symeda.sormas.api.externaldata.ExternalDataDto; @@ -176,7 +177,7 @@ Page getCaseFollowUpIndexPage( List getUuidsNotShareableWithExternalReportingTools(List caseUuids); - Integer saveBulkCase( + List saveBulkCase( List caseUuidList, @Valid CaseBulkEditData updatedCaseBulkEditData, boolean diseaseChange, @@ -185,7 +186,7 @@ Integer saveBulkCase( boolean outcomeChange, boolean surveillanceOfficerChange); - Integer saveBulkEditWithFacilities( + List saveBulkEditWithFacilities( List caseUuidList, @Valid CaseBulkEditData updatedCaseBulkEditData, boolean diseaseChange, @@ -213,11 +214,11 @@ Integer saveBulkEditWithFacilities( PreviousCaseDto getMostRecentPreviousCase(PersonReferenceDto person, Disease disease, Date startDate); - void archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts); + List archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts); - void archive(List entityUuids, boolean includeContacts); + List archive(List entityUuids, boolean includeContacts); - void dearchive(List entityUuids, String dearchiveReason, boolean includeContacts); + List dearchive(List entityUuids, String dearchiveReason, boolean includeContacts); void setResultingCase(EventParticipantReferenceDto eventParticipantReferenceDto, CaseReferenceDto caseReferenceDto); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java new file mode 100644 index 00000000000..daa35d6b31e --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java @@ -0,0 +1,31 @@ +package de.symeda.sormas.api.common.progress; + +import java.io.Serializable; + +public class ProcessedEntity implements Serializable { + + String entityUuid; + + ProcessedEntityStatus processedEntityStatus; + + public ProcessedEntity(String entityUuid, ProcessedEntityStatus processedEntityStatus) { + this.entityUuid = entityUuid; + this.processedEntityStatus = processedEntityStatus; + } + + public String getEntityUuid() { + return entityUuid; + } + + public void setEntityUuid(String entityUuid) { + this.entityUuid = entityUuid; + } + + public ProcessedEntityStatus getProcessedEntityStatus() { + return processedEntityStatus; + } + + public void setProcessedEntityStatus(ProcessedEntityStatus processedEntityStatus) { + this.processedEntityStatus = processedEntityStatus; + } +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java new file mode 100644 index 00000000000..c587fe73305 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java @@ -0,0 +1,23 @@ +package de.symeda.sormas.api.common.progress; + +public enum ProcessedEntityStatus { + + SUCCESS, + /** + * ExternalSurveillanceToolRuntimeException was thrown during the processing of the entity + */ + EXTERNAL_SURVEILLANCE_FAILURE, + /** + * SormasToSormasRuntimeException was thrown during the processing of the entity + */ + SORMAS_TO_SORMAS_FAILURE, + /** + * AccessDeniedException was thrown during the processing of the entity + */ + ACCESS_DENIED_FAILURE, + /** + * An internal exception was thrown during the processing of the entity + */ + INTERNAL_FAILURE; + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java index 965bbb00998..e1271ae228c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java @@ -34,6 +34,7 @@ import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.CoreAndPersonDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.dashboard.DashboardContactDto; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; @@ -146,7 +147,7 @@ List getContactsForDuplicateMerging( void updateExternalData(@Valid List externalData) throws ExternalDataUpdateException; - Integer saveBulkContacts( + List saveBulkContacts( List contactUuidlist, @Valid ContactBulkEditData updatedContacBulkEditData, boolean classificationChange, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java index fa4f5a77e43..5fafcd51826 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java @@ -29,6 +29,7 @@ import de.symeda.sormas.api.CoreFacade; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; @@ -75,7 +76,7 @@ public interface EventFacade extends CoreFacade saveBulkEvents( List eventUuidList, EventDto updatedTempEvent, boolean eventStatusChange, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolRuntimeException.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolRuntimeException.java index db4bc3ff1e4..a38a0882741 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolRuntimeException.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolRuntimeException.java @@ -15,6 +15,9 @@ package de.symeda.sormas.api.externalsurveillancetool; +import javax.ejb.ApplicationException; + +@ApplicationException(rollback = false) public class ExternalSurveillanceToolRuntimeException extends RuntimeException { private static final long serialVersionUID = -3526487657644154163L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasRuntimeException.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasRuntimeException.java index e606f942df1..54c63e112a9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasRuntimeException.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasRuntimeException.java @@ -15,8 +15,11 @@ package de.symeda.sormas.api.sormastosormas; +import javax.ejb.ApplicationException; + import de.symeda.sormas.api.i18n.I18nProperties; +@ApplicationException(rollback = false) public class SormasToSormasRuntimeException extends RuntimeException { public SormasToSormasRuntimeException(SormasToSormasException exception) { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java index 89dff078a47..c1466699e9a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java @@ -30,6 +30,7 @@ import de.symeda.sormas.api.PermanentlyDeletableFacade; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.utils.SortProperty; @@ -65,8 +66,6 @@ public interface TaskFacade extends PermanentlyDeletableFacade, ArchivableFacade List getAllActiveUuids(); - List deleteTasks(List taskUuids); - long count(TaskCriteria criteria); List getIndexList(TaskCriteria criteria, Integer first, Integer max, List sortProperties); @@ -79,7 +78,7 @@ public interface TaskFacade extends PermanentlyDeletableFacade, ArchivableFacade EditPermissionType getEditPermissionType(String uuid); - Integer saveBulkTasks( + List saveBulkTasks( List taskUuidList, TaskDto updatedTempTask, boolean priorityChange, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitFacade.java index e8dc45df9bf..a5212732d95 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitFacade.java @@ -65,5 +65,4 @@ List getVisitsExportList( VisitDto getLastVisitByCase(CaseReferenceDto caseRef); - List deleteVisits(List uuids); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java index 872e2847942..18bc80017fb 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java @@ -37,6 +37,7 @@ import de.symeda.sormas.api.campaign.form.CampaignFormMetaReferenceDto; import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -360,7 +361,7 @@ public void delete(String campaignUuid, DeletionDetails deletionDetails) { @Override @RightsAllowed(UserRight._CAMPAIGN_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { + public List delete(List uuids, DeletionDetails deletionDetails) { throw new NotImplementedException(); } @@ -372,7 +373,7 @@ public void restore(String uuid) { @Override @RightsAllowed(UserRight._CAMPAIGN_DELETE) - public List restore(List uuids) { + public List restore(List uuids) { throw new NotImplementedException(); } @@ -420,14 +421,14 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) - public void archive(List entityUuids) { - super.archive(entityUuids); + public List archive(List entityUuids) { + return super.archive(entityUuids); } @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); + public List dearchive(List entityUuids, String dearchiveReason) { + return super.dearchive(entityUuids, dearchiveReason); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 17a058182b0..96680163104 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -131,6 +131,8 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactReferenceDto; @@ -1517,7 +1519,7 @@ public CoreAndPersonDto save(@Valid @NotNull CoreAndPersonDto saveBulkCase( List caseUuidList, @Valid CaseBulkEditData updatedCaseBulkEditData, boolean diseaseChange, @@ -1527,6 +1529,8 @@ public Integer saveBulkCase( boolean surveillanceOfficerChange) throws ValidationRuntimeException { + List processedCases = new ArrayList<>(); + int changedCases = 0; for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); @@ -1542,15 +1546,18 @@ public Integer saveBulkCase( outcomeChange, surveillanceOfficerChange); doSave(caze, true, existingCaseDto, true); + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); changedCases++; } } - return changedCases; + //return changedCases; + + return processedCases; } @RightsAllowed({ UserRight._CASE_EDIT }) - public Integer saveBulkEditWithFacilities( + public List saveBulkEditWithFacilities( List caseUuidList, @Valid CaseBulkEditData updatedCaseBulkEditData, boolean diseaseChange, @@ -1560,6 +1567,8 @@ public Integer saveBulkEditWithFacilities( boolean surveillanceOfficerChange, Boolean doTransfer) { + List processedCases = new ArrayList<>(); + Region newRegion = regionService.getByUuid(updatedCaseBulkEditData.getRegion().getUuid()); District newDistrict = districtService.getByUuid(updatedCaseBulkEditData.getDistrict().getUuid()); Community newCommunity = @@ -1588,12 +1597,16 @@ public Integer saveBulkEditWithFacilities( caze.setHealthFacility(newFacility); caze.setHealthFacilityDetails(updatedCaseBulkEditData.getHealthFacilityDetails()); CaseLogic.handleHospitalization(toDto(caze), existingCaseDto, doTransfer); + doSave(caze, true, existingCaseDto, true); + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); + changedCases++; } } - return changedCases; + //return changedCases; + return processedCases; } private void updateCaseWithBulkData( @@ -2653,22 +2666,34 @@ public void delete(String caseUuid, DeletionDetails deletionDetails) @Override @RightsAllowed(UserRight._CASE_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { - List deletedCaseUuids = new ArrayList<>(); + public List delete(List uuids, DeletionDetails deletionDetails) { + List processedCases = new ArrayList<>(); List casesToBeDeleted = service.getByUuids(uuids); + if (casesToBeDeleted != null) { - casesToBeDeleted.forEach(caseToBeDeleted -> { + for (int i = 0; i < casesToBeDeleted.size(); i++) { + Case caseToBeDeleted = casesToBeDeleted.get(i); if (!caseToBeDeleted.isDeleted()) { try { deleteCase(caseToBeDeleted, deletionDetails); - deletedCaseUuids.add(caseToBeDeleted.getUuid()); - } catch (ExternalSurveillanceToolRuntimeException | SormasToSormasRuntimeException | AccessDeniedException e) { - logger.error("The case with uuid {} could not be deleted", caseToBeDeleted.getUuid(), e); + processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (ExternalSurveillanceToolRuntimeException e) { + processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } catch (SormasToSormasRuntimeException e) { + processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); + } catch (AccessDeniedException e) { + processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } catch (Exception e) { + processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + //TODO: check if we still need the logger or every exception will be logged when is thrown } + //logger.error("The case with uuid {} could not be deleted", caseToBeDeleted.getUuid(), e); } - }); + } + // } } - return deletedCaseUuids; + //if the cases with exceptions will not be sent back will be noted as skipped -> check if we can update the skipped indicator based on status + return processedCases; } @Override @@ -2679,21 +2704,21 @@ public void restore(String uuid) { @Override @RightsAllowed(UserRight._CASE_DELETE) - public List restore(List uuids) { - List restoredCaseUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedCases = new ArrayList<>(); List casesToBeRestored = caseService.getByUuids(uuids); if (casesToBeRestored != null) { casesToBeRestored.forEach(caseToBeRestored -> { try { restore(caseToBeRestored.getUuid()); - restoredCaseUuids.add(caseToBeRestored.getUuid()); + processedCases.add(new ProcessedEntity(caseToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The case with uuid {} could not be restored", caseToBeRestored.getUuid(), e); } }); } - return restoredCaseUuids; + return processedCases; } @Override @@ -2753,32 +2778,42 @@ public void deleteCaseInExternalSurveillanceTool(Case caze) throws ExternalSurve @Override @RightsAllowed(UserRight._CASE_ARCHIVE) - public void archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts) { + public List archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts) { super.archive(entityUuid, endOfProcessingDate); if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(Collections.singletonList(entityUuid)); contactService.archive(caseContacts); } + List processedEntities = new ArrayList<>(); + return processedEntities; } @Override @RightsAllowed(UserRight._CASE_ARCHIVE) - public void archive(List entityUuids, boolean includeContacts) { + public List archive(List entityUuids, boolean includeContacts) { super.archive(entityUuids); + + List processedEntities = new ArrayList<>(); if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(entityUuids); contactService.archive(caseContacts); } + + return processedEntities; } @Override @RightsAllowed(UserRight._CASE_ARCHIVE) - public void dearchive(List entityUuids, String dearchiveReason, boolean includeContacts) { + public List dearchive(List entityUuids, String dearchiveReason, boolean includeContacts) { super.dearchive(entityUuids, dearchiveReason); + List processedEntities = new ArrayList<>(); + if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(entityUuids); contactService.dearchive(caseContacts, dearchiveReason); } + + return processedEntities; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 120ae3f8fe2..7d3e649f1f1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -1176,7 +1176,7 @@ public void setArchiveInExternalSurveillanceToolForEntity(String entityUuid, boo } @Override - public void delete(Case caze, DeletionDetails deletionDetails) { + public void delete(Case caze, DeletionDetails deletionDetails) throws ExternalSurveillanceToolRuntimeException { // Soft-delete all samples that are only associated with this case caze.getSamples() diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index cc98bad443b..fe762d6db24 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -16,6 +16,7 @@ package de.symeda.sormas.backend.common; import java.io.Serializable; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -38,6 +39,7 @@ import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.i18n.I18nProperties; @@ -221,13 +223,17 @@ public void archive(String entityUuid, Date endOfProcessingDate) { } @DenyAll - public void archive(List entityUuids) { + public List archive(List entityUuids) { + List processedEntities = new ArrayList<>(); service.archive(entityUuids); + return processedEntities; } @DenyAll - public void dearchive(List entityUuids, String dearchiveReason) { + public List dearchive(List entityUuids, String dearchiveReason) { + List processedEntities = new ArrayList<>(); service.dearchive(entityUuids, dearchiveReason); + return processedEntities; } public Date calculateEndOfProcessingDate(String entityUuid) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index 5bf6a3ffe30..42d2000ada5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -81,6 +81,8 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactBulkEditData; import de.symeda.sormas.api.contact.ContactClassification; import de.symeda.sormas.api.contact.ContactCriteria; @@ -557,22 +559,22 @@ public void delete(String contactUuid, DeletionDetails deletionDetails) { @Override @RightsAllowed(UserRight._CONTACT_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { - List deletedContactUuids = new ArrayList<>(); + public List delete(List uuids, DeletionDetails deletionDetails) { + List processedContacts = new ArrayList<>(); List contactsToBeDeleted = service.getByUuids(uuids); if (contactsToBeDeleted != null) { contactsToBeDeleted.forEach(contactToBeDeleted -> { if (!contactToBeDeleted.isDeleted()) { try { deleteContact(contactToBeDeleted, deletionDetails); - deletedContactUuids.add(contactToBeDeleted.getUuid()); + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (AccessDeniedException e) { logger.error("The contact with uuid {} could not be deleted", contactToBeDeleted.getUuid(), e); } } }); } - return deletedContactUuids; + return processedContacts; } @Override @@ -583,22 +585,22 @@ public void restore(String uuid) { @Override @RightsAllowed(UserRight._CONTACT_DELETE) - public List restore(List uuids) { - List restoredContactUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedContacts = new ArrayList<>(); List contactsToBeRestored = contactService.getByUuids(uuids); if (contactsToBeRestored != null) { contactsToBeRestored.forEach(contactToBeRestored -> { try { restore(contactToBeRestored.getUuid()); - restoredContactUuids.add(contactToBeRestored.getUuid()); + processedContacts.add(new ProcessedEntity(contactToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The contact with uuid:" + contactToBeRestored.getUuid() + "could not be restored"); } }); } - return restoredContactUuids; + return processedContacts; } private void deleteContact(Contact contact, DeletionDetails deletionDetails) { @@ -627,14 +629,14 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._CONTACT_ARCHIVE) - public void archive(List entityUuids) { - super.archive(entityUuids); + public List archive(List entityUuids) { + return super.archive(entityUuids); } @Override @RightsAllowed(UserRight._CONTACT_ARCHIVE) - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); + public List dearchive(List entityUuids, String dearchiveReason) { + return super.dearchive(entityUuids, dearchiveReason); } @Override @@ -2250,13 +2252,15 @@ public void updateExternalData(@Valid List externalData) throws @Override @RightsAllowed(UserRight._CONTACT_EDIT) - public Integer saveBulkContacts( + public List saveBulkContacts( List contactUuidList, ContactBulkEditData updatedContactBulkEditData, boolean classificationChange, boolean contactOfficerChange) throws ValidationRuntimeException { + List processedEntities = new ArrayList(); + int changedContacts = 0; for (String contactUuid : contactUuidList) { Contact contact = service.getByUuid(contactUuid); @@ -2272,10 +2276,11 @@ public Integer saveBulkContacts( } save(existingContactDto); + processedEntities.add(new ProcessedEntity(contactUuid, ProcessedEntityStatus.SUCCESS)); changedContacts++; } } - return changedContacts; + return processedEntities; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java index 1e43b379076..e5c7220ec04 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java @@ -27,6 +27,7 @@ import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.environment.EnvironmentCriteria; import de.symeda.sormas.api.environment.EnvironmentDto; import de.symeda.sormas.api.environment.EnvironmentFacade; @@ -324,8 +325,8 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._ENVIRONMENT_ARCHIVE) - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); + public List dearchive(List entityUuids, String dearchiveReason) { + return super.dearchive(entityUuids, dearchiveReason); } @Override @@ -381,13 +382,13 @@ public List getArchivedUuidsSince(Date since) { @RightsAllowed(UserRight._ENVIRONMENT_DELETE) @Override - public List delete(List uuids, DeletionDetails deletionDetails) { + public List delete(List uuids, DeletionDetails deletionDetails) { throw new NotImplementedException(); } @Override @RightsAllowed(UserRight._ENVIRONMENT_DELETE) - public List restore(List uuids) { + public List restore(List uuids) { throw new NotImplementedException(); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 6f0eff6e2ae..635ed485078 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -67,6 +67,8 @@ import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.event.EventCriteria; import de.symeda.sormas.api.event.EventDetailedReferenceDto; @@ -342,22 +344,23 @@ private void deleteEvent(Event event, DeletionDetails deletionDetails) @Override @RightsAllowed(UserRight._EVENT_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { - List deletedEventUuids = new ArrayList<>(); + public List delete(List uuids, DeletionDetails deletionDetails) { + List processedEvents = new ArrayList<>(); + List eventsToBeDeleted = service.getByUuids(uuids); if (eventsToBeDeleted != null) { eventsToBeDeleted.forEach(eventToBeDeleted -> { if (!eventToBeDeleted.isDeleted()) { try { deleteEvent(eventToBeDeleted, deletionDetails); - deletedEventUuids.add(eventToBeDeleted.getUuid()); + processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (ExternalSurveillanceToolRuntimeException | SormasToSormasRuntimeException | AccessDeniedException e) { logger.error("The event with uuid:" + eventToBeDeleted.getUuid() + "could not be deleted"); } } }); } - return deletedEventUuids; + return processedEvents; } @Override @@ -368,21 +371,22 @@ public void restore(String uuid) { @Override @RightsAllowed(UserRight._EVENT_DELETE) - public List restore(List uuids) { - List restoredEventsUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedEvents = new ArrayList<>(); + List eventsToBeRestored = eventService.getByUuids(uuids); if (eventsToBeRestored != null) { eventsToBeRestored.forEach(eventToBeRestored -> { try { restore(eventToBeRestored.getUuid()); - restoredEventsUuids.add(eventToBeRestored.getUuid()); + processedEvents.add(new ProcessedEntity(eventToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The event with uuid: " + eventToBeRestored.getUuid() + " could not be restored"); } }); } - return restoredEventsUuids; + return processedEvents; } @RightsAllowed({ @@ -1029,18 +1033,23 @@ public void archive(String eventUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._EVENT_ARCHIVE) - public void archive(List eventUuids) { + public List archive(List eventUuids) { super.archive(eventUuids); List eventParticipantList = eventParticipantService.getAllUuidsByEventUuids(eventUuids); eventParticipantService.archive(eventParticipantList); + List processedEntities = new ArrayList<>(); + return processedEntities; } @Override @RightsAllowed(UserRight._EVENT_ARCHIVE) - public void dearchive(List eventUuids, String dearchiveReason) { + public List dearchive(List eventUuids, String dearchiveReason) { super.dearchive(eventUuids, dearchiveReason); List eventParticipantList = eventParticipantService.getAllUuidsByEventUuids(eventUuids); eventParticipantService.dearchive(eventParticipantList, dearchiveReason); + + List processedEntities = new ArrayList<>(); + return processedEntities; } @Override @@ -1465,13 +1474,15 @@ public boolean hasAnyEventParticipantWithoutJurisdiction(String eventUuid) { @Override @RightsAllowed(UserRight._EVENT_EDIT) - public Integer saveBulkEvents( + public List saveBulkEvents( List eventUuidList, EventDto updatedTempEvent, boolean eventStatusChange, boolean eventInvestigationStatusChange, boolean eventManagementStatusChange) { + List processedEvents = new ArrayList(); + int changedEvents = 0; for (String eventUuid : eventUuidList) { Event event = service.getByUuid(eventUuid); @@ -1491,10 +1502,11 @@ public Integer saveBulkEvents( } save(eventDto); + processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.SUCCESS)); changedEvents++; } } - return changedEvents; + return processedEvents; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index cc3e6d98e16..6caf7a86896 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -67,6 +67,7 @@ import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventParticipantCriteria; import de.symeda.sormas.api.event.EventParticipantDto; @@ -511,24 +512,26 @@ public void delete(String uuid, DeletionDetails deletionDetails) throws External @Override @RightsAllowed(UserRight._EVENTPARTICIPANT_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { - List deletedEventParticipantUuids = new ArrayList<>(); + public List delete(List uuids, DeletionDetails deletionDetails) { + List processedEventParticipants = new ArrayList<>(); List eventParticipantsToBeDeleted = service.getByUuids(uuids); if (eventParticipantsToBeDeleted != null) { - eventParticipantsToBeDeleted.forEach(eventParticipantToBeDeleted -> { - if (!eventParticipantToBeDeleted.isDeleted()) { - try { - delete(eventParticipantToBeDeleted.getUuid(), deletionDetails); - deletedEventParticipantUuids.add(eventParticipantToBeDeleted.getUuid()); - } catch (Exception e) { - logger.error("The event participant with uuid:" + eventParticipantToBeDeleted.getUuid() + "could not be deleted"); - } - } - }); + /* + * eventParticipantsToBeDeleted.forEach(eventParticipantToBeDeleted -> { + * if (!eventParticipantToBeDeleted.isDeleted()) { + * try { + * delete(eventParticipantToBeDeleted.getUuid(), deletionDetails); + * deletedEventParticipantUuids.add(eventParticipantToBeDeleted.getUuid()); + * } catch (Exception e) { + * logger.error("The event participant with uuid:" + eventParticipantToBeDeleted.getUuid() + "could not be deleted"); + * } + * } + * }); + */ } - return deletedEventParticipantUuids; + return processedEventParticipants; } @Override @@ -539,22 +542,24 @@ public void restore(String uuid) { @Override @RightsAllowed(UserRight._EVENTPARTICIPANT_DELETE) - public List restore(List uuids) { - List restoredEventParticipantUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedEventParticipants = new ArrayList<>(); List eventParticipantsToBeRestored = service.getByUuids(uuids); - if (eventParticipantsToBeRestored != null) { - eventParticipantsToBeRestored.forEach(eventParticipantToBeRestored -> { - try { - restore(eventParticipantToBeRestored.getUuid()); - restoredEventParticipantUuids.add(eventParticipantToBeRestored.getUuid()); - } catch (Exception e) { - logger.error("The event participant with uuid:" + eventParticipantToBeRestored.getUuid() + "could not be restored"); - } - }); - } - - return restoredEventParticipantUuids; + /* + * if (eventParticipantsToBeRestored != null) { + * eventParticipantsToBeRestored.forEach(eventParticipantToBeRestored -> { + * try { + * restore(eventParticipantToBeRestored.getUuid()); + * restoredEventParticipantUuids.add(eventParticipantToBeRestored.getUuid()); + * } catch (Exception e) { + * logger.error("The event participant with uuid:" + eventParticipantToBeRestored.getUuid() + "could not be restored"); + * } + * }); + * } + */ + + return processedEventParticipants; } @Override @@ -1281,8 +1286,8 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._EVENTPARTICIPANT_ARCHIVE) - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); + public List dearchive(List entityUuids, String dearchiveReason) { + return super.dearchive(entityUuids, dearchiveReason); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java index d685909c876..501722ec833 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java @@ -42,6 +42,8 @@ import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportReferenceDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.customizableenum.CustomEnumNotFoundException; import de.symeda.sormas.api.customizableenum.CustomizableEnumType; @@ -334,8 +336,8 @@ public void delete(String uuid) { @Override @RightsAllowed(UserRight._EXTERNAL_MESSAGE_DELETE) - public void delete(List uuids) { - List deletedExternalMessageUuids = new ArrayList<>(); + public List delete(List uuids) { + List processedExternalMessages = new ArrayList<>(); List externalMessagesToBeDeleted = externalMessageService.getByUuids(uuids); if (externalMessagesToBeDeleted != null) { @@ -343,13 +345,15 @@ public void delete(List uuids) { if (externalMessageToBeDeleted.getStatus() != ExternalMessageStatus.PROCESSED) { try { externalMessageService.deletePermanent(externalMessageToBeDeleted); - deletedExternalMessageUuids.add(externalMessageToBeDeleted.getUuid()); + processedExternalMessages.add(new ProcessedEntity(externalMessageToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The external message with uuid:" + externalMessageToBeDeleted.getUuid() + "could not be deleted"); } } }); } + + return processedExternalMessages; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java index 4d40083fd70..8278a3d5be7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java @@ -254,7 +254,7 @@ private void sendDeleteRequest(DeleteParameters params) throws ExternalSurveilla try { response = request.post(Entity.json(params)); } catch (Exception e) { - logger.error("Failed to send delete request to external surveillance tool", e); + //logger.error("Failed to send delete request to external surveillance tool", e); throw new ExternalSurveillanceToolException(I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorDeleting)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java index 33159e3f45c..43b522fb050 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java @@ -52,6 +52,8 @@ import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -309,16 +311,18 @@ public void delete(String uuid, DeletionDetails deletionDetails) { @Override @RightsAllowed(UserRight._IMMUNIZATION_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { + public List delete(List uuids, DeletionDetails deletionDetails) { + List processedImmunizations = new ArrayList<>(); + List deletedImmunizationUuids = new ArrayList<>(); List immunizationsToBeDeleted = service.getByUuids(uuids); if (immunizationsToBeDeleted != null) { immunizationsToBeDeleted.forEach(immunizationToBeDeleted -> { service.delete(immunizationToBeDeleted, deletionDetails); - deletedImmunizationUuids.add(immunizationToBeDeleted.getUuid()); + processedImmunizations.add(new ProcessedEntity(immunizationToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); }); } - return deletedImmunizationUuids; + return processedImmunizations; } @Override @@ -329,21 +333,21 @@ public void restore(String uuid) { @Override @RightsAllowed(UserRight._IMMUNIZATION_DELETE) - public List restore(List uuids) { - List restoredImmunizationUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedImmunizationUuids = new ArrayList<>(); List immunizationsToBeRestored = service.getByUuids(uuids); if (immunizationsToBeRestored != null) { immunizationsToBeRestored.forEach(immunizationToBeRestored -> { try { service.restore(immunizationToBeRestored); - restoredImmunizationUuids.add(immunizationToBeRestored.getUuid()); + processedImmunizationUuids.add(new ProcessedEntity(immunizationToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The immunization with uuid:" + immunizationToBeRestored.getUuid() + "could not be restored"); } }); } - return restoredImmunizationUuids; + return processedImmunizationUuids; } @Override @@ -745,8 +749,8 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._IMMUNIZATION_ARCHIVE) - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); + public List dearchive(List entityUuids, String dearchiveReason) { + return super.dearchive(entityUuids, dearchiveReason); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java index 1cd054e9638..3a2ae184c8c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java @@ -17,6 +17,8 @@ import de.symeda.sormas.api.InfrastructureDataReferenceDto; import de.symeda.sormas.api.audit.AuditIgnore; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; @@ -198,7 +200,7 @@ public void archive(String uuid) { } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) - public void dearchive(String uuid) { + public List dearchive(String uuid) { checkInfraDataLocked(); if (hasArchivedParentInfrastructure(Collections.singletonList(uuid))) { throw new AccessDeniedException(I18nProperties.getString(dearchivingNotPossibleMessageProperty)); @@ -209,30 +211,36 @@ public void dearchive(String uuid) { ado.setArchived(false); service.ensurePersisted(ado); } + return null; } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) - public List archive(List entityUuids) { + public List archive(List entityUuids) { + List processedEntities = new ArrayList<>(); List archivedEntityUuids = new ArrayList<>(); entityUuids.forEach(entityUuid -> { if (!isUsedInOtherInfrastructureData(Collections.singletonList(entityUuid))) { archive(entityUuid); archivedEntityUuids.add(entityUuid); + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); } }); - return archivedEntityUuids; + //return archivedEntityUuids; + return processedEntities; } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) - public List dearchive(List entityUuids) { + public List dearchive(List entityUuids) { + List processedEntities = new ArrayList<>(); List dearchivedEntityUuids = new ArrayList<>(); entityUuids.forEach(entityUuid -> { if (!hasArchivedParentInfrastructure(Arrays.asList(entityUuid))) { dearchive(entityUuid); dearchivedEntityUuids.add(entityUuid); + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); } }); - return dearchivedEntityUuids; + return processedEntities; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index 3f16fff7762..7f8e0aa154b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -46,6 +46,8 @@ import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.event.EventParticipantReferenceDto; @@ -765,21 +767,21 @@ public void delete(String sampleUuid, DeletionDetails deletionDetails) { @Override @RightsAllowed(UserRight._SAMPLE_DELETE) - public List restore(List uuids) { - List restoredSampleUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedSamples = new ArrayList<>(); List samplesToBeRestored = sampleService.getByUuids(uuids); if (samplesToBeRestored != null) { samplesToBeRestored.forEach(sampleToBeRestored -> { try { restore(sampleToBeRestored.getUuid()); - restoredSampleUuids.add(sampleToBeRestored.getUuid()); + processedSamples.add(new ProcessedEntity(sampleToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The sample with uuid:" + sampleToBeRestored.getUuid() + "could not be restored"); } }); } - return restoredSampleUuids; + return processedSamples; } @Override @@ -791,13 +793,17 @@ public void restore(String sampleUuid) { @Override @RightsAllowed(UserRight._SAMPLE_DELETE) - public List delete(List sampleUuids, DeletionDetails deletionDetails) { + public List delete(List sampleUuids, DeletionDetails deletionDetails) { long startTime = DateHelper.startTime(); + //TODO: fix this implementation + List processedEntities = new ArrayList<>(); + IterableHelper .executeBatched(sampleUuids, DELETED_BATCH_SIZE, batchedSampleUuids -> sampleService.deleteAll(batchedSampleUuids, deletionDetails)); logger.debug("deleteAllSamples(sampleUuids) finished. samplesCount = {}, {}ms", sampleUuids.size(), DateHelper.durationMillies(startTime)); - return sampleUuids; + //return sampleUuids; + return processedEntities; } @RightsAllowed(UserRight._SAMPLE_DELETE) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index b59d34398ec..b5636ac8612 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -54,6 +54,8 @@ import de.symeda.sormas.api.caze.BirthDateDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.i18n.Captions; @@ -361,13 +363,15 @@ public TaskDto saveTask(@Valid TaskDto dto) { @Override @RightsAllowed(UserRight._TASK_EDIT) - public Integer saveBulkTasks( + public List saveBulkTasks( List taskUuidList, TaskDto updatedTempTask, boolean priorityChange, boolean assigneeChange, boolean taskStatusChange) { + List processedTasks = new ArrayList<>(); + UserReferenceDto currentUser = userService.getCurrentUser().toReference(); int changedTasks = 0; @@ -387,9 +391,11 @@ public Integer saveBulkTasks( } saveTask(taskDto); + processedTasks.add(new ProcessedEntity(taskUuid, ProcessedEntityStatus.SUCCESS)); changedTasks++; } - return changedTasks; + //return changedTasks; + return processedTasks; } private void notifyAboutNewAssignee(Task task, User newAssignee, User oldAssignee) { @@ -925,26 +931,21 @@ public void delete(String uuid) { @Override @RightsAllowed(UserRight._TASK_DELETE) - public void delete(List uuids) { - deleteTasks(uuids); - } - - @RightsAllowed(UserRight._TASK_DELETE) - public List deleteTasks(List tasksUuids) { - List deletedTaskUuids = new ArrayList<>(); - List tasksToBeDeleted = taskService.getByUuids(tasksUuids); + public List delete(List uuids) { + List processedTasks = new ArrayList<>(); + List tasksToBeDeleted = taskService.getByUuids(uuids); if (tasksToBeDeleted != null) { tasksToBeDeleted.forEach(taskToBeDeleted -> { try { taskService.deletePermanent(taskToBeDeleted); - deletedTaskUuids.add(taskToBeDeleted.getUuid()); + processedTasks.add(new ProcessedEntity(taskToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The task with uuid:" + taskToBeDeleted.getUuid() + "could not be deleted"); } }); } - return deletedTaskUuids; + return processedTasks; } @Override @@ -1029,22 +1030,29 @@ public void archive(String uuid) { @Override @RightsAllowed(UserRight._TASK_ARCHIVE) - public void dearchive(String uuid) { + public List dearchive(String uuid) { dearchive(Collections.singletonList(uuid)); + return null; } @Override @RightsAllowed(UserRight._TASK_ARCHIVE) - public List archive(List taskUuids) { + public List archive(List taskUuids) { + List processedTasks = new ArrayList<>(); IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> taskService.updateArchived(e, true)); - return taskUuids; + //return taskUuids; + //TODO: change this logic + return processedTasks; } @Override @RightsAllowed(UserRight._TASK_ARCHIVE) - public List dearchive(List taskUuids) { + public List dearchive(List taskUuids) { + List processedTasks = new ArrayList<>(); IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> taskService.updateArchived(e, false)); - return taskUuids; + //return taskUuids; + //TODO: change this logic + return processedTasks; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index a29e7c7a227..7624e1f234d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -26,6 +26,8 @@ import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -129,8 +131,8 @@ public void delete(String travelEntryUuid, DeletionDetails deletionDetails) { @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { - List deletedTravelEntryUuids = new ArrayList<>(); + public List delete(List uuids, DeletionDetails deletionDetails) { + List processedTravelEntries = new ArrayList<>(); List travelEntriesToBeDeleted = travelEntryService.getByUuids(uuids); if (travelEntriesToBeDeleted != null) { @@ -138,7 +140,7 @@ public List delete(List uuids, DeletionDetails deletionDetails) if (!travelEntryToBeDeleted.isDeleted()) { try { delete(travelEntryToBeDeleted.getUuid(), deletionDetails); - deletedTravelEntryUuids.add(travelEntryToBeDeleted.getUuid()); + processedTravelEntries.add(new ProcessedEntity(travelEntryToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The travel entry with uuid:" + travelEntryToBeDeleted.getUuid() + "could not be deleted"); } @@ -146,7 +148,7 @@ public List delete(List uuids, DeletionDetails deletionDetails) }); } - return deletedTravelEntryUuids; + return processedTravelEntries; } @Override @@ -157,22 +159,22 @@ public void restore(String uuid) { @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_DELETE) - public List restore(List uuids) { - List restoredTravelEntryUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedTravelEntries = new ArrayList<>(); List travelEntriesToBeRestored = travelEntryService.getByUuids(uuids); if (travelEntriesToBeRestored != null) { travelEntriesToBeRestored.forEach(travelEntryToBeRestored -> { try { restore(travelEntryToBeRestored.getUuid()); - restoredTravelEntryUuids.add(travelEntryToBeRestored.getUuid()); + processedTravelEntries.add(new ProcessedEntity(travelEntryToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The travel entry with uuid:" + travelEntryToBeRestored.getUuid() + "could not be restored"); } }); } - return restoredTravelEntryUuids; + return processedTravelEntries; } @Override @@ -460,14 +462,14 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) - public void archive(List entityUuids) { - super.archive(entityUuids); + public List archive(List entityUuids) { + return super.archive(entityUuids); } @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); + public List dearchive(List entityUuids, String dearchiveReason) { + return super.dearchive(entityUuids, dearchiveReason); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java index 1a0993899fd..c8d65423eb8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java @@ -53,6 +53,8 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -331,28 +333,22 @@ public void delete(String uuid) { @Override @RightsAllowed(UserRight._VISIT_DELETE) - public void delete(List uuids) { - deleteVisits(uuids); - } - - @Override - @RightsAllowed(UserRight._VISIT_DELETE) - public List deleteVisits(List uuids) { - List deletedVisitUuids = new ArrayList<>(); + public List delete(List uuids) { + List processedVisits = new ArrayList<>(); List visitsToBeDeleted = visitService.getByUuids(uuids); if (visitsToBeDeleted != null) { visitsToBeDeleted.forEach(visitToBeDeleted -> { try { delete(visitToBeDeleted.getUuid()); - deletedVisitUuids.add(visitToBeDeleted.getUuid()); + processedVisits.add(new ProcessedEntity(visitToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { logger.error("The visit with uuid:" + visitToBeDeleted.getUuid() + "could not be deleted"); } }); } - return deletedVisitUuids; + return processedVisits; } @Override diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java index cb37ede80d1..1b1df9d80f6 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java @@ -90,6 +90,7 @@ import de.symeda.sormas.api.clinicalcourse.HealthConditionsDto; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactReferenceDto; @@ -2831,10 +2832,10 @@ public void testDeleteCasesOutsideJurisdiction() { loginWith(surveillanceOfficer); - List deleteUuids = getCaseFacade().delete(caseUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); + List deleteUuids = getCaseFacade().delete(caseUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); assertEquals(1, deleteUuids.size()); - assertEquals(caze1.getUuid(), deleteUuids.get(0)); + assertEquals(caze1.getUuid(), deleteUuids.get(0).getEntityUuid()); loginWith(nationalUser); getCaseFacade().delete(caseUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java index 8db4004aa6c..aa9e3daaec6 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java @@ -60,6 +60,7 @@ import de.symeda.sormas.api.clinicalcourse.HealthConditionsDto; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactClassification; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactDto; @@ -361,10 +362,10 @@ public void testDeleteContactsOutsideJurisdiction() { UserDto user = creator.createSurveillanceOfficer(rdcf1); loginWith(user); - List deleteUuids = + List deleteUuids = getContactFacade().delete(contactUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); assertEquals(1, deleteUuids.size()); - assertEquals(contact1.getUuid(), deleteUuids.get(0)); + assertEquals(contact1.getUuid(), deleteUuids.get(0).getEntityUuid()); loginWith(creatorUser); getContactFacade().delete(contactUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java index 9240aac933c..1888b172789 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java @@ -47,6 +47,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; import de.symeda.sormas.api.utils.Experimental; @@ -210,7 +211,7 @@ public CaseDataDto postUpdate(@PathParam("uuid") String uuid, JsonNode caseDataD @POST @Path("/delete") - public List delete(List uuids) { + public List delete(List uuids) { return FacadeProvider.getCaseFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java index 091e052c45c..23ed7195fb2 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.community.CommunityCriteria; import de.symeda.sormas.api.infrastructure.community.CommunityDto; import de.symeda.sormas.rest.resources.base.EntityDtoResource; @@ -75,14 +76,17 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getCommunityFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + + List processedEntities = FacadeProvider.getCommunityFacade().archive(uuids); + return processedEntities; } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getCommunityFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + List processedEntities = FacadeProvider.getCommunityFacade().dearchive(uuids); + return processedEntities; } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java index e133c896b1e..4f3b2463d5f 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java @@ -35,6 +35,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactIndexDetailedDto; @@ -148,8 +149,11 @@ public Response updateExternalData(@Valid List externalData) { @POST @Path("/delete") - public List delete(List uuids) { - return FacadeProvider.getContactFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); + public List delete(List uuids) { + List processedEntities = + FacadeProvider.getContactFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); + + return processedEntities; } @GET diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java index 4a45515683c..8e8e206ce05 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.continent.ContinentCriteria; import de.symeda.sormas.api.infrastructure.continent.ContinentDto; import de.symeda.sormas.api.infrastructure.continent.ContinentIndexDto; @@ -71,14 +72,15 @@ public List getAllUuids() { @POST @Path("/archive") - public List archive(@RequestBody List uuids) { + public List archive(@RequestBody List uuids) { return FacadeProvider.getContinentFacade().archive(uuids); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getContinentFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + List processedEntities = FacadeProvider.getContinentFacade().dearchive(uuids); + return processedEntities; } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java index 9a7721100df..621fe0240f2 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.country.CountryCriteria; import de.symeda.sormas.api.infrastructure.country.CountryDto; import de.symeda.sormas.api.infrastructure.country.CountryIndexDto; @@ -76,14 +77,16 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getCountryFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + List processedEntities = FacadeProvider.getCountryFacade().archive(uuids); + return processedEntities; } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getCountryFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + List processedEntities = FacadeProvider.getCountryFacade().dearchive(uuids); + return processedEntities; } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java index 8d9ff0f968f..f97377de662 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.district.DistrictCriteria; import de.symeda.sormas.api.infrastructure.district.DistrictDto; import de.symeda.sormas.api.infrastructure.district.DistrictIndexDto; @@ -76,13 +77,13 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { + public List archive(@RequestBody List uuids) { return FacadeProvider.getDistrictFacade().archive(uuids); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { + public List dearchive(@RequestBody List uuids) { return FacadeProvider.getDistrictFacade().dearchive(uuids); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java index 468403fe52b..00c7a0eb3de 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java @@ -34,6 +34,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.event.EventCriteria; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventIndexDto; @@ -136,7 +137,7 @@ public Response updateExternalData(List externalData) { @POST @Path("/delete") - public List delete(List uuids) { + public List delete(List uuids) { return FacadeProvider.getEventFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java index f94cfbac4f7..f8693a1e2f4 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.facility.FacilityCriteria; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityIndexDto; @@ -82,13 +83,13 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { + public List archive(@RequestBody List uuids) { return FacadeProvider.getFacilityFacade().archive(uuids); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { + public List dearchive(@RequestBody List uuids) { return FacadeProvider.getFacilityFacade().dearchive(uuids); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java index 65f9df9702d..7d82d4b518e 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java @@ -38,6 +38,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.immunization.ImmunizationCriteria; import de.symeda.sormas.api.immunization.ImmunizationDto; import de.symeda.sormas.api.immunization.ImmunizationIndexDto; @@ -123,7 +124,7 @@ public Page getIndexList( @POST @Path("/delete") - public List delete(List uuids) { + public List delete(List uuids) { return FacadeProvider.getImmunizationFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java index bfb01d6c8c5..fa6d0c7e710 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.pointofentry.PointOfEntryCriteria; import de.symeda.sormas.api.infrastructure.pointofentry.PointOfEntryDto; import de.symeda.sormas.rest.resources.base.EntityDtoResource; @@ -75,13 +76,13 @@ public List getAllUuids() { @POST @Path("/archive") - public List archive(@RequestBody List uuids) { + public List archive(@RequestBody List uuids) { return FacadeProvider.getPointOfEntryFacade().archive(uuids); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { + public List dearchive(@RequestBody List uuids) { return FacadeProvider.getPointOfEntryFacade().dearchive(uuids); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java index 699bf7ca8a7..d2aa2aa737d 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.region.RegionCriteria; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; @@ -76,13 +77,13 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { + public List archive(@RequestBody List uuids) { return FacadeProvider.getRegionFacade().archive(uuids); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { + public List dearchive(@RequestBody List uuids) { return FacadeProvider.getRegionFacade().dearchive(uuids); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java index 00871bee2fd..b9d4d97c8f8 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.subcontinent.SubcontinentCriteria; import de.symeda.sormas.api.infrastructure.subcontinent.SubcontinentDto; import de.symeda.sormas.api.infrastructure.subcontinent.SubcontinentIndexDto; @@ -71,13 +72,13 @@ public List getAllUuids() { @POST @Path("/archive") - public List archive(@RequestBody List uuids) { + public List archive(@RequestBody List uuids) { return FacadeProvider.getSubcontinentFacade().archive(uuids); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { + public List dearchive(@RequestBody List uuids) { return FacadeProvider.getSubcontinentFacade().dearchive(uuids); } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java index d11aec107fc..e1277389f7b 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java @@ -32,6 +32,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.task.TaskCriteria; import de.symeda.sormas.api.task.TaskDto; import de.symeda.sormas.api.task.TaskIndexDto; @@ -107,8 +108,8 @@ public List getObsoleteUuidsSince(@PathParam("since") long since) { @POST @Path("/delete") - public List delete(List uuids) { - return FacadeProvider.getTaskFacade().deleteTasks(uuids); + public List delete(List uuids) { + return FacadeProvider.getTaskFacade().delete(uuids); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index 4a2edc7addb..c19e5ddd168 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -15,6 +15,7 @@ package de.symeda.sormas.ui.utils; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -34,6 +35,7 @@ import de.symeda.sormas.api.campaign.CampaignFacade; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseFacade; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactFacade; import de.symeda.sormas.api.environment.EnvironmentDto; @@ -121,17 +123,21 @@ public void archive(String entityUuid) { } @Override - public int archive(List entityUuids) { - return entityFacade.archive(entityUuids).size(); + public List archive(List entityUuids) { + List processedEntities = entityFacade.archive(entityUuids); + return processedEntities; } @Override - public void dearchive(String entityUuid) { - entityFacade.dearchive(entityUuid); + public List dearchive(String entityUuid) { + List processedEntities = entityFacade.dearchive(entityUuid); + return processedEntities; } - public int dearchive(List entityUuids) { - return entityFacade.dearchive(entityUuids).size(); + public List dearchive(List entityUuids) { + //return entityFacade.dearchive(entityUuids).size(); + List processedEntities = entityFacade.dearchive(entityUuids); + return processedEntities; } @Override @@ -180,21 +186,24 @@ public void archive(String entityUuid) { } @Override - public int archive(List entityUuids) { - entityFacade.archive(entityUuids); + public List archive(List entityUuids) { + List processedEntities = entityFacade.archive(entityUuids); - return entityUuids.size(); + //return entityUuids.size(); + return processedEntities; } @Override - public void dearchive(String entityUuid) { - entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue()); + public List dearchive(String entityUuid) { + List processedEntities = entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue()); + return processedEntities; } @Override - public int dearchive(List entityUuids) { - entityFacade.dearchive(entityUuids, dearchiveReasonField.getValue()); - return entityUuids.size(); + public List dearchive(List entityUuids) { + List processedEntities = entityFacade.dearchive(entityUuids, dearchiveReasonField.getValue()); + //return entityUuids.size(); + return processedEntities; } @Override @@ -250,21 +259,25 @@ public void archive(String entityUuid) { } @Override - public void dearchive(String entityUuid) { - entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue(), archiveWithContacts.getValue()); + public List dearchive(String entityUuid) { + List processedEntities = + entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue(), archiveWithContacts.getValue()); + return processedEntities; } @Override - public int archive(List entityUuids) { - entityFacade.archive(entityUuids, archiveWithContacts.getValue()); + public List archive(List entityUuids) { + List processedEntities = entityFacade.archive(entityUuids, archiveWithContacts.getValue()); - return entityUuids.size(); + //return entityUuids.size(); + return processedEntities; } @Override - public int dearchive(List uuidList) { - entityFacade.dearchive(uuidList, dearchiveReasonField.getValue(), archiveWithContacts.getValue()); - return uuidList.size(); + public List dearchive(List uuidList) { + List processedEntities = + entityFacade.dearchive(uuidList, dearchiveReasonField.getValue(), archiveWithContacts.getValue()); + return processedEntities; } @Override @@ -317,12 +330,14 @@ public void archive(String entityUuid) { } @Override - public void dearchive(String entityUuid) { + public List dearchive(String entityUuid) { try { super.dearchive(entityUuid); } catch (AccessDeniedException e) { Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); } + List processedEntities = new ArrayList<>(); + return processedEntities; } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index 6b39fbff2de..39a21bdce35 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -16,6 +16,7 @@ import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.uuid.HasUuid; @@ -279,11 +280,11 @@ public interface IArchiveHandler { void archive(String entityUuid); - int archive(List entityUuids); + List archive(List entityUuids); - void dearchive(String entityUuid); + List dearchive(String entityUuid); - int dearchive(List entityUuids); + List dearchive(List entityUuids); boolean isArchived(T entity); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 180af732240..2df22c82839 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -1,5 +1,6 @@ package de.symeda.sormas.ui.utils; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.locks.Lock; @@ -16,6 +17,8 @@ import com.vaadin.ui.Window; import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -32,11 +35,11 @@ public class BulkOperationHandler { * Amount of DTOs that are forwarded to the backend in one single call * when displaying a progress layout. */ - public static final int BULK_ACTION_BATCH_SIZE = 20; + public static final int BULK_ACTION_BATCH_SIZE = 5; /** * Amount of DTOs that have to be selected for the progress layout to be displayed. */ - public static final int BULK_ACTION_PROGRESS_THRESHOLD = 40; + public static final int BULK_ACTION_PROGRESS_THRESHOLD = 10; private boolean cancelAfterCurrentBatch; private boolean cancelButtonClicked; private final Lock cancelLock = new ReentrantLock(); @@ -82,7 +85,7 @@ public static BulkOperationHandler forBulkEdit() { } public void doBulkOperation( - Function, Integer> bulkOperationFunction, + Function, List> bulkOperationFunction, List selectedEntries, List selectedEligibleEntries, List selectedIneligibleEntries, @@ -93,10 +96,22 @@ public void doBulkOperation( selectedEligibleEntries = !areIneligibleEntriesSelected(selectedIneligibleEntries) ? selectedEntries : selectedEligibleEntries; if (selectedEntries.size() < BULK_ACTION_PROGRESS_THRESHOLD) { + List processedEntities = new ArrayList<>(); if (initialEligibleEntryCount > 0) { - successfulEntryCount = areIneligibleEntriesSelected(selectedIneligibleEntries) + processedEntities = areIneligibleEntriesSelected(selectedIneligibleEntries) ? bulkOperationFunction.apply(selectedEligibleEntries) : bulkOperationFunction.apply(selectedEntries); + + successfulEntryCount = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .collect(Collectors.toList()) + .size(); + } + + //If the user does not have the proper rights to perform the action, there will be no processed entities + if (processedEntities.size() == 0 && initialEligibleEntryCount > 0) { + NotificationHelper.showNotification(I18nProperties.getString(Strings.errorForbidden), Notification.Type.WARNING_MESSAGE, -1); + return; } if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { @@ -143,12 +158,31 @@ public void doBulkOperation( FacadeProvider.getI18nFacade().setUserLanguage(currentUser.getLanguage()); try { - List remainingEntries = - performBulkOperation(bulkOperationFunction, finalSelectedEligibleEntries, bulkProgressLayout::updateProgress); + List entityUuidsNotProcessedExternalSurveillanceReason = new ArrayList<>(); + List entityUuidsNotProcessedGeneralReason = new ArrayList<>(); + List remainingEntries = performBulkOperation( + bulkOperationFunction, + finalSelectedEligibleEntries, + entityUuidsNotProcessedExternalSurveillanceReason, + entityUuidsNotProcessedGeneralReason, + bulkProgressLayout::updateProgress); currentUI.access(() -> { window.setClosable(true); + //If the user does not have the proper rights to perform the action, there will be no processed entities + if (remainingEntries.size() == initialEligibleEntryCount) { + bulkProgressLayout.finishProgress( + ProgressResult.FAILURE, + //I18nProperties.getString(Strings.infoBulkProcessNoEligibleEntries), + I18nProperties.getString(Strings.errorForbidden), + () -> { + window.close(); + bulkOperationDoneCallback.accept(Collections.emptyList()); + }); + return; + } + if (initialEligibleEntryCount == 0) { bulkProgressLayout.finishProgress( ProgressResult.SUCCESS_WITH_WARNING, @@ -207,8 +241,10 @@ public void doBulkOperation( } private List performBulkOperation( - Function, Integer> bulkOperationFunction, + Function, List> bulkOperationFunction, List selectedEntries, + List entitiesNotProcessedExternalSurveillanceFailure, + List entitiesNotProcessedGeneralReason, Consumer progressUpdateCallback) throws InterruptedException { @@ -226,12 +262,31 @@ private List performBulkOperation( } int entriesInBatch = Math.min(BULK_ACTION_BATCH_SIZE, selectedEntries.size() - i); - int successfullyProcessedInBatch = + + List processedEntities = bulkOperationFunction.apply(selectedEntries.subList(i, Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntries.size()))); + + //If the user does not have the proper rights to perform the action, there will be no processed entities + //send as parameter initialEligibleEntryCount? + if (processedEntities.size() == 0) { + break; + } else { + entitiesNotProcessedExternalSurveillanceFailure + .addAll(getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + // entitiesNotProcessedExternalSurveillanceFailure.addAll(getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + // entitiesNotProcessedExternalSurveillanceFailure.addAll(getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } + + int successfullyProcessedInBatch = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .collect(Collectors.toList()) + .size(); + successfulEntryCount += successfullyProcessedInBatch; lastProcessedEntry = Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntries.size() - 1); progressUpdateCallback.accept( new BulkProgressUpdateInfo(entriesInBatch, successfullyProcessedInBatch, entriesInBatch - successfullyProcessedInBatch)); + } } } finally { @@ -301,6 +356,13 @@ public boolean areIneligibleEntriesSelected(List selectedIneligibleEntries) { return selectedIneligibleEntries != null && selectedIneligibleEntries.size() > 0; } + public List getList(List processedEntities, ProcessedEntityStatus status) { + return processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(status)) + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); + } + public Window getWindow() { return window; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index 7035d5efba2..a8a5ecaa320 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -18,6 +18,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.uuid.HasUuid; @@ -176,9 +177,9 @@ public interface IDeleteRestoreHandler { void delete(String uuid, DeletionDetails deletionDetails); - int delete(List uuids, DeletionDetails deletionDetails); + List delete(List uuids, DeletionDetails deletionDetails); - int restore(List uuids); + List restore(List uuids); DeleteRestoreMessages getDeleteRestoreMessages(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java index 67f0de0563c..a482b24c715 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java @@ -1,5 +1,6 @@ package de.symeda.sormas.ui.utils; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -18,6 +19,7 @@ import de.symeda.sormas.api.PermanentlyDeletableFacade; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -86,15 +88,24 @@ public void delete(String uuid, DeletionDetails deletionDetails) { } @Override - public int delete(List uuids, DeletionDetails deletionDetails) { - entityFacade.delete(uuids, deletionDetails); - return uuids.size(); + public List delete(List uuids, DeletionDetails deletionDetails) { + List deletedEntities = new ArrayList(); + try { + deletedEntities = entityFacade.delete(uuids, deletionDetails); + } catch (Exception e) { + + } + + //return deletedEntities.size(); + return deletedEntities; } @Override - public int restore(List uuids) { - entityFacade.restore(uuids); - return uuids.size(); + public List restore(List uuids) { + List restoredEntities = entityFacade.restore(uuids); + //return uuids.size(); + + return restoredEntities; } @Override @@ -198,9 +209,10 @@ private PermanentDeleteHandler(F entityFacade, DeleteRestoreMessages deleteResto } @Override - public int delete(List uuids) { - entityFacade.delete(uuids); - return uuids.size(); + public List delete(List uuids) { + List processedEntities = entityFacade.delete(uuids); + //return uuids.size(); + return processedEntities; } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index 57e909650c2..8a9aa4e6bb9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -13,6 +13,7 @@ import com.vaadin.ui.VerticalLayout; import de.symeda.sormas.api.PermanentlyDeletableFacade; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.uuid.HasUuid; @@ -99,7 +100,7 @@ private BulkOperationHandler createBulkOperationHandler(I public interface IPermanentDeleteHandler { - int delete(List uuids); + List delete(List uuids); DeleteRestoreMessages getDeleteRestoreMessages(); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java index dc4f11414c8..758cbd3f5af 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java @@ -19,6 +19,22 @@ public enum ProgressResult { SUCCESS, SUCCESS_WITH_WARNING, + /** + * ExternalSurveillanceToolRuntimeException was thrown during the processing of the entity + */ + EXTERNAL_SURVEILLANCE_FAILURE, + /** + * SormasToSormasRuntimeException was thrown during the processing of the entity + */ + SORMAS_TO_SORMAS_FAILURE, + /** + * AccessDeniedException was thrown during the processing of the entity + */ + ACCESS_DENIED_FAILURE, + MISSING_USER_RIGHTS, + /** + * A general exception was thrown during the processing of the entity + */ FAILURE; } From 5cd3194531fcf69dc786f213b9f19e041f9f68c5 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 21 Jul 2023 19:47:52 +0300 Subject: [PATCH 002/144] #12257 - refactorings --- .../de/symeda/sormas/api/i18n/Strings.java | 7 +- .../src/main/resources/strings.properties | 11 +- .../sormas/backend/caze/CaseFacadeEjb.java | 12 +- .../sormas/ui/utils/ArchivingController.java | 3 + .../sormas/ui/utils/BulkOperationHandler.java | 198 ++++++++++++------ .../ui/utils/DeleteRestoreController.java | 5 + .../ui/utils/DeleteRestoreMessages.java | 35 +++- .../ui/utils/PermanentDeleteController.java | 2 + 8 files changed, 196 insertions(+), 77 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index f31f282d8c7..6bc5ea3d0f6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1051,7 +1051,6 @@ public interface Strings { String messageCasesDeleted = "messageCasesDeleted"; String messageCasesMerged = "messageCasesMerged"; String messageCasesNotDeleted = "messageCasesNotDeleted"; - String messageCasesNotDeletedExternalReason = "messageCasesNotDeletedExternalReason"; String messageCasesNotRestored = "messageCasesNotRestored"; String messageCasesRestored = "messageCasesRestored"; String messageCaseTransfered = "messageCaseTransfered"; @@ -1101,13 +1100,18 @@ public interface Strings { String messageCopyPassword = "messageCopyPassword"; String messageCountCasesAlreadyInEvent = "messageCountCasesAlreadyInEvent"; String messageCountCasesNotDeleted = "messageCountCasesNotDeleted"; + String messageCountCasesNotDeletedExternalReason = "messageCountCasesNotDeletedExternalReason"; + String messageCountCasesNotDeletedSormasToSormasReason = "messageCountCasesNotDeletedSormasToSormasReason"; String messageCountCasesNotRestored = "messageCountCasesNotRestored"; String messageCountContactsAlreadyInEvent = "messageCountContactsAlreadyInEvent"; String messageCountContactsNotDeleted = "messageCountContactsNotDeleted"; + String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; String messageCountEventsNotDeleted = "messageCountEventsNotDeleted"; + String messageCountEventsNotDeletedExternalReason = "messageCountEventsNotDeletedExternalReason"; + String messageCountEventsNotDeletedSormasToSormasReason = "messageCountEventsNotDeletedSormasToSormasReason"; String messageCountEventsNotRestored = "messageCountEventsNotRestored"; String messageCountExternalMessagesNotDeleted = "messageCountExternalMessagesNotDeleted"; String messageCountImmunizationsNotRestored = "messageCountImmunizationsNotRestored"; @@ -1177,7 +1181,6 @@ public interface Strings { String messageEventSaved = "messageEventSaved"; String messageEventsDeleted = "messageEventsDeleted"; String messageEventsNotDeleted = "messageEventsNotDeleted"; - String messageEventsNotDeletedExternalReason = "messageEventsNotDeletedExternalReason"; String messageEventsNotDeletedLinkedEntitiesReason = "messageEventsNotDeletedLinkedEntitiesReason"; String messageEventsNotRestored = "messageEventsNotRestored"; String messageEventsRestored = "messageEventsRestored"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index ce789a33297..c0acc1cf256 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1039,8 +1039,9 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility + +#check if these messages are still neccessary, if not delete them messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted messageCasesMerged = Cases merged and duplicate case deleted. @@ -1129,9 +1130,14 @@ messageEventGroupSaved = Event group data saved messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet + +#change everywhere this message messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted. UUIDs of cases not deleted because the communication with the reporting tool failed: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted. UUIDs of cases not deleted because the cases were shared with Sormas to Sormas: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted. UUIDs of contacts not deleted because the contacts were shared with Sormas to Sormas: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted: %s @@ -1145,8 +1151,9 @@ messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of tr messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedExternalReason = %s events not deleted. UUIDs of events not deleted because the communication with the reporting tool failed: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted. UUIDs of events not deleted because the events were shared with Sormas to Sormas: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 96680163104..c7406e17937 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2739,12 +2739,22 @@ private void deleteCase(Case caze, DeletionDetails deletionDetails) } externalJournalService.handleExternalJournalPersonUpdateAsync(caze.getPerson().toReference()); + //just for testing try { - sormasToSormasFacade.revokePendingShareRequests(caze.getSormasToSormasShares(), true); + if (caze.getUuid().equals("FHUY7T-TDIBAJ-BCOUS4-XFNJDPOQ")) { + throw SormasToSormasException.fromStringProperty(Strings.errorSormasToSormasRequestProcessed); + } } catch (SormasToSormasException e) { throw new SormasToSormasRuntimeException(e); } + /* + * try { + * sormasToSormasFacade.revokePendingShareRequests(caze.getSormasToSormasShares(), true); + * } catch (SormasToSormasException e) { + * throw new SormasToSormasRuntimeException(e); + * } + */ service.delete(caze, deletionDetails); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index 39a21bdce35..4f843526edf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -219,6 +219,9 @@ private BulkOperationHandler createBulkOperationHandler(I return new BulkOperationHandler<>( forArchive ? archiveMessages.getMessageAllEntitiesArchived() : archiveMessages.getMessageAllEntitiesDearchived(), null, + //TODO: add value to someEntriesNotProcessedExternalReason + null, + null, null, null, forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 2df22c82839..57555ca5112 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -9,6 +9,8 @@ import java.util.function.Function; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.server.Sizeable; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.Label; @@ -52,6 +54,10 @@ public class BulkOperationHandler { private final String ineligibleEntriesNotProcessedMessageProperty; private final String headingSomeEntitiesNotProcessed; private final String countEntriesNotProcessedMessageProperty; + + private final String countEntriesNotProcessedExternalReasonProperty; + private final String countEntriesNotProcessedSormasToSormasReasonProperty; + private final String someEntriesProcessedMessageProperty; private final String noEligibleEntityMessageProperty; private final String infoBulkProcessFinishedWithSkipsProperty; @@ -61,6 +67,10 @@ public BulkOperationHandler( String ineligibleEntriesNotProcessedMessageProperty, String headingSomeEntitiesNotProcessed, String countEntriesNotProcessedMessageProperty, + + String countEntriesNotProcessedExternalReasonProperty, + String countEntriesNotProcessedSormasToSormasReasonProperty, + String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, String infoBulkProcessFinishedWithSkipsProperty) { @@ -68,17 +78,24 @@ public BulkOperationHandler( this.ineligibleEntriesNotProcessedMessageProperty = ineligibleEntriesNotProcessedMessageProperty; this.headingSomeEntitiesNotProcessed = headingSomeEntitiesNotProcessed; this.countEntriesNotProcessedMessageProperty = countEntriesNotProcessedMessageProperty; + + this.countEntriesNotProcessedExternalReasonProperty = countEntriesNotProcessedExternalReasonProperty; + this.countEntriesNotProcessedSormasToSormasReasonProperty = countEntriesNotProcessedSormasToSormasReasonProperty; + this.someEntriesProcessedMessageProperty = someEntriesProcessedMessageProperty; this.noEligibleEntityMessageProperty = noEligibleEntityMessageProperty; this.infoBulkProcessFinishedWithSkipsProperty = infoBulkProcessFinishedWithSkipsProperty; } + //TODO: check if the 2 newly added fields can have value for bulk edit public static BulkOperationHandler forBulkEdit() { return new BulkOperationHandler( Strings.messageEntriesEdited, null, null, null, + null, + null, Strings.messageEntriesEditedExceptArchived, null, Strings.infoBulkProcessFinishedWithSkips); @@ -96,53 +113,7 @@ public void doBulkOperation( selectedEligibleEntries = !areIneligibleEntriesSelected(selectedIneligibleEntries) ? selectedEntries : selectedEligibleEntries; if (selectedEntries.size() < BULK_ACTION_PROGRESS_THRESHOLD) { - List processedEntities = new ArrayList<>(); - if (initialEligibleEntryCount > 0) { - processedEntities = areIneligibleEntriesSelected(selectedIneligibleEntries) - ? bulkOperationFunction.apply(selectedEligibleEntries) - : bulkOperationFunction.apply(selectedEntries); - - successfulEntryCount = processedEntities.stream() - .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) - .collect(Collectors.toList()) - .size(); - } - - //If the user does not have the proper rights to perform the action, there will be no processed entities - if (processedEntities.size() == 0 && initialEligibleEntryCount > 0) { - NotificationHelper.showNotification(I18nProperties.getString(Strings.errorForbidden), Notification.Type.WARNING_MESSAGE, -1); - return; - } - - if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { - //all the selected items were ineligible - NotificationHelper.showNotification(I18nProperties.getString(noEligibleEntityMessageProperty), Notification.Type.WARNING_MESSAGE, -1); - return; - } - - if (initialEligibleEntryCount > successfulEntryCount) { - NotificationHelper.showNotification( - String.format(I18nProperties.getString(someEntriesProcessedMessageProperty), successfulEntryCount), - Notification.Type.HUMANIZED_MESSAGE, - -1); - - } else { - if (areIneligibleEntriesSelected(selectedIneligibleEntries)) { - String description = getErrorDescription( - selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), - I18nProperties.getString(countEntriesNotProcessedMessageProperty), - I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty)); - - Window response = - VaadinUiUtil.showSimplePopupWindow(I18nProperties.getString(headingSomeEntitiesNotProcessed), description, ContentMode.HTML); - - response.setWidth(600, Sizeable.Unit.PIXELS); - } else { - //all the selected eligible entities were processed - NotificationHelper - .showNotification(I18nProperties.getString(allEntriesProcessedMessageProperty), Notification.Type.HUMANIZED_MESSAGE, -1); - } - } + processEntriesWithoutProgressBar(bulkOperationFunction, selectedEntries, selectedEligibleEntries, selectedIneligibleEntries); bulkOperationDoneCallback.accept(Collections.emptyList()); } else { UserDto currentUser = FacadeProvider.getUserFacade().getCurrentUser(); @@ -240,6 +211,71 @@ public void doBulkOperation( } } + public void processEntriesWithoutProgressBar( + Function, List> bulkOperationFunction, + List selectedEntries, + List selectedEligibleEntries, + List selectedIneligibleEntries) { + + initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); + + boolean areIneligibleEntriesSelected = areIneligibleEntriesSelected(selectedIneligibleEntries); + selectedEligibleEntries = !areIneligibleEntriesSelected ? selectedEntries : selectedEligibleEntries; + + List processedEntities = new ArrayList<>(); + if (initialEligibleEntryCount > 0) { + processedEntities = + areIneligibleEntriesSelected ? bulkOperationFunction.apply(selectedEligibleEntries) : bulkOperationFunction.apply(selectedEntries); + + successfulEntryCount = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .collect(Collectors.toList()) + .size(); + } + + //If the user does not have the proper rights to perform the action, there will be no processed entities + if (processedEntities.size() == 0 && initialEligibleEntryCount > 0) { + NotificationHelper.showNotification(I18nProperties.getString(Strings.errorForbidden), Notification.Type.WARNING_MESSAGE, -1); + return; + } + + if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { + //all the selected items were ineligible + NotificationHelper.showNotification(I18nProperties.getString(noEligibleEntityMessageProperty), Notification.Type.WARNING_MESSAGE, -1); + return; + } + + /* + * if (successfulEntryCount > 0) { + * //change some cases were not deleted to none of the cases were deleted? + * } else { + * } + */ + if (initialEligibleEntryCount > successfulEntryCount) { + String description = buildDescription(processedEntities); + Window response = + VaadinUiUtil.showSimplePopupWindow(I18nProperties.getString(headingSomeEntitiesNotProcessed), description, ContentMode.HTML); + + response.setWidth(600, Sizeable.Unit.PIXELS); + } else { + if (areIneligibleEntriesSelected(selectedIneligibleEntries)) { + String description = getErrorDescription( + selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), + I18nProperties.getString(countEntriesNotProcessedMessageProperty), + I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty)); + + Window response = + VaadinUiUtil.showSimplePopupWindow(I18nProperties.getString(headingSomeEntitiesNotProcessed), description, ContentMode.HTML); + + response.setWidth(600, Sizeable.Unit.PIXELS); + } else { + //all the selected eligible entities were processed + NotificationHelper + .showNotification(I18nProperties.getString(allEntriesProcessedMessageProperty), Notification.Type.HUMANIZED_MESSAGE, -1); + } + } + } + private List performBulkOperation( Function, List> bulkOperationFunction, List selectedEntries, @@ -317,35 +353,73 @@ private void handleCancelButtonClicked() { } - private String getErrorDescription( - List ineligibleEntityUuids, - String messageCountEntriesNotProcessed, - String messageIneligibleEntriesNotProcessed) { + public String buildDescription(List processedEntities) { + List entityUuidsNotProcessedExternalSurveillanceFailure = + getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + List entityUuidsNotProcessedSormasToSormasFailure = getList(processedEntities, ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE); + List entityUuidsNotProcessedAccessDeniedFailure = getList(processedEntities, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + List entityUuidsNotProcessedInternalFailure = getList(processedEntities, ProcessedEntityStatus.INTERNAL_FAILURE); + + String description = StringUtils.EMPTY; + if (entityUuidsNotProcessedExternalSurveillanceFailure.size() > 0) { + String description1 = getErrorDescription( + entityUuidsNotProcessedExternalSurveillanceFailure, + I18nProperties.getString(countEntriesNotProcessedExternalReasonProperty), + ""); + description = description.concat(description1); + } + + if (entityUuidsNotProcessedSormasToSormasFailure.size() > 0) { + String description2 = getErrorDescription( + entityUuidsNotProcessedSormasToSormasFailure, + I18nProperties.getString(countEntriesNotProcessedSormasToSormasReasonProperty), + ""); + description = description.concat(description2); + } + + if (entityUuidsNotProcessedAccessDeniedFailure.size() > 0) { + String description3 = getErrorDescription( + entityUuidsNotProcessedAccessDeniedFailure, + I18nProperties.getString(countEntriesNotProcessedMessageProperty), + ""); + description = description.concat(description3); + } + + if (entityUuidsNotProcessedInternalFailure.size() > 0) { + String description4 = + getErrorDescription(entityUuidsNotProcessedInternalFailure, I18nProperties.getString(countEntriesNotProcessedMessageProperty), ""); + description = description.concat(description4); + } + + return description; + } + + private String getErrorDescription(List entityUuids, String messageCountEntries, String messageEntriesNotSuccessfullyProcessed) { StringBuilder description = new StringBuilder(); description.append( String.format( "%1s
%2s", String.format( - messageCountEntriesNotProcessed, - String.format("%s", ineligibleEntityUuids.size()), - String.format("%s", HtmlHelper.cleanHtml(getIneligibleItemsString(ineligibleEntityUuids)))), - messageIneligibleEntriesNotProcessed)) + messageCountEntries, + String.format("%s", entityUuids.size()), + String.format("%s", HtmlHelper.cleanHtml(buildEntitiesString(entityUuids)))), + messageEntriesNotSuccessfullyProcessed)) .append("

"); return description.toString(); } - public String getIneligibleItemsString(List ineligibleEntities) { - StringBuilder ineligibleItems = new StringBuilder(); - for (String ineligibleEntity : ineligibleEntities) { - ineligibleItems.append(ineligibleEntity, 0, 6).append(", "); + public String buildEntitiesString(List entityUuids) { + StringBuilder entitiesString = new StringBuilder(); + for (String entityUuid : entityUuids) { + entitiesString.append(entityUuid, 0, 6).append(", "); } - if (ineligibleItems.length() > 0) { - ineligibleItems = new StringBuilder(" " + ineligibleItems.substring(0, ineligibleItems.length() - 2) + ". "); + if (entitiesString.length() > 0) { + entitiesString = new StringBuilder(" " + entitiesString.substring(0, entitiesString.length() - 2) + ". "); } - return ineligibleItems.toString(); + return entitiesString.toString(); } public int getInitialEligibleEntryCount(List selectedEntries, List selectedIneligibleEntries, List selectedEligibleEntries) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index a8a5ecaa320..5848a8b097e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -132,6 +132,11 @@ private BulkOperationHandler createBulkOperationHandler(I forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeletedLinkedEntitiesReason() : null, forDelete ? deleteRestoreMessages.getHeadingSomeEntitiesNotDeleted() : deleteRestoreMessages.getHeadingSomeEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeleted() : deleteRestoreMessages.getMessageCountEntitiesNotRestored(), + + //TODO: if the values are needed for Restore too + forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedExternalReason() : null, + forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedSormasToSormasReason() : null, + forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeleted() : deleteRestoreMessages.getMessageEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageNoEligibleEntitySelected() : null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index 30745f21255..c966272441f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -4,6 +4,7 @@ public enum DeleteRestoreMessages { + //TODO: check if SormasToSormasRuntimeException can happen to other entities too ( besides events and cases) CASE(Strings.entityCases, Strings.headingNoCasesSelected, Strings.messageNoCasesSelected, @@ -12,7 +13,8 @@ public enum DeleteRestoreMessages { Strings.headingCasesDeleted, Strings.messageCasesDeleted, Strings.messageCasesNotDeleted, - Strings.messageCasesNotDeletedExternalReason, + Strings.messageCountCasesNotDeletedExternalReason, + Strings.messageCountCasesNotDeletedSormasToSormasReason, null, Strings.headingSomeCasesNotDeleted, Strings.messageCountCasesNotDeleted, @@ -30,7 +32,8 @@ public enum DeleteRestoreMessages { Strings.headingEventsDeleted, Strings.messageEventsDeleted, Strings.messageEventsNotDeleted, - Strings.messageEventsNotDeletedExternalReason, + Strings.messageCountEventsNotDeletedExternalReason, + Strings.messageCountContactsNotDeletedSormasToSormasReason, Strings.messageEventsNotDeletedLinkedEntitiesReason, Strings.headingSomeEventsNotDeleted, Strings.messageCountEventsNotDeleted, @@ -50,6 +53,7 @@ public enum DeleteRestoreMessages { Strings.messageEventParticipantsNotDeleted, null, null, + null, Strings.headingSomeEventParticipantsNotDeleted, Strings.messageCountEventParticipantsNotDeleted, Strings.headingEventParticipantsRestored, @@ -67,6 +71,7 @@ public enum DeleteRestoreMessages { Strings.messageContactsDeleted, Strings.messageContactsNotDeleted, null, + Strings.messageCountContactsNotDeletedSormasToSormasReason, null, Strings.headingSomeContactsNotDeleted, Strings.messageCountContactsNotDeleted, @@ -86,6 +91,7 @@ public enum DeleteRestoreMessages { Strings.messageTravelEntriesNotDeleted, null, null, + null, Strings.headingSomeTravelEntriesNotDeleted, Strings.messageCountTravelEntriesNotDeleted, Strings.headingTravelEntriesRestored, @@ -104,6 +110,7 @@ public enum DeleteRestoreMessages { Strings.messageVisitsNotDeleted, null, null, + null, Strings.headingSomeVisitsNotDeleted, Strings.messageCountVisitsNotDeleted, null, @@ -122,6 +129,7 @@ public enum DeleteRestoreMessages { Strings.messageTasksNotDeleted, null, null, + null, Strings.headingSomeTasksNotDeleted, Strings.messageCountTasksNotDeleted, null, @@ -140,6 +148,7 @@ public enum DeleteRestoreMessages { Strings.messageExternalMessagesNotDeleted, null, null, + null, Strings.headingSomeExternalMessagesNotDeleted, Strings.messageCountExternalMessagesNotDeleted, null, @@ -158,6 +167,7 @@ public enum DeleteRestoreMessages { Strings.messageSamplesNotDeleted, null, null, + null, Strings.headingSomeSamplesNotDeleted, Strings.messageCountSamplesNotDeleted, Strings.headingSamplesRestored, @@ -178,6 +188,7 @@ public enum DeleteRestoreMessages { null, null, null, + null, Strings.headingImmunizationsRestored, Strings.messageImmunizationsRestored, Strings.messageImmunizationsNotRestored, @@ -192,11 +203,11 @@ public enum DeleteRestoreMessages { private final String headingEntitiesDeleted; private final String messageEntitiesDeleted; private final String messageEntitiesNotDeleted; - private final String messageEntitiesNotDeletedExternalReason; + private final String messageCountEntitiesNotDeletedExternalReason; + private final String messageCountEntitiesNotDeletedSormasToSormasReason; private final String messageEntitiesNotDeletedLinkedEntitiesReason; private final String headingSomeEntitiesNotDeleted; private final String messageCountEntitiesNotDeleted; - private final String headingEntitiesRestored; private final String messageEntitiesRestored; private final String messageEntitiesNotRestored; @@ -212,7 +223,8 @@ public enum DeleteRestoreMessages { String headingEntitiesDeleted, String messageEntitiesDeleted, String messageEntitiesNotDeleted, - String messageEntitiesNotDeletedExternalReason, + String messageCountEntitiesNotDeletedExternalReason, + String messageCountEntitiesNotDeletedSormasToSormasReason, String messageEntitiesNotDeletedLinkedEntitiesReason, String headingSomeEntitiesNotDeleted, String messageCountEntitiesNotDeleted, @@ -230,12 +242,11 @@ public enum DeleteRestoreMessages { this.headingEntitiesDeleted = headingEntitiesDeleted; this.messageEntitiesDeleted = messageEntitiesDeleted; this.messageEntitiesNotDeleted = messageEntitiesNotDeleted; - this.messageEntitiesNotDeletedExternalReason = messageEntitiesNotDeletedExternalReason; + this.messageCountEntitiesNotDeletedExternalReason = messageCountEntitiesNotDeletedExternalReason; + this.messageCountEntitiesNotDeletedSormasToSormasReason = messageCountEntitiesNotDeletedSormasToSormasReason; this.messageEntitiesNotDeletedLinkedEntitiesReason = messageEntitiesNotDeletedLinkedEntitiesReason; - this.headingSomeEntitiesNotDeleted = headingSomeEntitiesNotDeleted; this.messageCountEntitiesNotDeleted = messageCountEntitiesNotDeleted; - this.headingEntitiesRestored = headingEntitiesRestored; this.messageEntitiesRestored = messageEntitiesRestored; this.messageEntitiesNotRestored = messageEntitiesNotRestored; @@ -275,8 +286,12 @@ public String getMessageEntitiesNotDeleted() { return messageEntitiesNotDeleted; } - public String getMessageEntitiesNotDeletedExternalReason() { - return messageEntitiesNotDeletedExternalReason; + public String getMessageCountEntitiesNotDeletedExternalReason() { + return messageCountEntitiesNotDeletedExternalReason; + } + + public String getMessageCountEntitiesNotDeletedSormasToSormasReason() { + return messageCountEntitiesNotDeletedSormasToSormasReason; } public String getMessageEntitiesNotDeletedLinkedEntitiesReason() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index 8a9aa4e6bb9..8159941b293 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -91,8 +91,10 @@ private BulkOperationHandler createBulkOperationHandler(I return new BulkOperationHandler<>( deleteRestoreMessages.getMessageEntitiesDeleted(), null, + null, deleteRestoreMessages.getHeadingSomeEntitiesNotDeleted(), deleteRestoreMessages.getMessageCountEntitiesNotDeleted(), + null, deleteRestoreMessages.getMessageEntitiesNotDeleted(), null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction); From c7db62400b717bb8bdd977ada839ef2076348472 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Sun, 23 Jul 2023 18:21:35 +0300 Subject: [PATCH 003/144] #12257 - refactorings and fixes --- .../de/symeda/sormas/api/i18n/Strings.java | 9 +++ .../src/main/resources/strings.properties | 9 +++ .../sormas/backend/caze/CaseFacadeEjb.java | 19 +++-- .../backend/contact/ContactFacadeEjb.java | 19 +++++ .../sormas/backend/event/EventFacadeEjb.java | 20 +++++- ...ernalSurveillanceToolGatewayFacadeEjb.java | 2 +- .../sormas/ui/utils/ArchivingController.java | 1 + .../sormas/ui/utils/BulkOperationHandler.java | 72 ++++++++++--------- .../ui/utils/DeleteRestoreController.java | 2 + .../ui/utils/DeleteRestoreHandlers.java | 3 +- .../ui/utils/DeleteRestoreMessages.java | 21 ++++++ .../ui/utils/PermanentDeleteController.java | 3 +- .../components/progress/ProgressResult.java | 16 ----- 13 files changed, 133 insertions(+), 63 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 6bc5ea3d0f6..e88cfba04c8 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -423,6 +423,7 @@ public interface Strings { String headingCasesDeleted = "headingCasesDeleted"; String headingCasesGuide = "headingCasesGuide"; String headingCasesInQuarantine = "headingCasesInQuarantine"; + String headingCasesNotDeleted = "headingCasesNotDeleted"; String headingCasesPlacedInQuarantine = "headingCasesPlacedInQuarantine"; String headingCasesRestored = "headingCasesRestored"; String headingCasesResultingFromContacts = "headingCasesResultingFromContacts"; @@ -459,6 +460,7 @@ public interface Strings { String headingContactsDeleted = "headingContactsDeleted"; String headingContactsInQuarantine = "headingContactsInQuarantine"; String headingContactsLostToFollowUp = "headingContactsLostToFollowUp"; + String headingContactsNotDeleted = "headingContactsNotDeleted"; String headingContactsPerCase = "headingContactsPerCase"; String headingContactsPlacedInQuarantine = "headingContactsPlacedInQuarantine"; String headingContactsRestored = "headingContactsRestored"; @@ -555,8 +557,10 @@ public interface Strings { String headingEventNotDeleted = "headingEventNotDeleted"; String headingEventParticipantResponsibleJurisdictionUpdated = "headingEventParticipantResponsibleJurisdictionUpdated"; String headingEventParticipantsDeleted = "headingEventParticipantsDeleted"; + String headingEventParticipantsNotDeleted = "headingEventParticipantsNotDeleted"; String headingEventParticipantsRestored = "headingEventParticipantsRestored"; String headingEventsDeleted = "headingEventsDeleted"; + String headingEventsNotDeleted = "headingEventsNotDeleted"; String headingEventsRestored = "headingEventsRestored"; String headingExplanationOfTerms = "headingExplanationOfTerms"; String headingExportFailed = "headingExportFailed"; @@ -572,6 +576,7 @@ public interface Strings { String headingExternalMessageProcessSample = "headingExternalMessageProcessSample"; String headingExternalMessageSampleInformation = "headingExternalMessageSampleInformation"; String headingExternalMessagesDeleted = "headingExternalMessagesDeleted"; + String headingExternalMessagesNotDeleted = "headingExternalMessagesNotDeleted"; String headingFatalities = "headingFatalities"; String headingFetchExternalMessages = "headingFetchExternalMessages"; String headingFileExists = "headingFileExists"; @@ -703,6 +708,7 @@ public interface Strings { String headingSampleDashboardEpiCurve = "headingSampleDashboardEpiCurve"; String headingSampleDashboardMap = "headingSampleDashboardMap"; String headingSamplesDeleted = "headingSamplesDeleted"; + String headingSamplesNotDeleted = "headingSamplesNotDeleted"; String headingSamplesRestored = "headingSamplesRestored"; String headingSaveNotification = "headingSaveNotification"; String headingSaveUser = "headingSaveUser"; @@ -746,10 +752,12 @@ public interface Strings { String headingSymptomJournalAccountCreation = "headingSymptomJournalAccountCreation"; String headingSyncUsers = "headingSyncUsers"; String headingTasksDeleted = "headingTasksDeleted"; + String headingTasksNotDeleted = "headingTasksNotDeleted"; String headingTemplateNotAvailable = "headingTemplateNotAvailable"; String headingTests = "headingTests"; String headingTransferCase = "headingTransferCase"; String headingTravelEntriesDeleted = "headingTravelEntriesDeleted"; + String headingTravelEntriesNotDeleted = "headingTravelEntriesNotDeleted"; String headingTravelEntriesRestored = "headingTravelEntriesRestored"; String headingTravelEntryData = "headingTravelEntryData"; String headingTreatments = "headingTreatments"; @@ -781,6 +789,7 @@ public interface Strings { String headingViewVisit = "headingViewVisit"; String headingVisits = "headingVisits"; String headingVisitsDeleted = "headingVisitsDeleted"; + String headingVisitsNotDeleted = "headingVisitsNotDeleted"; String headingVisualization = "headingVisualization"; String headingWaterUse = "headingWaterUse"; String headingWrongFileType = "headingWrongFileType"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index c0acc1cf256..359029e3206 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -439,6 +439,7 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide: Case Directory @@ -460,6 +461,7 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,9 +533,11 @@ headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotDeleted = None of the events were deleted headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -637,6 +641,7 @@ headingRequestedPathogenTests = Requested pathogen tests: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -646,11 +651,13 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -670,6 +677,7 @@ headingViewVaccination = View vaccination headingViewVisit = View visit headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotDeleted = None of the visits were deleted headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -761,6 +769,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index c7406e17937..2bfd3e2ad17 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2671,27 +2671,34 @@ public List delete(List uuids, DeletionDetails deletion List casesToBeDeleted = service.getByUuids(uuids); if (casesToBeDeleted != null) { - for (int i = 0; i < casesToBeDeleted.size(); i++) { - Case caseToBeDeleted = casesToBeDeleted.get(i); + casesToBeDeleted.forEach(caseToBeDeleted -> { if (!caseToBeDeleted.isDeleted()) { try { deleteCase(caseToBeDeleted, deletionDetails); processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (ExternalSurveillanceToolRuntimeException e) { processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + logger.error( + "The case with uuid {} could not be deleted due to a ExternalSurveillanceToolRuntimeException", + caseToBeDeleted.getUuid(), + e); } catch (SormasToSormasRuntimeException e) { processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); + logger.error( + "The case with uuid {} could not be deleted due to a SormasToSormasRuntimeException", + caseToBeDeleted.getUuid(), + e); } catch (AccessDeniedException e) { processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The case with uuid {} could not be deleted due to a AccessDeniedException", caseToBeDeleted.getUuid(), e); } catch (Exception e) { processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - //TODO: check if we still need the logger or every exception will be logged when is thrown + logger.error("The case with uuid {} could not be deleted due to an Exception", caseToBeDeleted.getUuid(), e); } - //logger.error("The case with uuid {} could not be deleted", caseToBeDeleted.getUuid(), e); } - } - // } + }); } + //if the cases with exceptions will not be sent back will be noted as skipped -> check if we can update the skipped indicator based on status return processedCases; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index 42d2000ada5..d6902f65b25 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -111,6 +111,7 @@ import de.symeda.sormas.api.exposure.ExposureType; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; +import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolRuntimeException; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.followup.FollowUpDto; @@ -562,18 +563,36 @@ public void delete(String contactUuid, DeletionDetails deletionDetails) { public List delete(List uuids, DeletionDetails deletionDetails) { List processedContacts = new ArrayList<>(); List contactsToBeDeleted = service.getByUuids(uuids); + if (contactsToBeDeleted != null) { contactsToBeDeleted.forEach(contactToBeDeleted -> { if (!contactToBeDeleted.isDeleted()) { try { deleteContact(contactToBeDeleted, deletionDetails); processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (ExternalSurveillanceToolRuntimeException e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + logger.error( + "The contact with uuid {} could not be deleted due to a ExternalSurveillanceToolRuntimeException", + contactToBeDeleted.getUuid(), + e); + } catch (SormasToSormasRuntimeException e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); + logger.error( + "The contact with uuid {} could not be deleted due to a SormasToSormasRuntimeException", + contactToBeDeleted.getUuid(), + e); } catch (AccessDeniedException e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The contact with uuid {} could not be deleted due to a AccessDeniedException", contactToBeDeleted.getUuid(), e); + } catch (Exception e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The contact with uuid {} could not be deleted", contactToBeDeleted.getUuid(), e); } } }); } + return processedContacts; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 635ed485078..445a8844b92 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -354,8 +354,24 @@ public List delete(List uuids, DeletionDetails deletion try { deleteEvent(eventToBeDeleted, deletionDetails); processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); - } catch (ExternalSurveillanceToolRuntimeException | SormasToSormasRuntimeException | AccessDeniedException e) { - logger.error("The event with uuid:" + eventToBeDeleted.getUuid() + "could not be deleted"); + } catch (ExternalSurveillanceToolRuntimeException e) { + processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + logger.error( + "The event with uuid {} could not be deleted due to a ExternalSurveillanceToolRuntimeException", + eventToBeDeleted.getUuid(), + e); + } catch (SormasToSormasRuntimeException e) { + processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); + logger.error( + "The event with uuid {} could not be deleted due to a SormasToSormasRuntimeException", + eventToBeDeleted.getUuid(), + e); + } catch (AccessDeniedException e) { + processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The event with uuid {} could not be deleted due to a AccessDeniedException", eventToBeDeleted.getUuid(), e); + } catch (Exception e) { + processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The event with uuid {} could not be deleted due to an Exception", eventToBeDeleted.getUuid(), e); } } }); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java index 8278a3d5be7..4d40083fd70 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java @@ -254,7 +254,7 @@ private void sendDeleteRequest(DeleteParameters params) throws ExternalSurveilla try { response = request.post(Entity.json(params)); } catch (Exception e) { - //logger.error("Failed to send delete request to external surveillance tool", e); + logger.error("Failed to send delete request to external surveillance tool", e); throw new ExternalSurveillanceToolException(I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorDeleting)); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index 4f843526edf..f05e4ebcedb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -224,6 +224,7 @@ private BulkOperationHandler createBulkOperationHandler(I null, null, null, + null, forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), null, Strings.infoBulkProcessFinishedWithSkips); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 57555ca5112..59ae349d830 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -37,6 +37,7 @@ public class BulkOperationHandler { * Amount of DTOs that are forwarded to the backend in one single call * when displaying a progress layout. */ + //TODO: change back this public static final int BULK_ACTION_BATCH_SIZE = 5; /** * Amount of DTOs that have to be selected for the progress layout to be displayed. @@ -53,11 +54,11 @@ public class BulkOperationHandler { private final String allEntriesProcessedMessageProperty; private final String ineligibleEntriesNotProcessedMessageProperty; private final String headingSomeEntitiesNotProcessed; - private final String countEntriesNotProcessedMessageProperty; + private final String headingNoProcessedEntities; + private final String countEntriesNotProcessedMessageProperty; private final String countEntriesNotProcessedExternalReasonProperty; private final String countEntriesNotProcessedSormasToSormasReasonProperty; - private final String someEntriesProcessedMessageProperty; private final String noEligibleEntityMessageProperty; private final String infoBulkProcessFinishedWithSkipsProperty; @@ -66,28 +67,27 @@ public BulkOperationHandler( String allEntriesProcessedMessageProperty, String ineligibleEntriesNotProcessedMessageProperty, String headingSomeEntitiesNotProcessed, + String headingNoProcessedEntities, String countEntriesNotProcessedMessageProperty, - String countEntriesNotProcessedExternalReasonProperty, String countEntriesNotProcessedSormasToSormasReasonProperty, - String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, String infoBulkProcessFinishedWithSkipsProperty) { + this.allEntriesProcessedMessageProperty = allEntriesProcessedMessageProperty; this.ineligibleEntriesNotProcessedMessageProperty = ineligibleEntriesNotProcessedMessageProperty; this.headingSomeEntitiesNotProcessed = headingSomeEntitiesNotProcessed; + this.headingNoProcessedEntities = headingNoProcessedEntities; this.countEntriesNotProcessedMessageProperty = countEntriesNotProcessedMessageProperty; - this.countEntriesNotProcessedExternalReasonProperty = countEntriesNotProcessedExternalReasonProperty; this.countEntriesNotProcessedSormasToSormasReasonProperty = countEntriesNotProcessedSormasToSormasReasonProperty; - this.someEntriesProcessedMessageProperty = someEntriesProcessedMessageProperty; this.noEligibleEntityMessageProperty = noEligibleEntityMessageProperty; this.infoBulkProcessFinishedWithSkipsProperty = infoBulkProcessFinishedWithSkipsProperty; } - //TODO: check if the 2 newly added fields can have value for bulk edit + //TODO: check if the 3 newly added fields can have value for bulk edit public static BulkOperationHandler forBulkEdit() { return new BulkOperationHandler( Strings.messageEntriesEdited, @@ -96,6 +96,7 @@ public static BulkOperationHandler forBulkEdit() { null, null, null, + null, Strings.messageEntriesEditedExceptArchived, null, Strings.infoBulkProcessFinishedWithSkips); @@ -108,6 +109,7 @@ public void doBulkOperation( List selectedIneligibleEntries, Consumer> bulkOperationDoneCallback) { + //TODO: these will be deleted initialEntryCount = selectedEntries.size(); initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); selectedEligibleEntries = !areIneligibleEntriesSelected(selectedIneligibleEntries) ? selectedEntries : selectedEligibleEntries; @@ -227,16 +229,16 @@ public void processEntriesWithoutProgressBar( processedEntities = areIneligibleEntriesSelected ? bulkOperationFunction.apply(selectedEligibleEntries) : bulkOperationFunction.apply(selectedEntries); - successfulEntryCount = processedEntities.stream() - .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) - .collect(Collectors.toList()) - .size(); - } - - //If the user does not have the proper rights to perform the action, there will be no processed entities - if (processedEntities.size() == 0 && initialEligibleEntryCount > 0) { - NotificationHelper.showNotification(I18nProperties.getString(Strings.errorForbidden), Notification.Type.WARNING_MESSAGE, -1); - return; + //If the user does not have the proper rights to perform the action, there will be no processed entities + if (processedEntities.size() == 0) { + NotificationHelper.showNotification(I18nProperties.getString(Strings.errorForbidden), Notification.Type.WARNING_MESSAGE, -1); + return; + } else { + successfulEntryCount = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .collect(Collectors.toList()) + .size(); + } } if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { @@ -245,28 +247,28 @@ public void processEntriesWithoutProgressBar( return; } - /* - * if (successfulEntryCount > 0) { - * //change some cases were not deleted to none of the cases were deleted? - * } else { - * } - */ + String ineligibleEntriesDescription = StringUtils.EMPTY; + if (areIneligibleEntriesSelected) { + ineligibleEntriesDescription = getErrorDescription( + selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), + I18nProperties.getString(countEntriesNotProcessedMessageProperty), + I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty)); + } + + String heading = successfulEntryCount > 0 + ? I18nProperties.getString(headingSomeEntitiesNotProcessed) + : I18nProperties.getString(headingNoProcessedEntities); + if (initialEligibleEntryCount > successfulEntryCount) { - String description = buildDescription(processedEntities); - Window response = - VaadinUiUtil.showSimplePopupWindow(I18nProperties.getString(headingSomeEntitiesNotProcessed), description, ContentMode.HTML); + String description = areIneligibleEntriesSelected + ? ineligibleEntriesDescription.concat(buildDescription(processedEntities)) + : buildDescription(processedEntities); + Window response = VaadinUiUtil.showSimplePopupWindow(heading, description, ContentMode.HTML); response.setWidth(600, Sizeable.Unit.PIXELS); } else { - if (areIneligibleEntriesSelected(selectedIneligibleEntries)) { - String description = getErrorDescription( - selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), - I18nProperties.getString(countEntriesNotProcessedMessageProperty), - I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty)); - - Window response = - VaadinUiUtil.showSimplePopupWindow(I18nProperties.getString(headingSomeEntitiesNotProcessed), description, ContentMode.HTML); - + if (areIneligibleEntriesSelected) { + Window response = VaadinUiUtil.showSimplePopupWindow(heading, ineligibleEntriesDescription, ContentMode.HTML); response.setWidth(600, Sizeable.Unit.PIXELS); } else { //all the selected eligible entities were processed diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index 5848a8b097e..e95390b4bf0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -131,6 +131,8 @@ private BulkOperationHandler createBulkOperationHandler(I forDelete ? deleteRestoreMessages.getMessageEntitiesDeleted() : deleteRestoreMessages.getMessageEntitiesRestored(), forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeletedLinkedEntitiesReason() : null, forDelete ? deleteRestoreMessages.getHeadingSomeEntitiesNotDeleted() : deleteRestoreMessages.getHeadingSomeEntitiesNotRestored(), + + forDelete ? deleteRestoreMessages.getHeadingEntitiesNotDeleted() : null, forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeleted() : deleteRestoreMessages.getMessageCountEntitiesNotRestored(), //TODO: if the values are needed for Restore too diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java index a482b24c715..ecb603038d6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java @@ -90,13 +90,13 @@ public void delete(String uuid, DeletionDetails deletionDetails) { @Override public List delete(List uuids, DeletionDetails deletionDetails) { List deletedEntities = new ArrayList(); + //TODO: check if try-catch is needed here try { deletedEntities = entityFacade.delete(uuids, deletionDetails); } catch (Exception e) { } - //return deletedEntities.size(); return deletedEntities; } @@ -211,7 +211,6 @@ private PermanentDeleteHandler(F entityFacade, DeleteRestoreMessages deleteResto @Override public List delete(List uuids) { List processedEntities = entityFacade.delete(uuids); - //return uuids.size(); return processedEntities; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index c966272441f..4fda8fab259 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -12,6 +12,7 @@ public enum DeleteRestoreMessages { null, Strings.headingCasesDeleted, Strings.messageCasesDeleted, + Strings.headingCasesNotDeleted, Strings.messageCasesNotDeleted, Strings.messageCountCasesNotDeletedExternalReason, Strings.messageCountCasesNotDeletedSormasToSormasReason, @@ -31,6 +32,7 @@ public enum DeleteRestoreMessages { null, Strings.headingEventsDeleted, Strings.messageEventsDeleted, + Strings.headingEventsNotDeleted, Strings.messageEventsNotDeleted, Strings.messageCountEventsNotDeletedExternalReason, Strings.messageCountContactsNotDeletedSormasToSormasReason, @@ -50,6 +52,7 @@ public enum DeleteRestoreMessages { null, Strings.headingEventParticipantsDeleted, Strings.messageEventParticipantsDeleted, + Strings.headingEventParticipantsNotDeleted, Strings.messageEventParticipantsNotDeleted, null, null, @@ -69,6 +72,7 @@ public enum DeleteRestoreMessages { null, Strings.headingContactsDeleted, Strings.messageContactsDeleted, + Strings.headingContactsNotDeleted, Strings.messageContactsNotDeleted, null, Strings.messageCountContactsNotDeletedSormasToSormasReason, @@ -88,6 +92,7 @@ public enum DeleteRestoreMessages { null, Strings.headingTravelEntriesDeleted, Strings.messageTravelEntriesDeleted, + Strings.headingTravelEntriesNotDeleted, Strings.messageTravelEntriesNotDeleted, null, null, @@ -107,6 +112,7 @@ public enum DeleteRestoreMessages { null, Strings.headingVisitsDeleted, Strings.messageVisitsDeleted, + Strings.headingVisitsNotDeleted, Strings.messageVisitsNotDeleted, null, null, @@ -126,6 +132,7 @@ public enum DeleteRestoreMessages { null, Strings.headingTasksDeleted, Strings.messageTasksDeleted, + Strings.headingTasksNotDeleted, Strings.messageTasksNotDeleted, null, null, @@ -145,6 +152,7 @@ public enum DeleteRestoreMessages { Strings.messageExternalMessagesEligibleForDeletion, Strings.headingExternalMessagesDeleted, Strings.messageExternalMessagesDeleted, + Strings.headingExternalMessagesNotDeleted, Strings.messageExternalMessagesNotDeleted, null, null, @@ -164,6 +172,7 @@ public enum DeleteRestoreMessages { null, Strings.headingSamplesDeleted, Strings.messageSamplesDeleted, + Strings.headingSamplesNotDeleted, Strings.messageSamplesNotDeleted, null, null, @@ -189,6 +198,7 @@ public enum DeleteRestoreMessages { null, null, null, + null, Strings.headingImmunizationsRestored, Strings.messageImmunizationsRestored, Strings.messageImmunizationsNotRestored, @@ -202,6 +212,9 @@ public enum DeleteRestoreMessages { private final String messageEntitiesEligibleForDeletion; private final String headingEntitiesDeleted; private final String messageEntitiesDeleted; + private final String headingEntitiesNotDeleted; + //TODO: check for restore too the above label + private final String messageEntitiesNotDeleted; private final String messageCountEntitiesNotDeletedExternalReason; private final String messageCountEntitiesNotDeletedSormasToSormasReason; @@ -222,6 +235,8 @@ public enum DeleteRestoreMessages { String messageEntitiesEligibleForDeletion, String headingEntitiesDeleted, String messageEntitiesDeleted, + + String headingEntitiesNotDeleted, String messageEntitiesNotDeleted, String messageCountEntitiesNotDeletedExternalReason, String messageCountEntitiesNotDeletedSormasToSormasReason, @@ -241,6 +256,8 @@ public enum DeleteRestoreMessages { this.messageEntitiesEligibleForDeletion = messageEntitiesEligibleForDeletion; this.headingEntitiesDeleted = headingEntitiesDeleted; this.messageEntitiesDeleted = messageEntitiesDeleted; + + this.headingEntitiesNotDeleted = headingEntitiesNotDeleted; this.messageEntitiesNotDeleted = messageEntitiesNotDeleted; this.messageCountEntitiesNotDeletedExternalReason = messageCountEntitiesNotDeletedExternalReason; this.messageCountEntitiesNotDeletedSormasToSormasReason = messageCountEntitiesNotDeletedSormasToSormasReason; @@ -282,6 +299,10 @@ public String getMessageEntitiesDeleted() { return messageEntitiesDeleted; } + public String getHeadingEntitiesNotDeleted() { + return headingEntitiesNotDeleted; + } + public String getMessageEntitiesNotDeleted() { return messageEntitiesNotDeleted; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index 8159941b293..387b9ab5210 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -91,10 +91,11 @@ private BulkOperationHandler createBulkOperationHandler(I return new BulkOperationHandler<>( deleteRestoreMessages.getMessageEntitiesDeleted(), null, - null, deleteRestoreMessages.getHeadingSomeEntitiesNotDeleted(), + deleteRestoreMessages.getHeadingEntitiesNotDeleted(), deleteRestoreMessages.getMessageCountEntitiesNotDeleted(), null, + null, deleteRestoreMessages.getMessageEntitiesNotDeleted(), null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java index 758cbd3f5af..dc4f11414c8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/ProgressResult.java @@ -19,22 +19,6 @@ public enum ProgressResult { SUCCESS, SUCCESS_WITH_WARNING, - /** - * ExternalSurveillanceToolRuntimeException was thrown during the processing of the entity - */ - EXTERNAL_SURVEILLANCE_FAILURE, - /** - * SormasToSormasRuntimeException was thrown during the processing of the entity - */ - SORMAS_TO_SORMAS_FAILURE, - /** - * AccessDeniedException was thrown during the processing of the entity - */ - ACCESS_DENIED_FAILURE, - MISSING_USER_RIGHTS, - /** - * A general exception was thrown during the processing of the entity - */ FAILURE; } From 0c2e193c00e2f9d3902c4c0ce55665e94d55aa39 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 24 Jul 2023 10:07:02 +0300 Subject: [PATCH 004/144] #12257 - introduce List were is missing --- .../event/EventParticipantFacadeEjb.java | 33 ++++++++++++------- .../ExternalMessageFacadeEjb.java | 7 +++- .../immunization/ImmunizationFacadeEjb.java | 12 ++++--- .../backend/sample/SampleFacadeEjb.java | 17 +++++++--- .../sormas/backend/task/TaskFacadeEjb.java | 3 +- .../travelentry/TravelEntryFacadeEjb.java | 8 +++++ .../sormas/backend/visit/VisitFacadeEjb.java | 10 ++++-- .../backend/caze/CaseFacadeEjbTest.java | 1 + .../backend/contact/ContactFacadeEjbTest.java | 1 + 9 files changed, 66 insertions(+), 26 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index 6caf7a86896..4ae465a7242 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -68,6 +68,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventParticipantCriteria; import de.symeda.sormas.api.event.EventParticipantDto; @@ -517,18 +518,26 @@ public List delete(List uuids, DeletionDetails deletion List eventParticipantsToBeDeleted = service.getByUuids(uuids); if (eventParticipantsToBeDeleted != null) { - /* - * eventParticipantsToBeDeleted.forEach(eventParticipantToBeDeleted -> { - * if (!eventParticipantToBeDeleted.isDeleted()) { - * try { - * delete(eventParticipantToBeDeleted.getUuid(), deletionDetails); - * deletedEventParticipantUuids.add(eventParticipantToBeDeleted.getUuid()); - * } catch (Exception e) { - * logger.error("The event participant with uuid:" + eventParticipantToBeDeleted.getUuid() + "could not be deleted"); - * } - * } - * }); - */ + eventParticipantsToBeDeleted.forEach(eventParticipantToBeDeleted -> { + if (!eventParticipantToBeDeleted.isDeleted()) { + try { + delete(eventParticipantToBeDeleted.getUuid(), deletionDetails); + processedEventParticipants.add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEventParticipants + .add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error( + "The event participant with uuid {} could not be deleted due to a AccessDeniedException", + eventParticipantToBeDeleted.getUuid(), + e); + } catch (Exception e) { + processedEventParticipants + .add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error( + "The event participant with uuid:" + eventParticipantToBeDeleted.getUuid() + "could not be deleted due to an Exception"); + } + } + }); } return processedEventParticipants; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java index 501722ec833..fe0bc04dc18 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java @@ -347,7 +347,12 @@ public List delete(List uuids) { externalMessageService.deletePermanent(externalMessageToBeDeleted); processedExternalMessages.add(new ProcessedEntity(externalMessageToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The external message with uuid:" + externalMessageToBeDeleted.getUuid() + "could not be deleted"); + processedExternalMessages + .add(new ProcessedEntity(externalMessageToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error( + "The external message with uuid {} could not be deleted due to an Exception", + externalMessageToBeDeleted.getUuid(), + e); } } }); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java index 43b522fb050..94253bff236 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java @@ -313,13 +313,17 @@ public void delete(String uuid, DeletionDetails deletionDetails) { @RightsAllowed(UserRight._IMMUNIZATION_DELETE) public List delete(List uuids, DeletionDetails deletionDetails) { List processedImmunizations = new ArrayList<>(); - - List deletedImmunizationUuids = new ArrayList<>(); List immunizationsToBeDeleted = service.getByUuids(uuids); + if (immunizationsToBeDeleted != null) { immunizationsToBeDeleted.forEach(immunizationToBeDeleted -> { - service.delete(immunizationToBeDeleted, deletionDetails); - processedImmunizations.add(new ProcessedEntity(immunizationToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + try { + service.delete(immunizationToBeDeleted, deletionDetails); + processedImmunizations.add(new ProcessedEntity(immunizationToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (Exception e) { + processedImmunizations.add(new ProcessedEntity(immunizationToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The immunization with uuid {} could not be deleted due to an Exception", immunizationToBeDeleted.getUuid(), e); + } }); } return processedImmunizations; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index 7f8e0aa154b..183c212b65f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -796,14 +796,21 @@ public void restore(String sampleUuid) { public List delete(List sampleUuids, DeletionDetails deletionDetails) { long startTime = DateHelper.startTime(); - //TODO: fix this implementation - List processedEntities = new ArrayList<>(); - + List processedSamples = new ArrayList<>(); IterableHelper .executeBatched(sampleUuids, DELETED_BATCH_SIZE, batchedSampleUuids -> sampleService.deleteAll(batchedSampleUuids, deletionDetails)); logger.debug("deleteAllSamples(sampleUuids) finished. samplesCount = {}, {}ms", sampleUuids.size(), DateHelper.durationMillies(startTime)); - //return sampleUuids; - return processedEntities; + + List samplesList = getByUuids(sampleUuids); + for (SampleDto sample : samplesList) { + if (sample.isDeleted()) { + processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.SUCCESS)); + } else { + processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + } + } + + return processedSamples; } @RightsAllowed(UserRight._SAMPLE_DELETE) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index b5636ac8612..daae2e6119d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -941,7 +941,8 @@ public List delete(List uuids) { taskService.deletePermanent(taskToBeDeleted); processedTasks.add(new ProcessedEntity(taskToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The task with uuid:" + taskToBeDeleted.getUuid() + "could not be deleted"); + processedTasks.add(new ProcessedEntity(taskToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The task with uuid {} could not be deleted due to an Exception", taskToBeDeleted.getUuid(), e); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index 7624e1f234d..eb806088e12 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -141,7 +141,15 @@ public List delete(List uuids, DeletionDetails deletion try { delete(travelEntryToBeDeleted.getUuid(), deletionDetails); processedTravelEntries.add(new ProcessedEntity(travelEntryToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedTravelEntries + .add(new ProcessedEntity(travelEntryToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error( + "The travel entry with uuid {} could not be deleted due to an AccessDeniedException", + travelEntryToBeDeleted.getUuid(), + e); } catch (Exception e) { + processedTravelEntries.add(new ProcessedEntity(travelEntryToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The travel entry with uuid:" + travelEntryToBeDeleted.getUuid() + "could not be deleted"); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java index c8d65423eb8..20664aed343 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java @@ -66,6 +66,7 @@ import de.symeda.sormas.api.user.NotificationType; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.SortProperty; @@ -324,8 +325,7 @@ public void validate(VisitDto visit, Date allowedStartDate, Date allowedEndDate) @RightsAllowed(UserRight._VISIT_DELETE) public void delete(String uuid) { if (!userService.hasRight(UserRight.VISIT_DELETE)) { - throw new UnsupportedOperationException( - String.format("User %s is not allowed to delete visits.", userService.getCurrentUser().getUuid())); + throw new AccessDeniedException(String.format("User %s is not allowed to delete visits.", userService.getCurrentUser().getUuid())); } Visit visit = service.getByUuid(uuid); service.deletePermanent(visit); @@ -342,8 +342,12 @@ public List delete(List uuids) { try { delete(visitToBeDeleted.getUuid()); processedVisits.add(new ProcessedEntity(visitToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedVisits.add(new ProcessedEntity(visitToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The visit with uuid {} could not be deleted due to a AccessDeniedException", visitToBeDeleted.getUuid(), e); } catch (Exception e) { - logger.error("The visit with uuid:" + visitToBeDeleted.getUuid() + "could not be deleted"); + processedVisits.add(new ProcessedEntity(visitToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The visit with uuid {} could not be deleted due to an Exception", visitToBeDeleted.getUuid(), e); } }); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java index 1b1df9d80f6..757d0118a2a 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java @@ -2815,6 +2815,7 @@ public void testDeleteWithContacts() { assertEquals("test reason", getCaseFacade().getByUuid(caze.getUuid()).getOtherDeletionReason()); } + //TODO: fis this one @Test public void testDeleteCasesOutsideJurisdiction() { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java index aa9e3daaec6..9a473d97809 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java @@ -332,6 +332,7 @@ public void testContactFollowUpStatusCanceledWhenContactConvertedToCase() { assertEquals(FollowUpStatus.CANCELED, contact.getFollowUpStatus()); } + //TODO: fix this tests @Test public void testDeleteContactsOutsideJurisdiction() { RDCF rdcf = creator.createRDCF(); From be9da737cfb24e03258a12571467f4477634a55b Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 24 Jul 2023 12:25:27 +0300 Subject: [PATCH 005/144] #12257 - exception handling for restore --- .../de/symeda/sormas/api/i18n/Strings.java | 11 +++++++ .../src/main/resources/strings.properties | 11 +++++++ .../sormas/backend/caze/CaseFacadeEjb.java | 3 +- .../backend/contact/ContactFacadeEjb.java | 3 +- .../sormas/backend/event/EventFacadeEjb.java | 4 +-- .../event/EventParticipantFacadeEjb.java | 27 +++++++++------- .../immunization/ImmunizationFacadeEjb.java | 3 +- .../backend/sample/SampleFacadeEjb.java | 3 +- .../sormas/backend/task/TaskFacadeEjb.java | 3 +- .../travelentry/TravelEntryFacadeEjb.java | 3 +- .../sormas/ui/utils/BulkOperationHandler.java | 1 - .../ui/utils/DeleteRestoreController.java | 6 +--- .../ui/utils/DeleteRestoreMessages.java | 31 ++++++++++++++----- 13 files changed, 75 insertions(+), 34 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index e88cfba04c8..615feb3f9a2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -424,6 +424,7 @@ public interface Strings { String headingCasesGuide = "headingCasesGuide"; String headingCasesInQuarantine = "headingCasesInQuarantine"; String headingCasesNotDeleted = "headingCasesNotDeleted"; + String headingCasesNotRestored = "headingCasesNotRestored"; String headingCasesPlacedInQuarantine = "headingCasesPlacedInQuarantine"; String headingCasesRestored = "headingCasesRestored"; String headingCasesResultingFromContacts = "headingCasesResultingFromContacts"; @@ -461,6 +462,7 @@ public interface Strings { String headingContactsInQuarantine = "headingContactsInQuarantine"; String headingContactsLostToFollowUp = "headingContactsLostToFollowUp"; String headingContactsNotDeleted = "headingContactsNotDeleted"; + String headingContactsNotRestored = "headingContactsNotRestored"; String headingContactsPerCase = "headingContactsPerCase"; String headingContactsPlacedInQuarantine = "headingContactsPlacedInQuarantine"; String headingContactsRestored = "headingContactsRestored"; @@ -558,9 +560,11 @@ public interface Strings { String headingEventParticipantResponsibleJurisdictionUpdated = "headingEventParticipantResponsibleJurisdictionUpdated"; String headingEventParticipantsDeleted = "headingEventParticipantsDeleted"; String headingEventParticipantsNotDeleted = "headingEventParticipantsNotDeleted"; + String headingEventParticipantsNotRestored = "headingEventParticipantsNotRestored"; String headingEventParticipantsRestored = "headingEventParticipantsRestored"; String headingEventsDeleted = "headingEventsDeleted"; String headingEventsNotDeleted = "headingEventsNotDeleted"; + String headingEventsNotRestored = "headingEventsNotRestored"; String headingEventsRestored = "headingEventsRestored"; String headingExplanationOfTerms = "headingExplanationOfTerms"; String headingExportFailed = "headingExportFailed"; @@ -590,6 +594,9 @@ public interface Strings { String headingHospitalization = "headingHospitalization"; String headingHowToMergeCases = "headingHowToMergeCases"; String headingHowToMergeContacts = "headingHowToMergeContacts"; + String headingImmunizationsDeleted = "headingImmunizationsDeleted"; + String headingImmunizationsNotDeleted = "headingImmunizationsNotDeleted"; + String headingImmunizationsNotRestored = "headingImmunizationsNotRestored"; String headingImmunizationsRestored = "headingImmunizationsRestored"; String headingImportAllContinents = "headingImportAllContinents"; String headingImportAllCountries = "headingImportAllCountries"; @@ -709,6 +716,7 @@ public interface Strings { String headingSampleDashboardMap = "headingSampleDashboardMap"; String headingSamplesDeleted = "headingSamplesDeleted"; String headingSamplesNotDeleted = "headingSamplesNotDeleted"; + String headingSamplesNotRestored = "headingSamplesNotRestored"; String headingSamplesRestored = "headingSamplesRestored"; String headingSaveNotification = "headingSaveNotification"; String headingSaveUser = "headingSaveUser"; @@ -736,6 +744,7 @@ public interface Strings { String headingSomeEventsNotDeleted = "headingSomeEventsNotDeleted"; String headingSomeEventsNotRestored = "headingSomeEventsNotRestored"; String headingSomeExternalMessagesNotDeleted = "headingSomeExternalMessagesNotDeleted"; + String headingSomeImmunizationsNotDeleted = "headingSomeImmunizationsNotDeleted"; String headingSomeImmunizationsNotRestored = "headingSomeImmunizationsNotRestored"; String headingSomeSamplesNotDeleted = "headingSomeSamplesNotDeleted"; String headingSomeSamplesNotRestored = "headingSomeSamplesNotRestored"; @@ -758,6 +767,7 @@ public interface Strings { String headingTransferCase = "headingTransferCase"; String headingTravelEntriesDeleted = "headingTravelEntriesDeleted"; String headingTravelEntriesNotDeleted = "headingTravelEntriesNotDeleted"; + String headingTravelEntriesNotRestored = "headingTravelEntriesNotRestored"; String headingTravelEntriesRestored = "headingTravelEntriesRestored"; String headingTravelEntryData = "headingTravelEntryData"; String headingTreatments = "headingTreatments"; @@ -1123,6 +1133,7 @@ public interface Strings { String messageCountEventsNotDeletedSormasToSormasReason = "messageCountEventsNotDeletedSormasToSormasReason"; String messageCountEventsNotRestored = "messageCountEventsNotRestored"; String messageCountExternalMessagesNotDeleted = "messageCountExternalMessagesNotDeleted"; + String messageCountImmunizationsNotDeleted = "messageCountImmunizationsNotDeleted"; String messageCountImmunizationsNotRestored = "messageCountImmunizationsNotRestored"; String messageCountriesArchived = "messageCountriesArchived"; String messageCountriesDearchived = "messageCountriesDearchived"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 359029e3206..971c8c84c44 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -440,6 +440,7 @@ headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide: Case Directory @@ -462,6 +463,7 @@ headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotRestored = = None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -534,10 +536,12 @@ headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -642,6 +646,7 @@ headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -658,6 +663,7 @@ headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -709,6 +715,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations were deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -728,6 +737,7 @@ headingSomeContactsNotRestored = Some contacts were not restored headingSomeEventsNotRestored = Some events were not restored headingSomeEventParticipantsNotDeleted = Some event participants were not deleted headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeImmunizationsNotDeleted = Some immunizations were not deleted headingSomeImmunizationsNotRestored = Some immunizations were not restored headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored @@ -1152,6 +1162,7 @@ messageCountEventsNotRestored = %s events not restored. UUIDs of events not rest messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted. UUIDs of immunizations not deleted: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored: %s diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 2bfd3e2ad17..c93ae10db95 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2721,7 +2721,8 @@ public List restore(List uuids) { restore(caseToBeRestored.getUuid()); processedCases.add(new ProcessedEntity(caseToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The case with uuid {} could not be restored", caseToBeRestored.getUuid(), e); + processedCases.add(new ProcessedEntity(caseToBeRestored.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The case with uuid {} could not be restored due to an Exception", caseToBeRestored.getUuid(), e); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index d6902f65b25..42985da6eb3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -614,7 +614,8 @@ public List restore(List uuids) { restore(contactToBeRestored.getUuid()); processedContacts.add(new ProcessedEntity(contactToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The contact with uuid:" + contactToBeRestored.getUuid() + "could not be restored"); + processedContacts.add(new ProcessedEntity(contactToBeRestored.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The contact with uuid {} could not be restored due to an Exception", contactToBeRestored.getUuid(), e); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 445a8844b92..891cb52b577 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -389,7 +389,6 @@ public void restore(String uuid) { @RightsAllowed(UserRight._EVENT_DELETE) public List restore(List uuids) { List processedEvents = new ArrayList<>(); - List eventsToBeRestored = eventService.getByUuids(uuids); if (eventsToBeRestored != null) { @@ -398,7 +397,8 @@ public List restore(List uuids) { restore(eventToBeRestored.getUuid()); processedEvents.add(new ProcessedEntity(eventToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The event with uuid: " + eventToBeRestored.getUuid() + " could not be restored"); + processedEvents.add(new ProcessedEntity(eventToBeRestored.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The event with uuid {} could not be restored due to an Exception", eventToBeRestored.getUuid(), e); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index 4ae465a7242..5cc2bfd2cf6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -555,18 +555,21 @@ public List restore(List uuids) { List processedEventParticipants = new ArrayList<>(); List eventParticipantsToBeRestored = service.getByUuids(uuids); - /* - * if (eventParticipantsToBeRestored != null) { - * eventParticipantsToBeRestored.forEach(eventParticipantToBeRestored -> { - * try { - * restore(eventParticipantToBeRestored.getUuid()); - * restoredEventParticipantUuids.add(eventParticipantToBeRestored.getUuid()); - * } catch (Exception e) { - * logger.error("The event participant with uuid:" + eventParticipantToBeRestored.getUuid() + "could not be restored"); - * } - * }); - * } - */ + if (eventParticipantsToBeRestored != null) { + eventParticipantsToBeRestored.forEach(eventParticipantToBeRestored -> { + try { + restore(eventParticipantToBeRestored.getUuid()); + processedEventParticipants.add(new ProcessedEntity(eventParticipantToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (Exception e) { + processedEventParticipants + .add(new ProcessedEntity(eventParticipantToBeRestored.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error( + "The event participant with uuid {} could not be restored due to an Exception", + eventParticipantToBeRestored.getUuid(), + e); + } + }); + } return processedEventParticipants; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java index 94253bff236..b13c68b3cbe 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java @@ -347,7 +347,8 @@ public List restore(List uuids) { service.restore(immunizationToBeRestored); processedImmunizationUuids.add(new ProcessedEntity(immunizationToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The immunization with uuid:" + immunizationToBeRestored.getUuid() + "could not be restored"); + processedImmunizationUuids.add(new ProcessedEntity(immunizationToBeRestored.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The immunization with uuid {} could not be restored due to an Exception", immunizationToBeRestored.getUuid(), e); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index 183c212b65f..ab29e18e55d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -777,7 +777,8 @@ public List restore(List uuids) { restore(sampleToBeRestored.getUuid()); processedSamples.add(new ProcessedEntity(sampleToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The sample with uuid:" + sampleToBeRestored.getUuid() + "could not be restored"); + processedSamples.add(new ProcessedEntity(sampleToBeRestored.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The sample with uuid {} could not be restored due to an Exception", sampleToBeRestored.getUuid(), e); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index daae2e6119d..9ae3962e3ab 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -74,6 +74,7 @@ import de.symeda.sormas.api.user.NotificationType; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -922,7 +923,7 @@ public TaskDto getByUuid(String uuid) { @RightsAllowed(UserRight._TASK_DELETE) public void delete(String uuid) { if (!userService.hasRight(UserRight.TASK_DELETE)) { - throw new UnsupportedOperationException(String.format("User %s is not allowed to delete tasks.", userService.getCurrentUser().getUuid())); + throw new AccessDeniedException(String.format("User %s is not allowed to delete tasks.", userService.getCurrentUser().getUuid())); } Task task = taskService.getByUuid(uuid); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index eb806088e12..1b2ac303df9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -177,7 +177,8 @@ public List restore(List uuids) { restore(travelEntryToBeRestored.getUuid()); processedTravelEntries.add(new ProcessedEntity(travelEntryToBeRestored.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { - logger.error("The travel entry with uuid:" + travelEntryToBeRestored.getUuid() + "could not be restored"); + processedTravelEntries.add(new ProcessedEntity(travelEntryToBeRestored.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The travel entry with uuid {} could not be restored due to an Exception", travelEntryToBeRestored.getUuid(), e); } }); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 59ae349d830..85163a79199 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -55,7 +55,6 @@ public class BulkOperationHandler { private final String ineligibleEntriesNotProcessedMessageProperty; private final String headingSomeEntitiesNotProcessed; private final String headingNoProcessedEntities; - private final String countEntriesNotProcessedMessageProperty; private final String countEntriesNotProcessedExternalReasonProperty; private final String countEntriesNotProcessedSormasToSormasReasonProperty; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index e95390b4bf0..bcd71d5ed20 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -131,14 +131,10 @@ private BulkOperationHandler createBulkOperationHandler(I forDelete ? deleteRestoreMessages.getMessageEntitiesDeleted() : deleteRestoreMessages.getMessageEntitiesRestored(), forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeletedLinkedEntitiesReason() : null, forDelete ? deleteRestoreMessages.getHeadingSomeEntitiesNotDeleted() : deleteRestoreMessages.getHeadingSomeEntitiesNotRestored(), - - forDelete ? deleteRestoreMessages.getHeadingEntitiesNotDeleted() : null, + forDelete ? deleteRestoreMessages.getHeadingEntitiesNotDeleted() : deleteRestoreMessages.getHeadingEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeleted() : deleteRestoreMessages.getMessageCountEntitiesNotRestored(), - - //TODO: if the values are needed for Restore too forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedExternalReason() : null, forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedSormasToSormasReason() : null, - forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeleted() : deleteRestoreMessages.getMessageEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageNoEligibleEntitySelected() : null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index 4fda8fab259..5962dd4ebb0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -21,6 +21,7 @@ public enum DeleteRestoreMessages { Strings.messageCountCasesNotDeleted, Strings.headingCasesRestored, Strings.messageCasesRestored, + Strings.headingCasesNotRestored, Strings.messageCasesNotRestored, Strings.headingSomeCasesNotRestored, Strings.messageCountCasesNotRestored), @@ -41,6 +42,7 @@ public enum DeleteRestoreMessages { Strings.messageCountEventsNotDeleted, Strings.headingEventsRestored, Strings.messageEventsRestored, + Strings.headingEventsNotRestored, Strings.messageEventsNotRestored, Strings.headingSomeEventsNotRestored, Strings.messageCountEventsNotRestored), @@ -61,6 +63,7 @@ public enum DeleteRestoreMessages { Strings.messageCountEventParticipantsNotDeleted, Strings.headingEventParticipantsRestored, Strings.messageEventParticipantsRestored, + Strings.headingEventParticipantsNotRestored, Strings.messageEventParticipantsNotRestored, Strings.headingSomeEventParticipantsNotRestored, Strings.messageCountEventParticipantsNotRestored), @@ -81,6 +84,7 @@ public enum DeleteRestoreMessages { Strings.messageCountContactsNotDeleted, Strings.headingContactsRestored, Strings.messageContactsRestored, + Strings.headingContactsNotRestored, Strings.messageContactsNotRestored, Strings.headingSomeContactsNotRestored, Strings.messageCountContactsNotRestored), @@ -101,6 +105,7 @@ public enum DeleteRestoreMessages { Strings.messageCountTravelEntriesNotDeleted, Strings.headingTravelEntriesRestored, Strings.messageTravelEntriesRestored, + Strings.headingTravelEntriesNotRestored, Strings.messageTravelEntriesNotRestored, Strings.headingSomeTravelEntriesNotRestored, Strings.messageCountTravelEntriesNotRestored), @@ -123,6 +128,7 @@ public enum DeleteRestoreMessages { null, null, null, + null, null), TASK(Strings.entityTasks, @@ -143,6 +149,7 @@ public enum DeleteRestoreMessages { null, null, null, + null, null), EXTERNAL_MESSAGE(Strings.entityExternalMessages, @@ -163,6 +170,7 @@ public enum DeleteRestoreMessages { null, null, null, + null, null), SAMPLE(Strings.entitySamples, @@ -181,6 +189,7 @@ public enum DeleteRestoreMessages { Strings.messageCountSamplesNotDeleted, Strings.headingSamplesRestored, Strings.messageSamplesRestored, + Strings.headingSamplesNotRestored, Strings.messageSamplesNotRestored, Strings.headingSomeSamplesNotRestored, Strings.messageCountSamplesNotRestored), @@ -190,17 +199,18 @@ public enum DeleteRestoreMessages { Strings.messageNoImmunizationsSelected, null, null, + Strings.headingImmunizationsDeleted, + Strings.messageImmunizationsDeleted, + Strings.headingImmunizationsNotDeleted, + Strings.messageImmunizationsNotDeleted, null, null, null, - null, - null, - null, - null, - null, - null, + Strings.headingSomeImmunizationsNotDeleted, + Strings.messageCountImmunizationsNotDeleted, Strings.headingImmunizationsRestored, Strings.messageImmunizationsRestored, + Strings.headingImmunizationsNotRestored, Strings.messageImmunizationsNotRestored, Strings.headingSomeImmunizationsNotRestored, Strings.messageCountImmunizationsNotRestored); @@ -213,8 +223,6 @@ public enum DeleteRestoreMessages { private final String headingEntitiesDeleted; private final String messageEntitiesDeleted; private final String headingEntitiesNotDeleted; - //TODO: check for restore too the above label - private final String messageEntitiesNotDeleted; private final String messageCountEntitiesNotDeletedExternalReason; private final String messageCountEntitiesNotDeletedSormasToSormasReason; @@ -223,6 +231,7 @@ public enum DeleteRestoreMessages { private final String messageCountEntitiesNotDeleted; private final String headingEntitiesRestored; private final String messageEntitiesRestored; + private final String headingEntitiesNotRestored; private final String messageEntitiesNotRestored; private final String headingSomeEntitiesNotRestored; private final String messageCountEntitiesNotRestored; @@ -245,6 +254,7 @@ public enum DeleteRestoreMessages { String messageCountEntitiesNotDeleted, String headingEntitiesRestored, String messageEntitiesRestored, + String headingEntitiesNotRestored, String messageEntitiesNotRestored, String headingSomeEntitiesNotRestored, String messageCountEntitiesNotRestored) { @@ -266,6 +276,7 @@ public enum DeleteRestoreMessages { this.messageCountEntitiesNotDeleted = messageCountEntitiesNotDeleted; this.headingEntitiesRestored = headingEntitiesRestored; this.messageEntitiesRestored = messageEntitiesRestored; + this.headingEntitiesNotRestored = headingEntitiesNotRestored; this.messageEntitiesNotRestored = messageEntitiesNotRestored; this.headingSomeEntitiesNotRestored = headingSomeEntitiesNotRestored; this.messageCountEntitiesNotRestored = messageCountEntitiesNotRestored; @@ -335,6 +346,10 @@ public String getMessageEntitiesRestored() { return messageEntitiesRestored; } + public String getHeadingEntitiesNotRestored() { + return headingEntitiesNotRestored; + } + public String getMessageEntitiesNotRestored() { return messageEntitiesNotRestored; } From e9054ba27dc3f42e2e679d6c384fbe76da33513e Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 24 Jul 2023 16:34:57 +0300 Subject: [PATCH 006/144] #12257 - Do not display for tasks and visits the bulk actions if the user does not have the proper rights --- .../sormas/backend/caze/CaseFacadeEjb.java | 1 + .../immunization/ImmunizationFacadeEjb.java | 8 +++++++- .../sormas/backend/task/TaskFacadeEjb.java | 5 ++++- .../sormas/backend/visit/VisitFacadeEjb.java | 3 --- .../symeda/sormas/ui/caze/CaseVisitsView.java | 3 ++- .../sormas/ui/contact/ContactVisitsView.java | 3 ++- .../sormas/ui/task/TaskGridComponent.java | 17 +++++++++++------ .../sormas/ui/utils/DeleteRestoreHandlers.java | 5 +---- 8 files changed, 28 insertions(+), 17 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index c93ae10db95..b0ad2f39f57 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2742,6 +2742,7 @@ public void deleteWithContacts(String caseUuid, DeletionDetails deletionDetails) private void deleteCase(Case caze, DeletionDetails deletionDetails) throws ExternalSurveillanceToolRuntimeException, SormasToSormasRuntimeException, AccessDeniedException { + //TODO: test this one if (!caseService.inJurisdictionOrOwned(caze)) { throw new AccessDeniedException(I18nProperties.getString(Strings.messageCaseOutsideJurisdictionDeletionDenied)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java index b13c68b3cbe..09a03b88811 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java @@ -318,8 +318,14 @@ public List delete(List uuids, DeletionDetails deletion if (immunizationsToBeDeleted != null) { immunizationsToBeDeleted.forEach(immunizationToBeDeleted -> { try { - service.delete(immunizationToBeDeleted, deletionDetails); + delete(immunizationToBeDeleted.getUuid(), deletionDetails); processedImmunizations.add(new ProcessedEntity(immunizationToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedImmunizations.add(new ProcessedEntity(immunizationToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error( + "The immunization with uuid {} could not be deleted due to a AccessDeniedException", + immunizationToBeDeleted.getUuid(), + e); } catch (Exception e) { processedImmunizations.add(new ProcessedEntity(immunizationToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The immunization with uuid {} could not be deleted due to an Exception", immunizationToBeDeleted.getUuid(), e); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index 9ae3962e3ab..14cc786ec44 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -939,8 +939,11 @@ public List delete(List uuids) { if (tasksToBeDeleted != null) { tasksToBeDeleted.forEach(taskToBeDeleted -> { try { - taskService.deletePermanent(taskToBeDeleted); + delete(taskToBeDeleted.getUuid()); processedTasks.add(new ProcessedEntity(taskToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedTasks.add(new ProcessedEntity(taskToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The task with uuid {} could not be deleted due to an AccessDeniedException", taskToBeDeleted.getUuid(), e); } catch (Exception e) { processedTasks.add(new ProcessedEntity(taskToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The task with uuid {} could not be deleted due to an Exception", taskToBeDeleted.getUuid(), e); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java index 20664aed343..965aac018e8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitFacadeEjb.java @@ -324,9 +324,6 @@ public void validate(VisitDto visit, Date allowedStartDate, Date allowedEndDate) @Override @RightsAllowed(UserRight._VISIT_DELETE) public void delete(String uuid) { - if (!userService.hasRight(UserRight.VISIT_DELETE)) { - throw new AccessDeniedException(String.format("User %s is not allowed to delete visits.", userService.getCurrentUser().getUuid())); - } Visit visit = service.getByUuid(uuid); service.deletePermanent(visit); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java index b620971b4cc..2a652fed6ad 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java @@ -77,7 +77,8 @@ public HorizontalLayout createTopBar() { topLayout.addStyleName(CssStyles.VSPACE_3); if (isEditAllowed()) { - if (UserProvider.getCurrent().hasAllUserRights(UserRight.PERFORM_BULK_OPERATIONS, UserRight.CASE_EDIT, UserRight.VISIT_EDIT)) { + if (UserProvider.getCurrent() + .hasAllUserRights(UserRight.PERFORM_BULK_OPERATIONS, UserRight.CASE_EDIT, UserRight.VISIT_EDIT, UserRight.VISIT_DELETE)) { topLayout.setWidth(100, Unit.PERCENTAGE); MenuBar bulkOperationsDropdown = MenuBarHelper.createDropDown( Captions.bulkActions, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java index 23143601a5b..e56c99fe668 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java @@ -87,7 +87,8 @@ public HorizontalLayout createTopBar() { topLayout.addStyleName(CssStyles.VSPACE_3); if (isEditAllowed()) { - if (UserProvider.getCurrent().hasAllUserRights(UserRight.PERFORM_BULK_OPERATIONS, UserRight.CONTACT_EDIT, UserRight.VISIT_EDIT)) { + if (UserProvider.getCurrent() + .hasAllUserRights(UserRight.PERFORM_BULK_OPERATIONS, UserRight.CONTACT_EDIT, UserRight.VISIT_EDIT, UserRight.VISIT_DELETE)) { topLayout.setWidth(100, Unit.PERCENTAGE); MenuBar bulkOperationsDropdown = MenuBarHelper.createDropDown( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java index 2897504da12..03b7146661a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java @@ -168,9 +168,9 @@ public HorizontalLayout createAssigneeFilterBar() { } // Bulk operation dropdown - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { + boolean hasBulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS); + if (hasBulkOperationsRight) { assigneeFilterLayout.setWidth(100, Unit.PERCENTAGE); - boolean hasBulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS); final List menuBarItems = new ArrayList<>(); @@ -180,28 +180,33 @@ public HorizontalLayout createAssigneeFilterBar() { VaadinIcons.ELLIPSIS_H, mi -> ControllerProvider.getTaskController() .showBulkTaskDataEditComponent(this.grid.asMultiSelect().getSelectedItems(), grid, () -> tasksView.navigateTo(criteria)), - hasBulkOperationsRight)); + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.TASK_EDIT))); menuBarItems.add( new MenuBarHelper.MenuBarItem( + //here I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, selectedItem -> ControllerProvider.getTaskController() .deleteAllSelectedItems(this.grid.asMultiSelect().getSelectedItems(), grid, () -> tasksView.navigateTo(criteria)), - hasBulkOperationsRight)); + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.TASK_DELETE))); menuBarItems.add( new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionArchiveCoreEntity), VaadinIcons.ARCHIVE, mi -> ControllerProvider.getTaskController() .archiveAllSelectedItems(this.grid.asMultiSelect().getSelectedItems(), grid, () -> tasksView.navigateTo(criteria)), - hasBulkOperationsRight && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus()))); + hasBulkOperationsRight + && UserProvider.getCurrent().hasUserRight(UserRight.TASK_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus()))); menuBarItems.add( new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), VaadinIcons.ARCHIVE, mi -> ControllerProvider.getTaskController() .dearchiveAllSelectedItems(this.grid.asMultiSelect().getSelectedItems(), grid, () -> tasksView.navigateTo(criteria)), - hasBulkOperationsRight && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + hasBulkOperationsRight + && UserProvider.getCurrent().hasUserRight(UserRight.TASK_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, menuBarItems); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java index ecb603038d6..dbc498674e9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java @@ -102,10 +102,7 @@ public List delete(List uuids, DeletionDetails deletion @Override public List restore(List uuids) { - List restoredEntities = entityFacade.restore(uuids); - //return uuids.size(); - - return restoredEntities; + return entityFacade.restore(uuids); } @Override From 7c87ad73833645707ee251dbad3b4d5669cf5f6a Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 24 Jul 2023 22:29:02 +0300 Subject: [PATCH 007/144] #12257 - refactorings for bulk progress bar --- .../de/symeda/sormas/api/i18n/Strings.java | 1 + .../src/main/resources/strings.properties | 3 +- .../sormas/ui/importer/DataImporter.java | 6 +- .../ui/importer/ImportProgressLayout.java | 2 +- .../sormas/ui/utils/ArchivingController.java | 3 +- .../sormas/ui/utils/BulkOperationHandler.java | 220 +++++++++++------- .../ui/utils/DeleteRestoreController.java | 3 +- .../ui/utils/DeleteRestoreHandlers.java | 11 +- .../ui/utils/PermanentDeleteController.java | 3 +- .../progress/AbstractProgressLayout.java | 27 ++- .../progress/BulkProgressLayout.java | 2 +- 11 files changed, 182 insertions(+), 99 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 615feb3f9a2..8d9d076a086 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -827,6 +827,7 @@ public interface Strings { String infoBulkProcessCancelled = "infoBulkProcessCancelled"; String infoBulkProcessFinished = "infoBulkProcessFinished"; String infoBulkProcessFinishedWithIneligibleItems = "infoBulkProcessFinishedWithIneligibleItems"; + String infoBulkProcessFinishedWithoutSuccess = "infoBulkProcessFinishedWithoutSuccess"; String infoBulkProcessFinishedWithSkips = "infoBulkProcessFinishedWithSkips"; String infoBulkProcessFinishedWithSkipsOutsideJurisdiction = "infoBulkProcessFinishedWithSkipsOutsideJurisdiction"; String infoBulkProcessNoEligibleEntries = "infoBulkProcessNoEligibleEntries"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 971c8c84c44..a1446f9367a 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1019,8 +1019,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success!
None of the entries were successfully processed! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation! infoBulkProcessCancelled = Bulk process has been cancelled!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/DataImporter.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/DataImporter.java index 83f5e87a7d4..bb30eefe9e6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/DataImporter.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/DataImporter.java @@ -201,7 +201,7 @@ public void startImport(Consumer errorReportConsumer, UI current newInfoText = I18nProperties.getString(Strings.messageImportCanceledErrors); break; } - progressLayout.finishProgress(progressResult, newInfoText, window::close); + progressLayout.finishProgress(progressResult, newInfoText, null, window::close); window.addCloseListener(e -> { if (importResult == ImportResultStatus.COMPLETED_WITH_ERRORS || importResult == ImportResultStatus.CANCELED_WITH_ERRORS) { @@ -218,6 +218,7 @@ public void startImport(Consumer errorReportConsumer, UI current progressLayout.finishProgress( ProgressResult.FAILURE, String.format(I18nProperties.getString(Strings.messageImportInvalidColumn), e.getColumnName()), + null, window::close); currentUI.setPollInterval(-1); }); @@ -226,7 +227,8 @@ public void startImport(Consumer errorReportConsumer, UI current currentUI.access(() -> { window.setClosable(true); - progressLayout.finishProgress(ProgressResult.FAILURE, I18nProperties.getString(Strings.messageImportFailedFull), window::close); + progressLayout + .finishProgress(ProgressResult.FAILURE, I18nProperties.getString(Strings.messageImportFailedFull), null, window::close); currentUI.setPollInterval(-1); }); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/ImportProgressLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/ImportProgressLayout.java index 88e09c1c7bb..3cd4db36235 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/ImportProgressLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/importer/ImportProgressLayout.java @@ -46,7 +46,7 @@ public ImportProgressLayout(UI currentUI, int totalCount, Runnable cancelCallbac public ImportProgressLayout(UI currentUI, int totalCount, Runnable cancelCallback, boolean showDuplicates, boolean showSkips) { - super(currentUI, String.format(I18nProperties.getString(Strings.infoImportProcess), totalCount), totalCount, cancelCallback); + super(currentUI, String.format(I18nProperties.getString(Strings.infoImportProcess), totalCount), totalCount, null, cancelCallback); this.showDuplicates = showDuplicates; this.showSkips = showSkips; initAdditionalProgressStatusComponents(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index f05e4ebcedb..bc19512ff5d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -227,7 +227,8 @@ private BulkOperationHandler createBulkOperationHandler(I null, forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), null, - Strings.infoBulkProcessFinishedWithSkips); + Strings.infoBulkProcessFinishedWithSkips, + Strings.infoBulkProcessFinishedWithoutSuccess); } public void dearchiveSelectedItems( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 85163a79199..c1dc1224822 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -61,6 +61,7 @@ public class BulkOperationHandler { private final String someEntriesProcessedMessageProperty; private final String noEligibleEntityMessageProperty; private final String infoBulkProcessFinishedWithSkipsProperty; + private final String infoBulkProcessFinishedWithoutSuccess; public BulkOperationHandler( String allEntriesProcessedMessageProperty, @@ -72,7 +73,8 @@ public BulkOperationHandler( String countEntriesNotProcessedSormasToSormasReasonProperty, String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, - String infoBulkProcessFinishedWithSkipsProperty) { + String infoBulkProcessFinishedWithSkipsProperty, + String infoBulkProcessFinishedWithoutSuccess) { this.allEntriesProcessedMessageProperty = allEntriesProcessedMessageProperty; this.ineligibleEntriesNotProcessedMessageProperty = ineligibleEntriesNotProcessedMessageProperty; @@ -84,11 +86,12 @@ public BulkOperationHandler( this.someEntriesProcessedMessageProperty = someEntriesProcessedMessageProperty; this.noEligibleEntityMessageProperty = noEligibleEntityMessageProperty; this.infoBulkProcessFinishedWithSkipsProperty = infoBulkProcessFinishedWithSkipsProperty; + this.infoBulkProcessFinishedWithoutSuccess = infoBulkProcessFinishedWithoutSuccess; } //TODO: check if the 3 newly added fields can have value for bulk edit public static BulkOperationHandler forBulkEdit() { - return new BulkOperationHandler( + return new BulkOperationHandler<>( Strings.messageEntriesEdited, null, null, @@ -98,7 +101,8 @@ public static BulkOperationHandler forBulkEdit() { null, Strings.messageEntriesEditedExceptArchived, null, - Strings.infoBulkProcessFinishedWithSkips); + Strings.infoBulkProcessFinishedWithSkips, + Strings.infoBulkProcessFinishedWithoutSuccess); } public void doBulkOperation( @@ -108,15 +112,15 @@ public void doBulkOperation( List selectedIneligibleEntries, Consumer> bulkOperationDoneCallback) { - //TODO: these will be deleted - initialEntryCount = selectedEntries.size(); - initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); - selectedEligibleEntries = !areIneligibleEntriesSelected(selectedIneligibleEntries) ? selectedEntries : selectedEligibleEntries; - if (selectedEntries.size() < BULK_ACTION_PROGRESS_THRESHOLD) { processEntriesWithoutProgressBar(bulkOperationFunction, selectedEntries, selectedEligibleEntries, selectedIneligibleEntries); bulkOperationDoneCallback.accept(Collections.emptyList()); } else { + initialEntryCount = selectedEntries.size(); + selectedEligibleEntries = !areIneligibleEntriesSelected(selectedIneligibleEntries) ? selectedEntries : selectedEligibleEntries; + initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); + + boolean areIneligibleEntriesSelected = areIneligibleEntriesSelected(selectedIneligibleEntries); UserDto currentUser = FacadeProvider.getUserFacade().getCurrentUser(); UI currentUI = UI.getCurrent(); @@ -130,35 +134,34 @@ public void doBulkOperation( FacadeProvider.getI18nFacade().setUserLanguage(currentUser.getLanguage()); try { - List entityUuidsNotProcessedExternalSurveillanceReason = new ArrayList<>(); - List entityUuidsNotProcessedGeneralReason = new ArrayList<>(); + List processedEntities = new ArrayList<>(); List remainingEntries = performBulkOperation( bulkOperationFunction, finalSelectedEligibleEntries, - entityUuidsNotProcessedExternalSurveillanceReason, - entityUuidsNotProcessedGeneralReason, + processedEntities, bulkProgressLayout::updateProgress); currentUI.access(() -> { window.setClosable(true); - //If the user does not have the proper rights to perform the action, there will be no processed entities - if (remainingEntries.size() == initialEligibleEntryCount) { - bulkProgressLayout.finishProgress( - ProgressResult.FAILURE, - //I18nProperties.getString(Strings.infoBulkProcessNoEligibleEntries), - I18nProperties.getString(Strings.errorForbidden), - () -> { - window.close(); - bulkOperationDoneCallback.accept(Collections.emptyList()); - }); - return; + if (initialEligibleEntryCount > 0) { + //If the user does not have the proper rights to perform the action, there will be no processed entities + if (remainingEntries.size() == initialEligibleEntryCount) { + bulkProgressLayout + .finishProgress(ProgressResult.FAILURE, I18nProperties.getString(Strings.errorForbidden), null, () -> { + window.close(); + bulkOperationDoneCallback.accept(Collections.emptyList()); + }); + return; + } } - if (initialEligibleEntryCount == 0) { + //all the selected items were ineligible + if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { bulkProgressLayout.finishProgress( - ProgressResult.SUCCESS_WITH_WARNING, + ProgressResult.FAILURE, I18nProperties.getString(Strings.infoBulkProcessNoEligibleEntries), + null, () -> { window.close(); bulkOperationDoneCallback.accept(remainingEntries); @@ -166,42 +169,42 @@ public void doBulkOperation( return; } + String ineligibleEntriesDescription = + buildIneligibleEntriesDescription(areIneligibleEntriesSelected, selectedIneligibleEntries); + String description = buildDescription(ineligibleEntriesDescription, processedEntities); + if (cancelAfterCurrentBatch) { - bulkProgressLayout.finishProgress( - ProgressResult.SUCCESS_WITH_WARNING, - I18nProperties.getString(Strings.infoBulkProcessCancelled), - () -> { - window.close(); - bulkOperationDoneCallback.accept(remainingEntries); - }); + handleProgressResultBasedOnSuccessfullEntryCount( + bulkProgressLayout, + true, + description, + remainingEntries, + bulkOperationDoneCallback); } else if (initialEligibleEntryCount == successfulEntryCount) { - if (initialEntryCount == initialEligibleEntryCount) { bulkProgressLayout - .finishProgress(ProgressResult.SUCCESS, I18nProperties.getString(Strings.infoBulkProcessFinished), () -> { + .finishProgress(ProgressResult.SUCCESS, I18nProperties.getString(Strings.infoBulkProcessFinished), null, () -> { window.close(); bulkOperationDoneCallback.accept(remainingEntries); }); } else { - bulkProgressLayout.finishProgress( ProgressResult.SUCCESS_WITH_WARNING, I18nProperties.getString(Strings.infoBulkProcessFinishedWithIneligibleItems), + ineligibleEntriesDescription, () -> { window.close(); bulkOperationDoneCallback.accept(remainingEntries); }); } } else { - bulkProgressLayout.finishProgress( - ProgressResult.SUCCESS_WITH_WARNING, - I18nProperties.getString(infoBulkProcessFinishedWithSkipsProperty), - () -> { - window.close(); - bulkOperationDoneCallback.accept(remainingEntries); - }); + handleProgressResultBasedOnSuccessfullEntryCount( + bulkProgressLayout, + false, + description, + remainingEntries, + bulkOperationDoneCallback); } - }); } catch (InterruptedException e) { throw new RuntimeException(e); @@ -212,6 +215,38 @@ public void doBulkOperation( } } + public void handleProgressResultBasedOnSuccessfullEntryCount( + BulkProgressLayout bulkProgressLayout, + boolean cancelAfterCurrentBatch, + String description, + List remainingEntries, + Consumer> bulkOperationDoneCallback) { + + if (successfulEntryCount > 0) { + bulkProgressLayout.finishProgress( + ProgressResult.SUCCESS_WITH_WARNING, + cancelAfterCurrentBatch + ? I18nProperties.getString(Strings.infoBulkProcessCancelled) + : I18nProperties.getString(infoBulkProcessFinishedWithSkipsProperty), + description, + () -> { + window.close(); + bulkOperationDoneCallback.accept(remainingEntries); + }); + } else { + bulkProgressLayout.finishProgress( + ProgressResult.FAILURE, + cancelAfterCurrentBatch + ? I18nProperties.getString(Strings.infoBulkProcessCancelled) + : I18nProperties.getString(infoBulkProcessFinishedWithoutSuccess), + description, + () -> { + window.close(); + bulkOperationDoneCallback.accept(remainingEntries); + }); + } + } + public void processEntriesWithoutProgressBar( Function, List> bulkOperationFunction, List selectedEntries, @@ -219,7 +254,6 @@ public void processEntriesWithoutProgressBar( List selectedIneligibleEntries) { initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); - boolean areIneligibleEntriesSelected = areIneligibleEntriesSelected(selectedIneligibleEntries); selectedEligibleEntries = !areIneligibleEntriesSelected ? selectedEntries : selectedEligibleEntries; @@ -233,10 +267,9 @@ public void processEntriesWithoutProgressBar( NotificationHelper.showNotification(I18nProperties.getString(Strings.errorForbidden), Notification.Type.WARNING_MESSAGE, -1); return; } else { - successfulEntryCount = processedEntities.stream() + successfulEntryCount = (int) processedEntities.stream() .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) - .collect(Collectors.toList()) - .size(); + .count(); } } @@ -259,9 +292,7 @@ public void processEntriesWithoutProgressBar( : I18nProperties.getString(headingNoProcessedEntities); if (initialEligibleEntryCount > successfulEntryCount) { - String description = areIneligibleEntriesSelected - ? ineligibleEntriesDescription.concat(buildDescription(processedEntities)) - : buildDescription(processedEntities); + String description = buildDescription(ineligibleEntriesDescription, processedEntities); Window response = VaadinUiUtil.showSimplePopupWindow(heading, description, ContentMode.HTML); response.setWidth(600, Sizeable.Unit.PIXELS); @@ -280,8 +311,7 @@ public void processEntriesWithoutProgressBar( private List performBulkOperation( Function, List> bulkOperationFunction, List selectedEntries, - List entitiesNotProcessedExternalSurveillanceFailure, - List entitiesNotProcessedGeneralReason, + List processedEntities, Consumer progressUpdateCallback) throws InterruptedException { @@ -300,24 +330,24 @@ private List performBulkOperation( int entriesInBatch = Math.min(BULK_ACTION_BATCH_SIZE, selectedEntries.size() - i); - List processedEntities = + List processedEntitiesFromBatch = bulkOperationFunction.apply(selectedEntries.subList(i, Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntries.size()))); //If the user does not have the proper rights to perform the action, there will be no processed entities - //send as parameter initialEligibleEntryCount? - if (processedEntities.size() == 0) { + if (processedEntitiesFromBatch.size() == 0) { break; } else { - entitiesNotProcessedExternalSurveillanceFailure - .addAll(getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); - // entitiesNotProcessedExternalSurveillanceFailure.addAll(getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); - // entitiesNotProcessedExternalSurveillanceFailure.addAll(getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedEntities + .addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedEntities + .addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); + processedEntities.addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + processedEntities.addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.INTERNAL_FAILURE)); } - int successfullyProcessedInBatch = processedEntities.stream() + int successfullyProcessedInBatch = (int) processedEntitiesFromBatch.stream() .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) - .collect(Collectors.toList()) - .size(); + .count(); successfulEntryCount += successfullyProcessedInBatch; lastProcessedEntry = Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntries.size() - 1); @@ -354,12 +384,33 @@ private void handleCancelButtonClicked() { } - public String buildDescription(List processedEntities) { + public String buildDescription(String ineligibleEntriesDescription, List processedEntities) { + String failedProcessingDescription = buildFailedProcessingDescription(processedEntities); + return !ineligibleEntriesDescription.isEmpty() + ? ineligibleEntriesDescription.concat(failedProcessingDescription) + : failedProcessingDescription; + } + + public String buildIneligibleEntriesDescription(boolean areIneligibleEntriesSelected, List selectedIneligibleEntries) { + String ineligibleEntriesDescription = StringUtils.EMPTY; + if (areIneligibleEntriesSelected) { + ineligibleEntriesDescription = getErrorDescription( + selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), + I18nProperties.getString(countEntriesNotProcessedMessageProperty), + I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty)); + } + + return ineligibleEntriesDescription; + } + + public String buildFailedProcessingDescription(List processedEntities) { List entityUuidsNotProcessedExternalSurveillanceFailure = - getList(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); - List entityUuidsNotProcessedSormasToSormasFailure = getList(processedEntities, ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE); - List entityUuidsNotProcessedAccessDeniedFailure = getList(processedEntities, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); - List entityUuidsNotProcessedInternalFailure = getList(processedEntities, ProcessedEntityStatus.INTERNAL_FAILURE); + getFailedEntityUuidsByStatus(processedEntities, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + List entityUuidsNotProcessedSormasToSormasFailure = + getFailedEntityUuidsByStatus(processedEntities, ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE); + List entityUuidsNotProcessedAccessDeniedFailure = + getFailedEntityUuidsByStatus(processedEntities, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + List entityUuidsNotProcessedInternalFailure = getFailedEntityUuidsByStatus(processedEntities, ProcessedEntityStatus.INTERNAL_FAILURE); String description = StringUtils.EMPTY; if (entityUuidsNotProcessedExternalSurveillanceFailure.size() > 0) { @@ -370,6 +421,14 @@ public String buildDescription(List processedEntities) { description = description.concat(description1); } + if (entityUuidsNotProcessedExternalSurveillanceFailure.size() > 0) { + String description1 = getErrorDescription( + entityUuidsNotProcessedExternalSurveillanceFailure, + I18nProperties.getString(countEntriesNotProcessedExternalReasonProperty), + ""); + description = description.concat(description1); + } + if (entityUuidsNotProcessedSormasToSormasFailure.size() > 0) { String description2 = getErrorDescription( entityUuidsNotProcessedSormasToSormasFailure, @@ -396,18 +455,14 @@ public String buildDescription(List processedEntities) { } private String getErrorDescription(List entityUuids, String messageCountEntries, String messageEntriesNotSuccessfullyProcessed) { - StringBuilder description = new StringBuilder(); - description.append( + + return String.format( + "%1s
%2s", String.format( - "%1s
%2s", - String.format( - messageCountEntries, - String.format("%s", entityUuids.size()), - String.format("%s", HtmlHelper.cleanHtml(buildEntitiesString(entityUuids)))), - messageEntriesNotSuccessfullyProcessed)) - .append("

"); - - return description.toString(); + messageCountEntries, + String.format("%s", entityUuids.size()), + String.format("%s", HtmlHelper.cleanHtml(buildEntitiesString(entityUuids)))), + messageEntriesNotSuccessfullyProcessed) + "

"; } public String buildEntitiesString(List entityUuids) { @@ -431,7 +486,14 @@ public boolean areIneligibleEntriesSelected(List selectedIneligibleEntries) { return selectedIneligibleEntries != null && selectedIneligibleEntries.size() > 0; } - public List getList(List processedEntities, ProcessedEntityStatus status) { + public List getFailedEntitiesByStatus(List processedEntities, ProcessedEntityStatus status) { + return processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(status)) + //.map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); + } + + public List getFailedEntityUuidsByStatus(List processedEntities, ProcessedEntityStatus status) { return processedEntities.stream() .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(status)) .map(ProcessedEntity::getEntityUuid) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index bcd71d5ed20..a87f0368e89 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -137,7 +137,8 @@ private BulkOperationHandler createBulkOperationHandler(I forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedSormasToSormasReason() : null, forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeleted() : deleteRestoreMessages.getMessageEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageNoEligibleEntitySelected() : null, - Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction); + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction, + Strings.infoBulkProcessFinishedWithoutSuccess); } private void displayNothingSelectedToBeDeleted(DeleteRestoreMessages messages) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java index dbc498674e9..10edda0fa3c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java @@ -1,6 +1,5 @@ package de.symeda.sormas.ui.utils; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -89,15 +88,7 @@ public void delete(String uuid, DeletionDetails deletionDetails) { @Override public List delete(List uuids, DeletionDetails deletionDetails) { - List deletedEntities = new ArrayList(); - //TODO: check if try-catch is needed here - try { - deletedEntities = entityFacade.delete(uuids, deletionDetails); - } catch (Exception e) { - - } - - return deletedEntities; + return entityFacade.delete(uuids, deletionDetails); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index 387b9ab5210..1069e3e7bc9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -98,7 +98,8 @@ private BulkOperationHandler createBulkOperationHandler(I null, deleteRestoreMessages.getMessageEntitiesNotDeleted(), null, - Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction); + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction, + Strings.infoBulkProcessFinishedWithoutSuccess); } public interface IPermanentDeleteHandler { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/AbstractProgressLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/AbstractProgressLayout.java index fcd1a6de173..62e5350add5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/AbstractProgressLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/AbstractProgressLayout.java @@ -39,7 +39,9 @@ public abstract class AbstractProgressLayout

exten private final int totalCount; private HorizontalLayout infoLayout; + private HorizontalLayout descriptionLayout; private Label infoLabel; + private Label descriptionLabel; /** * The component that is displayed to the left of the info label, * indicating the result of the operation; set to a progress circle in the beginning @@ -61,7 +63,7 @@ public abstract class AbstractProgressLayout

exten private Button closeButton; private final Runnable cancelCallback; - public AbstractProgressLayout(UI currentUI, String initialInfoText, int totalCount, Runnable cancelCallback) { + public AbstractProgressLayout(UI currentUI, String initialInfoText, int totalCount, String descriptionText, Runnable cancelCallback) { this.currentUI = currentUI; this.totalCount = totalCount; @@ -71,6 +73,7 @@ public AbstractProgressLayout(UI currentUI, String initialInfoText, int totalCou setMargin(true); initInfoSection(initialInfoText); + initDescriptionSection(descriptionText); initProgressSection(); initButtonPanel(); initHintSection(); @@ -102,7 +105,7 @@ public void updateProgress(P progressUpdateInfo) { * Sets the result icon, hides the Cancel button, shows the Close button, and * optionally replaces the info text. */ - public void finishProgress(ProgressResult result, String newInfoText, Runnable closeCallback) { + public void finishProgress(ProgressResult result, String newInfoText, String descriptionText, Runnable closeCallback) { infoLayout.removeComponent(progressResultComponent); switch (result) { @@ -122,6 +125,10 @@ public void finishProgress(ProgressResult result, String newInfoText, Runnable c infoLabel.setValue(newInfoText); } + if (descriptionText != null) { + descriptionLabel.setValue(descriptionText); + } + cancelButton.setVisible(false); closeButton.setVisible(true); closeButton.addClickListener(e -> closeCallback.run()); @@ -149,6 +156,22 @@ private void initInfoSection(String initialInfoText) { addComponent(infoLayout); } + private void initDescriptionSection(String descriptionText) { + descriptionLayout = new HorizontalLayout(); + descriptionLayout.setWidth(90, Unit.PERCENTAGE); + descriptionLayout.setSpacing(true); + + descriptionLabel = new Label(descriptionText); + descriptionLabel.setContentMode(ContentMode.HTML); + descriptionLabel.setWidthFull(); + descriptionLabel.addStyleNames(CssStyles.VSPACE_TOP_3, CssStyles.HSPACE_LEFT_1); + + descriptionLayout.addComponent(descriptionLabel); + descriptionLayout.setExpandRatio(descriptionLabel, 1); + + addComponent(descriptionLayout); + } + private void initInfoComponents() { ProgressBar progressCircle = new ProgressBar(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/BulkProgressLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/BulkProgressLayout.java index 1071ff8ee6d..c3b359012f5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/BulkProgressLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/progress/BulkProgressLayout.java @@ -31,7 +31,7 @@ public class BulkProgressLayout extends AbstractProgressLayout Date: Mon, 24 Jul 2023 22:36:56 +0300 Subject: [PATCH 008/144] #12257 - refactorings for bulk progress bar --- .../sormas/ui/utils/BulkOperationHandler.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index c1dc1224822..771662eeff0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -174,7 +174,7 @@ public void doBulkOperation( String description = buildDescription(ineligibleEntriesDescription, processedEntities); if (cancelAfterCurrentBatch) { - handleProgressResultBasedOnSuccessfullEntryCount( + handleProgressResultBasedOnSuccessfulEntryCount( bulkProgressLayout, true, description, @@ -198,7 +198,7 @@ public void doBulkOperation( }); } } else { - handleProgressResultBasedOnSuccessfullEntryCount( + handleProgressResultBasedOnSuccessfulEntryCount( bulkProgressLayout, false, description, @@ -215,7 +215,7 @@ public void doBulkOperation( } } - public void handleProgressResultBasedOnSuccessfullEntryCount( + public void handleProgressResultBasedOnSuccessfulEntryCount( BulkProgressLayout bulkProgressLayout, boolean cancelAfterCurrentBatch, String description, @@ -279,13 +279,7 @@ public void processEntriesWithoutProgressBar( return; } - String ineligibleEntriesDescription = StringUtils.EMPTY; - if (areIneligibleEntriesSelected) { - ineligibleEntriesDescription = getErrorDescription( - selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), - I18nProperties.getString(countEntriesNotProcessedMessageProperty), - I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty)); - } + String ineligibleEntriesDescription = buildIneligibleEntriesDescription(areIneligibleEntriesSelected, selectedIneligibleEntries); String heading = successfulEntryCount > 0 ? I18nProperties.getString(headingSomeEntitiesNotProcessed) @@ -489,7 +483,6 @@ public boolean areIneligibleEntriesSelected(List selectedIneligibleEntries) { public List getFailedEntitiesByStatus(List processedEntities, ProcessedEntityStatus status) { return processedEntities.stream() .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(status)) - //.map(ProcessedEntity::getEntityUuid) .collect(Collectors.toList()); } From 66f20b79e57bdeb063b18c1e4f78c04a3825e5e0 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 25 Jul 2023 17:12:36 +0300 Subject: [PATCH 009/144] #12257 - do not display delete and restore if the user does not have rights --- .../de/symeda/sormas/ui/caze/CasesView.java | 4 +- .../sormas/ui/contact/ContactsView.java | 116 +++++++++--------- .../ui/samples/SampleGridComponent.java | 7 +- 3 files changed, 67 insertions(+), 60 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index 6e54c4e7a4b..0099a443d44 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -725,14 +725,14 @@ public HorizontalLayout createStatusFilterBar() { grid.bulkActionHandler( items -> ControllerProvider.getCaseController().deleteAllSelectedItems(items, (AbstractCaseGrid) grid), true); - }, hasBulkOperationsRight)); + }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE))); } else { menuBarItems .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, mi -> { grid.bulkActionHandler( items -> ControllerProvider.getCaseController().restoreSelectedCases(items, (AbstractCaseGrid) grid), true); - }, hasBulkOperationsRight)); + }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE))); } final boolean externalMessagesEnabled = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.MANUAL_EXTERNAL_MESSAGES); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java index e5ded699a96..467adbfca4e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java @@ -510,65 +510,71 @@ public HorizontalLayout createStatusFilterBar() { boolean hasBulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS); List bulkActions = new ArrayList<>( - Arrays.asList( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkEdit), - VaadinIcons.ELLIPSIS_H, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController() - .showBulkContactDataEditComponent(items, null, (AbstractContactGrid) grid)), - hasBulkOperationsRight), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkCancelFollowUp), - VaadinIcons.CLOSE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController() - .cancelFollowUpOfAllSelectedItems(items, () -> navigateTo(criteria))), - hasBulkOperationsRight), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkLostToFollowUp), - VaadinIcons.UNLINK, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController() - .setAllSelectedItemsToLostToFollowUp(items, () -> navigateTo(criteria))), - hasBulkOperationsRight), - criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED - ? new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkDelete), - VaadinIcons.TRASH, + Arrays + .asList( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkEdit), + VaadinIcons.ELLIPSIS_H, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .showBulkContactDataEditComponent(items, null, (AbstractContactGrid) grid)), + hasBulkOperationsRight), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkCancelFollowUp), + VaadinIcons.CLOSE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .cancelFollowUpOfAllSelectedItems(items, () -> navigateTo(criteria))), + hasBulkOperationsRight), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkLostToFollowUp), + VaadinIcons.UNLINK, mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().deleteAllSelectedItems(items, (AbstractContactGrid) grid), + items -> ControllerProvider.getContactController() + .setAllSelectedItemsToLostToFollowUp(items, () -> navigateTo(criteria))), + hasBulkOperationsRight), + criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED + ? new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkDelete), + VaadinIcons.TRASH, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .deleteAllSelectedItems(items, (AbstractContactGrid) grid), + true), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE)) + : new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkRestore), + VaadinIcons.ARROW_BACKWARD, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .restoreSelectedContacts(items, (AbstractContactGrid) grid), + true), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE)), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionArchiveCoreEntity), + VaadinIcons.ARCHIVE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController().archiveAllSelectedItems(items, (AbstractContactGrid) grid), true), - hasBulkOperationsRight) - : new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkRestore), - VaadinIcons.ARROW_BACKWARD, + hasBulkOperationsRight && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), + VaadinIcons.ARCHIVE, mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().restoreSelectedContacts(items, (AbstractContactGrid) grid), + items -> ControllerProvider + .getContactController() + .dearchiveAllSelectedItems(items, (AbstractContactGrid) grid), true), - hasBulkOperationsRight), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.actionArchiveCoreEntity), - VaadinIcons.ARCHIVE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().archiveAllSelectedItems(items, (AbstractContactGrid) grid), - true), - hasBulkOperationsRight && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), - VaadinIcons.ARCHIVE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().dearchiveAllSelectedItems(items, (AbstractContactGrid) grid), - true), - hasBulkOperationsRight && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus())), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.sormasToSormasShare), - VaadinIcons.SHARE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getSormasToSormasController().shareSelectedContacts(items, () -> navigateTo(criteria))), - FacadeProvider.getFeatureConfigurationFacade() - .isPropertyValueTrue(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS, FeatureTypeProperty.S2S_SHARING) - && FacadeProvider.getSormasToSormasFacade().isSharingContactsEnabledForUser()))); + hasBulkOperationsRight && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus())), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.sormasToSormasShare), + VaadinIcons.SHARE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getSormasToSormasController() + .shareSelectedContacts(items, () -> navigateTo(criteria))), + FacadeProvider.getFeatureConfigurationFacade() + .isPropertyValueTrue(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS, FeatureTypeProperty.S2S_SHARING) + && FacadeProvider.getSormasToSormasFacade().isSharingContactsEnabledForUser()))); if (isDocGenerationAllowed() && grid instanceof AbstractContactGrid) { bulkActions.add( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java index 30cab037805..97502aadf95 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java @@ -181,7 +181,8 @@ public HorizontalLayout createShipmentFilterBar() { } // Bulk operation dropdown - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { + boolean bulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES); + if (bulkOperationsRight) { shipmentFilterLayout.setWidth(100, Unit.PERCENTAGE); if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { @@ -190,14 +191,14 @@ public HorizontalLayout createShipmentFilterBar() { new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, selectedItem -> { ControllerProvider.getSampleController() .deleteAllSelectedItems(grid.asMultiSelect().getSelectedItems(), grid, () -> samplesView.navigateTo(criteria)); - })); + }, UserProvider.getCurrent().hasUserRight(UserRight.SAMPLE_DELETE))); } else { bulkOperationsDropdown = MenuBarHelper.createDropDown( Captions.bulkActions, new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, selectedItem -> { ControllerProvider.getSampleController() .restoreSelectedSamples(grid.asMultiSelect().getSelectedItems(), grid, () -> samplesView.navigateTo(criteria)); - })); + }, UserProvider.getCurrent().hasUserRight(UserRight.SAMPLE_DELETE))); } bulkOperationsDropdown.setVisible(samplesView.getViewConfiguration().isInEagerMode()); From 6e871bc3979a806ded57147c9913f71722b6ecfe Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 25 Jul 2023 17:14:17 +0300 Subject: [PATCH 010/144] #12257 - add logic for AccessDeniedException handling --- .../de/symeda/sormas/api/i18n/Strings.java | 8 ++++ .../src/main/resources/strings.properties | 38 +++++++++++-------- .../ui/utils/DeleteRestoreController.java | 1 + .../ui/utils/DeleteRestoreMessages.java | 20 ++++++++-- .../ui/utils/PermanentDeleteController.java | 1 + 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 8d9d076a086..982a17c7d1a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1122,19 +1122,24 @@ public interface Strings { String messageCountCasesNotDeleted = "messageCountCasesNotDeleted"; String messageCountCasesNotDeletedExternalReason = "messageCountCasesNotDeletedExternalReason"; String messageCountCasesNotDeletedSormasToSormasReason = "messageCountCasesNotDeletedSormasToSormasReason"; + String messageCountCasesNotDeletedAccessDeniedReason = "messageCountCasesNotDeletedAccessDeniedReason"; String messageCountCasesNotRestored = "messageCountCasesNotRestored"; String messageCountContactsAlreadyInEvent = "messageCountContactsAlreadyInEvent"; String messageCountContactsNotDeleted = "messageCountContactsNotDeleted"; String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; + String messageCountContactsNotDeletedAccessDeniedReason = "messageCountContactsNotDeletedAccessDeniedReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; + String messageCountEventParticipantsNotDeletedAccessDeniedReason = "messageCountEventParticipantsNotDeletedAccessDeniedReason"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; String messageCountEventsNotDeleted = "messageCountEventsNotDeleted"; String messageCountEventsNotDeletedExternalReason = "messageCountEventsNotDeletedExternalReason"; String messageCountEventsNotDeletedSormasToSormasReason = "messageCountEventsNotDeletedSormasToSormasReason"; + String messageCountEventsNotDeletedAccessDeniedReason = "messageCountEventsNotDeletedAccessDeniedReason"; String messageCountEventsNotRestored = "messageCountEventsNotRestored"; String messageCountExternalMessagesNotDeleted = "messageCountExternalMessagesNotDeleted"; String messageCountImmunizationsNotDeleted = "messageCountImmunizationsNotDeleted"; + String messageCountImmunizationsNotDeletedAccessDeniedReason = "messageCountImmunizationsNotDeletedAccessDeniedReason"; String messageCountImmunizationsNotRestored = "messageCountImmunizationsNotRestored"; String messageCountriesArchived = "messageCountriesArchived"; String messageCountriesDearchived = "messageCountriesDearchived"; @@ -1144,9 +1149,12 @@ public interface Strings { String messageCountSamplesNotDeleted = "messageCountSamplesNotDeleted"; String messageCountSamplesNotRestored = "messageCountSamplesNotRestored"; String messageCountTasksNotDeleted = "messageCountTasksNotDeleted"; + String messageCountTasksNotDeletedAccessDeniedReason = "messageCountTasksNotDeletedAccessDeniedReason"; String messageCountTravelEntriesNotDeleted = "messageCountTravelEntriesNotDeleted"; + String messageCountTravelEntriesNotDeletedAccessDeniedReason = "messageCountTravelEntriesNotDeletedAccessDeniedReason"; String messageCountTravelEntriesNotRestored = "messageCountTravelEntriesNotRestored"; String messageCountVisitsNotDeleted = "messageCountVisitsNotDeleted"; + String messageCountVisitsNotDeletedAccessDeniedReason = "messageCountVisitsNotDeletedAccessDeniedReason"; String messageCreateCollectionTask = "messageCreateCollectionTask"; String messageDatabaseExportFailed = "messageDatabaseExportFailed"; String messageDeleteImmunizationVaccinations = "messageDeleteImmunizationVaccinations"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index a1446f9367a..3681e49484c 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1152,29 +1152,37 @@ messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet #change everywhere this message -messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted: %s -messageCountCasesNotDeletedExternalReason = %s cases not deleted. UUIDs of cases not deleted because the communication with the reporting tool failed: %s -messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted. UUIDs of cases not deleted because the cases were shared with Sormas to Sormas: %s +messageCountCasesNotDeleted = %s cases not deleted: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because they were already shared with Sormas to Sormas: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored: %s -messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted: %s -messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted. UUIDs of contacts not deleted because the contacts were shared with Sormas to Sormas: %s +messageCountContactsNotDeleted = %s contacts not deleted: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s -messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted: %s +messageCountEventParticipantsNotDeleted = %s event participants not deleted: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored: %s -messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted: %s -messageCountImmunizationsNotDeleted = %s immunizations not deleted. UUIDs of immunizations not deleted: %s +messageCountExternalMessagesNotDeleted = %s external messages not deleted: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted: %s +messageCountImmunizationsNotDeletedAccessDeniedReason =%s immunizations not deleted because they are not in jurisdiction or owned: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored: %s -messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted: %s +messageCountSamplesNotDeleted = %s samples not deleted: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored: %s -messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted: %s -messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted: %s +messageCountTasksNotDeleted = %s tasks not deleted: %s +messageCountTasksNotDeletedAccessDeniedReason =%s tasks not deleted because the they are not in jurisdiction or owned: %s +messageCountTravelEntriesNotDeleted = %s travel entries not deleted: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason =%s travel entries not deleted because the they are not in jurisdiction or owned: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored: %s -messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted: %s -messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted: %s -messageCountEventsNotDeletedExternalReason = %s events not deleted. UUIDs of events not deleted because the communication with the reporting tool failed: %s +messageCountVisitsNotDeleted = %s visits not deleted: %s +messageCountVisitsNotDeletedAccessDeniedReason =%s visits not deleted because they are not in jurisdiction or owned: %s +messageCountEventsNotDeleted = %s events not deleted: %s +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. -messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted. UUIDs of events not deleted because the events were shared with Sormas to Sormas: %s +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because they were already shared with Sormas to Sormas: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index a87f0368e89..8c362a1fb94 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -135,6 +135,7 @@ private BulkOperationHandler createBulkOperationHandler(I forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeleted() : deleteRestoreMessages.getMessageCountEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedExternalReason() : null, forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedSormasToSormasReason() : null, + forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedAccessDeniedReason() : null, forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeleted() : deleteRestoreMessages.getMessageEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageNoEligibleEntitySelected() : null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index 5962dd4ebb0..fa72abbffd7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -4,7 +4,6 @@ public enum DeleteRestoreMessages { - //TODO: check if SormasToSormasRuntimeException can happen to other entities too ( besides events and cases) CASE(Strings.entityCases, Strings.headingNoCasesSelected, Strings.messageNoCasesSelected, @@ -16,6 +15,7 @@ public enum DeleteRestoreMessages { Strings.messageCasesNotDeleted, Strings.messageCountCasesNotDeletedExternalReason, Strings.messageCountCasesNotDeletedSormasToSormasReason, + Strings.messageCountCasesNotDeletedAccessDeniedReason, null, Strings.headingSomeCasesNotDeleted, Strings.messageCountCasesNotDeleted, @@ -37,6 +37,7 @@ public enum DeleteRestoreMessages { Strings.messageEventsNotDeleted, Strings.messageCountEventsNotDeletedExternalReason, Strings.messageCountContactsNotDeletedSormasToSormasReason, + Strings.messageCountEventsNotDeletedAccessDeniedReason, Strings.messageEventsNotDeletedLinkedEntitiesReason, Strings.headingSomeEventsNotDeleted, Strings.messageCountEventsNotDeleted, @@ -58,6 +59,7 @@ public enum DeleteRestoreMessages { Strings.messageEventParticipantsNotDeleted, null, null, + Strings.messageCountEventParticipantsNotDeletedAccessDeniedReason, null, Strings.headingSomeEventParticipantsNotDeleted, Strings.messageCountEventParticipantsNotDeleted, @@ -79,6 +81,7 @@ public enum DeleteRestoreMessages { Strings.messageContactsNotDeleted, null, Strings.messageCountContactsNotDeletedSormasToSormasReason, + Strings.messageCountContactsNotDeletedAccessDeniedReason, null, Strings.headingSomeContactsNotDeleted, Strings.messageCountContactsNotDeleted, @@ -100,6 +103,7 @@ public enum DeleteRestoreMessages { Strings.messageTravelEntriesNotDeleted, null, null, + Strings.messageCountTravelEntriesNotDeletedAccessDeniedReason, null, Strings.headingSomeTravelEntriesNotDeleted, Strings.messageCountTravelEntriesNotDeleted, @@ -121,6 +125,7 @@ public enum DeleteRestoreMessages { Strings.messageVisitsNotDeleted, null, null, + Strings.messageCountVisitsNotDeletedAccessDeniedReason, null, Strings.headingSomeVisitsNotDeleted, Strings.messageCountVisitsNotDeleted, @@ -142,6 +147,7 @@ public enum DeleteRestoreMessages { Strings.messageTasksNotDeleted, null, null, + Strings.messageCountTasksNotDeletedAccessDeniedReason, null, Strings.headingSomeTasksNotDeleted, Strings.messageCountTasksNotDeleted, @@ -164,6 +170,7 @@ public enum DeleteRestoreMessages { null, null, null, + null, Strings.headingSomeExternalMessagesNotDeleted, Strings.messageCountExternalMessagesNotDeleted, null, @@ -185,6 +192,7 @@ public enum DeleteRestoreMessages { null, null, null, + null, Strings.headingSomeSamplesNotDeleted, Strings.messageCountSamplesNotDeleted, Strings.headingSamplesRestored, @@ -205,6 +213,7 @@ public enum DeleteRestoreMessages { Strings.messageImmunizationsNotDeleted, null, null, + Strings.messageCountImmunizationsNotDeletedAccessDeniedReason, null, Strings.headingSomeImmunizationsNotDeleted, Strings.messageCountImmunizationsNotDeleted, @@ -226,6 +235,7 @@ public enum DeleteRestoreMessages { private final String messageEntitiesNotDeleted; private final String messageCountEntitiesNotDeletedExternalReason; private final String messageCountEntitiesNotDeletedSormasToSormasReason; + private final String messageCountEntitiesNotDeletedAccessDeniedReason; private final String messageEntitiesNotDeletedLinkedEntitiesReason; private final String headingSomeEntitiesNotDeleted; private final String messageCountEntitiesNotDeleted; @@ -244,11 +254,11 @@ public enum DeleteRestoreMessages { String messageEntitiesEligibleForDeletion, String headingEntitiesDeleted, String messageEntitiesDeleted, - String headingEntitiesNotDeleted, String messageEntitiesNotDeleted, String messageCountEntitiesNotDeletedExternalReason, String messageCountEntitiesNotDeletedSormasToSormasReason, + String messageCountEntitiesNotDeletedAccessDeniedReason, String messageEntitiesNotDeletedLinkedEntitiesReason, String headingSomeEntitiesNotDeleted, String messageCountEntitiesNotDeleted, @@ -266,11 +276,11 @@ public enum DeleteRestoreMessages { this.messageEntitiesEligibleForDeletion = messageEntitiesEligibleForDeletion; this.headingEntitiesDeleted = headingEntitiesDeleted; this.messageEntitiesDeleted = messageEntitiesDeleted; - this.headingEntitiesNotDeleted = headingEntitiesNotDeleted; this.messageEntitiesNotDeleted = messageEntitiesNotDeleted; this.messageCountEntitiesNotDeletedExternalReason = messageCountEntitiesNotDeletedExternalReason; this.messageCountEntitiesNotDeletedSormasToSormasReason = messageCountEntitiesNotDeletedSormasToSormasReason; + this.messageCountEntitiesNotDeletedAccessDeniedReason = messageCountEntitiesNotDeletedAccessDeniedReason; this.messageEntitiesNotDeletedLinkedEntitiesReason = messageEntitiesNotDeletedLinkedEntitiesReason; this.headingSomeEntitiesNotDeleted = headingSomeEntitiesNotDeleted; this.messageCountEntitiesNotDeleted = messageCountEntitiesNotDeleted; @@ -326,6 +336,10 @@ public String getMessageCountEntitiesNotDeletedSormasToSormasReason() { return messageCountEntitiesNotDeletedSormasToSormasReason; } + public String getMessageCountEntitiesNotDeletedAccessDeniedReason() { + return messageCountEntitiesNotDeletedAccessDeniedReason; + } + public String getMessageEntitiesNotDeletedLinkedEntitiesReason() { return messageEntitiesNotDeletedLinkedEntitiesReason; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index 1069e3e7bc9..ae6ba14ad1c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -96,6 +96,7 @@ private BulkOperationHandler createBulkOperationHandler(I deleteRestoreMessages.getMessageCountEntitiesNotDeleted(), null, null, + deleteRestoreMessages.getMessageCountEntitiesNotDeletedAccessDeniedReason(), deleteRestoreMessages.getMessageEntitiesNotDeleted(), null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction, From 25c6c213c0ba535de2eccc209680c0bd959a650e Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 25 Jul 2023 17:19:18 +0300 Subject: [PATCH 011/144] #12257 - refactoring related to the ineligible entries --- .../progress/ProcessedEntityStatus.java | 4 + .../backend/caze/CaseFacadeEjbTest.java | 2 +- .../sormas/ui/utils/ArchivingController.java | 2 + .../sormas/ui/utils/BulkOperationHandler.java | 85 +++++++++++-------- 4 files changed, 56 insertions(+), 37 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java index c587fe73305..e54b5076560 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntityStatus.java @@ -3,6 +3,10 @@ public enum ProcessedEntityStatus { SUCCESS, + /** + * The entity does not corresponds to the criterias needed in order to be processed (e.g. Events with Participants can not be deleted) + */ + NOT_ELIGIBLE, /** * ExternalSurveillanceToolRuntimeException was thrown during the processing of the entity */ diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java index 757d0118a2a..f9592839285 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java @@ -2815,7 +2815,7 @@ public void testDeleteWithContacts() { assertEquals("test reason", getCaseFacade().getByUuid(caze.getUuid()).getOtherDeletionReason()); } - //TODO: fis this one + //TODO: fix this one @Test public void testDeleteCasesOutsideJurisdiction() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index bc19512ff5d..eb57b1c3bb3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -214,6 +214,7 @@ this. createBulkOperationHandler(archiveHandler, true) } } + //TODO: check the necessary labels below private BulkOperationHandler createBulkOperationHandler(IArchiveHandler archiveHandler, boolean forArchive) { ArchiveMessages archiveMessages = archiveHandler.getArchiveMessages(); return new BulkOperationHandler<>( @@ -225,6 +226,7 @@ private BulkOperationHandler createBulkOperationHandler(I null, null, null, + null, forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), null, Strings.infoBulkProcessFinishedWithSkips, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 771662eeff0..3756c1239b3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -58,6 +58,7 @@ public class BulkOperationHandler { private final String countEntriesNotProcessedMessageProperty; private final String countEntriesNotProcessedExternalReasonProperty; private final String countEntriesNotProcessedSormasToSormasReasonProperty; + private final String countEntriesNotProcessedAccessDeniedReasonProperty; private final String someEntriesProcessedMessageProperty; private final String noEligibleEntityMessageProperty; private final String infoBulkProcessFinishedWithSkipsProperty; @@ -71,6 +72,7 @@ public BulkOperationHandler( String countEntriesNotProcessedMessageProperty, String countEntriesNotProcessedExternalReasonProperty, String countEntriesNotProcessedSormasToSormasReasonProperty, + String countEntriesNotProcessedAccessDeniedReasonProperty, String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, String infoBulkProcessFinishedWithSkipsProperty, @@ -83,13 +85,14 @@ public BulkOperationHandler( this.countEntriesNotProcessedMessageProperty = countEntriesNotProcessedMessageProperty; this.countEntriesNotProcessedExternalReasonProperty = countEntriesNotProcessedExternalReasonProperty; this.countEntriesNotProcessedSormasToSormasReasonProperty = countEntriesNotProcessedSormasToSormasReasonProperty; + this.countEntriesNotProcessedAccessDeniedReasonProperty = countEntriesNotProcessedAccessDeniedReasonProperty; this.someEntriesProcessedMessageProperty = someEntriesProcessedMessageProperty; this.noEligibleEntityMessageProperty = noEligibleEntityMessageProperty; this.infoBulkProcessFinishedWithSkipsProperty = infoBulkProcessFinishedWithSkipsProperty; this.infoBulkProcessFinishedWithoutSuccess = infoBulkProcessFinishedWithoutSuccess; } - //TODO: check if the 3 newly added fields can have value for bulk edit + //TODO: check if the 4 newly added fields can have value for bulk edit public static BulkOperationHandler forBulkEdit() { return new BulkOperationHandler<>( Strings.messageEntriesEdited, @@ -99,6 +102,7 @@ public static BulkOperationHandler forBulkEdit() { null, null, null, + null, Strings.messageEntriesEditedExceptArchived, null, Strings.infoBulkProcessFinishedWithSkips, @@ -117,10 +121,11 @@ public void doBulkOperation( bulkOperationDoneCallback.accept(Collections.emptyList()); } else { initialEntryCount = selectedEntries.size(); - selectedEligibleEntries = !areIneligibleEntriesSelected(selectedIneligibleEntries) ? selectedEntries : selectedEligibleEntries; + boolean areIneligibleEntriesSelected = areIneligibleEntriesSelected(selectedIneligibleEntries); + selectedEligibleEntries = !areIneligibleEntriesSelected ? selectedEntries : selectedEligibleEntries; initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); - boolean areIneligibleEntriesSelected = areIneligibleEntriesSelected(selectedIneligibleEntries); + List entitiesToBeProcessed = new ArrayList<>(); UserDto currentUser = FacadeProvider.getUserFacade().getCurrentUser(); UI currentUI = UI.getCurrent(); @@ -134,11 +139,11 @@ public void doBulkOperation( FacadeProvider.getI18nFacade().setUserLanguage(currentUser.getLanguage()); try { - List processedEntities = new ArrayList<>(); List remainingEntries = performBulkOperation( bulkOperationFunction, + selectedEntries, finalSelectedEligibleEntries, - processedEntities, + entitiesToBeProcessed, bulkProgressLayout::updateProgress); currentUI.access(() -> { @@ -171,7 +176,7 @@ public void doBulkOperation( String ineligibleEntriesDescription = buildIneligibleEntriesDescription(areIneligibleEntriesSelected, selectedIneligibleEntries); - String description = buildDescription(ineligibleEntriesDescription, processedEntities); + String description = buildDescription(ineligibleEntriesDescription, entitiesToBeProcessed); if (cancelAfterCurrentBatch) { handleProgressResultBasedOnSuccessfulEntryCount( @@ -304,8 +309,9 @@ public void processEntriesWithoutProgressBar( private List performBulkOperation( Function, List> bulkOperationFunction, - List selectedEntries, - List processedEntities, + List selectedEntities, + List selectedEligibleEntities, + List entitiesToBeProcessed, Consumer progressUpdateCallback) throws InterruptedException { @@ -313,7 +319,7 @@ private List performBulkOperation( int lastProcessedEntry = 0; try { - for (int i = 0; i < selectedEntries.size(); i += BULK_ACTION_BATCH_SIZE) { + for (int i = 0; i < selectedEntities.size(); i += BULK_ACTION_BATCH_SIZE) { synchronized (cancelLock) { while (cancelButtonClicked) { cancelLock.wait(); @@ -322,21 +328,26 @@ private List performBulkOperation( break; } - int entriesInBatch = Math.min(BULK_ACTION_BATCH_SIZE, selectedEntries.size() - i); - - List processedEntitiesFromBatch = - bulkOperationFunction.apply(selectedEntries.subList(i, Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntries.size()))); + int entriesInBatch = Math.min(BULK_ACTION_BATCH_SIZE, selectedEntities.size() - i); + + List entitiesFromBatch = selectedEntities.subList(i, Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntities.size())); + List eligibleEntitiesFromBatch = getEligibleEntriesFromBatch(entitiesFromBatch, selectedEligibleEntities); + List ineligibleEntitiesFromBatch = getInEligibleEntriesFromBatch(entitiesFromBatch, selectedEligibleEntities); + List processedEntitiesFromBatch = bulkOperationFunction.apply(eligibleEntitiesFromBatch); + + //If the user does not have the proper rights to perform the action or there are no eligibleEntries, there will be no processed entities + /* + * if (processedEntitiesFromBatch.size() == 0) { + * break; + * } else { + */ + if (ineligibleEntitiesFromBatch.size() > 0) { + ineligibleEntitiesFromBatch + .forEach(entity -> entitiesToBeProcessed.add(new ProcessedEntity(entity.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE))); + } - //If the user does not have the proper rights to perform the action, there will be no processed entities - if (processedEntitiesFromBatch.size() == 0) { - break; - } else { - processedEntities - .addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); - processedEntities - .addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); - processedEntities.addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - processedEntities.addAll(getFailedEntitiesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.INTERNAL_FAILURE)); + if (processedEntitiesFromBatch.size() > 0) { + entitiesToBeProcessed.addAll(processedEntitiesFromBatch); } int successfullyProcessedInBatch = (int) processedEntitiesFromBatch.stream() @@ -344,7 +355,7 @@ private List performBulkOperation( .count(); successfulEntryCount += successfullyProcessedInBatch; - lastProcessedEntry = Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntries.size() - 1); + lastProcessedEntry = Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntities.size() - 1); progressUpdateCallback.accept( new BulkProgressUpdateInfo(entriesInBatch, successfullyProcessedInBatch, entriesInBatch - successfullyProcessedInBatch)); @@ -354,9 +365,9 @@ private List performBulkOperation( cancelLock.unlock(); } - return lastProcessedEntry == selectedEntries.size() - 1 + return lastProcessedEntry == selectedEntities.size() - 1 ? Collections.emptyList() - : selectedEntries.subList(lastProcessedEntry, selectedEntries.size()); + : selectedEntities.subList(lastProcessedEntry, selectedEntities.size()); } private void handleCancelButtonClicked() { @@ -415,14 +426,6 @@ public String buildFailedProcessingDescription(List processedEn description = description.concat(description1); } - if (entityUuidsNotProcessedExternalSurveillanceFailure.size() > 0) { - String description1 = getErrorDescription( - entityUuidsNotProcessedExternalSurveillanceFailure, - I18nProperties.getString(countEntriesNotProcessedExternalReasonProperty), - ""); - description = description.concat(description1); - } - if (entityUuidsNotProcessedSormasToSormasFailure.size() > 0) { String description2 = getErrorDescription( entityUuidsNotProcessedSormasToSormasFailure, @@ -434,7 +437,7 @@ public String buildFailedProcessingDescription(List processedEn if (entityUuidsNotProcessedAccessDeniedFailure.size() > 0) { String description3 = getErrorDescription( entityUuidsNotProcessedAccessDeniedFailure, - I18nProperties.getString(countEntriesNotProcessedMessageProperty), + I18nProperties.getString(countEntriesNotProcessedAccessDeniedReasonProperty), ""); description = description.concat(description3); } @@ -476,11 +479,21 @@ public int getInitialEligibleEntryCount(List selectedEntries, List selecte return selectedIneligibleEntries != null && selectedIneligibleEntries.size() > 0 ? selectedEligibleEntries.size() : selectedEntries.size(); } + public List getEligibleEntriesFromBatch(List entitiesFromBatch, List selectedEligibleEntities) { + List selectedEligibleUuids = selectedEligibleEntities.stream().map(T::getUuid).collect(Collectors.toList()); + return entitiesFromBatch.stream().filter(entity -> selectedEligibleUuids.contains(entity.getUuid())).collect(Collectors.toList()); + } + + public List getInEligibleEntriesFromBatch(List entitiesFromBatch, List selectedEligibleEntities) { + List selectedIneligibleUuids = selectedEligibleEntities.stream().map(T::getUuid).collect(Collectors.toList()); + return entitiesFromBatch.stream().filter(entity -> !selectedIneligibleUuids.contains(entity.getUuid())).collect(Collectors.toList()); + } + public boolean areIneligibleEntriesSelected(List selectedIneligibleEntries) { return selectedIneligibleEntries != null && selectedIneligibleEntries.size() > 0; } - public List getFailedEntitiesByStatus(List processedEntities, ProcessedEntityStatus status) { + public List getEntitiesByProcessingStatus(List processedEntities, ProcessedEntityStatus status) { return processedEntities.stream() .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(status)) .collect(Collectors.toList()); From 081c2b33752563ab63f1ff0fe52c1d3047962509 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 1 Aug 2023 13:57:03 +0300 Subject: [PATCH 012/144] #12257 - refactorings necessary for the other bulk actions --- .../sormas/ui/contact/ContactController.java | 57 +++++++++++++++++-- .../sormas/ui/events/EventController.java | 15 ++++- .../ui/events/EventGroupController.java | 23 +++++++- .../ExternalSurveillanceServiceGateway.java | 25 ++++++-- .../symeda/sormas/ui/user/UserController.java | 46 +++++++++++++-- .../sormas/ui/utils/BulkOperationHandler.java | 34 ++++++----- 6 files changed, 167 insertions(+), 33 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index 3dedd5e9a25..0561b40d223 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -45,6 +45,8 @@ import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.CaseSelectionDto; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactBulkEditData; import de.symeda.sormas.api.contact.ContactClassification; import de.symeda.sormas.api.contact.ContactCriteria; @@ -71,6 +73,7 @@ import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateFormatHelper; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -835,6 +838,9 @@ public void cancelFollowUpOfAllSelectedItems( if (Boolean.TRUE.equals(confirmed)) { String userName = UserProvider.getCurrent().getUserName(); + //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, + //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + new BulkOperationHandler( Strings.messageFollowUpCanceled, null, @@ -842,18 +848,35 @@ public void cancelFollowUpOfAllSelectedItems( null, Strings.messageFollowUpCanceledForSome, null, + null, + null, + null, + null, + null, null).doBulkOperation(batch -> { + List processedContacts = new ArrayList<>(); + //TODO: fill the items which are not eligible with a progressStatus (from below the below if) + for (ContactIndexDto contact : batch) { if (!FollowUpStatus.NO_FOLLOW_UP.equals(contact.getFollowUpStatus()) && !FollowUpStatus.CANCELED.equals(contact.getFollowUpStatus())) { + ContactDto contactDto = FacadeProvider.getContactFacade().getByUuid(contact.getUuid()); contactDto.setFollowUpStatus(FollowUpStatus.CANCELED); contactDto.addToFollowUpComment(String.format(I18nProperties.getString(Strings.infoCanceledBy), userName)); - FacadeProvider.getContactFacade().save(contactDto); + try { + FacadeProvider.getContactFacade().save(contactDto); + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (Exception e) { + //TODO: analyze the save and add all type of exceptions + } + + } else { + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } } - return batch.size(); + return processedContacts; }, new ArrayList<>(selectedRows), null, null, bulkOperationCallback(caseUuid, contactGrid, null)); } }); @@ -881,25 +904,51 @@ public void setAllSelectedItemsToLostToFollowUp( if (Boolean.TRUE.equals(confirmed)) { String userName = UserProvider.getCurrent().getUserName(); + //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, + // countEntriesNotProcessedSormastoSormasReasonProperty,countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty new BulkOperationHandler( Strings.messageFollowUpStatusChanged, null, null, null, + null, + null, + null, + null, Strings.messageFollowUpStatusChangedForSome, null, + null, null).doBulkOperation(batch -> { + //TODO: fill the status for ineligible items + List processedContacts = new ArrayList<>(); + for (ContactIndexDto contact : batch) { if (contact.getFollowUpStatus() != FollowUpStatus.NO_FOLLOW_UP) { ContactDto contactDto = FacadeProvider.getContactFacade().getByUuid(contact.getUuid()); contactDto.setFollowUpStatus(FollowUpStatus.LOST); contactDto .addToFollowUpComment(String.format(I18nProperties.getString(Strings.infoLostToFollowUpBy), userName)); - FacadeProvider.getContactFacade().save(contactDto); + try { + FacadeProvider.getContactFacade().save(contactDto); + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedContacts + .add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error( + "The contact with uuid {} could not be saved due to an AccessDeniedException", + contact.getUuid(), + e); + } catch (Exception e) { + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The contact with uuid {} could not be saved due to an Exception", contact.getUuid(), e); + } + } else { + //TODO: check this part + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } } + return processedContacts; - return batch.size(); }, new ArrayList<>(selectedRows), null, null, bulkOperationCallback(caseUuid, contactGrid, null)); } }); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index 50bce40c9d6..aa14cbd9e6c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -52,6 +52,7 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; @@ -345,21 +346,33 @@ private void linkContactsToEvent(EventReferenceDto eventReferenceDto, List( Strings.messageAllContactsLinkedToEvent, null, Strings.headingSomeContactsAlreadyInEvent, + null, Strings.messageCountContactsAlreadyInEvent, + null, + null, + null, Strings.messageSomeContactsLinkedToEvent, Strings.messageAllContactsAlreadyInEvent, + null, null).doBulkOperation(batch -> { + //TODO: fill the status for ineligible items + List processedContacts = new ArrayList<>(); + + //TODO: change the logic here batch.forEach(contactDataDto -> { EventParticipantDto ep = EventParticipantDto.buildFromPerson(personByUuid.get(contactDataDto.getPerson().getUuid()), eventReferenceDto, currentUser); FacadeProvider.getEventParticipantFacade().save(ep); }); - return batch.size(); + return processedContacts; }, new ArrayList<>(contacts), new ArrayList<>(contactByPersonUuid.values()), alreadyLinkedContacts, callback); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java index eda30492d3b..d107bcec6b9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java @@ -35,6 +35,7 @@ import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventGroupCriteria; import de.symeda.sormas.api.event.EventGroupDto; @@ -68,8 +69,24 @@ private static void linkEventsToGroup( Consumer> callback) { String messageEventsLinkedToGroup = eventReferences.size() > 1 ? Strings.messageEventsLinkedToGroup : Strings.messageEventLinkedToGroup; - new BulkOperationHandler(messageEventsLinkedToGroup, null, null, null, Strings.messageSomeEventsLinkedToGroup, null, null) - .doBulkOperation(batch -> { + //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, + //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + new BulkOperationHandler( + messageEventsLinkedToGroup, + null, + null, + null, + null, + null, + null, + null, + Strings.messageSomeEventsLinkedToGroup, + null, + null, + null).doBulkOperation(batch -> { + List processedEventGroups = new ArrayList<>(); + //TODO: fill the items which are not eligible with a progressStatus (from below the below if) + //TODO: change the logic FacadeProvider.getEventGroupFacade() .linkEventsToGroups( batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()), @@ -79,7 +96,7 @@ private static void linkEventsToGroup( eventGroupReference.getUuid(), batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); - return batch.size(); + return processedEventGroups; }, new ArrayList<>(eventReferences), null, null, callback); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java index d86cbd0e5cf..b0b5030caab 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java @@ -19,6 +19,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseIndexDto; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventIndexDto; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; @@ -119,22 +120,31 @@ public static void sendCasesToExternalSurveillanceTool( Consumer> callback) { sendToExternalSurveillanceTool(I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_confirmSendCases), () -> { ArrayList selectedCasesCpy = new ArrayList<>(selectedCases); + //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, + //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty new BulkOperationHandler( Strings.ExternalSurveillanceToolGateway_notificationEntriesSent, null, null, null, + null, + null, + null, + null, Strings.ExternalSurveillanceToolGateway_notificationSomeEntriesSent, null, + null, null).doBulkOperation(batch -> { + List processedCases = new ArrayList<>(); try { FacadeProvider.getExternalSurveillanceToolFacade() .sendCases(batch.stream().map(CaseIndexDto::getUuid).collect(Collectors.toList())); } catch (ExternalSurveillanceToolException e) { - return 0; + //TODO: add all type of exceptions here + //return 0; } - return batch.size(); + return processedCases; }, selectedCasesCpy, null, null, callback); }, null, shouldConfirm, null); @@ -151,17 +161,24 @@ public static void sendEventsToExternalSurveillanceTool( null, null, null, + null, + null, + null, + null, Strings.ExternalSurveillanceToolGateway_notificationSomeEntriesSent, null, + null, null).doBulkOperation(batch -> { + List processedEvents = new ArrayList<>(); try { FacadeProvider.getExternalSurveillanceToolFacade() .sendEvents(batch.stream().map(EventIndexDto::getUuid).collect(Collectors.toList())); } catch (ExternalSurveillanceToolException e) { - return 0; + //TODO: add all type of exceptions here + //return 0; } - return batch.size(); + return processedEvents; }, selectedEventsCpy, null, null, callback); }, null, shouldConfirm, null); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java index f8993620e4b..000118fef62 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java @@ -46,6 +46,7 @@ import de.symeda.sormas.api.AuthProvider; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.Language; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -367,12 +368,29 @@ public void enableAllSelectedItems(Collection selectedRows, UserGrid us return; } - new BulkOperationHandler(Strings.messageUsersEnabled, null, null, null, Strings.messageSomeUsersEnabled, null, null) - .doBulkOperation(batch -> { + //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, + //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + new BulkOperationHandler( + Strings.messageUsersEnabled, + null, + null, + null, + null, + null, + null, + null, + Strings.messageSomeUsersEnabled, + null, + null, + null).doBulkOperation(batch -> { + + List processedUsers = new ArrayList<>(); + + //TODO: change the logic List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); FacadeProvider.getUserFacade().enableUsers(uuids); - return batch.size(); + return processedUsers; }, new ArrayList<>(selectedRows), null, null, remaining -> { userGrid.reload(); if (CollectionUtils.isNotEmpty(remaining)) { @@ -405,12 +423,28 @@ public void disableAllSelectedItems(Collection selectedRows, UserGrid u return; } - new BulkOperationHandler(Strings.messageUsersDisabled, null, null, null, Strings.messageSomeUsersDisabled, null, null) - .doBulkOperation(batch -> { + //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, + //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + new BulkOperationHandler( + Strings.messageUsersDisabled, + null, + null, + null, + null, + null, + null, + null, + Strings.messageSomeUsersDisabled, + null, + null, + null).doBulkOperation(batch -> { + + List processedUsers = new ArrayList<>(); + //TODO: change the logic List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); FacadeProvider.getUserFacade().disableUsers(uuids); - return batch.size(); + return processedUsers; }, new ArrayList<>(selectedRows), null, null, remaining -> { userGrid.reload(); if (CollectionUtils.isNotEmpty(remaining)) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 7d67839bf76..db1c4cb6cc8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -9,9 +9,8 @@ import java.util.function.Function; import java.util.stream.Collectors; -import org.slf4j.LoggerFactory; - import org.apache.commons.lang3.StringUtils; +import org.slf4j.LoggerFactory; import com.vaadin.server.Sizeable; import com.vaadin.shared.ui.ContentMode; @@ -32,7 +31,6 @@ import de.symeda.sormas.ui.utils.components.progress.BulkProgressLayout; import de.symeda.sormas.ui.utils.components.progress.BulkProgressUpdateInfo; import de.symeda.sormas.ui.utils.components.progress.ProgressResult; -import org.slf4j.LoggerFactory; public class BulkOperationHandler { @@ -71,14 +69,22 @@ public BulkOperationHandler( String allEntriesProcessedMessageProperty, String ineligibleEntriesNotProcessedMessageProperty, String headingSomeEntitiesNotProcessed, + + //not added String headingNoProcessedEntities, + String countEntriesNotProcessedMessageProperty, + + //Not added String countEntriesNotProcessedExternalReasonProperty, String countEntriesNotProcessedSormasToSormasReasonProperty, String countEntriesNotProcessedAccessDeniedReasonProperty, + String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, String infoBulkProcessFinishedWithSkipsProperty, + + //Not added String infoBulkProcessFinishedWithoutSuccess) { this.allEntriesProcessedMessageProperty = allEntriesProcessedMessageProperty; @@ -214,15 +220,15 @@ public void doBulkOperation( bulkOperationDoneCallback); } }); - } catch (Exception e) { - LoggerFactory.getLogger(BulkOperationHandler.class).error("Error during bulk operation", e); - bulkProgressLayout.finishProgress(ProgressResult.FAILURE, I18nProperties.getString(Strings.errorWasReported), () -> { - window.close(); - bulkOperationDoneCallback.accept(selectedEntries); - }); - } finally { - currentUI.setPollInterval(-1); - } + } catch (Exception e) { + LoggerFactory.getLogger(BulkOperationHandler.class).error("Error during bulk operation", e); + bulkProgressLayout.finishProgress(ProgressResult.FAILURE, I18nProperties.getString(Strings.errorWasReported), null, () -> { + window.close(); + bulkOperationDoneCallback.accept(selectedEntries); + }); + } finally { + currentUI.setPollInterval(-1); + } }); bulkThread.start(); @@ -411,9 +417,7 @@ public String buildIneligibleEntriesDescription(boolean areIneligibleEntriesSele ineligibleEntriesDescription = getErrorDescription( selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), I18nProperties.getString(countEntriesNotProcessedMessageProperty), - ineligibleEntriesNotProcessedMessageProperty != null - ? I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty) - : ""); + ineligibleEntriesNotProcessedMessageProperty != null ? I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty) : ""); } return ineligibleEntriesDescription; From a4710ef968c744573d30df7583005f8c3b693181 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 1 Aug 2023 17:27:00 +0300 Subject: [PATCH 013/144] #12257 - add exceptions for other bulk actions --- .../backend/event/EventGroupFacadeEjb.java | 3 +- .../sormas/ui/contact/ContactController.java | 22 ++++++++--- .../sormas/ui/events/EventController.java | 31 ++++++++++++--- .../ui/events/EventGroupController.java | 39 +++++++++++++------ .../ExternalSurveillanceServiceGateway.java | 25 +++++++++++- .../sormas/ui/utils/BulkOperationHandler.java | 3 -- 6 files changed, 97 insertions(+), 26 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java index cee7c9e9b66..fddddf3e352 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java @@ -67,6 +67,7 @@ import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.user.NotificationType; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.backend.FacadeHelper; @@ -379,7 +380,7 @@ public void linkEventsToGroups(List eventUuids, List eventGroupU for (Event event : events) { final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); if (!eventFacade.isInJurisdictionOrOwned(event.getUuid()) && (jurisdictionLevel != JurisdictionLevel.NATION) && !currentUser.isAdmin()) { - throw new UnsupportedOperationException( + throw new AccessDeniedException( "User " + currentUser.getUuid() + " is not allowed to link events from another region to an event group."); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index 0561b40d223..eeb1d0bed3f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -855,7 +855,6 @@ public void cancelFollowUpOfAllSelectedItems( null, null).doBulkOperation(batch -> { List processedContacts = new ArrayList<>(); - //TODO: fill the items which are not eligible with a progressStatus (from below the below if) for (ContactIndexDto contact : batch) { if (!FollowUpStatus.NO_FOLLOW_UP.equals(contact.getFollowUpStatus()) @@ -867,10 +866,21 @@ public void cancelFollowUpOfAllSelectedItems( try { FacadeProvider.getContactFacade().save(contactDto); processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedContacts + .add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error( + "The follow up of the contact with uuid {} could not be cancelled due to an AccessDeniedException", + contact.getUuid(), + e); } catch (Exception e) { //TODO: analyze the save and add all type of exceptions + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error( + "The follow up of the contact with uuid {} could not be cancelled due to an Exception", + contact.getUuid(), + e); } - } else { processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } @@ -919,7 +929,6 @@ public void setAllSelectedItemsToLostToFollowUp( null, null, null).doBulkOperation(batch -> { - //TODO: fill the status for ineligible items List processedContacts = new ArrayList<>(); for (ContactIndexDto contact : batch) { @@ -935,12 +944,15 @@ public void setAllSelectedItemsToLostToFollowUp( processedContacts .add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); logger.error( - "The contact with uuid {} could not be saved due to an AccessDeniedException", + "The follow up status of contact with uuid {} could not be set due to an AccessDeniedException", contact.getUuid(), e); } catch (Exception e) { processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - logger.error("The contact with uuid {} could not be saved due to an Exception", contact.getUuid(), e); + logger.error( + "TThe follow up status of contact with uuid {} could not be set due to an Exception", + contact.getUuid(), + e); } } else { //TODO: check this part diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index aa14cbd9e6c..3886b71badb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -31,6 +31,8 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.base.Functions; import com.vaadin.navigator.Navigator; @@ -53,6 +55,7 @@ import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; @@ -76,6 +79,7 @@ import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.ui.ControllerProvider; @@ -98,6 +102,8 @@ public class EventController { + protected final Logger logger = LoggerFactory.getLogger(getClass()); + public void registerViews(Navigator navigator) { navigator.addView(EventsView.VIEW_NAME, EventsView.class); navigator.addView(EventDataView.VIEW_NAME, EventDataView.class); @@ -362,17 +368,32 @@ private void linkContactsToEvent(EventReferenceDto eventReferenceDto, List { - //TODO: fill the status for ineligible items - List processedContacts = new ArrayList<>(); + //TODO: check if contacts or events should be passed here + List processedEvents = new ArrayList<>(); - //TODO: change the logic here batch.forEach(contactDataDto -> { EventParticipantDto ep = EventParticipantDto.buildFromPerson(personByUuid.get(contactDataDto.getPerson().getUuid()), eventReferenceDto, currentUser); - FacadeProvider.getEventParticipantFacade().save(ep); + try { + FacadeProvider.getEventParticipantFacade().save(ep); + processedEvents.add(new ProcessedEntity(eventReferenceDto.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEvents.add(new ProcessedEntity(eventReferenceDto.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error( + "The event participant of the event with uuid {} could not be linked due to an AccessDeniedException", + eventReferenceDto.getUuid(), + e); + } catch (Exception e) { + processedEvents.add(new ProcessedEntity(eventReferenceDto.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error( + "The event participant of the event with uuid {} could not be linked due to an Exception", + eventReferenceDto.getUuid(), + e); + } + }); - return processedContacts; + return processedEvents; }, new ArrayList<>(contacts), new ArrayList<>(contactByPersonUuid.values()), alreadyLinkedContacts, callback); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java index d107bcec6b9..767ce408783 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java @@ -24,6 +24,9 @@ import java.util.function.Consumer; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.vaadin.server.Page; import com.vaadin.server.Sizeable; import com.vaadin.ui.Alignment; @@ -36,6 +39,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventGroupCriteria; import de.symeda.sormas.api.event.EventGroupDto; @@ -49,6 +53,7 @@ import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SormasUI; @@ -63,7 +68,9 @@ public class EventGroupController { - private static void linkEventsToGroup( + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + private void linkEventsToGroup( List eventReferences, EventGroupReferenceDto eventGroupReference, Consumer> callback) { @@ -86,16 +93,26 @@ private static void linkEventsToGroup( null).doBulkOperation(batch -> { List processedEventGroups = new ArrayList<>(); //TODO: fill the items which are not eligible with a progressStatus (from below the below if) - //TODO: change the logic - FacadeProvider.getEventGroupFacade() - .linkEventsToGroups( - batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()), - Collections.singletonList(eventGroupReference.getUuid())); - FacadeProvider.getEventGroupFacade() - .notifyEventAddedToEventGroup( - eventGroupReference.getUuid(), - batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); - + try { + FacadeProvider.getEventGroupFacade() + .linkEventsToGroups( + batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()), + Collections.singletonList(eventGroupReference.getUuid())); + + FacadeProvider.getEventGroupFacade() + .notifyEventAddedToEventGroup( + eventGroupReference.getUuid(), + batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); + processedEventGroups.add(new ProcessedEntity(eventGroupReference.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEventGroups.add(new ProcessedEntity(eventGroupReference.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger + .error("The event group with uuid {} could not be linked due to an AccessDeniedException", eventGroupReference.getUuid(), e); + } catch (Exception e) { + processedEventGroups.add(new ProcessedEntity(eventGroupReference.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger + .error("The event group with uuid {} could not be linked due to an AccessDeniedException", eventGroupReference.getUuid(), e); + } return processedEventGroups; }, new ArrayList<>(eventReferences), null, null, callback); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java index b0b5030caab..10d6ee3ba00 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java @@ -20,6 +20,7 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseIndexDto; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventIndexDto; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; @@ -27,6 +28,7 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.share.ExternalShareInfoCriteria; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.utils.BulkOperationHandler; import de.symeda.sormas.ui.utils.DirtyStateComponent; @@ -139,9 +141,13 @@ public static void sendCasesToExternalSurveillanceTool( try { FacadeProvider.getExternalSurveillanceToolFacade() .sendCases(batch.stream().map(CaseIndexDto::getUuid).collect(Collectors.toList())); + } catch (AccessDeniedException e) { + addProcessingStatusToEntities(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); } catch (ExternalSurveillanceToolException e) { //TODO: add all type of exceptions here - //return 0; + addProcessingStatusToEntities(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + } catch (Exception e) { + //TODO: if other exceptions should be added } return processedCases; @@ -150,6 +156,23 @@ public static void sendCasesToExternalSurveillanceTool( }, null, shouldConfirm, null); } + public static List addProcessingStatusToEntities( + Collection entities, + ProcessedEntityStatus processedEntityStatus) { + List processedEntities = new ArrayList<>(); + + //if for one entity occurs a type of exception (AccessDenied or ExternalSurveillanceTool) that exception will occur for the whole batch + entities.forEach(entity -> processedEntities.add(new ProcessedEntity(entity.getUuid(), processedEntityStatus))); + + if (processedEntityStatus.equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE)) { + logger.error("The selected entities could not be sent to the External Surveillance Tool due to an AccessDeniedException"); + } else { + logger.error("The selected entities could not be sent to the External Surveillance Tool due to an ExternalSurveillanceToolException"); + } + + return processedEntities; + } + public static void sendEventsToExternalSurveillanceTool( Collection selectedEvents, boolean shouldConfirm, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index db1c4cb6cc8..4b88f29543b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -69,12 +69,10 @@ public BulkOperationHandler( String allEntriesProcessedMessageProperty, String ineligibleEntriesNotProcessedMessageProperty, String headingSomeEntitiesNotProcessed, - //not added String headingNoProcessedEntities, String countEntriesNotProcessedMessageProperty, - //Not added String countEntriesNotProcessedExternalReasonProperty, String countEntriesNotProcessedSormasToSormasReasonProperty, @@ -83,7 +81,6 @@ public BulkOperationHandler( String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, String infoBulkProcessFinishedWithSkipsProperty, - //Not added String infoBulkProcessFinishedWithoutSuccess) { From c8bdb0252033264ac2313b7f518b1785a004381a Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 3 Aug 2023 16:09:14 +0300 Subject: [PATCH 014/144] #12257 - refactorings needed for case archiving --- .../de/symeda/sormas/api/caze/CaseFacade.java | 2 +- .../de/symeda/sormas/api/i18n/Strings.java | 15 ++-- .../src/main/resources/strings.properties | 15 ++-- .../sormas/backend/caze/CaseFacadeEjb.java | 8 +- .../sormas/backend/caze/CaseService.java | 49 ++++++++++-- .../common/AbstractCoreAdoService.java | 6 +- .../backend/common/AbstractCoreFacadeEjb.java | 4 +- ...ernalSurveillanceToolGatewayFacadeEjb.java | 14 +++- .../sormas/ui/utils/ArchiveHandlers.java | 8 +- .../sormas/ui/utils/ArchiveMessages.java | 78 +++++++++++++++---- .../sormas/ui/utils/ArchivingController.java | 10 ++- .../ui/utils/DeleteRestoreMessages.java | 16 +--- 12 files changed, 142 insertions(+), 83 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java index 00a07e01cb4..9b870d2074d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java @@ -216,7 +216,7 @@ List saveBulkEditWithFacilities( PreviousCaseDto getMostRecentPreviousCase(PersonReferenceDto person, Disease disease, Date startDate); - List archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts); + void archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts); List archive(List entityUuids, boolean includeContacts); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 00c0e62314a..8aaafdb3607 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -548,6 +548,7 @@ public interface Strings { String headingEditUser = "headingEditUser"; String headingEditVaccination = "headingEditVaccination"; String headingEditVisit = "headingEditVisit"; + String headingEntitiesNotArchived = "headingEntitiesNotArchived"; String headingEnvironmentalExposure = "headingEnvironmentalExposure"; String headingEpiCurve = "headingEpiCurve"; String headingEpiDataSourceCaseContacts = "headingEpiDataSourceCaseContacts"; @@ -734,24 +735,16 @@ public interface Strings { String headingShowExternalMessage = "headingShowExternalMessage"; String headingSignsAndSymptoms = "headingSignsAndSymptoms"; String headingSimilarImmunization = "headingSimilarImmunization"; - String headingSomeCasesNotDeleted = "headingSomeCasesNotDeleted"; String headingSomeCasesNotRestored = "headingSomeCasesNotRestored"; String headingSomeContactsAlreadyInEvent = "headingSomeContactsAlreadyInEvent"; - String headingSomeContactsNotDeleted = "headingSomeContactsNotDeleted"; String headingSomeContactsNotRestored = "headingSomeContactsNotRestored"; - String headingSomeEventParticipantsNotDeleted = "headingSomeEventParticipantsNotDeleted"; + String headingSomeEntitiesNotArchived = "headingSomeEntitiesNotArchived"; + String headingSomeEntitiesNotDeleted = "headingSomeEntitiesNotDeleted"; String headingSomeEventParticipantsNotRestored = "headingSomeEventParticipantsNotRestored"; - String headingSomeEventsNotDeleted = "headingSomeEventsNotDeleted"; String headingSomeEventsNotRestored = "headingSomeEventsNotRestored"; - String headingSomeExternalMessagesNotDeleted = "headingSomeExternalMessagesNotDeleted"; - String headingSomeImmunizationsNotDeleted = "headingSomeImmunizationsNotDeleted"; String headingSomeImmunizationsNotRestored = "headingSomeImmunizationsNotRestored"; - String headingSomeSamplesNotDeleted = "headingSomeSamplesNotDeleted"; String headingSomeSamplesNotRestored = "headingSomeSamplesNotRestored"; - String headingSomeTasksNotDeleted = "headingSomeTasksNotDeleted"; - String headingSomeTravelEntriesNotDeleted = "headingSomeTravelEntriesNotDeleted"; String headingSomeTravelEntriesNotRestored = "headingSomeTravelEntriesNotRestored"; - String headingSomeVisitsNotDeleted = "headingSomeVisitsNotDeleted"; String headingSormasToSormasCanAcceptContactsWithoutCase = "headingSormasToSormasCanAcceptContactsWithoutCase"; String headingSormasToSormasCantShareContactWithoutCase = "headingSormasToSormasCantShareContactWithoutCase"; String headingSormasToSormasDuplicateDetection = "headingSormasToSormasDuplicateDetection"; @@ -1117,6 +1110,7 @@ public interface Strings { String messageConvertEventParticipantToCaseNoDisease = "messageConvertEventParticipantToCaseNoDisease"; String messageCopyPassword = "messageCopyPassword"; String messageCountCasesAlreadyInEvent = "messageCountCasesAlreadyInEvent"; + String messageCountCasesNotArchivedExternalReason = "messageCountCasesNotArchivedExternalReason"; String messageCountCasesNotDeleted = "messageCountCasesNotDeleted"; String messageCountCasesNotDeletedExternalReason = "messageCountCasesNotDeletedExternalReason"; String messageCountCasesNotDeletedSormasToSormasReason = "messageCountCasesNotDeletedSormasToSormasReason"; @@ -1130,6 +1124,7 @@ public interface Strings { String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; String messageCountEventParticipantsNotDeletedAccessDeniedReason = "messageCountEventParticipantsNotDeletedAccessDeniedReason"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; + String messageCountEventsNotArchivedExternalReason = "messageCountEventsNotArchivedExternalReason"; String messageCountEventsNotDeleted = "messageCountEventsNotDeleted"; String messageCountEventsNotDeletedExternalReason = "messageCountEventsNotDeletedExternalReason"; String messageCountEventsNotDeletedSormasToSormasReason = "messageCountEventsNotDeletedSormasToSormasReason"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 3e1b729a3cd..cdd256008ac 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -529,6 +529,7 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available @@ -728,23 +729,15 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDeleted= Some entities were not deleted headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted headingSomeEventParticipantsNotRestored = Some event participants were not restored -headingSomeImmunizationsNotDeleted = Some immunizations were not deleted headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -1152,6 +1145,7 @@ messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet #change everywhere this message +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed: %s messageCountCasesNotDeleted = %s cases not deleted: %s messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned: %s messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed: %s @@ -1161,6 +1155,7 @@ messageCountContactsNotDeleted = %s contacts not deleted: %s messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned: %s messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted: %s messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned: %s diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 969604b23d5..c86ee15cb9f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2823,22 +2823,18 @@ public void deleteCaseInExternalSurveillanceTool(Case caze) throws ExternalSurve @Override @RightsAllowed(UserRight._CASE_ARCHIVE) - public List archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts) { + public void archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts) { super.archive(entityUuid, endOfProcessingDate); if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(Collections.singletonList(entityUuid)); contactService.archive(caseContacts); } - List processedEntities = new ArrayList<>(); - return processedEntities; } @Override @RightsAllowed(UserRight._CASE_ARCHIVE) public List archive(List entityUuids, boolean includeContacts) { - super.archive(entityUuids); - - List processedEntities = new ArrayList<>(); + List processedEntities = super.archive(entityUuids); if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(entityUuids); contactService.archive(caseContacts); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 146ac6f9854..0f794130824 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -82,6 +82,8 @@ import de.symeda.sormas.api.clinicalcourse.ClinicalCourseReferenceDto; import de.symeda.sormas.api.clinicalcourse.ClinicalVisitCriteria; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactStatus; import de.symeda.sormas.api.contact.FollowUpStatus; import de.symeda.sormas.api.document.DocumentRelatedEntityType; @@ -103,6 +105,7 @@ import de.symeda.sormas.api.therapy.TherapyReferenceDto; import de.symeda.sormas.api.therapy.TreatmentCriteria; import de.symeda.sormas.api.user.JurisdictionLevel; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.YesNoUnknown; @@ -1118,18 +1121,37 @@ public void archive(String entityUuid, Date endOfProcessingDate) { } @Override - public void archive(List entityUuids) { - super.archive(entityUuids); - setArchiveInExternalSurveillanceToolForEntities(entityUuids, true); + public List archive(List entityUuids) { + List processedCases = updateArchiveFlagInExternalSurveillanceToolForSharedEntities(entityUuids, true); + List casesToBeProcessed = getCasesToBeProcessed(entityUuids, processedCases); + List caseUuidsToBeProcessed = casesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + + super.archive(caseUuidsToBeProcessed); + processedCases.addAll(buildProcessedEntities(caseUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + + return processedCases; + } + + public List getCasesToBeProcessed(List entityUuids, List processedCases) { + List failedUuids = processedCases.stream() + .filter( + entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE) + || entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) + .map(entity -> entity.getEntityUuid()) + .collect(Collectors.toList()); + + List cases = getByUuids(entityUuids); + return cases.stream().filter(caze -> !failedUuids.contains(caze.getUuid())).collect(Collectors.toList()); } @Override public void dearchive(List entityUuids, String dearchiveReason) { super.dearchive(entityUuids, dearchiveReason); - setArchiveInExternalSurveillanceToolForEntities(entityUuids, false); + updateArchiveFlagInExternalSurveillanceToolForSharedEntities(entityUuids, false); } - public void setArchiveInExternalSurveillanceToolForEntities(List entityUuids, boolean archived) { + public List updateArchiveFlagInExternalSurveillanceToolForSharedEntities(List entityUuids, boolean archived) { + List processedCases = new ArrayList<>(); if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { List uuidsAllowedToBeShared = getEntityUuidsAllowedToBeShared(entityUuids); if (!uuidsAllowedToBeShared.isEmpty()) { @@ -1137,13 +1159,24 @@ public void setArchiveInExternalSurveillanceToolForEntities(List entityU List sharedCaseUuids = getSharedCaseUuids(uuidsAllowedToBeShared); if (!sharedCaseUuids.isEmpty()) { try { - externalSurveillanceToolGatewayFacade.sendCasesInternal(entityUuids, archived); + externalSurveillanceToolGatewayFacade.sendCasesInternal(sharedCaseUuids, archived); } catch (ExternalSurveillanceToolException e) { - throw new ExternalSurveillanceToolRuntimeException(e.getMessage(), e.getErrorCode()); + processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + //TODO: add a catch for AccessDeniedException too ( add to the events too) + } catch (AccessDeniedException e) { + processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); } } } } + return processedCases; + } + + public List buildProcessedEntities(List sharedCaseUuids, ProcessedEntityStatus processedEntityStatus) { + List processedEntities = new ArrayList<>(); + sharedCaseUuids.forEach(sharedCazeUuid -> processedEntities.add(new ProcessedEntity(sharedCazeUuid, processedEntityStatus))); + + return processedEntities; } public List getSharedCaseUuids(List entityUuids) { @@ -1174,7 +1207,7 @@ public List getEntityUuidsAllowedToBeShared(List entityUuids) { } public void setArchiveInExternalSurveillanceToolForEntity(String entityUuid, boolean archived) { - setArchiveInExternalSurveillanceToolForEntities(Collections.singletonList(entityUuid), archived); + updateArchiveFlagInExternalSurveillanceToolForSharedEntities(Collections.singletonList(entityUuid), archived); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 4933e129a35..5cee5f8a07d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -17,6 +17,7 @@ import java.sql.Timestamp; import java.time.Instant; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -36,6 +37,7 @@ import javax.persistence.criteria.Root; import de.symeda.sormas.api.EditPermissionType; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.util.IterableHelper; @@ -143,7 +145,7 @@ public void archive(String entityUuid, Date endOfProcessingDate) { } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) - public void archive(List entityUuids) { + public List archive(List entityUuids) { IterableHelper.executeBatched( entityUuids, @@ -161,6 +163,8 @@ public void archive(List entityUuids) { em.createQuery(cu).executeUpdate(); })); + + return new ArrayList<>(); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index fe762d6db24..91936c0a5ee 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -224,9 +224,7 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @DenyAll public List archive(List entityUuids) { - List processedEntities = new ArrayList<>(); - service.archive(entityUuids); - return processedEntities; + return service.archive(entityUuids); } @DenyAll diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java index 4d40083fd70..60275ae1410 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java @@ -125,13 +125,21 @@ private void doSendEvents(List eventUuids, boolean archived) throws Exte private void sendRequest(ExportParameters params) throws ExternalSurveillanceToolException { String serviceUrl = configFacade.getExternalSurveillanceToolGatewayUrl().trim(); - Response response = ClientBuilder.newBuilder() + Invocation.Builder request = + ClientBuilder.newBuilder() .connectTimeout(30, TimeUnit.SECONDS) .build() .target(serviceUrl) .path("export") - .request() - .post(Entity.json(params)); + .request(); + + Response response; + try { + response = request.post(Entity.json(params)); + } catch (Exception e) { + logger.error("Failed to send request to external surveillance tool", e); + throw new ExternalSurveillanceToolException(I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorSending)); + } int status = response.getStatus(); switch (status) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index c19e5ddd168..79ab6dbfee2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -188,8 +188,6 @@ public void archive(String entityUuid) { @Override public List archive(List entityUuids) { List processedEntities = entityFacade.archive(entityUuids); - - //return entityUuids.size(); return processedEntities; } @@ -202,7 +200,6 @@ public List dearchive(String entityUuid) { @Override public List dearchive(List entityUuids) { List processedEntities = entityFacade.dearchive(entityUuids, dearchiveReasonField.getValue()); - //return entityUuids.size(); return processedEntities; } @@ -267,10 +264,7 @@ public List dearchive(String entityUuid) { @Override public List archive(List entityUuids) { - List processedEntities = entityFacade.archive(entityUuids, archiveWithContacts.getValue()); - - //return entityUuids.size(); - return processedEntities; + return entityFacade.archive(entityUuids, archiveWithContacts.getValue()); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index 8856e22e2ba..66d29dd59f9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -13,7 +13,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveCases, Strings.messageCaseDearchived, Strings.headingNoCasesSelected, - Strings.messageNoCasesSelected), + Strings.messageNoCasesSelected, + Strings.messageCountCasesNotArchivedExternalReason), CONTACT(Strings.headingArchiveContact, Strings.confirmationArchiveContact, @@ -24,7 +25,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveContacts, Strings.messageContactDearchived, Strings.headingNoContactsSelected, - Strings.messageNoContactsSelected), + Strings.messageNoContactsSelected, + null), ENVIRONMENT(Strings.headingArchiveEnvironment, Strings.confirmationArchiveEnvironment, @@ -35,7 +37,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveEnvironments, Strings.messageEnvironmentDearchived, Strings.headingNoEnvironmentSelected, - Strings.messageNoEnvironmentsSelected), + Strings.messageNoEnvironmentsSelected, + null), EVENT(Strings.headingArchiveEvent, Strings.confirmationArchiveEvent, @@ -46,7 +49,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveEvents, Strings.messageEventDearchived, Strings.headingNoEventsSelected, - Strings.messageNoEventsSelected), + Strings.messageNoEventsSelected, + Strings.messageCountEventsNotArchivedExternalReason), EVENT_PARTICIPANT(Strings.headingArchiveEventParticipant, Strings.confirmationArchiveEventParticipant, @@ -57,7 +61,8 @@ public enum ArchiveMessages { null, Strings.messageEventParticipantDearchived, Strings.headingNoEventParticipantsSelected, - Strings.messageNoEventParticipantsSelected), + Strings.messageNoEventParticipantsSelected, + null), IMMUNIZATION(Strings.headingArchiveImmunization, Strings.confirmationArchiveImmunization, @@ -68,6 +73,7 @@ public enum ArchiveMessages { null, Strings.messageImmunizationDearchived, null, + null, null), TRAVEL_ENTRY(Strings.headingArchiveTravelEntry, @@ -79,7 +85,8 @@ public enum ArchiveMessages { null, Strings.messageTravelEntryDearchived, Strings.headingNoTravelEntriesSelected, - Strings.messageNoTravelEntriesSelected), + Strings.messageNoTravelEntriesSelected, + null), CAMPAIGN(Strings.headingArchiveCampaign, Strings.confirmationArchiveCampaign, @@ -90,6 +97,7 @@ public enum ArchiveMessages { null, Strings.messageCampaignDearchived, null, + null, null), TASK(Strings.headingConfirmArchiving, @@ -101,7 +109,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveTasks, Strings.messageTaskDearchived, Strings.headingNoTasksSelected, - Strings.messageNoTasksSelected), + Strings.messageNoTasksSelected, + null), CONTINENT(Strings.headingConfirmArchiving, Strings.confirmationArchiveContinent, @@ -112,7 +121,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveContinents, Strings.messageContinentDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), SUBCONTINENT(Strings.headingConfirmArchiving, Strings.confirmationArchiveSubcontinent, @@ -123,7 +133,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveSubcontinents, Strings.messageSubcontinentDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), AREA(Strings.headingConfirmArchiving, Strings.confirmationArchiveArea, @@ -134,7 +145,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveAreas, Strings.messageAreaDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), COUNTRY(Strings.headingConfirmArchiving, Strings.confirmationArchiveCountry, @@ -145,7 +157,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveCountries, Strings.messageCountryDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), REGION(Strings.headingConfirmArchiving, Strings.confirmationArchiveRegion, @@ -156,7 +169,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveRegions, Strings.messageRegionDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), DISTRICT(Strings.headingConfirmArchiving, Strings.confirmationArchiveDistrict, @@ -167,7 +181,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveDistricts, Strings.messageDistrictDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), COMMUNITY(Strings.headingConfirmArchiving, Strings.confirmationArchiveCommunity, @@ -178,7 +193,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveCommunities, Strings.messageCommunityDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), FACILITY(Strings.headingConfirmArchiving, Strings.confirmationArchiveFacility, @@ -189,7 +205,8 @@ public enum ArchiveMessages { Strings.confirmationDearchiveFacilities, Strings.messageFacilityDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected), + Strings.messageNoRowsSelected, + null), POINT_OF_ENTRY(Strings.headingConfirmArchiving, Strings.confirmationArchivePointOfEntry, @@ -200,7 +217,8 @@ public enum ArchiveMessages { Strings.confirmationDearchivePointsOfEntry, Strings.messagePointOfEntryDearchived, Strings.headingNoRowsSelected, - Strings.messageNoRowsSelected); + Strings.messageNoRowsSelected, + null); private final String headingArchiveEntity; private final String confirmationArchiveEntity; @@ -213,6 +231,7 @@ public enum ArchiveMessages { private final String headingNoEntitySelected; private final String messageNoEntitySelected; + private final String messageCountEntitiesNotArchivedExternalReason; private final String headingConfirmationArchiving = Strings.headingConfirmArchiving; private final String headingConfirmationDearchiving = Strings.headingConfirmDearchiving; @@ -221,6 +240,17 @@ public enum ArchiveMessages { private final String messageAllEntitiesDearchived = Strings.messageAllEntitiesDearchived; private final String messageSomeEntitiesDearchived = Strings.messageSomeEntitiesDearchived; + //TODO: check if is necessary to be added for each entity separately + private final String headingSomeEntitiesNotArchived = Strings.headingSomeEntitiesNotArchived; + private final String headingEntitiesNotArchived = Strings.headingEntitiesNotArchived; + + //private final String messageCountEntitiesNotArchived; + + /* + * private final String headingSomeEntitiesDearchived = Strings.headingSomeEntitiesDearchived; + * private final String headingEntitiesNotDearchived = Strings.headingEntitiesNotDearchived; + */ + ArchiveMessages( String headingArchiveEntity, String confirmationArchiveEntity, @@ -231,7 +261,8 @@ public enum ArchiveMessages { String confirmDearchiveEntities, String messageEntityDearchived, String headingNoEntitySelected, - String messageNoEntitySelected) { + String messageNoEntitySelected, + String messageCountEntitiesNotArchivedExternalReason) { this.headingArchiveEntity = headingArchiveEntity; this.confirmationArchiveEntity = confirmationArchiveEntity; this.confirmationArchiveEntities = confirmationArchiveEntities; @@ -242,6 +273,7 @@ public enum ArchiveMessages { this.messageEntityDearchived = messageEntityDearchived; this.headingNoEntitySelected = headingNoEntitySelected; this.messageNoEntitySelected = messageNoEntitySelected; + this.messageCountEntitiesNotArchivedExternalReason = messageCountEntitiesNotArchivedExternalReason; } public String getHeadingArchiveEntity() { @@ -284,6 +316,10 @@ public String getMessageNoEntitySelected() { return messageNoEntitySelected; } + public String getMessageCountEntitiesNotArchivedExternalReason() { + return messageCountEntitiesNotArchivedExternalReason; + } + public String getHeadingConfirmationArchiving() { return headingConfirmationArchiving; } @@ -307,4 +343,12 @@ public String getMessageAllEntitiesDearchived() { public String getMessageSomeEntitiesDearchived() { return messageSomeEntitiesDearchived; } + + public String getHeadingSomeEntitiesNotArchived() { + return headingSomeEntitiesNotArchived; + } + + public String getHeadingEntitiesNotArchived() { + return headingEntitiesNotArchived; + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index eb57b1c3bb3..ec3e1120289 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -220,11 +220,13 @@ private BulkOperationHandler createBulkOperationHandler(I return new BulkOperationHandler<>( forArchive ? archiveMessages.getMessageAllEntitiesArchived() : archiveMessages.getMessageAllEntitiesDearchived(), null, - //TODO: add value to someEntriesNotProcessedExternalReason - null, - null, - null, + forArchive ? archiveMessages.getHeadingSomeEntitiesNotArchived() : null, + forArchive ? archiveMessages.getHeadingEntitiesNotArchived() : null, + + //forArchive ? archiveMessages.getMessageCountEntitiesNotArchived() : null, null, + forArchive ? archiveMessages.getMessageCountEntitiesNotArchivedExternalReason() : null, + null, null, forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index fa72abbffd7..f77f6dbd32c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -17,7 +17,7 @@ public enum DeleteRestoreMessages { Strings.messageCountCasesNotDeletedSormasToSormasReason, Strings.messageCountCasesNotDeletedAccessDeniedReason, null, - Strings.headingSomeCasesNotDeleted, + //TODO: change the next message and headingCasesNotDeleted to general ones as we have for archive Strings.messageCountCasesNotDeleted, Strings.headingCasesRestored, Strings.messageCasesRestored, @@ -39,7 +39,6 @@ public enum DeleteRestoreMessages { Strings.messageCountContactsNotDeletedSormasToSormasReason, Strings.messageCountEventsNotDeletedAccessDeniedReason, Strings.messageEventsNotDeletedLinkedEntitiesReason, - Strings.headingSomeEventsNotDeleted, Strings.messageCountEventsNotDeleted, Strings.headingEventsRestored, Strings.messageEventsRestored, @@ -61,7 +60,6 @@ public enum DeleteRestoreMessages { null, Strings.messageCountEventParticipantsNotDeletedAccessDeniedReason, null, - Strings.headingSomeEventParticipantsNotDeleted, Strings.messageCountEventParticipantsNotDeleted, Strings.headingEventParticipantsRestored, Strings.messageEventParticipantsRestored, @@ -83,7 +81,6 @@ public enum DeleteRestoreMessages { Strings.messageCountContactsNotDeletedSormasToSormasReason, Strings.messageCountContactsNotDeletedAccessDeniedReason, null, - Strings.headingSomeContactsNotDeleted, Strings.messageCountContactsNotDeleted, Strings.headingContactsRestored, Strings.messageContactsRestored, @@ -105,7 +102,6 @@ public enum DeleteRestoreMessages { null, Strings.messageCountTravelEntriesNotDeletedAccessDeniedReason, null, - Strings.headingSomeTravelEntriesNotDeleted, Strings.messageCountTravelEntriesNotDeleted, Strings.headingTravelEntriesRestored, Strings.messageTravelEntriesRestored, @@ -127,7 +123,6 @@ public enum DeleteRestoreMessages { null, Strings.messageCountVisitsNotDeletedAccessDeniedReason, null, - Strings.headingSomeVisitsNotDeleted, Strings.messageCountVisitsNotDeleted, null, null, @@ -149,7 +144,6 @@ public enum DeleteRestoreMessages { null, Strings.messageCountTasksNotDeletedAccessDeniedReason, null, - Strings.headingSomeTasksNotDeleted, Strings.messageCountTasksNotDeleted, null, null, @@ -171,7 +165,6 @@ public enum DeleteRestoreMessages { null, null, null, - Strings.headingSomeExternalMessagesNotDeleted, Strings.messageCountExternalMessagesNotDeleted, null, null, @@ -193,7 +186,6 @@ public enum DeleteRestoreMessages { null, null, null, - Strings.headingSomeSamplesNotDeleted, Strings.messageCountSamplesNotDeleted, Strings.headingSamplesRestored, Strings.messageSamplesRestored, @@ -215,7 +207,6 @@ public enum DeleteRestoreMessages { null, Strings.messageCountImmunizationsNotDeletedAccessDeniedReason, null, - Strings.headingSomeImmunizationsNotDeleted, Strings.messageCountImmunizationsNotDeleted, Strings.headingImmunizationsRestored, Strings.messageImmunizationsRestored, @@ -237,7 +228,6 @@ public enum DeleteRestoreMessages { private final String messageCountEntitiesNotDeletedSormasToSormasReason; private final String messageCountEntitiesNotDeletedAccessDeniedReason; private final String messageEntitiesNotDeletedLinkedEntitiesReason; - private final String headingSomeEntitiesNotDeleted; private final String messageCountEntitiesNotDeleted; private final String headingEntitiesRestored; private final String messageEntitiesRestored; @@ -246,6 +236,8 @@ public enum DeleteRestoreMessages { private final String headingSomeEntitiesNotRestored; private final String messageCountEntitiesNotRestored; + private final String headingSomeEntitiesNotDeleted = Strings.headingSomeEntitiesNotDeleted; + DeleteRestoreMessages( String entities, String headingNoSelection, @@ -260,7 +252,6 @@ public enum DeleteRestoreMessages { String messageCountEntitiesNotDeletedSormasToSormasReason, String messageCountEntitiesNotDeletedAccessDeniedReason, String messageEntitiesNotDeletedLinkedEntitiesReason, - String headingSomeEntitiesNotDeleted, String messageCountEntitiesNotDeleted, String headingEntitiesRestored, String messageEntitiesRestored, @@ -282,7 +273,6 @@ public enum DeleteRestoreMessages { this.messageCountEntitiesNotDeletedSormasToSormasReason = messageCountEntitiesNotDeletedSormasToSormasReason; this.messageCountEntitiesNotDeletedAccessDeniedReason = messageCountEntitiesNotDeletedAccessDeniedReason; this.messageEntitiesNotDeletedLinkedEntitiesReason = messageEntitiesNotDeletedLinkedEntitiesReason; - this.headingSomeEntitiesNotDeleted = headingSomeEntitiesNotDeleted; this.messageCountEntitiesNotDeleted = messageCountEntitiesNotDeleted; this.headingEntitiesRestored = headingEntitiesRestored; this.messageEntitiesRestored = messageEntitiesRestored; From 0ba66dd0506665e33d6186c5250b7ec1ef90800f Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 3 Aug 2023 17:31:46 +0300 Subject: [PATCH 015/144] #12257 - refactorings needed for event archiving --- .../sormas/backend/caze/CaseService.java | 58 +++++++++---------- .../common/AbstractCoreAdoService.java | 20 +++++++ .../sormas/backend/event/EventFacadeEjb.java | 4 +- .../sormas/backend/event/EventService.java | 33 +++++++++-- .../sormas/ui/utils/ArchiveHandlers.java | 3 +- 5 files changed, 77 insertions(+), 41 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 0f794130824..9b4ddd068b3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -1122,8 +1122,17 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override public List archive(List entityUuids) { - List processedCases = updateArchiveFlagInExternalSurveillanceToolForSharedEntities(entityUuids, true); - List casesToBeProcessed = getCasesToBeProcessed(entityUuids, processedCases); + List processedCases = new ArrayList<>(); + List sharedCaseUuids = getEligibleSharedUuids(entityUuids); + try { + updateArchiveFlagInExternalSurveillanceToolForSharedEntities(sharedCaseUuids, true); + } catch (ExternalSurveillanceToolRuntimeException e) { + processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + } catch (AccessDeniedException e) { + processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + } + + List casesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); List caseUuidsToBeProcessed = casesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); super.archive(caseUuidsToBeProcessed); @@ -1132,53 +1141,38 @@ public List archive(List entityUuids) { return processedCases; } - public List getCasesToBeProcessed(List entityUuids, List processedCases) { - List failedUuids = processedCases.stream() - .filter( - entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE) - || entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) - .map(entity -> entity.getEntityUuid()) - .collect(Collectors.toList()); - - List cases = getByUuids(entityUuids); - return cases.stream().filter(caze -> !failedUuids.contains(caze.getUuid())).collect(Collectors.toList()); - } - @Override public void dearchive(List entityUuids, String dearchiveReason) { super.dearchive(entityUuids, dearchiveReason); updateArchiveFlagInExternalSurveillanceToolForSharedEntities(entityUuids, false); } - public List updateArchiveFlagInExternalSurveillanceToolForSharedEntities(List entityUuids, boolean archived) { - List processedCases = new ArrayList<>(); - if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { - List uuidsAllowedToBeShared = getEntityUuidsAllowedToBeShared(entityUuids); - if (!uuidsAllowedToBeShared.isEmpty()) { + public List getEligibleSharedUuids(List entityUuids) { + List sharedCaseUuids = new ArrayList<>(); + List uuidsAllowedToBeShared = getEntityUuidsAllowedToBeShared(entityUuids); + if (!uuidsAllowedToBeShared.isEmpty()) { + sharedCaseUuids = getSharedCaseUuids(uuidsAllowedToBeShared); + } - List sharedCaseUuids = getSharedCaseUuids(uuidsAllowedToBeShared); + return sharedCaseUuids; + } + + public void updateArchiveFlagInExternalSurveillanceToolForSharedEntities(List sharedCaseUuids, boolean archived) { + if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { if (!sharedCaseUuids.isEmpty()) { try { externalSurveillanceToolGatewayFacade.sendCasesInternal(sharedCaseUuids, archived); } catch (ExternalSurveillanceToolException e) { - processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); - //TODO: add a catch for AccessDeniedException too ( add to the events too) + throw new ExternalSurveillanceToolRuntimeException(e.getMessage(), e.getErrorCode()); } catch (AccessDeniedException e) { - processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + //TODO: add message + throw new AccessDeniedException(e.getMessage()); } - } } } - return processedCases; - } - - public List buildProcessedEntities(List sharedCaseUuids, ProcessedEntityStatus processedEntityStatus) { - List processedEntities = new ArrayList<>(); - sharedCaseUuids.forEach(sharedCazeUuid -> processedEntities.add(new ProcessedEntity(sharedCazeUuid, processedEntityStatus))); - - return processedEntities; } + //TODO: check if other common methods (Case-Events) can be extracted to the service public List getSharedCaseUuids(List entityUuids) { List caseIds = getCaseIds(entityUuids); List sharedCaseUuids = new ArrayList<>(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 5cee5f8a07d..0c4ad4bdd18 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -38,6 +38,7 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.util.IterableHelper; @@ -210,6 +211,25 @@ public boolean inJurisdictionOrOwned(ADO entity) { return fulfillsCondition(entity, this::inJurisdictionOrOwned); } + public List getEntitiesToBeProcessed(List entityUuids, List processedEntities) { + List failedUuids = processedEntities.stream() + .filter( + entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE) + || entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) + .map(entity -> entity.getEntityUuid()) + .collect(Collectors.toList()); + + List entities = getByUuids(entityUuids); + return entities.stream().filter(entity -> !failedUuids.contains(entity.getUuid())).collect(Collectors.toList()); + } + + public List buildProcessedEntities(List entityUuids, ProcessedEntityStatus processedEntityStatus) { + List processedEntities = new ArrayList<>(); + entityUuids.forEach(entityUuid -> processedEntities.add(new ProcessedEntity(entityUuid, processedEntityStatus))); + + return processedEntities; + } + /** * Used to fetch {@link AdoServiceWithUserFilterAndJurisdiction#getInJurisdictionIds(List)}/{@link AdoServiceWithUserFilterAndJurisdiction#inJurisdictionOrOwned(AbstractDomainObject)} * (without {@link QueryContext} because there are no other conditions etc.). diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 891cb52b577..e28fc60e58a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -1050,10 +1050,10 @@ public void archive(String eventUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._EVENT_ARCHIVE) public List archive(List eventUuids) { - super.archive(eventUuids); + List processedEntities = super.archive(eventUuids); + List eventParticipantList = eventParticipantService.getAllUuidsByEventUuids(eventUuids); eventParticipantService.archive(eventParticipantList); - List processedEntities = new ArrayList<>(); return processedEntities; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index d03d874572e..1b9f789e8e9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -48,6 +48,8 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.document.DocumentRelatedEntityType; import de.symeda.sormas.api.event.EventCriteria; import de.symeda.sormas.api.event.EventCriteriaDateType; @@ -60,6 +62,7 @@ import de.symeda.sormas.api.sormastosormas.SormasToSormasException; import de.symeda.sormas.api.task.TaskCriteria; import de.symeda.sormas.api.user.JurisdictionLevel; +import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; @@ -299,18 +302,34 @@ public void archive(String entityUuid, Date endOfProcessingDate) { } @Override - public void archive(List entityUuids) { + public List archive(List entityUuids) { + List processedEvents = new ArrayList<>(); + List sharedEventUuids = getSharedEventUuids(entityUuids); + try { + updateArchiveFlagInExternalSurveillanceToolForSharedEntities(sharedEventUuids, true); + } catch (ExternalSurveillanceToolRuntimeException e) { + processedEvents = buildProcessedEntities(sharedEventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + } catch (AccessDeniedException e) { + processedEvents = buildProcessedEntities(sharedEventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + } + + List eventsToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedEvents); + List eventUuidsToBeProcessed = eventsToBeProcessed.stream().map(event -> event.getUuid()).collect(Collectors.toList()); + super.archive(entityUuids); - setArchiveInExternalSurveillanceToolForEntities(entityUuids, true); + processedEvents.addAll(buildProcessedEntities(eventUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + + return processedEvents; } @Override public void dearchive(List entityUuids, String dearchiveReason) { super.dearchive(entityUuids, dearchiveReason); - setArchiveInExternalSurveillanceToolForEntities(entityUuids, false); + updateArchiveFlagInExternalSurveillanceToolForSharedEntities(entityUuids, false); } - public void setArchiveInExternalSurveillanceToolForEntities(List entityUuids, boolean archived) { + //TODO: check if can be added to Abstract Core Ado Service + public void updateArchiveFlagInExternalSurveillanceToolForSharedEntities(List entityUuids, boolean archived) { if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { List sharedEventUuids = getSharedEventUuids(entityUuids); if (!sharedEventUuids.isEmpty()) { @@ -318,11 +337,15 @@ public void setArchiveInExternalSurveillanceToolForEntities(List entityU externalSurveillanceToolGatewayFacade.sendEventsInternal(sharedEventUuids, archived); } catch (ExternalSurveillanceToolException e) { throw new ExternalSurveillanceToolRuntimeException(e.getMessage(), e.getErrorCode()); + } catch (AccessDeniedException e) { + //TODO: add message + throw new AccessDeniedException(e.getMessage()); } } } } + //TODO: check if can be added to the service public List getSharedEventUuids(List entityUuids) { List eventIds = getEventIds(entityUuids); List sharedEventUuids = new ArrayList<>(); @@ -344,7 +367,7 @@ public List getEventIds(List entityUuids) { } public void setArchiveInExternalSurveillanceToolForEntity(String eventUuid, boolean archived) { - setArchiveInExternalSurveillanceToolForEntities(Collections.singletonList(eventUuid), archived); + updateArchiveFlagInExternalSurveillanceToolForSharedEntities(Collections.singletonList(eventUuid), archived); } public List getArchivedUuidsSince(Date since) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index 79ab6dbfee2..14383b2e797 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -187,8 +187,7 @@ public void archive(String entityUuid) { @Override public List archive(List entityUuids) { - List processedEntities = entityFacade.archive(entityUuids); - return processedEntities; + return entityFacade.archive(entityUuids); } @Override From 965ccfe2b3b4f019dcc1e389f1cf9274a3a3b51e Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 4 Aug 2023 16:42:45 +0300 Subject: [PATCH 016/144] #12257 - fix archive and dearchive for cases and events --- .../java/de/symeda/sormas/api/CoreFacade.java | 7 -- .../de/symeda/sormas/api/i18n/Strings.java | 6 +- .../sormas/backend/caze/CaseFacadeEjb.java | 3 +- .../sormas/backend/caze/CaseService.java | 65 ++++++++++--------- .../common/AbstractCoreAdoService.java | 4 +- .../backend/common/AbstractCoreFacadeEjb.java | 5 +- .../sormas/backend/event/EventService.java | 53 ++++++++------- ...lSurveillanceToolGatewayFacadeEjbTest.java | 40 +++++++----- .../ui/utils/DeleteRestoreController.java | 2 - .../ui/utils/DeleteRestoreHandlers.java | 4 -- 10 files changed, 98 insertions(+), 91 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java index 1160f35441b..e55643d4c0a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java @@ -21,7 +21,6 @@ import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; -import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; import de.symeda.sormas.api.utils.criteria.BaseCriteria; public interface CoreFacade @@ -43,11 +42,5 @@ public interface CoreFacade getArchivedUuidsSince(Date since); - default void setArchiveInExternalSurveillanceToolForEntity(String uuid, boolean archived) throws ExternalSurveillanceToolException { - } - - default void setArchiveInExternalSurveillanceToolForEntities(List uuid, boolean archived) throws ExternalSurveillanceToolException { - } - Date calculateEndOfProcessingDate(String entityUuids); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 8aaafdb3607..fe236bdd551 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1112,23 +1112,23 @@ public interface Strings { String messageCountCasesAlreadyInEvent = "messageCountCasesAlreadyInEvent"; String messageCountCasesNotArchivedExternalReason = "messageCountCasesNotArchivedExternalReason"; String messageCountCasesNotDeleted = "messageCountCasesNotDeleted"; + String messageCountCasesNotDeletedAccessDeniedReason = "messageCountCasesNotDeletedAccessDeniedReason"; String messageCountCasesNotDeletedExternalReason = "messageCountCasesNotDeletedExternalReason"; String messageCountCasesNotDeletedSormasToSormasReason = "messageCountCasesNotDeletedSormasToSormasReason"; - String messageCountCasesNotDeletedAccessDeniedReason = "messageCountCasesNotDeletedAccessDeniedReason"; String messageCountCasesNotRestored = "messageCountCasesNotRestored"; String messageCountContactsAlreadyInEvent = "messageCountContactsAlreadyInEvent"; String messageCountContactsNotDeleted = "messageCountContactsNotDeleted"; - String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; String messageCountContactsNotDeletedAccessDeniedReason = "messageCountContactsNotDeletedAccessDeniedReason"; + String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; String messageCountEventParticipantsNotDeletedAccessDeniedReason = "messageCountEventParticipantsNotDeletedAccessDeniedReason"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; String messageCountEventsNotArchivedExternalReason = "messageCountEventsNotArchivedExternalReason"; String messageCountEventsNotDeleted = "messageCountEventsNotDeleted"; + String messageCountEventsNotDeletedAccessDeniedReason = "messageCountEventsNotDeletedAccessDeniedReason"; String messageCountEventsNotDeletedExternalReason = "messageCountEventsNotDeletedExternalReason"; String messageCountEventsNotDeletedSormasToSormasReason = "messageCountEventsNotDeletedSormasToSormasReason"; - String messageCountEventsNotDeletedAccessDeniedReason = "messageCountEventsNotDeletedAccessDeniedReason"; String messageCountEventsNotRestored = "messageCountEventsNotRestored"; String messageCountExternalMessagesNotDeleted = "messageCountExternalMessagesNotDeleted"; String messageCountImmunizationsNotDeleted = "messageCountImmunizationsNotDeleted"; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index c86ee15cb9f..8c971f20f28 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2846,8 +2846,7 @@ public List archive(List entityUuids, boolean includeCo @Override @RightsAllowed(UserRight._CASE_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason, boolean includeContacts) { - super.dearchive(entityUuids, dearchiveReason); - List processedEntities = new ArrayList<>(); + List processedEntities = super.dearchive(entityUuids, dearchiveReason); if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(entityUuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 9b4ddd068b3..bb67444d8b7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -1117,34 +1117,45 @@ private void initVisitSubqueryForDeletion(CriteriaBuilder cb, Root visitR @Override public void archive(String entityUuid, Date endOfProcessingDate) { super.archive(entityUuid, endOfProcessingDate); - setArchiveInExternalSurveillanceToolForEntity(entityUuid, true); + List sharedCaseUuids = getEligibleSharedUuids(Collections.singletonList(entityUuid)); + updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, true); } @Override public List archive(List entityUuids) { List processedCases = new ArrayList<>(); + List eligibleCases = getEligibleCasesForArchivingAndDearchiving(entityUuids, processedCases, true); + List eligibleCaseUuids = eligibleCases.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + + super.archive(eligibleCaseUuids); + processedCases.addAll(buildProcessedEntities(eligibleCaseUuids, ProcessedEntityStatus.SUCCESS)); + + return processedCases; + } + + @Override + public List dearchive(List entityUuids, String dearchiveReason) { + List processedCases = new ArrayList<>(); + List eligibleCases = getEligibleCasesForArchivingAndDearchiving(entityUuids, processedCases, false); + List eligibleCaseUuids = eligibleCases.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + + super.dearchive(eligibleCaseUuids, dearchiveReason); + processedCases.addAll(buildProcessedEntities(eligibleCaseUuids, ProcessedEntityStatus.SUCCESS)); + + return processedCases; + } + + public List getEligibleCasesForArchivingAndDearchiving(List entityUuids, List processedCases, boolean archiving) { List sharedCaseUuids = getEligibleSharedUuids(entityUuids); try { - updateArchiveFlagInExternalSurveillanceToolForSharedEntities(sharedCaseUuids, true); + updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, archiving); } catch (ExternalSurveillanceToolRuntimeException e) { processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); } catch (AccessDeniedException e) { processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); } - List casesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); - List caseUuidsToBeProcessed = casesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); - - super.archive(caseUuidsToBeProcessed); - processedCases.addAll(buildProcessedEntities(caseUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); - - return processedCases; - } - - @Override - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); - updateArchiveFlagInExternalSurveillanceToolForSharedEntities(entityUuids, false); + return getEntitiesToBeProcessed(entityUuids, processedCases); } public List getEligibleSharedUuids(List entityUuids) { @@ -1157,22 +1168,20 @@ public List getEligibleSharedUuids(List entityUuids) { return sharedCaseUuids; } - public void updateArchiveFlagInExternalSurveillanceToolForSharedEntities(List sharedCaseUuids, boolean archived) { + public void updateArchiveFlagInExternalSurveillanceToolForSharedCases(List sharedCaseUuids, boolean archived) { if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { - if (!sharedCaseUuids.isEmpty()) { - try { - externalSurveillanceToolGatewayFacade.sendCasesInternal(sharedCaseUuids, archived); - } catch (ExternalSurveillanceToolException e) { - throw new ExternalSurveillanceToolRuntimeException(e.getMessage(), e.getErrorCode()); - } catch (AccessDeniedException e) { - //TODO: add message - throw new AccessDeniedException(e.getMessage()); - } + if (!sharedCaseUuids.isEmpty()) { + try { + externalSurveillanceToolGatewayFacade.sendCasesInternal(sharedCaseUuids, archived); + } catch (ExternalSurveillanceToolException e) { + throw new ExternalSurveillanceToolRuntimeException(e.getMessage(), e.getErrorCode()); + } catch (AccessDeniedException e) { + throw new AccessDeniedException(e.getMessage()); + } } } } - //TODO: check if other common methods (Case-Events) can be extracted to the service public List getSharedCaseUuids(List entityUuids) { List caseIds = getCaseIds(entityUuids); List sharedCaseUuids = new ArrayList<>(); @@ -1200,10 +1209,6 @@ public List getEntityUuidsAllowedToBeShared(List entityUuids) { return casesAllowedToBeShare.stream().map(CaseDataDto::getUuid).collect(Collectors.toList()); } - public void setArchiveInExternalSurveillanceToolForEntity(String entityUuid, boolean archived) { - updateArchiveFlagInExternalSurveillanceToolForSharedEntities(Collections.singletonList(entityUuid), archived); - } - @Override public void delete(Case caze, DeletionDetails deletionDetails) throws ExternalSurveillanceToolRuntimeException { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 0c4ad4bdd18..cebea8cbc7c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -169,7 +169,7 @@ public List archive(List entityUuids) { } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) - public void dearchive(List entityUuids, String dearchiveReason) { + public List dearchive(List entityUuids, String dearchiveReason) { IterableHelper.executeBatched(entityUuids, ARCHIVE_BATCH_SIZE, batchedUuids -> { CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -185,6 +185,8 @@ public void dearchive(List entityUuids, String dearchiveReason) { em.createQuery(cu).executeUpdate(); }); + + return new ArrayList<>(); } public EditPermissionType getEditPermissionType(ADO entity) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index 91936c0a5ee..6c188943669 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -16,7 +16,6 @@ package de.symeda.sormas.backend.common; import java.io.Serializable; -import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -229,9 +228,7 @@ public List archive(List entityUuids) { @DenyAll public List dearchive(List entityUuids, String dearchiveReason) { - List processedEntities = new ArrayList<>(); - service.dearchive(entityUuids, dearchiveReason); - return processedEntities; + return service.dearchive(entityUuids, dearchiveReason); } public Date calculateEndOfProcessingDate(String entityUuid) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index 1b9f789e8e9..43ae34e47d8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -298,38 +298,51 @@ public Event getEventReferenceByEventParticipant(String eventParticipantUuid) { @Override public void archive(String entityUuid, Date endOfProcessingDate) { super.archive(entityUuid, endOfProcessingDate); - setArchiveInExternalSurveillanceToolForEntity(entityUuid, true); + List sharedEventUuids = getSharedEventUuids(Collections.singletonList(entityUuid)); + updateArchiveFlagInExternalSurveillanceToolForSharedEvents(sharedEventUuids, true); } @Override public List archive(List entityUuids) { List processedEvents = new ArrayList<>(); + List eligibleEvents = getEligibleEventsForArchivingAndDearchiving(entityUuids, processedEvents, true); + List eligibleEventUuids = eligibleEvents.stream().map(event -> event.getUuid()).collect(Collectors.toList()); + + super.archive(eligibleEventUuids); + processedEvents.addAll(buildProcessedEntities(eligibleEventUuids, ProcessedEntityStatus.SUCCESS)); + + return processedEvents; + } + + @Override + public List dearchive(List entityUuids, String dearchiveReason) { + List processedEvents = new ArrayList<>(); + List eligibleEvents = getEligibleEventsForArchivingAndDearchiving(entityUuids, processedEvents, false); + List eligibleEventUuids = eligibleEvents.stream().map(event -> event.getUuid()).collect(Collectors.toList()); + + super.dearchive(eligibleEventUuids, dearchiveReason); + processedEvents.addAll(buildProcessedEntities(eligibleEventUuids, ProcessedEntityStatus.SUCCESS)); + + return processedEvents; + } + + public List getEligibleEventsForArchivingAndDearchiving( + List entityUuids, + List processedEvents, + boolean archiving) { List sharedEventUuids = getSharedEventUuids(entityUuids); try { - updateArchiveFlagInExternalSurveillanceToolForSharedEntities(sharedEventUuids, true); + updateArchiveFlagInExternalSurveillanceToolForSharedEvents(sharedEventUuids, archiving); } catch (ExternalSurveillanceToolRuntimeException e) { processedEvents = buildProcessedEntities(sharedEventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); } catch (AccessDeniedException e) { processedEvents = buildProcessedEntities(sharedEventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); } - List eventsToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedEvents); - List eventUuidsToBeProcessed = eventsToBeProcessed.stream().map(event -> event.getUuid()).collect(Collectors.toList()); - - super.archive(entityUuids); - processedEvents.addAll(buildProcessedEntities(eventUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); - - return processedEvents; - } - - @Override - public void dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); - updateArchiveFlagInExternalSurveillanceToolForSharedEntities(entityUuids, false); + return getEntitiesToBeProcessed(entityUuids, processedEvents); } - //TODO: check if can be added to Abstract Core Ado Service - public void updateArchiveFlagInExternalSurveillanceToolForSharedEntities(List entityUuids, boolean archived) { + public void updateArchiveFlagInExternalSurveillanceToolForSharedEvents(List entityUuids, boolean archived) { if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { List sharedEventUuids = getSharedEventUuids(entityUuids); if (!sharedEventUuids.isEmpty()) { @@ -338,14 +351,12 @@ public void updateArchiveFlagInExternalSurveillanceToolForSharedEntities(List getSharedEventUuids(List entityUuids) { List eventIds = getEventIds(entityUuids); List sharedEventUuids = new ArrayList<>(); @@ -366,10 +377,6 @@ public List getEventIds(List entityUuids) { return eventIds; } - public void setArchiveInExternalSurveillanceToolForEntity(String eventUuid, boolean archived) { - updateArchiveFlagInExternalSurveillanceToolForSharedEntities(Collections.singletonList(eventUuid), archived); - } - public List getArchivedUuidsSince(Date since) { CriteriaBuilder cb = em.getCriteriaBuilder(); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java index 5a749138466..4aa0a0c2138 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java @@ -96,6 +96,7 @@ import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseFacadeEjb; +import de.symeda.sormas.backend.caze.CaseService; import de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration; import de.symeda.sormas.backend.event.Event; import de.symeda.sormas.backend.event.EventService; @@ -251,7 +252,8 @@ public void testDeleteCases() throws ExternalSurveillanceToolException { } @Test - public void testSetArchiveInExternalSurveillanceToolForCase_WithProperEntity_WithCaseAllowedToShare(WireMockRuntimeInfo wireMockRuntime) { + public void testUpdateArchiveFlagInExternalSurveillanceToolForForCase_WithProperEntity_WithCaseAllowedToShare( + WireMockRuntimeInfo wireMockRuntime) { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); PersonReferenceDto person = creator.createPerson("Walter", "Schuster").toReference(); @@ -265,16 +267,18 @@ public void testSetArchiveInExternalSurveillanceToolForCase_WithProperEntity_Wit .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - getCaseService().setArchiveInExternalSurveillanceToolForEntity(caze.getUuid(), true); + getCaseService().updateArchiveFlagInExternalSurveillanceToolForSharedCases(Collections.singletonList(caze.getUuid()), true); wireMockRuntime.getWireMock().verify(exactly(1), postRequestedFor(urlEqualTo("/export"))); } @Test - public void testSetArchiveInExternalSurveillanceToolForCase_WithProperEntity_WithoutCaseAllowedToShare(WireMockRuntimeInfo wireMockRuntime) { + public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithProperEntity_WithoutCaseAllowedToShare( + WireMockRuntimeInfo wireMockRuntime) { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); PersonReferenceDto person = creator.createPerson("Walter", "Schuster").toReference(); + CaseService caseService = getCaseService(); CaseDataDto caze = creator.createCase(user, person, rdcf, c -> c.setDontShareWithReportingTool(true)); Case case1 = getCaseService().getByUuid(caze.getUuid()); @@ -285,16 +289,18 @@ public void testSetArchiveInExternalSurveillanceToolForCase_WithProperEntity_Wit .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - getCaseService().setArchiveInExternalSurveillanceToolForEntity(caze.getUuid(), true); + List sharedCaseUuids = caseService.getEligibleSharedUuids(Collections.singletonList(caze.getUuid())); + caseService.updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, true); wireMockRuntime.getWireMock().verify(exactly(0), postRequestedFor(urlEqualTo("/export"))); } @Test - public void testSetArchiveInExternalSurveillanceToolForCase_WithoutProperEntity(WireMockRuntimeInfo wireMockRuntime) { + public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithoutProperEntity(WireMockRuntimeInfo wireMockRuntime) { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); PersonReferenceDto person = creator.createPerson("Walter", "Schuster").toReference(); + CaseService caseService = getCaseService(); CaseDataDto caze = creator.createCase(user, person, rdcf); @@ -304,12 +310,14 @@ public void testSetArchiveInExternalSurveillanceToolForCase_WithoutProperEntity( .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); //the case does not have an externalId set and after the filtering the sendCases will not be called - getCaseService().setArchiveInExternalSurveillanceToolForEntity(caze.getUuid(), true); + List sharedCaseUuids = caseService.getEligibleSharedUuids(Collections.singletonList(caze.getUuid())); + getCaseService().updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, true); + wireMockRuntime.getWireMock().verify(exactly(0), postRequestedFor(urlEqualTo("/export"))); } @Test - public void testSetArchiveInExternalSurveillanceToolForCase_Exception() { + public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_Exception() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); PersonReferenceDto person = creator.createPerson("Walter", "Schuster").toReference(); @@ -325,11 +333,12 @@ public void testSetArchiveInExternalSurveillanceToolForCase_Exception() { assertThrows( ExternalSurveillanceToolRuntimeException.class, - () -> getCaseService().setArchiveInExternalSurveillanceToolForEntity(caze.getUuid(), true)); + () -> getCaseService().updateArchiveFlagInExternalSurveillanceToolForSharedCases(Collections.singletonList(caze.getUuid()), true)); + } @Test - public void testSetArchiveInExternalSurveillanceToolForEvent_WithProperEntity(WireMockRuntimeInfo wireMockRuntime) { + public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_WithProperEntity(WireMockRuntimeInfo wireMockRuntime) { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); @@ -358,12 +367,14 @@ public void testSetArchiveInExternalSurveillanceToolForEvent_WithProperEntity(Wi .withRequestBody(containing("eventUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - eventService.setArchiveInExternalSurveillanceToolForEntity(event.getUuid(), false); + List sharedEventUuids = eventService.getSharedEventUuids(Collections.singletonList(event.getUuid())); + eventService.updateArchiveFlagInExternalSurveillanceToolForSharedEvents(sharedEventUuids, false); + wireMockRuntime.getWireMock().verify(exactly(1), postRequestedFor(urlEqualTo("/export"))); } @Test - public void testSetArchiveInExternalSurveillanceToolForEvent_Exception() { + public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_Exception() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); @@ -383,10 +394,9 @@ public void testSetArchiveInExternalSurveillanceToolForEvent_Exception() { Disease.DENGUE, rdcf); - Event event = getEventService().getByUuid(eventDto.getUuid()); - getExternalShareInfoService().createAndPersistShareInfo(event, ExternalShareStatus.SHARED); - EventService eventService = getBean(EventService.class); + Event event = eventService.getByUuid(eventDto.getUuid()); + getExternalShareInfoService().createAndPersistShareInfo(event, ExternalShareStatus.SHARED); stubFor( post(urlEqualTo("/export")).withRequestBody(containing(eventDto.getUuid())) @@ -395,7 +405,7 @@ public void testSetArchiveInExternalSurveillanceToolForEvent_Exception() { assertThrows( ExternalSurveillanceToolRuntimeException.class, - () -> eventService.setArchiveInExternalSurveillanceToolForEntity(eventDto.getUuid(), true)); + () -> eventService.updateArchiveFlagInExternalSurveillanceToolForSharedEvents(Collections.singletonList(eventDto.getUuid()), true)); } @Test diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index 8c362a1fb94..2743168c30b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -180,8 +180,6 @@ public String getDeleteConfirmationDetails(String entity, Co public interface IDeleteRestoreHandler { - void delete(String uuid, DeletionDetails deletionDetails); - List delete(List uuids, DeletionDetails deletionDetails); List restore(List uuids); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java index 10edda0fa3c..df2bcaa1424 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java @@ -82,10 +82,6 @@ private DeleteRestoreHandler(F entityFacade, DeleteRestoreMessages deleteRestore this.deleteRestoreMessages = deleteRestoreMessages; } - @Override - public void delete(String uuid, DeletionDetails deletionDetails) { - } - @Override public List delete(List uuids, DeletionDetails deletionDetails) { return entityFacade.delete(uuids, deletionDetails); From abadfe14b1fd9d44f60927a95edd892cb375879c Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Sun, 6 Aug 2023 18:59:38 +0300 Subject: [PATCH 017/144] #12257 - fix found bugs --- .../de/symeda/sormas/api/i18n/Strings.java | 4 ++ .../src/main/resources/strings.properties | 4 ++ .../sormas/backend/caze/CaseService.java | 31 +++++++------ .../sormas/backend/event/EventService.java | 29 ++++++------ .../sormas/ui/utils/ArchiveMessages.java | 46 +++++++++++++++---- .../sormas/ui/utils/ArchivingController.java | 11 ++--- 6 files changed, 82 insertions(+), 43 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index fe236bdd551..7d7b772f03f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -549,6 +549,7 @@ public interface Strings { String headingEditVaccination = "headingEditVaccination"; String headingEditVisit = "headingEditVisit"; String headingEntitiesNotArchived = "headingEntitiesNotArchived"; + String headingEntitiesNotDearchived = "headingEntitiesNotDearchived"; String headingEnvironmentalExposure = "headingEnvironmentalExposure"; String headingEpiCurve = "headingEpiCurve"; String headingEpiDataSourceCaseContacts = "headingEpiDataSourceCaseContacts"; @@ -739,6 +740,7 @@ public interface Strings { String headingSomeContactsAlreadyInEvent = "headingSomeContactsAlreadyInEvent"; String headingSomeContactsNotRestored = "headingSomeContactsNotRestored"; String headingSomeEntitiesNotArchived = "headingSomeEntitiesNotArchived"; + String headingSomeEntitiesNotDearchived = "headingSomeEntitiesNotDearchived"; String headingSomeEntitiesNotDeleted = "headingSomeEntitiesNotDeleted"; String headingSomeEventParticipantsNotRestored = "headingSomeEventParticipantsNotRestored"; String headingSomeEventsNotRestored = "headingSomeEventsNotRestored"; @@ -1111,6 +1113,7 @@ public interface Strings { String messageCopyPassword = "messageCopyPassword"; String messageCountCasesAlreadyInEvent = "messageCountCasesAlreadyInEvent"; String messageCountCasesNotArchivedExternalReason = "messageCountCasesNotArchivedExternalReason"; + String messageCountCasesNotDearchivedExternalReason = "messageCountCasesNotDearchivedExternalReason"; String messageCountCasesNotDeleted = "messageCountCasesNotDeleted"; String messageCountCasesNotDeletedAccessDeniedReason = "messageCountCasesNotDeletedAccessDeniedReason"; String messageCountCasesNotDeletedExternalReason = "messageCountCasesNotDeletedExternalReason"; @@ -1125,6 +1128,7 @@ public interface Strings { String messageCountEventParticipantsNotDeletedAccessDeniedReason = "messageCountEventParticipantsNotDeletedAccessDeniedReason"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; String messageCountEventsNotArchivedExternalReason = "messageCountEventsNotArchivedExternalReason"; + String messageCountEventsNotDearchivedExternalReason = "messageCountEventsNotDearchivedExternalReason"; String messageCountEventsNotDeleted = "messageCountEventsNotDeleted"; String messageCountEventsNotDeletedAccessDeniedReason = "messageCountEventsNotDeletedAccessDeniedReason"; String messageCountEventsNotDeletedExternalReason = "messageCountEventsNotDeletedExternalReason"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index cdd256008ac..34de904f1f9 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -530,6 +530,7 @@ headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available @@ -732,6 +733,7 @@ headingEventNotDeleted = Event not deleted headingSomeCasesNotRestored = Some cases were not restored headingSomeContactsNotRestored = Some contacts were not restored headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived headingSomeEntitiesNotDeleted= Some entities were not deleted headingSomeEventsNotRestored = Some events were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored @@ -1146,6 +1148,7 @@ messageEventsSentToSurvnet = All selected events have been sent to SurvNet #change everywhere this message messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed: %s messageCountCasesNotDeleted = %s cases not deleted: %s messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned: %s messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed: %s @@ -1156,6 +1159,7 @@ messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted becau messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted: %s messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned: %s diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index bb67444d8b7..52325d2ec92 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -1123,29 +1123,35 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override public List archive(List entityUuids) { - List processedCases = new ArrayList<>(); - List eligibleCases = getEligibleCasesForArchivingAndDearchiving(entityUuids, processedCases, true); - List eligibleCaseUuids = eligibleCases.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + List processedCases = preprocessCases(entityUuids, true); + List remainingCasesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); + List remainingUuidsToBeProcessed = remainingCasesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); - super.archive(eligibleCaseUuids); - processedCases.addAll(buildProcessedEntities(eligibleCaseUuids, ProcessedEntityStatus.SUCCESS)); + super.archive(remainingUuidsToBeProcessed); + if (remainingCasesToBeProcessed.size() > 0) { + processedCases.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + } return processedCases; } + //TODO: test archive and dearchive, for bulk and single cases for Events with/without Survnet failure -> test the other entities too @Override public List dearchive(List entityUuids, String dearchiveReason) { - List processedCases = new ArrayList<>(); - List eligibleCases = getEligibleCasesForArchivingAndDearchiving(entityUuids, processedCases, false); - List eligibleCaseUuids = eligibleCases.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + List processedCases = preprocessCases(entityUuids, false); + List remainingCasesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); + List remainingUuidsToBeProcessed = remainingCasesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); - super.dearchive(eligibleCaseUuids, dearchiveReason); - processedCases.addAll(buildProcessedEntities(eligibleCaseUuids, ProcessedEntityStatus.SUCCESS)); + super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); + if (remainingCasesToBeProcessed.size() > 0) { + processedCases.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + } return processedCases; } - public List getEligibleCasesForArchivingAndDearchiving(List entityUuids, List processedCases, boolean archiving) { + public List preprocessCases(List entityUuids, boolean archiving) { + List processedCases = new ArrayList<>(); List sharedCaseUuids = getEligibleSharedUuids(entityUuids); try { updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, archiving); @@ -1154,8 +1160,7 @@ public List getEligibleCasesForArchivingAndDearchiving(List entity } catch (AccessDeniedException e) { processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); } - - return getEntitiesToBeProcessed(entityUuids, processedCases); + return processedCases; } public List getEligibleSharedUuids(List entityUuids) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index 43ae34e47d8..e0c424392eb 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -304,32 +304,30 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override public List archive(List entityUuids) { - List processedEvents = new ArrayList<>(); - List eligibleEvents = getEligibleEventsForArchivingAndDearchiving(entityUuids, processedEvents, true); - List eligibleEventUuids = eligibleEvents.stream().map(event -> event.getUuid()).collect(Collectors.toList()); + List processedEvents = preprocessEvents(entityUuids, true); + List remainingEventsToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedEvents); + List remainingUuidsToBeProcessed = remainingEventsToBeProcessed.stream().map(event -> event.getUuid()).collect(Collectors.toList()); - super.archive(eligibleEventUuids); - processedEvents.addAll(buildProcessedEntities(eligibleEventUuids, ProcessedEntityStatus.SUCCESS)); + super.archive(remainingUuidsToBeProcessed); + processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); return processedEvents; } @Override public List dearchive(List entityUuids, String dearchiveReason) { - List processedEvents = new ArrayList<>(); - List eligibleEvents = getEligibleEventsForArchivingAndDearchiving(entityUuids, processedEvents, false); - List eligibleEventUuids = eligibleEvents.stream().map(event -> event.getUuid()).collect(Collectors.toList()); + List processedEvents = preprocessEvents(entityUuids, false); + List remainingEventsToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedEvents); + List remainingUuidsToBeProcessed = remainingEventsToBeProcessed.stream().map(event -> event.getUuid()).collect(Collectors.toList()); - super.dearchive(eligibleEventUuids, dearchiveReason); - processedEvents.addAll(buildProcessedEntities(eligibleEventUuids, ProcessedEntityStatus.SUCCESS)); + super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); + processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); return processedEvents; } - public List getEligibleEventsForArchivingAndDearchiving( - List entityUuids, - List processedEvents, - boolean archiving) { + public List preprocessEvents(List entityUuids, boolean archiving) { + List processedEvents = new ArrayList<>(); List sharedEventUuids = getSharedEventUuids(entityUuids); try { updateArchiveFlagInExternalSurveillanceToolForSharedEvents(sharedEventUuids, archiving); @@ -338,8 +336,7 @@ public List getEligibleEventsForArchivingAndDearchiving( } catch (AccessDeniedException e) { processedEvents = buildProcessedEntities(sharedEventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); } - - return getEntitiesToBeProcessed(entityUuids, processedEvents); + return processedEvents; } public void updateArchiveFlagInExternalSurveillanceToolForSharedEvents(List entityUuids, boolean archived) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index 66d29dd59f9..79bbdcd94ff 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -14,7 +14,8 @@ public enum ArchiveMessages { Strings.messageCaseDearchived, Strings.headingNoCasesSelected, Strings.messageNoCasesSelected, - Strings.messageCountCasesNotArchivedExternalReason), + Strings.messageCountCasesNotArchivedExternalReason, + Strings.messageCountCasesNotDearchivedExternalReason), CONTACT(Strings.headingArchiveContact, Strings.confirmationArchiveContact, @@ -26,6 +27,7 @@ public enum ArchiveMessages { Strings.messageContactDearchived, Strings.headingNoContactsSelected, Strings.messageNoContactsSelected, + null, null), ENVIRONMENT(Strings.headingArchiveEnvironment, @@ -38,6 +40,7 @@ public enum ArchiveMessages { Strings.messageEnvironmentDearchived, Strings.headingNoEnvironmentSelected, Strings.messageNoEnvironmentsSelected, + null, null), EVENT(Strings.headingArchiveEvent, @@ -50,7 +53,8 @@ public enum ArchiveMessages { Strings.messageEventDearchived, Strings.headingNoEventsSelected, Strings.messageNoEventsSelected, - Strings.messageCountEventsNotArchivedExternalReason), + Strings.messageCountEventsNotArchivedExternalReason, + Strings.messageCountEventsNotDearchivedExternalReason), EVENT_PARTICIPANT(Strings.headingArchiveEventParticipant, Strings.confirmationArchiveEventParticipant, @@ -62,6 +66,7 @@ public enum ArchiveMessages { Strings.messageEventParticipantDearchived, Strings.headingNoEventParticipantsSelected, Strings.messageNoEventParticipantsSelected, + null, null), IMMUNIZATION(Strings.headingArchiveImmunization, @@ -74,6 +79,7 @@ public enum ArchiveMessages { Strings.messageImmunizationDearchived, null, null, + null, null), TRAVEL_ENTRY(Strings.headingArchiveTravelEntry, @@ -86,6 +92,7 @@ public enum ArchiveMessages { Strings.messageTravelEntryDearchived, Strings.headingNoTravelEntriesSelected, Strings.messageNoTravelEntriesSelected, + null, null), CAMPAIGN(Strings.headingArchiveCampaign, @@ -98,6 +105,7 @@ public enum ArchiveMessages { Strings.messageCampaignDearchived, null, null, + null, null), TASK(Strings.headingConfirmArchiving, @@ -110,6 +118,7 @@ public enum ArchiveMessages { Strings.messageTaskDearchived, Strings.headingNoTasksSelected, Strings.messageNoTasksSelected, + null, null), CONTINENT(Strings.headingConfirmArchiving, @@ -122,6 +131,7 @@ public enum ArchiveMessages { Strings.messageContinentDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), SUBCONTINENT(Strings.headingConfirmArchiving, @@ -134,6 +144,7 @@ public enum ArchiveMessages { Strings.messageSubcontinentDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), AREA(Strings.headingConfirmArchiving, @@ -146,6 +157,7 @@ public enum ArchiveMessages { Strings.messageAreaDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), COUNTRY(Strings.headingConfirmArchiving, @@ -158,6 +170,7 @@ public enum ArchiveMessages { Strings.messageCountryDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), REGION(Strings.headingConfirmArchiving, @@ -170,6 +183,7 @@ public enum ArchiveMessages { Strings.messageRegionDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), DISTRICT(Strings.headingConfirmArchiving, @@ -182,6 +196,7 @@ public enum ArchiveMessages { Strings.messageDistrictDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), COMMUNITY(Strings.headingConfirmArchiving, @@ -194,6 +209,7 @@ public enum ArchiveMessages { Strings.messageCommunityDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), FACILITY(Strings.headingConfirmArchiving, @@ -206,6 +222,7 @@ public enum ArchiveMessages { Strings.messageFacilityDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null), POINT_OF_ENTRY(Strings.headingConfirmArchiving, @@ -218,6 +235,7 @@ public enum ArchiveMessages { Strings.messagePointOfEntryDearchived, Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, + null, null); private final String headingArchiveEntity; @@ -232,6 +250,7 @@ public enum ArchiveMessages { private final String headingNoEntitySelected; private final String messageNoEntitySelected; private final String messageCountEntitiesNotArchivedExternalReason; + private final String messageCountEntitiesNotDearchivedExternalReason; private final String headingConfirmationArchiving = Strings.headingConfirmArchiving; private final String headingConfirmationDearchiving = Strings.headingConfirmDearchiving; @@ -243,14 +262,11 @@ public enum ArchiveMessages { //TODO: check if is necessary to be added for each entity separately private final String headingSomeEntitiesNotArchived = Strings.headingSomeEntitiesNotArchived; private final String headingEntitiesNotArchived = Strings.headingEntitiesNotArchived; + private final String headingSomeEntitiesNotDearchived = Strings.headingSomeEntitiesNotDearchived; + private final String headingEntitiesNotDearchived = Strings.headingEntitiesNotDearchived; //private final String messageCountEntitiesNotArchived; - /* - * private final String headingSomeEntitiesDearchived = Strings.headingSomeEntitiesDearchived; - * private final String headingEntitiesNotDearchived = Strings.headingEntitiesNotDearchived; - */ - ArchiveMessages( String headingArchiveEntity, String confirmationArchiveEntity, @@ -262,7 +278,8 @@ public enum ArchiveMessages { String messageEntityDearchived, String headingNoEntitySelected, String messageNoEntitySelected, - String messageCountEntitiesNotArchivedExternalReason) { + String messageCountEntitiesNotArchivedExternalReason, + String messageCountEntitiesNotDearchivedExternalReason) { this.headingArchiveEntity = headingArchiveEntity; this.confirmationArchiveEntity = confirmationArchiveEntity; this.confirmationArchiveEntities = confirmationArchiveEntities; @@ -274,6 +291,7 @@ public enum ArchiveMessages { this.headingNoEntitySelected = headingNoEntitySelected; this.messageNoEntitySelected = messageNoEntitySelected; this.messageCountEntitiesNotArchivedExternalReason = messageCountEntitiesNotArchivedExternalReason; + this.messageCountEntitiesNotDearchivedExternalReason = messageCountEntitiesNotDearchivedExternalReason; } public String getHeadingArchiveEntity() { @@ -320,6 +338,10 @@ public String getMessageCountEntitiesNotArchivedExternalReason() { return messageCountEntitiesNotArchivedExternalReason; } + public String getMessageCountEntitiesNotDearchivedExternalReason() { + return messageCountEntitiesNotDearchivedExternalReason; + } + public String getHeadingConfirmationArchiving() { return headingConfirmationArchiving; } @@ -351,4 +373,12 @@ public String getHeadingSomeEntitiesNotArchived() { public String getHeadingEntitiesNotArchived() { return headingEntitiesNotArchived; } + + public String getHeadingSomeEntitiesNotDearchived() { + return headingSomeEntitiesNotDearchived; + } + + public String getHeadingEntitiesNotDearchived() { + return headingEntitiesNotDearchived; + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index ec3e1120289..dad588b45f0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -220,13 +220,12 @@ private BulkOperationHandler createBulkOperationHandler(I return new BulkOperationHandler<>( forArchive ? archiveMessages.getMessageAllEntitiesArchived() : archiveMessages.getMessageAllEntitiesDearchived(), null, - forArchive ? archiveMessages.getHeadingSomeEntitiesNotArchived() : null, - forArchive ? archiveMessages.getHeadingEntitiesNotArchived() : null, - - //forArchive ? archiveMessages.getMessageCountEntitiesNotArchived() : null, + forArchive ? archiveMessages.getHeadingSomeEntitiesNotArchived() : archiveMessages.getHeadingSomeEntitiesNotDearchived(), + forArchive ? archiveMessages.getHeadingEntitiesNotArchived() : archiveMessages.getHeadingEntitiesNotDearchived(), null, - forArchive ? archiveMessages.getMessageCountEntitiesNotArchivedExternalReason() : null, - + forArchive + ? archiveMessages.getMessageCountEntitiesNotArchivedExternalReason() + : archiveMessages.getMessageCountEntitiesNotDearchivedExternalReason(), null, null, forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), From fc4b700077576465c4e50ef4f06be186b809139e Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 10:40:32 +0300 Subject: [PATCH 018/144] #12257 - refactorings for archive and dearchive --- .../de/symeda/sormas/api/i18n/Strings.java | 2 ++ .../src/main/resources/strings.properties | 2 ++ .../sormas/backend/caze/CaseFacadeEjb.java | 1 - .../common/AbstractCoreAdoService.java | 31 ++++++++++++++++--- .../sormas/backend/event/EventFacadeEjb.java | 4 +-- .../AbstractInfrastructureFacadeEjb.java | 30 ++++++++++++------ .../sormas/backend/task/TaskFacadeEjb.java | 13 +++++--- .../rest/resources/CommunityResource.java | 1 - .../sormas/ui/utils/ArchiveHandlers.java | 27 +++++----------- .../sormas/ui/utils/ArchiveMessages.java | 14 ++++++++- .../sormas/ui/utils/ArchivingController.java | 2 +- .../sormas/ui/utils/BulkOperationHandler.java | 23 ++++++++++++-- 12 files changed, 102 insertions(+), 48 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 7d7b772f03f..995277e3167 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1281,6 +1281,8 @@ public interface Strings { String messageNoCsvFile = "messageNoCsvFile"; String messageNoDocumentTemplateUploadFile = "messageNoDocumentTemplateUploadFile"; String messageNoDocumentUploadFile = "messageNoDocumentUploadFile"; + String messageNoEligibleEntityForArchiving = "messageNoEligibleEntityForArchiving"; + String messageNoEligibleEntityForDearchiving = "messageNoEligibleEntityForDearchiving"; String messageNoEligibleEventForDeletionSelected = "messageNoEligibleEventForDeletionSelected"; String messageNoEndDate = "messageNoEndDate"; String messageNoEnvironmentsSelected = "messageNoEnvironmentsSelected"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 34de904f1f9..a47e3ce29c7 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1223,6 +1223,8 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForArchiving = None of the selected entities can be archived because the entities are used in other infrastructure data +messageNoEligibleEntityForDearchiving = None of the selected entities can be dearchived because the entities have archived parent infrastructure messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 8c971f20f28..4df35605ac4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2725,7 +2725,6 @@ public List delete(List uuids, DeletionDetails deletion }); } - //if the cases with exceptions will not be sent back will be noted as skipped -> check if we can update the skipped indicator based on status return processedCases; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index cebea8cbc7c..31ab99b45c3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -147,7 +147,6 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public List archive(List entityUuids) { - IterableHelper.executeBatched( entityUuids, ARCHIVE_BATCH_SIZE, @@ -165,12 +164,11 @@ public List archive(List entityUuids) { em.createQuery(cu).executeUpdate(); })); - return new ArrayList<>(); + return buildProcessedEntities(entityUuids, true); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public List dearchive(List entityUuids, String dearchiveReason) { - IterableHelper.executeBatched(entityUuids, ARCHIVE_BATCH_SIZE, batchedUuids -> { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaUpdate cu = cb.createCriteriaUpdate(getElementClass()); @@ -186,7 +184,29 @@ public List dearchive(List entityUuids, String dearchiv em.createQuery(cu).executeUpdate(); }); - return new ArrayList<>(); + return buildProcessedEntities(entityUuids, false); + } + + public List buildProcessedEntities(List entityUuids, boolean archiving) { + List processedEntities = new ArrayList<>(); + List adoList = getByUuids(entityUuids); + if (adoList != null) { + for (ADO ado : adoList) { + if (archiving) { + processedEntities.add( + new ProcessedEntity( + ado.getUuid(), + ado.isArchived() ? ProcessedEntityStatus.SUCCESS : ProcessedEntityStatus.INTERNAL_FAILURE)); + } else { + processedEntities.add( + new ProcessedEntity( + ado.getUuid(), + !ado.isArchived() ? ProcessedEntityStatus.SUCCESS : ProcessedEntityStatus.INTERNAL_FAILURE)); + } + } + } + + return processedEntities; } public EditPermissionType getEditPermissionType(ADO entity) { @@ -233,7 +253,8 @@ public List buildProcessedEntities(List entityUuids, Pr } /** - * Used to fetch {@link AdoServiceWithUserFilterAndJurisdiction#getInJurisdictionIds(List)}/{@link AdoServiceWithUserFilterAndJurisdiction#inJurisdictionOrOwned(AbstractDomainObject)} + * Used to fetch + * {@link AdoServiceWithUserFilterAndJurisdiction#getInJurisdictionIds(List)}/{@link AdoServiceWithUserFilterAndJurisdiction#inJurisdictionOrOwned(AbstractDomainObject)} * (without {@link QueryContext} because there are no other conditions etc.). * * @return A filter on entities within the users jurisdiction or owned by him. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index e28fc60e58a..261abc82d9f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -1060,11 +1060,11 @@ public List archive(List eventUuids) { @Override @RightsAllowed(UserRight._EVENT_ARCHIVE) public List dearchive(List eventUuids, String dearchiveReason) { - super.dearchive(eventUuids, dearchiveReason); + List processedEntities = super.dearchive(eventUuids, dearchiveReason); + List eventParticipantList = eventParticipantService.getAllUuidsByEventUuids(eventUuids); eventParticipantService.dearchive(eventParticipantList, dearchiveReason); - List processedEntities = new ArrayList<>(); return processedEntities; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java index 3a2ae184c8c..fe289a2d27d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java @@ -201,6 +201,7 @@ public void archive(String uuid) { @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) public List dearchive(String uuid) { + List processedEntity = new ArrayList<>(); checkInfraDataLocked(); if (hasArchivedParentInfrastructure(Collections.singletonList(uuid))) { throw new AccessDeniedException(I18nProperties.getString(dearchivingNotPossibleMessageProperty)); @@ -211,33 +212,42 @@ public List dearchive(String uuid) { ado.setArchived(false); service.ensurePersisted(ado); } - return null; + + processedEntity.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS)); + return processedEntity; } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) public List archive(List entityUuids) { List processedEntities = new ArrayList<>(); - List archivedEntityUuids = new ArrayList<>(); entityUuids.forEach(entityUuid -> { if (!isUsedInOtherInfrastructureData(Collections.singletonList(entityUuid))) { - archive(entityUuid); - archivedEntityUuids.add(entityUuid); - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); + try { + archive(entityUuid); + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } + } else { + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); } }); - //return archivedEntityUuids; return processedEntities; } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) public List dearchive(List entityUuids) { List processedEntities = new ArrayList<>(); - List dearchivedEntityUuids = new ArrayList<>(); entityUuids.forEach(entityUuid -> { if (!hasArchivedParentInfrastructure(Arrays.asList(entityUuid))) { - dearchive(entityUuid); - dearchivedEntityUuids.add(entityUuid); - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); + try { + dearchive(entityUuid); + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } + } else { + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); } }); return processedEntities; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index 14cc786ec44..322d6920e03 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -1036,8 +1036,11 @@ public void archive(String uuid) { @Override @RightsAllowed(UserRight._TASK_ARCHIVE) public List dearchive(String uuid) { + List processedTasks = new ArrayList<>(); dearchive(Collections.singletonList(uuid)); - return null; + processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS)); + + return processedTasks; } @Override @@ -1045,8 +1048,8 @@ public List dearchive(String uuid) { public List archive(List taskUuids) { List processedTasks = new ArrayList<>(); IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> taskService.updateArchived(e, true)); - //return taskUuids; - //TODO: change this logic + taskUuids.forEach(uuid -> processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + return processedTasks; } @@ -1055,8 +1058,8 @@ public List archive(List taskUuids) { public List dearchive(List taskUuids) { List processedTasks = new ArrayList<>(); IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> taskService.updateArchived(e, false)); - //return taskUuids; - //TODO: change this logic + taskUuids.forEach(uuid -> processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + return processedTasks; } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java index 23ed7195fb2..744ad5ac9d5 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java @@ -77,7 +77,6 @@ public Page getIndexList( @POST @Path("/archive") public List archive(@RequestBody List uuids) { - List processedEntities = FacadeProvider.getCommunityFacade().archive(uuids); return processedEntities; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index 14383b2e797..3e3fb6adc6b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -124,20 +124,16 @@ public void archive(String entityUuid) { @Override public List archive(List entityUuids) { - List processedEntities = entityFacade.archive(entityUuids); - return processedEntities; + return entityFacade.archive(entityUuids); } @Override public List dearchive(String entityUuid) { - List processedEntities = entityFacade.dearchive(entityUuid); - return processedEntities; + return entityFacade.dearchive(entityUuid); } public List dearchive(List entityUuids) { - //return entityFacade.dearchive(entityUuids).size(); - List processedEntities = entityFacade.dearchive(entityUuids); - return processedEntities; + return entityFacade.dearchive(entityUuids); } @Override @@ -192,14 +188,12 @@ public List archive(List entityUuids) { @Override public List dearchive(String entityUuid) { - List processedEntities = entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue()); - return processedEntities; + return entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue()); } @Override public List dearchive(List entityUuids) { - List processedEntities = entityFacade.dearchive(entityUuids, dearchiveReasonField.getValue()); - return processedEntities; + return entityFacade.dearchive(entityUuids, dearchiveReasonField.getValue()); } @Override @@ -256,9 +250,7 @@ public void archive(String entityUuid) { @Override public List dearchive(String entityUuid) { - List processedEntities = - entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue(), archiveWithContacts.getValue()); - return processedEntities; + return entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue(), archiveWithContacts.getValue()); } @Override @@ -268,9 +260,7 @@ public List archive(List entityUuids) { @Override public List dearchive(List uuidList) { - List processedEntities = - entityFacade.dearchive(uuidList, dearchiveReasonField.getValue(), archiveWithContacts.getValue()); - return processedEntities; + return entityFacade.dearchive(uuidList, dearchiveReasonField.getValue(), archiveWithContacts.getValue()); } @Override @@ -329,8 +319,7 @@ public List dearchive(String entityUuid) { } catch (AccessDeniedException e) { Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); } - List processedEntities = new ArrayList<>(); - return processedEntities; + return new ArrayList<>(); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index 79bbdcd94ff..88fa6a95150 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -121,6 +121,7 @@ public enum ArchiveMessages { null, null), + //TODO: add for infrastructure data for accessDenied message the I18nProperties.getString(dearchivingNotPossibleMessageProperty) label CONTINENT(Strings.headingConfirmArchiving, Strings.confirmationArchiveContinent, Strings.confirmationArchiveContinents, @@ -259,12 +260,15 @@ public enum ArchiveMessages { private final String messageAllEntitiesDearchived = Strings.messageAllEntitiesDearchived; private final String messageSomeEntitiesDearchived = Strings.messageSomeEntitiesDearchived; - //TODO: check if is necessary to be added for each entity separately private final String headingSomeEntitiesNotArchived = Strings.headingSomeEntitiesNotArchived; private final String headingEntitiesNotArchived = Strings.headingEntitiesNotArchived; private final String headingSomeEntitiesNotDearchived = Strings.headingSomeEntitiesNotDearchived; private final String headingEntitiesNotDearchived = Strings.headingEntitiesNotDearchived; + //TODO: the next 2 messages could be added above to the infrastructure entities + private final String messageNoEligibleEntityForArchiving = Strings.messageNoEligibleEntityForArchiving; + private final String messageNoEligibleEntityForDearchiving = Strings.messageNoEligibleEntityForDearchiving; + //private final String messageCountEntitiesNotArchived; ArchiveMessages( @@ -381,4 +385,12 @@ public String getHeadingSomeEntitiesNotDearchived() { public String getHeadingEntitiesNotDearchived() { return headingEntitiesNotDearchived; } + + public String getMessageNoEligibleEntityForArchiving() { + return messageNoEligibleEntityForArchiving; + } + + public String getMessageNoEligibleEntityForDearchiving() { + return messageNoEligibleEntityForDearchiving; + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index dad588b45f0..08e237919aa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -229,7 +229,7 @@ private BulkOperationHandler createBulkOperationHandler(I null, null, forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), - null, + forArchive ? archiveMessages.getMessageNoEligibleEntityForArchiving() : archiveMessages.getMessageNoEligibleEntityForDearchiving(), Strings.infoBulkProcessFinishedWithSkips, Strings.infoBulkProcessFinishedWithoutSuccess); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 4b88f29543b..f32b25f9956 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -168,7 +168,8 @@ public void doBulkOperation( } //all the selected items were ineligible - if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { + if ((initialEligibleEntryCount == 0 || allTheProcessedEntitiesAreIneligible(entitiesToBeProcessed)) + && successfulEntryCount == 0) { bulkProgressLayout.finishProgress( ProgressResult.FAILURE, I18nProperties.getString(Strings.infoBulkProcessNoEligibleEntries), @@ -290,7 +291,7 @@ public void processEntriesWithoutProgressBar( } } - if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { + if ((initialEligibleEntryCount == 0 || allTheProcessedEntitiesAreIneligible(processedEntities)) && successfulEntryCount == 0) { //all the selected items were ineligible NotificationHelper.showNotification(I18nProperties.getString(noEligibleEntityMessageProperty), Notification.Type.WARNING_MESSAGE, -1); return; @@ -353,7 +354,7 @@ private List performBulkOperation( * break; * } else { */ - if (ineligibleEntitiesFromBatch.size() > 0) { + if (ineligibleEntitiesFromBatch.size() > 0 || getIneligibleEntities(processedEntitiesFromBatch).size() > 0) { ineligibleEntitiesFromBatch .forEach(entity -> entitiesToBeProcessed.add(new ProcessedEntity(entity.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE))); } @@ -401,6 +402,21 @@ private void handleCancelButtonClicked() { } + public List getIneligibleEntities(List processedEntities) { + List ineligibleEntities = processedEntities.stream() + .filter(entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.NOT_ELIGIBLE)) + .collect(Collectors.toList()); + + return ineligibleEntities.size() > 0 ? ineligibleEntities : new ArrayList<>(); + } + + public boolean allTheProcessedEntitiesAreIneligible(List processedEntities) { + int ineligibleEntitiesSize = + (int) processedEntities.stream().filter(entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.NOT_ELIGIBLE)).count(); + + return processedEntities.size() == ineligibleEntitiesSize; + } + public String buildDescription(String ineligibleEntriesDescription, List processedEntities) { String failedProcessingDescription = buildFailedProcessingDescription(processedEntities); return !ineligibleEntriesDescription.isEmpty() @@ -408,6 +424,7 @@ public String buildDescription(String ineligibleEntriesDescription, List selectedIneligibleEntries) { String ineligibleEntriesDescription = StringUtils.EMPTY; if (areIneligibleEntriesSelected) { From 7db94373968c6dbdb31e6c7849adeb064c009ed1 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 11:57:44 +0300 Subject: [PATCH 019/144] #12257 - archive/dearchive will not appear in bulk dropdown without the proper right --- .../de/symeda/sormas/ui/caze/CasesView.java | 10 +- .../infrastructure/AreasView.java | 6 +- .../infrastructure/CommunitiesView.java | 6 +- .../infrastructure/ContinentsView.java | 6 +- .../infrastructure/CountriesView.java | 6 +- .../infrastructure/DistrictsView.java | 6 +- .../infrastructure/FacilitiesView.java | 6 +- .../infrastructure/PointsOfEntryView.java | 6 +- .../infrastructure/RegionsView.java | 6 +- .../infrastructure/SubcontinentsView.java | 6 +- .../sormas/ui/contact/ContactsView.java | 120 ++++++++++-------- 11 files changed, 109 insertions(+), 75 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index 35529d0b611..ae6f92822a9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -751,13 +751,19 @@ public HorizontalLayout createStatusFilterBar() { grid.bulkActionHandler( items -> ControllerProvider.getCaseController().archiveAllSelectedItems(items, (AbstractCaseGrid) grid), true); - }, hasBulkOperationsRight && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus()))); + }, + hasBulkOperationsRight + && UserProvider.getCurrent().hasUserRight(UserRight.CASE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus()))); menuBarItems .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), VaadinIcons.ARCHIVE, mi -> { grid.bulkActionHandler( items -> ControllerProvider.getCaseController().dearchiveAllSelectedItems(items, (AbstractCaseGrid) grid), true); - }, hasBulkOperationsRight && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + }, + hasBulkOperationsRight + && UserProvider.getCurrent().hasUserRight(UserRight.CASE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); menuBarItems.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.sormasToSormasShare), VaadinIcons.SHARE, mi -> { grid.bulkActionHandler( items -> ControllerProvider.getSormasToSormasController().shareSelectedCases(items, () -> navigateTo(criteria))); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java index 2a4c2c20cda..defdab305c4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java @@ -210,7 +210,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -221,7 +222,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); dropdownBulkOperations.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(dropdownBulkOperations); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java index a751081e241..8828ba35d27 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java @@ -282,7 +282,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -293,7 +294,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java index 172e8334435..60a356985ab 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java @@ -242,7 +242,8 @@ private HorizontalLayout createFilterBar() { grid::reload, () -> navigateTo(criteria)); }, - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -253,7 +254,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java index 61b54b55b6a..d356fe236bf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java @@ -262,7 +262,8 @@ private HorizontalLayout createFilterBar() { grid::reload, () -> navigateTo(criteria)); }, - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -275,7 +276,8 @@ private HorizontalLayout createFilterBar() { grid::reload, () -> navigateTo(criteria)); }, - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java index 8c52d527f97..e950af2306a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java @@ -268,7 +268,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -279,7 +280,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java index e48e8521c73..e805e8f3cea 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java @@ -388,7 +388,8 @@ private HorizontalLayout createFilterBar() { grid::reload, () -> navigateTo(criteria)); }, - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -401,7 +402,8 @@ private HorizontalLayout createFilterBar() { grid::reload, () -> navigateTo(criteria)); }, - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java index 9e52cf2a96c..bd28c4b045b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java @@ -316,7 +316,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -327,7 +328,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java index f5a4269fa8b..06466d48111 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java @@ -244,7 +244,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -255,7 +256,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java index 7fb8814e35d..5cd866af6ac 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java @@ -256,7 +256,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, @@ -267,7 +268,8 @@ private HorizontalLayout createFilterBar() { grid, grid::reload, () -> navigateTo(criteria)), - EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java index a3a924848a9..06fdd357765 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java @@ -510,65 +510,75 @@ public HorizontalLayout createStatusFilterBar() { boolean hasBulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS); List bulkActions = new ArrayList<>( - Arrays.asList( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkEdit), - VaadinIcons.ELLIPSIS_H, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController() - .showBulkContactDataEditComponent(items, null, (AbstractContactGrid) grid)), - hasBulkOperationsRight), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkCancelFollowUp), - VaadinIcons.CLOSE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController() - .cancelFollowUpOfAllSelectedItems(items, null, (AbstractContactGrid) grid)), - hasBulkOperationsRight), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkLostToFollowUp), - VaadinIcons.UNLINK, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController() - .setAllSelectedItemsToLostToFollowUp(items, null, (AbstractContactGrid) grid)), - hasBulkOperationsRight), - criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED - ? new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkDelete), - VaadinIcons.TRASH, + Arrays + .asList( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkEdit), + VaadinIcons.ELLIPSIS_H, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .showBulkContactDataEditComponent(items, null, (AbstractContactGrid) grid)), + hasBulkOperationsRight), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkCancelFollowUp), + VaadinIcons.CLOSE, mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().deleteAllSelectedItems(items, (AbstractContactGrid) grid), + items -> ControllerProvider.getContactController() + .cancelFollowUpOfAllSelectedItems(items, null, (AbstractContactGrid) grid)), + hasBulkOperationsRight), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkLostToFollowUp), + VaadinIcons.UNLINK, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .setAllSelectedItemsToLostToFollowUp(items, null, (AbstractContactGrid) grid)), + hasBulkOperationsRight), + criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED + ? new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkDelete), + VaadinIcons.TRASH, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .deleteAllSelectedItems(items, (AbstractContactGrid) grid), + true), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE)) + : new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkRestore), + VaadinIcons.ARROW_BACKWARD, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .restoreSelectedContacts(items, (AbstractContactGrid) grid), + true), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE)), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionArchiveCoreEntity), + VaadinIcons.ARCHIVE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController().archiveAllSelectedItems(items, (AbstractContactGrid) grid), true), - hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE)) - : new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkRestore), - VaadinIcons.ARROW_BACKWARD, + hasBulkOperationsRight + && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_ARCHIVE) + && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), + VaadinIcons.ARCHIVE, mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().restoreSelectedContacts(items, (AbstractContactGrid) grid), + items -> ControllerProvider + .getContactController() + .dearchiveAllSelectedItems(items, (AbstractContactGrid) grid), true), - hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE)), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.actionArchiveCoreEntity), - VaadinIcons.ARCHIVE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().archiveAllSelectedItems(items, (AbstractContactGrid) grid), - true), - hasBulkOperationsRight && EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), - VaadinIcons.ARCHIVE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController().dearchiveAllSelectedItems(items, (AbstractContactGrid) grid), - true), - hasBulkOperationsRight && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus())), - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.sormasToSormasShare), - VaadinIcons.SHARE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getSormasToSormasController().shareSelectedContacts(items, () -> navigateTo(criteria))), - FacadeProvider.getFeatureConfigurationFacade() - .isPropertyValueTrue(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS, FeatureTypeProperty.S2S_SHARING) - && FacadeProvider.getSormasToSormasFacade().isSharingContactsEnabledForUser()))); + hasBulkOperationsRight + && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus())), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.sormasToSormasShare), + VaadinIcons.SHARE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getSormasToSormasController() + .shareSelectedContacts(items, () -> navigateTo(criteria))), + FacadeProvider.getFeatureConfigurationFacade() + .isPropertyValueTrue(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS, FeatureTypeProperty.S2S_SHARING) + && FacadeProvider.getSormasToSormasFacade().isSharingContactsEnabledForUser()))); if (isDocGenerationAllowed() && grid instanceof AbstractContactGrid) { bulkActions.add( From 2b1f90148b2f1caf832553d8137b06c91d997a82 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 15:56:13 +0300 Subject: [PATCH 020/144] #12257 - Send to reporting tool should appear in the dropdown only if the user has the proper right --- .../src/main/java/de/symeda/sormas/ui/caze/CasesView.java | 3 ++- .../src/main/java/de/symeda/sormas/ui/events/EventsView.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index ae6f92822a9..9b07063d946 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -785,7 +785,8 @@ public HorizontalLayout createStatusFilterBar() { ControllerProvider.getCaseController().sendCasesToExternalSurveillanceTool(items, (AbstractCaseGrid) grid); }); }, - FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); + UserProvider.getCurrent().hasUserRight(UserRight.EXTERNAL_SURVEILLANCE_SHARE) + && FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); if (isDocGenerationAllowed()) { menuBarItems.add( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java index da3abfb1b9a..dce6137d06a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java @@ -597,7 +597,8 @@ public HorizontalLayout createStatusFilterBar() { mi -> grid.bulkActionHandler( items -> ControllerProvider.getEventController() .sendAllSelectedToExternalSurveillanceTool(eventGrid.asMultiSelect().getSelectedItems(), eventGrid)), - FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); + UserProvider.getCurrent().hasUserRight(UserRight.EXTERNAL_SURVEILLANCE_SHARE) + && FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); if (isDocGenerationAllowed()) { bulkActions.add( From b6d890515b8e6e71b07a4a766cb97b5acdf09098 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 17:39:31 +0300 Subject: [PATCH 021/144] #12257 - change the not allowed to archive/dearchive infra entities to ACCESS_DENIED status --- .../de/symeda/sormas/api/i18n/Strings.java | 4 +- .../src/main/resources/strings.properties | 4 +- .../AbstractInfrastructureFacadeEjb.java | 12 +-- .../sormas/ui/utils/ArchiveMessages.java | 87 +++++++++++++------ .../sormas/ui/utils/ArchivingController.java | 8 +- 5 files changed, 73 insertions(+), 42 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 995277e3167..2607e4c7418 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1124,6 +1124,8 @@ public interface Strings { String messageCountContactsNotDeletedAccessDeniedReason = "messageCountContactsNotDeletedAccessDeniedReason"; String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; + String messageCountEntitiesNotArchivedAccessDeniedReason = "messageCountEntitiesNotArchivedAccessDeniedReason"; + String messageCountEntitiesNotDearchivedAccessDeniedReason = "messageCountEntitiesNotDearchivedAccessDeniedReason"; String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; String messageCountEventParticipantsNotDeletedAccessDeniedReason = "messageCountEventParticipantsNotDeletedAccessDeniedReason"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; @@ -1281,8 +1283,6 @@ public interface Strings { String messageNoCsvFile = "messageNoCsvFile"; String messageNoDocumentTemplateUploadFile = "messageNoDocumentTemplateUploadFile"; String messageNoDocumentUploadFile = "messageNoDocumentUploadFile"; - String messageNoEligibleEntityForArchiving = "messageNoEligibleEntityForArchiving"; - String messageNoEligibleEntityForDearchiving = "messageNoEligibleEntityForDearchiving"; String messageNoEligibleEventForDeletionSelected = "messageNoEligibleEventForDeletionSelected"; String messageNoEndDate = "messageNoEndDate"; String messageNoEnvironmentsSelected = "messageNoEnvironmentsSelected"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index a47e3ce29c7..d4a3f6c2cdf 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1158,6 +1158,8 @@ messageCountContactsNotDeleted = %s contacts not deleted: %s messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned: %s messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure: %s messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed: %s messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s @@ -1223,8 +1225,6 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. -messageNoEligibleEntityForArchiving = None of the selected entities can be archived because the entities are used in other infrastructure data -messageNoEligibleEntityForDearchiving = None of the selected entities can be dearchived because the entities have archived parent infrastructure messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java index fe289a2d27d..d99c83dee00 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java @@ -222,14 +222,10 @@ public List archive(List entityUuids) { List processedEntities = new ArrayList<>(); entityUuids.forEach(entityUuid -> { if (!isUsedInOtherInfrastructureData(Collections.singletonList(entityUuid))) { - try { archive(entityUuid); processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - } } else { - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } }); return processedEntities; @@ -240,14 +236,10 @@ public List dearchive(List entityUuids) { List processedEntities = new ArrayList<>(); entityUuids.forEach(entityUuid -> { if (!hasArchivedParentInfrastructure(Arrays.asList(entityUuid))) { - try { dearchive(entityUuid); processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - } } else { - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } }); return processedEntities; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index 88fa6a95150..d1a8b4ce23b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -15,7 +15,9 @@ public enum ArchiveMessages { Strings.headingNoCasesSelected, Strings.messageNoCasesSelected, Strings.messageCountCasesNotArchivedExternalReason, - Strings.messageCountCasesNotDearchivedExternalReason), + Strings.messageCountCasesNotDearchivedExternalReason, + null, + null), CONTACT(Strings.headingArchiveContact, Strings.confirmationArchiveContact, @@ -28,6 +30,8 @@ public enum ArchiveMessages { Strings.headingNoContactsSelected, Strings.messageNoContactsSelected, null, + null, + null, null), ENVIRONMENT(Strings.headingArchiveEnvironment, @@ -41,6 +45,8 @@ public enum ArchiveMessages { Strings.headingNoEnvironmentSelected, Strings.messageNoEnvironmentsSelected, null, + null, + null, null), EVENT(Strings.headingArchiveEvent, @@ -54,7 +60,9 @@ public enum ArchiveMessages { Strings.headingNoEventsSelected, Strings.messageNoEventsSelected, Strings.messageCountEventsNotArchivedExternalReason, - Strings.messageCountEventsNotDearchivedExternalReason), + Strings.messageCountEventsNotDearchivedExternalReason, + null, + null), EVENT_PARTICIPANT(Strings.headingArchiveEventParticipant, Strings.confirmationArchiveEventParticipant, @@ -67,6 +75,8 @@ public enum ArchiveMessages { Strings.headingNoEventParticipantsSelected, Strings.messageNoEventParticipantsSelected, null, + null, + null, null), IMMUNIZATION(Strings.headingArchiveImmunization, @@ -80,6 +90,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), TRAVEL_ENTRY(Strings.headingArchiveTravelEntry, @@ -93,6 +105,8 @@ public enum ArchiveMessages { Strings.headingNoTravelEntriesSelected, Strings.messageNoTravelEntriesSelected, null, + null, + null, null), CAMPAIGN(Strings.headingArchiveCampaign, @@ -106,6 +120,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), TASK(Strings.headingConfirmArchiving, @@ -119,6 +135,8 @@ public enum ArchiveMessages { Strings.headingNoTasksSelected, Strings.messageNoTasksSelected, null, + null, + null, null), //TODO: add for infrastructure data for accessDenied message the I18nProperties.getString(dearchivingNotPossibleMessageProperty) label @@ -133,7 +151,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), SUBCONTINENT(Strings.headingConfirmArchiving, Strings.confirmationArchiveSubcontinent, @@ -146,7 +166,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), AREA(Strings.headingConfirmArchiving, Strings.confirmationArchiveArea, @@ -159,7 +181,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), COUNTRY(Strings.headingConfirmArchiving, Strings.confirmationArchiveCountry, @@ -172,7 +196,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), REGION(Strings.headingConfirmArchiving, Strings.confirmationArchiveRegion, @@ -185,7 +211,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), DISTRICT(Strings.headingConfirmArchiving, Strings.confirmationArchiveDistrict, @@ -198,7 +226,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), COMMUNITY(Strings.headingConfirmArchiving, Strings.confirmationArchiveCommunity, @@ -211,7 +241,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), FACILITY(Strings.headingConfirmArchiving, Strings.confirmationArchiveFacility, @@ -224,7 +256,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null), + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), POINT_OF_ENTRY(Strings.headingConfirmArchiving, Strings.confirmationArchivePointOfEntry, @@ -237,7 +271,9 @@ public enum ArchiveMessages { Strings.headingNoRowsSelected, Strings.messageNoRowsSelected, null, - null); + null, + Strings.messageCountEntitiesNotArchivedAccessDeniedReason, + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason); private final String headingArchiveEntity; private final String confirmationArchiveEntity; @@ -252,6 +288,8 @@ public enum ArchiveMessages { private final String messageNoEntitySelected; private final String messageCountEntitiesNotArchivedExternalReason; private final String messageCountEntitiesNotDearchivedExternalReason; + private final String messageCountEntitiesNotArchivedAccessDeniedReason; + private final String messageCountEntitiesNotDearchivedAccessDeniedReason; private final String headingConfirmationArchiving = Strings.headingConfirmArchiving; private final String headingConfirmationDearchiving = Strings.headingConfirmDearchiving; @@ -265,12 +303,6 @@ public enum ArchiveMessages { private final String headingSomeEntitiesNotDearchived = Strings.headingSomeEntitiesNotDearchived; private final String headingEntitiesNotDearchived = Strings.headingEntitiesNotDearchived; - //TODO: the next 2 messages could be added above to the infrastructure entities - private final String messageNoEligibleEntityForArchiving = Strings.messageNoEligibleEntityForArchiving; - private final String messageNoEligibleEntityForDearchiving = Strings.messageNoEligibleEntityForDearchiving; - - //private final String messageCountEntitiesNotArchived; - ArchiveMessages( String headingArchiveEntity, String confirmationArchiveEntity, @@ -283,7 +315,9 @@ public enum ArchiveMessages { String headingNoEntitySelected, String messageNoEntitySelected, String messageCountEntitiesNotArchivedExternalReason, - String messageCountEntitiesNotDearchivedExternalReason) { + String messageCountEntitiesNotDearchivedExternalReason, + String messageCountEntitiesNotArchivedAccessDeniedReason, + String messageCountEntitiesNotDearchivedAccessDeniedReason) { this.headingArchiveEntity = headingArchiveEntity; this.confirmationArchiveEntity = confirmationArchiveEntity; this.confirmationArchiveEntities = confirmationArchiveEntities; @@ -296,6 +330,8 @@ public enum ArchiveMessages { this.messageNoEntitySelected = messageNoEntitySelected; this.messageCountEntitiesNotArchivedExternalReason = messageCountEntitiesNotArchivedExternalReason; this.messageCountEntitiesNotDearchivedExternalReason = messageCountEntitiesNotDearchivedExternalReason; + this.messageCountEntitiesNotArchivedAccessDeniedReason = messageCountEntitiesNotArchivedAccessDeniedReason; + this.messageCountEntitiesNotDearchivedAccessDeniedReason = messageCountEntitiesNotDearchivedAccessDeniedReason; } public String getHeadingArchiveEntity() { @@ -346,6 +382,14 @@ public String getMessageCountEntitiesNotDearchivedExternalReason() { return messageCountEntitiesNotDearchivedExternalReason; } + public String getMessageCountEntitiesNotArchivedAccessDeniedReason() { + return messageCountEntitiesNotArchivedAccessDeniedReason; + } + + public String getMessageCountEntitiesNotDearchivedAccessDeniedReason() { + return messageCountEntitiesNotDearchivedAccessDeniedReason; + } + public String getHeadingConfirmationArchiving() { return headingConfirmationArchiving; } @@ -386,11 +430,4 @@ public String getHeadingEntitiesNotDearchived() { return headingEntitiesNotDearchived; } - public String getMessageNoEligibleEntityForArchiving() { - return messageNoEligibleEntityForArchiving; - } - - public String getMessageNoEligibleEntityForDearchiving() { - return messageNoEligibleEntityForDearchiving; - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index 08e237919aa..99d2c93d4db 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -214,7 +214,7 @@ this. createBulkOperationHandler(archiveHandler, true) } } - //TODO: check the necessary labels below + private BulkOperationHandler createBulkOperationHandler(IArchiveHandler archiveHandler, boolean forArchive) { ArchiveMessages archiveMessages = archiveHandler.getArchiveMessages(); return new BulkOperationHandler<>( @@ -227,9 +227,11 @@ private BulkOperationHandler createBulkOperationHandler(I ? archiveMessages.getMessageCountEntitiesNotArchivedExternalReason() : archiveMessages.getMessageCountEntitiesNotDearchivedExternalReason(), null, - null, + forArchive + ? archiveMessages.getMessageCountEntitiesNotArchivedAccessDeniedReason() + : archiveMessages.getMessageCountEntitiesNotDearchivedAccessDeniedReason(), forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), - forArchive ? archiveMessages.getMessageNoEligibleEntityForArchiving() : archiveMessages.getMessageNoEligibleEntityForDearchiving(), + null, Strings.infoBulkProcessFinishedWithSkips, Strings.infoBulkProcessFinishedWithoutSuccess); } From 20ec1b493af27dc661ebc35d14c8c865f1d27585 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 17:40:20 +0300 Subject: [PATCH 022/144] #12257 - change the not allowed to archive/dearchive infra entities to ACCESS_DENIED status --- .../sormas/ui/utils/BulkOperationHandler.java | 28 ++----------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index f32b25f9956..3edf07b679a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -168,8 +168,7 @@ public void doBulkOperation( } //all the selected items were ineligible - if ((initialEligibleEntryCount == 0 || allTheProcessedEntitiesAreIneligible(entitiesToBeProcessed)) - && successfulEntryCount == 0) { + if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { bulkProgressLayout.finishProgress( ProgressResult.FAILURE, I18nProperties.getString(Strings.infoBulkProcessNoEligibleEntries), @@ -291,7 +290,7 @@ public void processEntriesWithoutProgressBar( } } - if ((initialEligibleEntryCount == 0 || allTheProcessedEntitiesAreIneligible(processedEntities)) && successfulEntryCount == 0) { + if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { //all the selected items were ineligible NotificationHelper.showNotification(I18nProperties.getString(noEligibleEntityMessageProperty), Notification.Type.WARNING_MESSAGE, -1); return; @@ -348,13 +347,7 @@ private List performBulkOperation( List ineligibleEntitiesFromBatch = getInEligibleEntriesFromBatch(entitiesFromBatch, selectedEligibleEntities); List processedEntitiesFromBatch = bulkOperationFunction.apply(eligibleEntitiesFromBatch); - //If the user does not have the proper rights to perform the action or there are no eligibleEntries, there will be no processed entities - /* - * if (processedEntitiesFromBatch.size() == 0) { - * break; - * } else { - */ - if (ineligibleEntitiesFromBatch.size() > 0 || getIneligibleEntities(processedEntitiesFromBatch).size() > 0) { + if (ineligibleEntitiesFromBatch.size() > 0) { ineligibleEntitiesFromBatch .forEach(entity -> entitiesToBeProcessed.add(new ProcessedEntity(entity.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE))); } @@ -402,21 +395,6 @@ private void handleCancelButtonClicked() { } - public List getIneligibleEntities(List processedEntities) { - List ineligibleEntities = processedEntities.stream() - .filter(entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.NOT_ELIGIBLE)) - .collect(Collectors.toList()); - - return ineligibleEntities.size() > 0 ? ineligibleEntities : new ArrayList<>(); - } - - public boolean allTheProcessedEntitiesAreIneligible(List processedEntities) { - int ineligibleEntitiesSize = - (int) processedEntities.stream().filter(entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.NOT_ELIGIBLE)).count(); - - return processedEntities.size() == ineligibleEntitiesSize; - } - public String buildDescription(String ineligibleEntriesDescription, List processedEntities) { String failedProcessingDescription = buildFailedProcessingDescription(processedEntities); return !ineligibleEntriesDescription.isEmpty() From 49b84104ac08a28b59b8cdd70628e68e3b33dac1 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 20:04:56 +0300 Subject: [PATCH 023/144] #12257 - changes related to the disabling/enabling of users --- .../de/symeda/sormas/api/i18n/Strings.java | 6 ++++ .../de/symeda/sormas/api/user/UserFacade.java | 5 ++-- .../src/main/resources/strings.properties | 6 ++++ .../sormas/backend/user/UserFacadeEjb.java | 20 ++++++++----- .../symeda/sormas/ui/user/UserController.java | 30 +++++-------------- .../de/symeda/sormas/ui/user/UsersView.java | 4 +-- 6 files changed, 38 insertions(+), 33 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 2607e4c7418..3370d6118d1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -747,6 +747,8 @@ public interface Strings { String headingSomeImmunizationsNotRestored = "headingSomeImmunizationsNotRestored"; String headingSomeSamplesNotRestored = "headingSomeSamplesNotRestored"; String headingSomeTravelEntriesNotRestored = "headingSomeTravelEntriesNotRestored"; + String headingSomeUsersNotDisabled = "headingSomeUsersNotDisabled"; + String headingSomeUsersNotEnabled = "headingSomeUsersNotEnabled"; String headingSormasToSormasCanAcceptContactsWithoutCase = "headingSormasToSormasCanAcceptContactsWithoutCase"; String headingSormasToSormasCantShareContactWithoutCase = "headingSormasToSormasCantShareContactWithoutCase"; String headingSormasToSormasDuplicateDetection = "headingSormasToSormasDuplicateDetection"; @@ -779,6 +781,8 @@ public interface Strings { String headingUploadSuccess = "headingUploadSuccess"; String headingUserData = "headingUserData"; String headingUserSettings = "headingUserSettings"; + String headingUsersNotDisabled = "headingUsersNotDisabled"; + String headingUsersNotEnabled = "headingUsersNotEnabled"; String headingVaccination = "headingVaccination"; String headingViewAdditionalTest = "headingViewAdditionalTest"; String headingViewClinicalVisit = "headingViewClinicalVisit"; @@ -1152,6 +1156,8 @@ public interface Strings { String messageCountTravelEntriesNotDeleted = "messageCountTravelEntriesNotDeleted"; String messageCountTravelEntriesNotDeletedAccessDeniedReason = "messageCountTravelEntriesNotDeletedAccessDeniedReason"; String messageCountTravelEntriesNotRestored = "messageCountTravelEntriesNotRestored"; + String messageCountUsersNotDisabled = "messageCountUsersNotDisabled"; + String messageCountUsersNotEnabled = "messageCountUsersNotEnabled"; String messageCountVisitsNotDeleted = "messageCountVisitsNotDeleted"; String messageCountVisitsNotDeletedAccessDeniedReason = "messageCountVisitsNotDeletedAccessDeniedReason"; String messageCreateCollectionTask = "messageCreateCollectionTask"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 7b8cc23ad6e..d69ddaba13a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -29,6 +29,7 @@ import de.symeda.sormas.api.InfrastructureDataReferenceDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; @@ -130,9 +131,9 @@ List getUserRefsByInfrastructure( List getUsersWithDefaultPassword(); - void enableUsers(List userUuids); + List enableUsers(List userUuids); - void disableUsers(List userUuids); + List disableUsers(List userUuids); List getUsersHavingCaseInJurisdiction(CaseReferenceDto caseReferenceDto); diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index d4a3f6c2cdf..f06367b1d9a 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -740,6 +740,8 @@ headingSomeEventParticipantsNotRestored = Some event participants were not resto headingSomeImmunizationsNotRestored = Some immunizations were not restored headingSomeSamplesNotRestored = Some samples were not restored headingSomeTravelEntriesNotRestored = Some travel entries were not restored +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -781,6 +783,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -1177,6 +1181,8 @@ messageCountTasksNotDeletedAccessDeniedReason =%s tasks not deleted because the messageCountTravelEntriesNotDeleted = %s travel entries not deleted: %s messageCountTravelEntriesNotDeletedAccessDeniedReason =%s travel entries not deleted because the they are not in jurisdiction or owned: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored: %s +messageCountUsersNotDisabled = %s users not disabled: %s +messageCountUsersNotEnabled = %s users not enabled: %s messageCountVisitsNotDeleted = %s visits not deleted: %s messageCountVisitsNotDeletedAccessDeniedReason =%s visits not deleted because they are not in jurisdiction or owned: %s messageCountEventsNotDeleted = %s events not deleted: %s diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java index f7945ff3a48..33cabab5650 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java @@ -61,6 +61,8 @@ import de.symeda.sormas.api.audit.AuditIgnore; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.i18n.I18nProperties; @@ -982,32 +984,36 @@ public List getUsersWithDefaultPassword() { @Override @RightsAllowed(UserRight._USER_EDIT) - public void enableUsers(List userUuids) { - updateActiveState(userUuids, true); + public List enableUsers(List userUuids) { + return updateActiveState(userUuids, true); } @Override @RightsAllowed(UserRight._USER_EDIT) - public void disableUsers(List userUuids) { - updateActiveState(userUuids, false); + public List disableUsers(List userUuids) { + return updateActiveState(userUuids, false); } - private void updateActiveState(List userUuids, boolean active) { + private List updateActiveState(List userUuids, boolean active) { + List processedEntities = new ArrayList<>(); List users = userService.getByUuids(userUuids); for (User user : users) { - User oldUser; + User oldUser = new User(); try { oldUser = (User) BeanUtils.cloneBean(user); } catch (Exception e) { - throw new IllegalArgumentException("Invalid bean access", e); + processedEntities.add(new ProcessedEntity(user.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); } user.setActive(active); userService.ensurePersisted(user); userUpdateEvent.fire(new UserUpdateEvent(oldUser, user)); + processedEntities.add(new ProcessedEntity(user.getUuid(), ProcessedEntityStatus.SUCCESS)); } + + return processedEntities; } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java index 000118fef62..1c79109c5b9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java @@ -46,7 +46,6 @@ import de.symeda.sormas.api.AuthProvider; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.Language; -import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -368,14 +367,12 @@ public void enableAllSelectedItems(Collection selectedRows, UserGrid us return; } - //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, - //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty new BulkOperationHandler( Strings.messageUsersEnabled, null, - null, - null, - null, + Strings.headingSomeUsersNotEnabled, + Strings.headingUsersNotEnabled, + Strings.messageCountUsersNotEnabled, null, null, null, @@ -384,13 +381,8 @@ public void enableAllSelectedItems(Collection selectedRows, UserGrid us null, null).doBulkOperation(batch -> { - List processedUsers = new ArrayList<>(); - - //TODO: change the logic List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); - FacadeProvider.getUserFacade().enableUsers(uuids); - - return processedUsers; + return FacadeProvider.getUserFacade().enableUsers(uuids); }, new ArrayList<>(selectedRows), null, null, remaining -> { userGrid.reload(); if (CollectionUtils.isNotEmpty(remaining)) { @@ -423,14 +415,12 @@ public void disableAllSelectedItems(Collection selectedRows, UserGrid u return; } - //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, - //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty new BulkOperationHandler( Strings.messageUsersDisabled, null, - null, - null, - null, + Strings.headingSomeUsersNotDisabled, + Strings.headingUsersNotDisabled, + Strings.messageCountUsersNotDisabled, null, null, null, @@ -439,12 +429,8 @@ public void disableAllSelectedItems(Collection selectedRows, UserGrid u null, null).doBulkOperation(batch -> { - List processedUsers = new ArrayList<>(); - //TODO: change the logic List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); - FacadeProvider.getUserFacade().disableUsers(uuids); - - return processedUsers; + return FacadeProvider.getUserFacade().disableUsers(uuids); }, new ArrayList<>(selectedRows), null, null, remaining -> { userGrid.reload(); if (CollectionUtils.isNotEmpty(remaining)) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java index b1d615fda26..c46b59c99e5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java @@ -256,11 +256,11 @@ public HorizontalLayout createActionsBar() { new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.actionEnable), VaadinIcons.CHECK_SQUARE_O, selectedItem -> { ControllerProvider.getUserController() .enableAllSelectedItems(grid.asMultiSelect().getSelectedItems(), grid); - }, true), + }, UserProvider.getCurrent().hasUserRight(UserRight.USER_EDIT)), new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.actionDisable), VaadinIcons.THIN_SQUARE, selectedItem -> { ControllerProvider.getUserController() .disableAllSelectedItems(grid.asMultiSelect().getSelectedItems(), grid); - }, true)); + }, UserProvider.getCurrent().hasUserRight(UserRight.USER_EDIT))); bulkOperationsDropdown.setVisible(ViewModelProviders.of(UsersView.class).get(ViewConfiguration.class).isInEagerMode()); actionButtonsLayout.addComponent(bulkOperationsDropdown); From 7b04857f1bd2c556e2359308e79796a9b0971b6d Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 20:06:05 +0300 Subject: [PATCH 024/144] #12257 - fixes for archiving/dearchiving --- .../src/main/java/de/symeda/sormas/api/CoreFacade.java | 2 ++ .../symeda/sormas/backend/campaign/CampaignFacadeEjb.java | 6 ++++-- .../sormas/backend/common/AbstractCoreAdoService.java | 4 ++-- .../symeda/sormas/backend/common/AbstractCoreFacadeEjb.java | 5 +++++ .../de/symeda/sormas/backend/contact/ContactFacadeEjb.java | 6 ++++-- .../sormas/backend/travelentry/TravelEntryFacadeEjb.java | 6 ++++-- .../de/symeda/sormas/ui/utils/BulkOperationHandler.java | 2 ++ 7 files changed, 23 insertions(+), 8 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java index e55643d4c0a..bdccf08333c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java @@ -42,5 +42,7 @@ public interface CoreFacade getArchivedUuidsSince(Date since); + List buildProcessedEntities(List entityUuids, boolean archiving); + Date calculateEndOfProcessingDate(String entityUuids); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java index 18bc80017fb..63804aaa3b5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java @@ -422,13 +422,15 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) public List archive(List entityUuids) { - return super.archive(entityUuids); + super.archive(entityUuids); + return super.buildProcessedEntities(entityUuids, true); } @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason) { - return super.dearchive(entityUuids, dearchiveReason); + super.dearchive(entityUuids, dearchiveReason); + return super.buildProcessedEntities(entityUuids, false); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 31ab99b45c3..3097b30fc86 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -164,7 +164,7 @@ public List archive(List entityUuids) { em.createQuery(cu).executeUpdate(); })); - return buildProcessedEntities(entityUuids, true); + return new ArrayList<>(); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) @@ -184,7 +184,7 @@ public List dearchive(List entityUuids, String dearchiv em.createQuery(cu).executeUpdate(); }); - return buildProcessedEntities(entityUuids, false); + return new ArrayList<>(); } public List buildProcessedEntities(List entityUuids, boolean archiving) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index 6c188943669..db5340f2ce8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -216,6 +216,11 @@ private Date getDeletionReferenceDate(String uuid, DeletionConfiguration entityC protected abstract CoreEntityType getCoreEntityType(); + @DenyAll + public List buildProcessedEntities(List entityUuids, boolean archiving) { + return service.buildProcessedEntities(entityUuids, archiving); + } + @DenyAll public void archive(String entityUuid, Date endOfProcessingDate) { service.archive(entityUuid, endOfProcessingDate); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index 42985da6eb3..4112b471604 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -650,13 +650,15 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._CONTACT_ARCHIVE) public List archive(List entityUuids) { - return super.archive(entityUuids); + super.archive(entityUuids); + return super.buildProcessedEntities(entityUuids, true); } @Override @RightsAllowed(UserRight._CONTACT_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason) { - return super.dearchive(entityUuids, dearchiveReason); + super.dearchive(entityUuids, dearchiveReason); + return super.buildProcessedEntities(entityUuids, false); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index 1b2ac303df9..23a98e6b2a8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -472,13 +472,15 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) public List archive(List entityUuids) { - return super.archive(entityUuids); + super.archive(entityUuids); + return super.buildProcessedEntities(entityUuids, true); } @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason) { - return super.dearchive(entityUuids, dearchiveReason); + super.dearchive(entityUuids, dearchiveReason); + return super.buildProcessedEntities(entityUuids, false); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 3edf07b679a..2b2fe17787e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -60,6 +60,8 @@ public class BulkOperationHandler { private final String countEntriesNotProcessedExternalReasonProperty; private final String countEntriesNotProcessedSormasToSormasReasonProperty; private final String countEntriesNotProcessedAccessDeniedReasonProperty; + + //TODO: check this field, if is not used delete private final String someEntriesProcessedMessageProperty; private final String noEligibleEntityMessageProperty; private final String infoBulkProcessFinishedWithSkipsProperty; From d4038f5683833cf57c8c6e1c03d516adce58ead4 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 8 Aug 2023 20:23:40 +0300 Subject: [PATCH 025/144] #12257 - add new messages for users enabling/disabling --- .../java/de/symeda/sormas/ui/user/UserController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java index 1c79109c5b9..e024548677a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java @@ -378,8 +378,8 @@ public void enableAllSelectedItems(Collection selectedRows, UserGrid us null, Strings.messageSomeUsersEnabled, null, - null, - null).doBulkOperation(batch -> { + Strings.infoBulkProcessFinishedWithSkips, + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); return FacadeProvider.getUserFacade().enableUsers(uuids); @@ -426,8 +426,8 @@ public void disableAllSelectedItems(Collection selectedRows, UserGrid u null, Strings.messageSomeUsersDisabled, null, - null, - null).doBulkOperation(batch -> { + Strings.infoBulkProcessFinishedWithSkips, + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); return FacadeProvider.getUserFacade().disableUsers(uuids); From 44941e930338b37f5c6ae8bfb688c7195ff92cc5 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 9 Aug 2023 13:07:36 +0300 Subject: [PATCH 026/144] #12257 - Changes for "Sending entities to reporting tool" bulk action --- .../de/symeda/sormas/api/i18n/Strings.java | 3 ++ .../src/main/resources/strings.properties | 3 ++ .../ExternalSurveillanceServiceGateway.java | 35 +++++++++---------- .../sormas/ui/utils/BulkOperationHandler.java | 1 - 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 3370d6118d1..48eb78322f0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -550,6 +550,7 @@ public interface Strings { String headingEditVisit = "headingEditVisit"; String headingEntitiesNotArchived = "headingEntitiesNotArchived"; String headingEntitiesNotDearchived = "headingEntitiesNotDearchived"; + String headingEntitiesNotSent = "headingEntitiesNotSent"; String headingEnvironmentalExposure = "headingEnvironmentalExposure"; String headingEpiCurve = "headingEpiCurve"; String headingEpiDataSourceCaseContacts = "headingEpiDataSourceCaseContacts"; @@ -1130,6 +1131,8 @@ public interface Strings { String messageCountContactsNotRestored = "messageCountContactsNotRestored"; String messageCountEntitiesNotArchivedAccessDeniedReason = "messageCountEntitiesNotArchivedAccessDeniedReason"; String messageCountEntitiesNotDearchivedAccessDeniedReason = "messageCountEntitiesNotDearchivedAccessDeniedReason"; + String messageCountEntitiesNotSentAccessDeniedReason = "messageCountEntitiesNotSentAccessDeniedReason"; + String messageCountEntitiesNotSentExternalReason = "messageCountEntitiesNotSentExternalReason"; String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; String messageCountEventParticipantsNotDeletedAccessDeniedReason = "messageCountEventParticipantsNotDeletedAccessDeniedReason"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index f06367b1d9a..12f5c39e7ef 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -531,6 +531,7 @@ headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent headingEntitiesNotArchived = None of the entities were archived headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available @@ -1164,6 +1165,8 @@ messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted bec messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data: %s messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed: %s messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed: %s messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java index 10d6ee3ba00..ba5965dea63 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java @@ -29,6 +29,7 @@ import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.share.ExternalShareInfoCriteria; import de.symeda.sormas.api.utils.AccessDeniedException; +import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.utils.BulkOperationHandler; import de.symeda.sormas.ui.utils.DirtyStateComponent; @@ -122,32 +123,28 @@ public static void sendCasesToExternalSurveillanceTool( Consumer> callback) { sendToExternalSurveillanceTool(I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_confirmSendCases), () -> { ArrayList selectedCasesCpy = new ArrayList<>(selectedCases); - //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, - //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty new BulkOperationHandler( Strings.ExternalSurveillanceToolGateway_notificationEntriesSent, null, null, + Strings.headingEntitiesNotSent, null, + Strings.messageCountEntitiesNotSentExternalReason, null, - null, - null, - null, + Strings.messageCountEntitiesNotSentAccessDeniedReason, Strings.ExternalSurveillanceToolGateway_notificationSomeEntriesSent, null, null, - null).doBulkOperation(batch -> { + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List processedCases = new ArrayList<>(); try { FacadeProvider.getExternalSurveillanceToolFacade() .sendCases(batch.stream().map(CaseIndexDto::getUuid).collect(Collectors.toList())); + processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.SUCCESS)); } catch (AccessDeniedException e) { - addProcessingStatusToEntities(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } catch (ExternalSurveillanceToolException e) { - //TODO: add all type of exceptions here - addProcessingStatusToEntities(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); - } catch (Exception e) { - //TODO: if other exceptions should be added + processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } return processedCases; @@ -156,7 +153,7 @@ public static void sendCasesToExternalSurveillanceTool( }, null, shouldConfirm, null); } - public static List addProcessingStatusToEntities( + public static List buildProcessedEntitiesListByStatus( Collection entities, ProcessedEntityStatus processedEntityStatus) { List processedEntities = new ArrayList<>(); @@ -183,22 +180,24 @@ public static void sendEventsToExternalSurveillanceTool( Strings.ExternalSurveillanceToolGateway_notificationEntriesSent, null, null, + Strings.headingEntitiesNotSent, null, + Strings.messageCountEntitiesNotSentExternalReason, null, - null, - null, - null, + Strings.messageCountEntitiesNotSentAccessDeniedReason, Strings.ExternalSurveillanceToolGateway_notificationSomeEntriesSent, null, null, - null).doBulkOperation(batch -> { + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List processedEvents = new ArrayList<>(); try { FacadeProvider.getExternalSurveillanceToolFacade() .sendEvents(batch.stream().map(EventIndexDto::getUuid).collect(Collectors.toList())); + processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } catch (ExternalSurveillanceToolException e) { - //TODO: add all type of exceptions here - //return 0; + processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } return processedEvents; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 2b2fe17787e..5de99b32e08 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -404,7 +404,6 @@ public String buildDescription(String ineligibleEntriesDescription, List selectedIneligibleEntries) { String ineligibleEntriesDescription = StringUtils.EMPTY; if (areIneligibleEntriesSelected) { From 8d756e1a7631e2640cfab5668dfb34671c92352b Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 9 Aug 2023 17:24:59 +0300 Subject: [PATCH 027/144] #12257 - Changes for "Cancel follow-up" bulk action --- .../de/symeda/sormas/api/i18n/Strings.java | 9 ++++- .../src/main/resources/strings.properties | 9 ++++- .../sormas/ui/contact/ContactController.java | 38 ++++++++++++------- .../sormas/ui/contact/ContactsView.java | 4 +- .../ui/utils/DeleteRestoreController.java | 2 +- .../ui/utils/PermanentDeleteController.java | 2 +- 6 files changed, 42 insertions(+), 22 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 48eb78322f0..26143db4f73 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -548,6 +548,7 @@ public interface Strings { String headingEditUser = "headingEditUser"; String headingEditVaccination = "headingEditVaccination"; String headingEditVisit = "headingEditVisit"; + String headingEntitiesFollowUpNotCancelled = "headingEntitiesFollowUpNotCancelled"; String headingEntitiesNotArchived = "headingEntitiesNotArchived"; String headingEntitiesNotDearchived = "headingEntitiesNotDearchived"; String headingEntitiesNotSent = "headingEntitiesNotSent"; @@ -740,6 +741,7 @@ public interface Strings { String headingSomeCasesNotRestored = "headingSomeCasesNotRestored"; String headingSomeContactsAlreadyInEvent = "headingSomeContactsAlreadyInEvent"; String headingSomeContactsNotRestored = "headingSomeContactsNotRestored"; + String headingSomeEntitiesFollowUpNotCancelled = "headingSomeEntitiesFollowUpNotCancelled"; String headingSomeEntitiesNotArchived = "headingSomeEntitiesNotArchived"; String headingSomeEntitiesNotDearchived = "headingSomeEntitiesNotDearchived"; String headingSomeEntitiesNotDeleted = "headingSomeEntitiesNotDeleted"; @@ -827,7 +829,7 @@ public interface Strings { String infoBulkProcessFinishedWithIneligibleItems = "infoBulkProcessFinishedWithIneligibleItems"; String infoBulkProcessFinishedWithoutSuccess = "infoBulkProcessFinishedWithoutSuccess"; String infoBulkProcessFinishedWithSkips = "infoBulkProcessFinishedWithSkips"; - String infoBulkProcessFinishedWithSkipsOutsideJurisdiction = "infoBulkProcessFinishedWithSkipsOutsideJurisdiction"; + String infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = "infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible"; String infoBulkProcessNoEligibleEntries = "infoBulkProcessNoEligibleEntries"; String infoBulkUnresponsiveWindowHint = "infoBulkUnresponsiveWindowHint"; String infoCalculateCompleteness = "infoCalculateCompleteness"; @@ -1129,6 +1131,8 @@ public interface Strings { String messageCountContactsNotDeletedAccessDeniedReason = "messageCountContactsNotDeletedAccessDeniedReason"; String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; + String messageCountEntitiesFollowUpNotCancelled = "messageCountEntitiesFollowUpNotCancelled"; + String messageCountEntitiesFollowUpNotCancelledAccessDeniedReason = "messageCountEntitiesFollowUpNotCancelledAccessDeniedReason"; String messageCountEntitiesNotArchivedAccessDeniedReason = "messageCountEntitiesNotArchivedAccessDeniedReason"; String messageCountEntitiesNotDearchivedAccessDeniedReason = "messageCountEntitiesNotDearchivedAccessDeniedReason"; String messageCountEntitiesNotSentAccessDeniedReason = "messageCountEntitiesNotSentAccessDeniedReason"; @@ -1178,6 +1182,7 @@ public interface Strings { String messageDistrictsDearchived = "messageDistrictsDearchived"; String messageDontShareWithReportingToolWarning = "messageDontShareWithReportingToolWarning"; String messageEnterSms = "messageEnterSms"; + String messageEntitiesFollowUpWithWrongStatusNotCancelled = "messageEntitiesFollowUpWithWrongStatusNotCancelled"; String messageEntityNotFound = "messageEntityNotFound"; String messageEntriesEdited = "messageEntriesEdited"; String messageEntriesEditedExceptArchived = "messageEntriesEditedExceptArchived"; @@ -1243,7 +1248,6 @@ public interface Strings { String messageFacilityDearchivingNotPossible = "messageFacilityDearchivingNotPossible"; String messageFacilityMulitChanged = "messageFacilityMulitChanged"; String messageFollowUpCanceled = "messageFollowUpCanceled"; - String messageFollowUpCanceledForSome = "messageFollowUpCanceledForSome"; String messageFollowUpStatusChanged = "messageFollowUpStatusChanged"; String messageFollowUpStatusChangedForSome = "messageFollowUpStatusChangedForSome"; String messageForwardedExternalMessageFound = "messageForwardedExternalMessageFound"; @@ -1292,6 +1296,7 @@ public interface Strings { String messageNoCsvFile = "messageNoCsvFile"; String messageNoDocumentTemplateUploadFile = "messageNoDocumentTemplateUploadFile"; String messageNoDocumentUploadFile = "messageNoDocumentUploadFile"; + String messageNoEligibleEntityForFollowUpCancellation = "messageNoEligibleEntityForFollowUpCancellation"; String messageNoEligibleEventForDeletionSelected = "messageNoEligibleEventForDeletionSelected"; String messageNoEndDate = "messageNoEndDate"; String messageNoEnvironmentsSelected = "messageNoEnvironmentsSelected"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 12f5c39e7ef..464c5709d8a 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -529,6 +529,7 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesFollowUpNotCancelled= None of the follow-ups was cancelled headingEntitiesNotArchived = None of the entities were archived headingEntitiesNotDearchived = None of the entities were dearchived headingEntitiesNotSent = None of the entities were sent @@ -733,6 +734,7 @@ headingNoEventFound = No event found headingEventNotDeleted = Event not deleted headingSomeCasesNotRestored = Some cases were not restored headingSomeContactsNotRestored = Some contacts were not restored +headingSomeEntitiesFollowUpNotCancelled= Some follow-ups was not cancelled headingSomeEntitiesNotArchived= Some entities were not archived headingSomeEntitiesNotDearchived = Some entities were not dearchived headingSomeEntitiesNotDeleted= Some entities were not deleted @@ -1018,7 +1020,7 @@ infoBulkProcessFinished = All selected entries have been processed!
Y infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, because they were not eligible. infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success!
None of the entries were successfully processed! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation! infoBulkProcessCancelled = Bulk process has been cancelled!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1163,6 +1165,8 @@ messageCountContactsNotDeleted = %s contacts not deleted: %s messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned: %s messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s +messageCountEntitiesFollowUpNotCancelled = %s entities' follow-up not cancelled: %s +messageCountEntitiesFollowUpNotCancelledAccessDeniedReason = %s entities' follow-up not cancelled because the entity is not editable anymore or is outside the user's jurisdiction: %s messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data: %s messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure: %s messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights: %s @@ -1191,13 +1195,13 @@ messageCountVisitsNotDeletedAccessDeniedReason =%s visits not deleted because th messageCountEventsNotDeleted = %s events not deleted: %s messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned: %s messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed: %s +messageEntitiesFollowUpWithWrongStatusNotCancelled = Entities' follow-up with CANCELLED or NO FOLLOW-UP status can not be cancelled messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because they were already shared with Sormas to Sormas: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? @@ -1235,6 +1239,7 @@ messageNoCsvFile = You have not selected a file to upload. Please select a .csv messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleEntityForFollowUpCancellation = None of the follow-ups are eligible for cancellation messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index eeb1d0bed3f..ef03a9c66db 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -838,22 +838,30 @@ public void cancelFollowUpOfAllSelectedItems( if (Boolean.TRUE.equals(confirmed)) { String userName = UserProvider.getCurrent().getUserName(); - //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, - //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + Collection ineligibleContacts = selectedRows.stream() + .filter( + row -> row.getFollowUpStatus().equals(FollowUpStatus.CANCELED) + || row.getFollowUpStatus().equals(FollowUpStatus.NO_FOLLOW_UP)) + .collect(Collectors.toList()); + + Collection eligibleContacts = ineligibleContacts.size() > 0 + ? selectedRows.stream().filter(row -> !ineligibleContacts.contains(row)).collect(Collectors.toCollection(ArrayList::new)) + : selectedRows; new BulkOperationHandler( Strings.messageFollowUpCanceled, + Strings.messageEntitiesFollowUpWithWrongStatusNotCancelled, + Strings.headingSomeEntitiesFollowUpNotCancelled, + Strings.headingEntitiesFollowUpNotCancelled, + Strings.messageCountEntitiesFollowUpNotCancelled, null, null, + Strings.messageCountEntitiesFollowUpNotCancelledAccessDeniedReason, null, - Strings.messageFollowUpCanceledForSome, - null, - null, - null, - null, - null, - null, - null).doBulkOperation(batch -> { + Strings.messageNoEligibleEntityForFollowUpCancellation, + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List processedContacts = new ArrayList<>(); for (ContactIndexDto contact : batch) { @@ -873,21 +881,23 @@ public void cancelFollowUpOfAllSelectedItems( "The follow up of the contact with uuid {} could not be cancelled due to an AccessDeniedException", contact.getUuid(), e); + //TODO: add to other controller where is missing } catch (Exception e) { - //TODO: analyze the save and add all type of exceptions processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error( "The follow up of the contact with uuid {} could not be cancelled due to an Exception", contact.getUuid(), e); } - } else { - processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } } return processedContacts; - }, new ArrayList<>(selectedRows), null, null, bulkOperationCallback(caseUuid, contactGrid, null)); + }, + new ArrayList<>(selectedRows), + new ArrayList<>(eligibleContacts), + new ArrayList<>(ineligibleContacts), + bulkOperationCallback(caseUuid, contactGrid, null)); } }); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java index 06fdd357765..fbb9684c9a3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java @@ -525,14 +525,14 @@ public HorizontalLayout createStatusFilterBar() { mi -> grid.bulkActionHandler( items -> ControllerProvider.getContactController() .cancelFollowUpOfAllSelectedItems(items, null, (AbstractContactGrid) grid)), - hasBulkOperationsRight), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EDIT)), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.bulkLostToFollowUp), VaadinIcons.UNLINK, mi -> grid.bulkActionHandler( items -> ControllerProvider.getContactController() .setAllSelectedItemsToLostToFollowUp(items, null, (AbstractContactGrid) grid)), - hasBulkOperationsRight), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EDIT)), criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED ? new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.bulkDelete), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index 2743168c30b..15e73965e10 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -138,7 +138,7 @@ private BulkOperationHandler createBulkOperationHandler(I forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedAccessDeniedReason() : null, forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeleted() : deleteRestoreMessages.getMessageEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageNoEligibleEntitySelected() : null, - Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction, + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index ae6ba14ad1c..b30a5ba7c2e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -99,7 +99,7 @@ private BulkOperationHandler createBulkOperationHandler(I deleteRestoreMessages.getMessageCountEntitiesNotDeletedAccessDeniedReason(), deleteRestoreMessages.getMessageEntitiesNotDeleted(), null, - Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdiction, + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess); } From 19471619da0c7b2d1bcf9b6d463d566ea6b1b80d Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 10 Aug 2023 15:33:52 +0300 Subject: [PATCH 028/144] #12257 - Contacts follow-up set to lost --- .../de/symeda/sormas/api/i18n/Strings.java | 19 ++- .../src/main/resources/strings.properties | 19 ++- .../sormas/ui/contact/ContactController.java | 143 ++++++++---------- .../sormas/ui/utils/ArchiveMessages.java | 1 - 4 files changed, 88 insertions(+), 94 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 26143db4f73..9dacc93f92a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -548,7 +548,6 @@ public interface Strings { String headingEditUser = "headingEditUser"; String headingEditVaccination = "headingEditVaccination"; String headingEditVisit = "headingEditVisit"; - String headingEntitiesFollowUpNotCancelled = "headingEntitiesFollowUpNotCancelled"; String headingEntitiesNotArchived = "headingEntitiesNotArchived"; String headingEntitiesNotDearchived = "headingEntitiesNotDearchived"; String headingEntitiesNotSent = "headingEntitiesNotSent"; @@ -590,6 +589,8 @@ public interface Strings { String headingFetchExternalMessages = "headingFetchExternalMessages"; String headingFileExists = "headingFileExists"; String headingFilters = "headingFilters"; + String headingFollowUpsNotCancelled = "headingFollowUpsNotCancelled"; + String headingFollowUpsNotSetToLost = "headingFollowUpsNotSetToLost"; String headingFollowUpStatus = "headingFollowUpStatus"; String headingGenerateCases = "headingGenerateCases"; String headingGenerateContacts = "headingGenerateContacts"; @@ -741,12 +742,13 @@ public interface Strings { String headingSomeCasesNotRestored = "headingSomeCasesNotRestored"; String headingSomeContactsAlreadyInEvent = "headingSomeContactsAlreadyInEvent"; String headingSomeContactsNotRestored = "headingSomeContactsNotRestored"; - String headingSomeEntitiesFollowUpNotCancelled = "headingSomeEntitiesFollowUpNotCancelled"; String headingSomeEntitiesNotArchived = "headingSomeEntitiesNotArchived"; String headingSomeEntitiesNotDearchived = "headingSomeEntitiesNotDearchived"; String headingSomeEntitiesNotDeleted = "headingSomeEntitiesNotDeleted"; String headingSomeEventParticipantsNotRestored = "headingSomeEventParticipantsNotRestored"; String headingSomeEventsNotRestored = "headingSomeEventsNotRestored"; + String headingSomeFollowUpsNotCancelled = "headingSomeFollowUpsNotCancelled"; + String headingSomeFollowUpsNotSetToLost = "headingSomeFollowUpsNotSetToLost"; String headingSomeImmunizationsNotRestored = "headingSomeImmunizationsNotRestored"; String headingSomeSamplesNotRestored = "headingSomeSamplesNotRestored"; String headingSomeTravelEntriesNotRestored = "headingSomeTravelEntriesNotRestored"; @@ -1131,8 +1133,6 @@ public interface Strings { String messageCountContactsNotDeletedAccessDeniedReason = "messageCountContactsNotDeletedAccessDeniedReason"; String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; - String messageCountEntitiesFollowUpNotCancelled = "messageCountEntitiesFollowUpNotCancelled"; - String messageCountEntitiesFollowUpNotCancelledAccessDeniedReason = "messageCountEntitiesFollowUpNotCancelledAccessDeniedReason"; String messageCountEntitiesNotArchivedAccessDeniedReason = "messageCountEntitiesNotArchivedAccessDeniedReason"; String messageCountEntitiesNotDearchivedAccessDeniedReason = "messageCountEntitiesNotDearchivedAccessDeniedReason"; String messageCountEntitiesNotSentAccessDeniedReason = "messageCountEntitiesNotSentAccessDeniedReason"; @@ -1148,6 +1148,10 @@ public interface Strings { String messageCountEventsNotDeletedSormasToSormasReason = "messageCountEventsNotDeletedSormasToSormasReason"; String messageCountEventsNotRestored = "messageCountEventsNotRestored"; String messageCountExternalMessagesNotDeleted = "messageCountExternalMessagesNotDeleted"; + String messageCountFollowUpsNotCancelled = "messageCountFollowUpsNotCancelled"; + String messageCountFollowUpsNotCancelledAccessDeniedReason = "messageCountFollowUpsNotCancelledAccessDeniedReason"; + String messageCountFollowUpsNotSetToLost = "messageCountFollowUpsNotSetToLost"; + String messageCountFollowUpsNotSetToLostAccessDeniedReason = "messageCountFollowUpsNotSetToLostAccessDeniedReason"; String messageCountImmunizationsNotDeleted = "messageCountImmunizationsNotDeleted"; String messageCountImmunizationsNotDeletedAccessDeniedReason = "messageCountImmunizationsNotDeletedAccessDeniedReason"; String messageCountImmunizationsNotRestored = "messageCountImmunizationsNotRestored"; @@ -1182,7 +1186,6 @@ public interface Strings { String messageDistrictsDearchived = "messageDistrictsDearchived"; String messageDontShareWithReportingToolWarning = "messageDontShareWithReportingToolWarning"; String messageEnterSms = "messageEnterSms"; - String messageEntitiesFollowUpWithWrongStatusNotCancelled = "messageEntitiesFollowUpWithWrongStatusNotCancelled"; String messageEntityNotFound = "messageEntityNotFound"; String messageEntriesEdited = "messageEntriesEdited"; String messageEntriesEditedExceptArchived = "messageEntriesEditedExceptArchived"; @@ -1249,7 +1252,8 @@ public interface Strings { String messageFacilityMulitChanged = "messageFacilityMulitChanged"; String messageFollowUpCanceled = "messageFollowUpCanceled"; String messageFollowUpStatusChanged = "messageFollowUpStatusChanged"; - String messageFollowUpStatusChangedForSome = "messageFollowUpStatusChangedForSome"; + String messageFollowUpsWithWrongStatusNotCancelled = "messageFollowUpsWithWrongStatusNotCancelled"; + String messageFollowUpsWithWrongStatusNotSetToLost = "messageFollowUpsWithWrongStatusNotSetToLost"; String messageForwardedExternalMessageFound = "messageForwardedExternalMessageFound"; String messageGdpr = "messageGdpr"; String messageGdprCheck = "messageGdprCheck"; @@ -1296,8 +1300,9 @@ public interface Strings { String messageNoCsvFile = "messageNoCsvFile"; String messageNoDocumentTemplateUploadFile = "messageNoDocumentTemplateUploadFile"; String messageNoDocumentUploadFile = "messageNoDocumentUploadFile"; - String messageNoEligibleEntityForFollowUpCancellation = "messageNoEligibleEntityForFollowUpCancellation"; String messageNoEligibleEventForDeletionSelected = "messageNoEligibleEventForDeletionSelected"; + String messageNoEligibleFollowUpForCancellation = "messageNoEligibleFollowUpForCancellation"; + String messageNoEligibleFollowUpForSettingToLost = "messageNoEligibleFollowUpForSettingToLost"; String messageNoEndDate = "messageNoEndDate"; String messageNoEnvironmentsSelected = "messageNoEnvironmentsSelected"; String messageNoEventFound = "messageNoEventFound"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 464c5709d8a..706ad2c65b9 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -529,7 +529,8 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent -headingEntitiesFollowUpNotCancelled= None of the follow-ups was cancelled +headingFollowUpsNotCancelled= None of the follow-ups were cancelled +headingFollowUpsNotSetToLost= None of the follow-ups were set to lost headingEntitiesNotArchived = None of the entities were archived headingEntitiesNotDearchived = None of the entities were dearchived headingEntitiesNotSent = None of the entities were sent @@ -734,7 +735,8 @@ headingNoEventFound = No event found headingEventNotDeleted = Event not deleted headingSomeCasesNotRestored = Some cases were not restored headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEntitiesFollowUpNotCancelled= Some follow-ups was not cancelled +headingSomeFollowUpsNotCancelled= Some follow-ups were not cancelled +headingSomeFollowUpsNotSetToLost= Some follow-ups were not set to lost headingSomeEntitiesNotArchived= Some entities were not archived headingSomeEntitiesNotDearchived = Some entities were not dearchived headingSomeEntitiesNotDeleted= Some entities were not deleted @@ -1165,8 +1167,10 @@ messageCountContactsNotDeleted = %s contacts not deleted: %s messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned: %s messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s -messageCountEntitiesFollowUpNotCancelled = %s entities' follow-up not cancelled: %s -messageCountEntitiesFollowUpNotCancelledAccessDeniedReason = %s entities' follow-up not cancelled because the entity is not editable anymore or is outside the user's jurisdiction: %s +messageCountFollowUpsNotCancelled = %s contacts' follow-up not cancelled: %s +messageCountFollowUpsNotCancelledAccessDeniedReason = %s contacts' follow-up not cancelled because the contact is not editable anymore or is outside the user's jurisdiction: %s +messageCountFollowUpsNotSetToLost = %s contacts' follow-up not set to lost: %s +messageCountFollowUpsNotSetToLostAccessDeniedReason = %s contacts' follow-up not set to lost: %s messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data: %s messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure: %s messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights: %s @@ -1195,7 +1199,8 @@ messageCountVisitsNotDeletedAccessDeniedReason =%s visits not deleted because th messageCountEventsNotDeleted = %s events not deleted: %s messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned: %s messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed: %s -messageEntitiesFollowUpWithWrongStatusNotCancelled = Entities' follow-up with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageFollowUpsWithWrongStatusNotCancelled = Contacts' follow-up with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageFollowUpsWithWrongStatusNotSetToLost = Contacts' follow-up with NO FOLLOW-UP status can not be set to lost messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because they were already shared with Sormas to Sormas: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. @@ -1203,7 +1208,6 @@ messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1239,7 +1243,8 @@ messageNoCsvFile = You have not selected a file to upload. Please select a .csv messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion -messageNoEligibleEntityForFollowUpCancellation = None of the follow-ups are eligible for cancellation +messageNoEligibleFollowUpForCancellation = None of the follow-ups were eligible for cancellation +messageNoEligibleFollowUpForSettingToLost = None of the follow-ups were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index ef03a9c66db..ed148a38291 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -816,8 +816,8 @@ public void restoreSelectedContacts(Collection select .restoreSelectedItems(selectedRows, DeleteRestoreHandlers.forContact(), bulkOperationCallback(null, contactGrid, null)); } - public void cancelFollowUpOfAllSelectedItems( - Collection selectedRows, + public void cancelFollowUpOfAllSelectedItems( + Collection selectedRows, String caseUuid, AbstractContactGrid contactGrid) { @@ -838,28 +838,23 @@ public void cancelFollowUpOfAllSelectedItems( if (Boolean.TRUE.equals(confirmed)) { String userName = UserProvider.getCurrent().getUserName(); - //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty - Collection ineligibleContacts = selectedRows.stream() - .filter( - row -> row.getFollowUpStatus().equals(FollowUpStatus.CANCELED) - || row.getFollowUpStatus().equals(FollowUpStatus.NO_FOLLOW_UP)) - .collect(Collectors.toList()); - - Collection eligibleContacts = ineligibleContacts.size() > 0 - ? selectedRows.stream().filter(row -> !ineligibleContacts.contains(row)).collect(Collectors.toCollection(ArrayList::new)) - : selectedRows; + List ineligibleStatuses = new ArrayList<>(); + ineligibleStatuses.add(FollowUpStatus.NO_FOLLOW_UP); + ineligibleStatuses.add(FollowUpStatus.CANCELED); + Collection ineligibleContacts = getIneligibleContacts(selectedRows, ineligibleStatuses); + Collection eligibleContacts = getEligibleContacts(selectedRows, ineligibleContacts); new BulkOperationHandler( Strings.messageFollowUpCanceled, - Strings.messageEntitiesFollowUpWithWrongStatusNotCancelled, - Strings.headingSomeEntitiesFollowUpNotCancelled, - Strings.headingEntitiesFollowUpNotCancelled, - Strings.messageCountEntitiesFollowUpNotCancelled, + Strings.messageFollowUpsWithWrongStatusNotCancelled, + Strings.headingSomeFollowUpsNotCancelled, + Strings.headingFollowUpsNotCancelled, + Strings.messageCountFollowUpsNotCancelled, null, null, - Strings.messageCountEntitiesFollowUpNotCancelledAccessDeniedReason, + Strings.messageCountFollowUpsNotCancelledAccessDeniedReason, null, - Strings.messageNoEligibleEntityForFollowUpCancellation, + Strings.messageNoEligibleFollowUpForCancellation, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List processedContacts = new ArrayList<>(); @@ -867,31 +862,9 @@ public void cancelFollowUpOfAllSelectedItems( for (ContactIndexDto contact : batch) { if (!FollowUpStatus.NO_FOLLOW_UP.equals(contact.getFollowUpStatus()) && !FollowUpStatus.CANCELED.equals(contact.getFollowUpStatus())) { - - ContactDto contactDto = FacadeProvider.getContactFacade().getByUuid(contact.getUuid()); - contactDto.setFollowUpStatus(FollowUpStatus.CANCELED); - contactDto.addToFollowUpComment(String.format(I18nProperties.getString(Strings.infoCanceledBy), userName)); - try { - FacadeProvider.getContactFacade().save(contactDto); - processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedContacts - .add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - logger.error( - "The follow up of the contact with uuid {} could not be cancelled due to an AccessDeniedException", - contact.getUuid(), - e); - //TODO: add to other controller where is missing - } catch (Exception e) { - processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - logger.error( - "The follow up of the contact with uuid {} could not be cancelled due to an Exception", - contact.getUuid(), - e); - } + processedContacts.add(processContact(contact, FollowUpStatus.CANCELED, Strings.infoCanceledBy, userName)); } } - return processedContacts; }, new ArrayList<>(selectedRows), @@ -903,8 +876,8 @@ public void cancelFollowUpOfAllSelectedItems( } } - public void setAllSelectedItemsToLostToFollowUp( - Collection selectedRows, + public void setAllSelectedItemsToLostToFollowUp( + Collection selectedRows, String caseUuid, AbstractContactGrid contactGrid) { if (selectedRows.isEmpty()) { @@ -924,59 +897,71 @@ public void setAllSelectedItemsToLostToFollowUp( if (Boolean.TRUE.equals(confirmed)) { String userName = UserProvider.getCurrent().getUserName(); - //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, - // countEntriesNotProcessedSormastoSormasReasonProperty,countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + List ineligibleStatuses = new ArrayList<>(); + ineligibleStatuses.add(FollowUpStatus.NO_FOLLOW_UP); + Collection ineligibleContacts = getIneligibleContacts(selectedRows, ineligibleStatuses); + Collection eligibleContacts = getEligibleContacts(selectedRows, ineligibleContacts); + new BulkOperationHandler( Strings.messageFollowUpStatusChanged, + Strings.messageFollowUpsWithWrongStatusNotSetToLost, + Strings.headingSomeFollowUpsNotSetToLost, + Strings.headingFollowUpsNotSetToLost, + Strings.messageCountFollowUpsNotSetToLost, null, null, + Strings.messageCountFollowUpsNotSetToLostAccessDeniedReason, null, - null, - null, - null, - null, - Strings.messageFollowUpStatusChangedForSome, - null, - null, - null).doBulkOperation(batch -> { + Strings.messageNoEligibleFollowUpForSettingToLost, + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List processedContacts = new ArrayList<>(); for (ContactIndexDto contact : batch) { if (contact.getFollowUpStatus() != FollowUpStatus.NO_FOLLOW_UP) { - ContactDto contactDto = FacadeProvider.getContactFacade().getByUuid(contact.getUuid()); - contactDto.setFollowUpStatus(FollowUpStatus.LOST); - contactDto - .addToFollowUpComment(String.format(I18nProperties.getString(Strings.infoLostToFollowUpBy), userName)); - try { - FacadeProvider.getContactFacade().save(contactDto); - processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedContacts - .add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - logger.error( - "The follow up status of contact with uuid {} could not be set due to an AccessDeniedException", - contact.getUuid(), - e); - } catch (Exception e) { - processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - logger.error( - "TThe follow up status of contact with uuid {} could not be set due to an Exception", - contact.getUuid(), - e); - } - } else { - //TODO: check this part - processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); + processedContacts.add(processContact(contact, FollowUpStatus.LOST, Strings.infoLostToFollowUpBy, userName)); } } return processedContacts; - - }, new ArrayList<>(selectedRows), null, null, bulkOperationCallback(caseUuid, contactGrid, null)); + }, + new ArrayList<>(selectedRows), + new ArrayList<>(eligibleContacts), + new ArrayList<>(ineligibleContacts), + bulkOperationCallback(caseUuid, contactGrid, null)); } }); } } + public ProcessedEntity processContact(ContactIndexDto contact, FollowUpStatus followUpStatus, String followUpComment, String userName) { + + ProcessedEntity processedContact; + ContactDto contactDto = FacadeProvider.getContactFacade().getByUuid(contact.getUuid()); + contactDto.setFollowUpStatus(followUpStatus); + contactDto.addToFollowUpComment(String.format(I18nProperties.getString(followUpComment), userName)); + try { + FacadeProvider.getContactFacade().save(contactDto); + processedContact = new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.SUCCESS); + } catch (AccessDeniedException e) { + processedContact = new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + logger.error("The follow up status of contact with uuid {} could not be set due to an AccessDeniedException", contact.getUuid(), e); + } catch (Exception e) { + processedContact = new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE); + logger.error("The follow up status of contact with uuid {} could not be set due to an Exception", contact.getUuid(), e); + } + return processedContact; + } + + public Collection getIneligibleContacts(Collection selectedRows, List ineligibleStatuses) { + return selectedRows.stream().filter(row -> ineligibleStatuses.contains(row.getFollowUpStatus())).collect(Collectors.toList()); + } + + public Collection getEligibleContacts(Collection selectedRows, Collection ineligibleContacts) { + return ineligibleContacts.size() > 0 + ? selectedRows.stream().filter(row -> !ineligibleContacts.contains(row)).collect(Collectors.toCollection(ArrayList::new)) + : selectedRows; + } + public void openSelectCaseForContactWindow(Disease disease, Consumer selectedCaseCallback) { CaseSelectionField selectionField = new CaseSelectionField(disease); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index d1a8b4ce23b..dda1fad8463 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -139,7 +139,6 @@ public enum ArchiveMessages { null, null), - //TODO: add for infrastructure data for accessDenied message the I18nProperties.getString(dearchivingNotPossibleMessageProperty) label CONTINENT(Strings.headingConfirmArchiving, Strings.confirmationArchiveContinent, Strings.confirmationArchiveContinents, From a2f905637b83b877022cf89d8e8449868c26a985 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 10 Aug 2023 16:40:44 +0300 Subject: [PATCH 029/144] #12257 - Add missing messages + fixes --- .../main/java/de/symeda/sormas/api/i18n/Strings.java | 3 +++ sormas-api/src/main/resources/strings.properties | 3 +++ .../ExternalSurveillanceServiceGateway.java | 10 ++++++++-- .../de/symeda/sormas/ui/utils/ArchiveMessages.java | 11 ++++++++++- .../symeda/sormas/ui/utils/ArchivingController.java | 3 +-- .../symeda/sormas/ui/utils/BulkOperationHandler.java | 5 ----- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 9dacc93f92a..c58b606a7d4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1133,8 +1133,11 @@ public interface Strings { String messageCountContactsNotDeletedAccessDeniedReason = "messageCountContactsNotDeletedAccessDeniedReason"; String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; + String messageCountEntitiesNotArchived = "messageCountEntitiesNotArchived"; String messageCountEntitiesNotArchivedAccessDeniedReason = "messageCountEntitiesNotArchivedAccessDeniedReason"; + String messageCountEntitiesNotDearchived = "messageCountEntitiesNotDearchived"; String messageCountEntitiesNotDearchivedAccessDeniedReason = "messageCountEntitiesNotDearchivedAccessDeniedReason"; + String messageCountEntitiesNotSent = "messageCountEntitiesNotSent"; String messageCountEntitiesNotSentAccessDeniedReason = "messageCountEntitiesNotSentAccessDeniedReason"; String messageCountEntitiesNotSentExternalReason = "messageCountEntitiesNotSentExternalReason"; String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 706ad2c65b9..bb01bf610cc 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1171,8 +1171,11 @@ messageCountFollowUpsNotCancelled = %s contacts' follow-up not cancelled: %s messageCountFollowUpsNotCancelledAccessDeniedReason = %s contacts' follow-up not cancelled because the contact is not editable anymore or is outside the user's jurisdiction: %s messageCountFollowUpsNotSetToLost = %s contacts' follow-up not set to lost: %s messageCountFollowUpsNotSetToLostAccessDeniedReason = %s contacts' follow-up not set to lost: %s +messageCountEntitiesNotArchived = %s entities can not be archived: %s messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived: %s messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool: %s messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights: %s messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed: %s messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed: %s diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java index ba5965dea63..3beb591ebff 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java @@ -145,6 +145,8 @@ public static void sendCasesToExternalSurveillanceTool( processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } catch (ExternalSurveillanceToolException e) { processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } catch (Exception e) { + processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.INTERNAL_FAILURE)); } return processedCases; @@ -163,8 +165,10 @@ public static List buildPro if (processedEntityStatus.equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE)) { logger.error("The selected entities could not be sent to the External Surveillance Tool due to an AccessDeniedException"); - } else { + } else if (processedEntityStatus.equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE)) { logger.error("The selected entities could not be sent to the External Surveillance Tool due to an ExternalSurveillanceToolException"); + } else { + logger.error("The selected entities could not be sent to the External Surveillance Tool due to an Exception"); } return processedEntities; @@ -181,7 +185,7 @@ public static void sendEventsToExternalSurveillanceTool( null, null, Strings.headingEntitiesNotSent, - null, + Strings.messageCountEntitiesNotSent, Strings.messageCountEntitiesNotSentExternalReason, null, Strings.messageCountEntitiesNotSentAccessDeniedReason, @@ -198,6 +202,8 @@ public static void sendEventsToExternalSurveillanceTool( processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } catch (ExternalSurveillanceToolException e) { processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } catch (Exception e) { + processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.INTERNAL_FAILURE)); } return processedEvents; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index dda1fad8463..2785c19c0de 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -296,7 +296,8 @@ public enum ArchiveMessages { private final String messageSomeEntitiesArchived = Strings.messageSomeEntitiesArchived; private final String messageAllEntitiesDearchived = Strings.messageAllEntitiesDearchived; private final String messageSomeEntitiesDearchived = Strings.messageSomeEntitiesDearchived; - + private final String messageCountEntitiesNotArchived = Strings.messageCountEntitiesNotArchived; + private final String messageCountEntitiesNotDearchived = Strings.messageCountEntitiesNotDearchived; private final String headingSomeEntitiesNotArchived = Strings.headingSomeEntitiesNotArchived; private final String headingEntitiesNotArchived = Strings.headingEntitiesNotArchived; private final String headingSomeEntitiesNotDearchived = Strings.headingSomeEntitiesNotDearchived; @@ -389,6 +390,14 @@ public String getMessageCountEntitiesNotDearchivedAccessDeniedReason() { return messageCountEntitiesNotDearchivedAccessDeniedReason; } + public String getMessageCountEntitiesNotArchived() { + return messageCountEntitiesNotArchived; + } + + public String getMessageCountEntitiesNotDearchived() { + return messageCountEntitiesNotDearchived; + } + public String getHeadingConfirmationArchiving() { return headingConfirmationArchiving; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index 99d2c93d4db..beb7f94459a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -214,7 +214,6 @@ this. createBulkOperationHandler(archiveHandler, true) } } - private BulkOperationHandler createBulkOperationHandler(IArchiveHandler archiveHandler, boolean forArchive) { ArchiveMessages archiveMessages = archiveHandler.getArchiveMessages(); return new BulkOperationHandler<>( @@ -222,7 +221,7 @@ private BulkOperationHandler createBulkOperationHandler(I null, forArchive ? archiveMessages.getHeadingSomeEntitiesNotArchived() : archiveMessages.getHeadingSomeEntitiesNotDearchived(), forArchive ? archiveMessages.getHeadingEntitiesNotArchived() : archiveMessages.getHeadingEntitiesNotDearchived(), - null, + forArchive ? archiveMessages.getMessageCountEntitiesNotArchived() : archiveMessages.getMessageCountEntitiesNotDearchived(), forArchive ? archiveMessages.getMessageCountEntitiesNotArchivedExternalReason() : archiveMessages.getMessageCountEntitiesNotDearchivedExternalReason(), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 5de99b32e08..99ebb259223 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -71,19 +71,14 @@ public BulkOperationHandler( String allEntriesProcessedMessageProperty, String ineligibleEntriesNotProcessedMessageProperty, String headingSomeEntitiesNotProcessed, - //not added String headingNoProcessedEntities, - String countEntriesNotProcessedMessageProperty, - //Not added String countEntriesNotProcessedExternalReasonProperty, String countEntriesNotProcessedSormasToSormasReasonProperty, String countEntriesNotProcessedAccessDeniedReasonProperty, - String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, String infoBulkProcessFinishedWithSkipsProperty, - //Not added String infoBulkProcessFinishedWithoutSuccess) { this.allEntriesProcessedMessageProperty = allEntriesProcessedMessageProperty; From 49639c039eb8f0535def18cf680baa450ba34fb0 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 11 Aug 2023 15:46:34 +0300 Subject: [PATCH 030/144] #12257 - bulk actions in CaseContactsView should appear based on rights --- .../java/de/symeda/sormas/ui/caze/CaseContactsView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java index da68a1f2d59..392992c7036 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java @@ -252,19 +252,19 @@ public HorizontalLayout createStatusFilterBar() { new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkEdit), VaadinIcons.ELLIPSIS_H, selectedItem -> { ControllerProvider.getContactController() .showBulkContactDataEditComponent(grid.asMultiSelect().getSelectedItems(), getCaseRef().getUuid(), grid); - }), + }, UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EDIT)), new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkCancelFollowUp), VaadinIcons.CLOSE, selectedItem -> { ControllerProvider.getContactController() .cancelFollowUpOfAllSelectedItems(grid.asMultiSelect().getSelectedItems(), getCaseRef().getUuid(), grid); - }), + }, UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EDIT)), new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkLostToFollowUp), VaadinIcons.UNLINK, selectedItem -> { ControllerProvider.getContactController() .setAllSelectedItemsToLostToFollowUp(grid.asMultiSelect().getSelectedItems(), getCaseRef().getUuid(), grid); - }), + }, UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EDIT)), new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, selectedItem -> { ControllerProvider.getContactController() .deleteAllSelectedItems(grid.asMultiSelect().getSelectedItems(), (AbstractContactGrid) grid); - })); + }, UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE))); statusFilterLayout.addComponent(bulkOperationsDropdown); statusFilterLayout.setComponentAlignment(bulkOperationsDropdown, Alignment.TOP_RIGHT); From a6c5cf49806e71e8496ebe9be9b5fb15b0e36c14 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 11 Aug 2023 16:25:10 +0300 Subject: [PATCH 031/144] #12257 - changes for bulk editing --- .../java/de/symeda/sormas/api/CoreFacade.java | 6 ++++++ .../de/symeda/sormas/api/i18n/Strings.java | 5 +++++ .../src/main/resources/strings.properties | 7 ++++++- .../sormas/backend/caze/CaseFacadeEjb.java | 19 +++++++------------ .../backend/common/AbstractCoreFacadeEjb.java | 17 +++++++++++++++++ .../backend/contact/ContactFacadeEjb.java | 2 -- .../sormas/backend/event/EventFacadeEjb.java | 13 +++++++++---- .../sormas/backend/task/TaskFacadeEjb.java | 14 ++++++-------- .../symeda/sormas/ui/caze/CaseController.java | 11 +++++++---- .../de/symeda/sormas/ui/caze/CasesView.java | 2 +- .../sormas/ui/contact/ContactController.java | 11 +++++++---- .../sormas/ui/contact/ContactsView.java | 2 +- .../sormas/ui/events/EventController.java | 7 +++++-- .../sormas/ui/utils/BulkOperationHandler.java | 11 +++++------ 14 files changed, 82 insertions(+), 45 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java index bdccf08333c..6e55f424155 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java @@ -16,12 +16,14 @@ package de.symeda.sormas.api; import java.io.Serializable; +import java.util.Collection; import java.util.Date; import java.util.List; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; +import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; public interface CoreFacade extends BaseFacade, EditPermissionFacade, DeletableFacade { @@ -45,4 +47,8 @@ public interface CoreFacade buildProcessedEntities(List entityUuids, boolean archiving); Date calculateEndOfProcessingDate(String entityUuids); + + Collection getIneligibleEntitiesForEditing(Collection selectedEntities); + + Collection getEligibleEntitiesForEditing(Collection selectedCases, Collection ineligibleCases); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index c58b606a7d4..96c4c03969b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -550,6 +550,7 @@ public interface Strings { String headingEditVisit = "headingEditVisit"; String headingEntitiesNotArchived = "headingEntitiesNotArchived"; String headingEntitiesNotDearchived = "headingEntitiesNotDearchived"; + String headingEntitiesNotEdited = "headingEntitiesNotEdited"; String headingEntitiesNotSent = "headingEntitiesNotSent"; String headingEnvironmentalExposure = "headingEnvironmentalExposure"; String headingEpiCurve = "headingEpiCurve"; @@ -745,6 +746,7 @@ public interface Strings { String headingSomeEntitiesNotArchived = "headingSomeEntitiesNotArchived"; String headingSomeEntitiesNotDearchived = "headingSomeEntitiesNotDearchived"; String headingSomeEntitiesNotDeleted = "headingSomeEntitiesNotDeleted"; + String headingSomeEntitiesNotEdited = "headingSomeEntitiesNotEdited"; String headingSomeEventParticipantsNotRestored = "headingSomeEventParticipantsNotRestored"; String headingSomeEventsNotRestored = "headingSomeEventsNotRestored"; String headingSomeFollowUpsNotCancelled = "headingSomeFollowUpsNotCancelled"; @@ -1137,6 +1139,8 @@ public interface Strings { String messageCountEntitiesNotArchivedAccessDeniedReason = "messageCountEntitiesNotArchivedAccessDeniedReason"; String messageCountEntitiesNotDearchived = "messageCountEntitiesNotDearchived"; String messageCountEntitiesNotDearchivedAccessDeniedReason = "messageCountEntitiesNotDearchivedAccessDeniedReason"; + String messageCountEntitiesNotEdited = "messageCountEntitiesNotEdited"; + String messageCountEntitiesNotEditedAccessDeniedReason = "messageCountEntitiesNotEditedAccessDeniedReason"; String messageCountEntitiesNotSent = "messageCountEntitiesNotSent"; String messageCountEntitiesNotSentAccessDeniedReason = "messageCountEntitiesNotSentAccessDeniedReason"; String messageCountEntitiesNotSentExternalReason = "messageCountEntitiesNotSentExternalReason"; @@ -1189,6 +1193,7 @@ public interface Strings { String messageDistrictsDearchived = "messageDistrictsDearchived"; String messageDontShareWithReportingToolWarning = "messageDontShareWithReportingToolWarning"; String messageEnterSms = "messageEnterSms"; + String messageEntitiesNotEditable = "messageEntitiesNotEditable"; String messageEntityNotFound = "messageEntityNotFound"; String messageEntriesEdited = "messageEntriesEdited"; String messageEntriesEditedExceptArchived = "messageEntriesEditedExceptArchived"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index bb01bf610cc..34ad08e7430 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -533,6 +533,7 @@ headingFollowUpsNotCancelled= None of the follow-ups were cancelled headingFollowUpsNotSetToLost= None of the follow-ups were set to lost headingEntitiesNotArchived = None of the entities were archived headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve @@ -740,6 +741,7 @@ headingSomeFollowUpsNotSetToLost= Some follow-ups were not set to lost headingSomeEntitiesNotArchived= Some entities were not archived headingSomeEntitiesNotDearchived = Some entities were not dearchived headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited headingSomeEventsNotRestored = Some events were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored @@ -1170,11 +1172,13 @@ messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not messageCountFollowUpsNotCancelled = %s contacts' follow-up not cancelled: %s messageCountFollowUpsNotCancelledAccessDeniedReason = %s contacts' follow-up not cancelled because the contact is not editable anymore or is outside the user's jurisdiction: %s messageCountFollowUpsNotSetToLost = %s contacts' follow-up not set to lost: %s -messageCountFollowUpsNotSetToLostAccessDeniedReason = %s contacts' follow-up not set to lost: %s +messageCountFollowUpsNotSetToLostAccessDeniedReason = %s contacts' follow-up not set to lost because the contact is not editable anymore or is outside the user's jurisdiction: %s messageCountEntitiesNotArchived = %s entities can not be archived: %s messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data: %s messageCountEntitiesNotDearchived = %s entities can not be dearchived: %s messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore: %s messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool: %s messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights: %s messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed: %s @@ -1428,6 +1432,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 4df35605ac4..abeb3f9629c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -1537,8 +1537,6 @@ public List saveBulkCase( throws ValidationRuntimeException { List processedCases = new ArrayList<>(); - - int changedCases = 0; for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); @@ -1555,10 +1553,8 @@ public List saveBulkCase( surveillanceOfficerChange); doSave(caze, true, existingCaseDto, true); processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); - changedCases++; } } - //return changedCases; return processedCases; } @@ -1585,7 +1581,6 @@ public List saveBulkEditWithFacilities( updatedCaseBulkEditData.getCommunity() != null ? communityService.getByUuid(updatedCaseBulkEditData.getCommunity().getUuid()) : null; Facility newFacility = facilityService.getByUuid(updatedCaseBulkEditData.getHealthFacility().getUuid()); - int changedCases = 0; for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); @@ -1607,16 +1602,16 @@ public List saveBulkEditWithFacilities( caze.setFacilityType(updatedCaseBulkEditData.getFacilityType()); caze.setHealthFacility(newFacility); caze.setHealthFacilityDetails(updatedCaseBulkEditData.getHealthFacilityDetails()); - CaseLogic.handleHospitalization(toDto(caze), existingCaseDto, doTransfer); - - doSave(caze, true, existingCaseDto, true); - processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); - - changedCases++; + try { + CaseLogic.handleHospitalization(toDto(caze), existingCaseDto, doTransfer); + doSave(caze, true, existingCaseDto, true); + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); + } catch (Exception e) { + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + } } } - //return changedCases; return processedCases; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index db5340f2ce8..0afe83264ca 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -16,9 +16,12 @@ package de.symeda.sormas.backend.common; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.security.DenyAll; import javax.ejb.TransactionAttribute; @@ -46,6 +49,7 @@ import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.criteria.BaseCriteria; +import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; import de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration; import de.symeda.sormas.backend.deletionconfiguration.DeletionConfigurationService; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; @@ -249,4 +253,17 @@ public EditPermissionType getEditPermissionType(String uuid) { public boolean isEditAllowed(String uuid) { return service.isEditAllowed(service.getByUuid(uuid)); } + + public Collection getIneligibleEntitiesForEditing(Collection selectedEntities) { + return selectedEntities.stream().filter(entity -> !this.isEditAllowed(entity.getUuid())).collect(Collectors.toList()); + } + + public Collection getEligibleEntitiesForEditing( + Collection selectedCases, + Collection ineligibleCases) { + return ineligibleCases.size() > 0 + ? selectedCases.stream().filter(row -> !ineligibleCases.contains(row)).collect(Collectors.toCollection(ArrayList::new)) + : selectedCases; + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index 4112b471604..3c37c08b6aa 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -2283,7 +2283,6 @@ public List saveBulkContacts( List processedEntities = new ArrayList(); - int changedContacts = 0; for (String contactUuid : contactUuidList) { Contact contact = service.getByUuid(contactUuid); @@ -2299,7 +2298,6 @@ public List saveBulkContacts( save(existingContactDto); processedEntities.add(new ProcessedEntity(contactUuid, ProcessedEntityStatus.SUCCESS)); - changedContacts++; } } return processedEntities; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 261abc82d9f..f6918f5ca1f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -1499,7 +1499,6 @@ public List saveBulkEvents( List processedEvents = new ArrayList(); - int changedEvents = 0; for (String eventUuid : eventUuidList) { Event event = service.getByUuid(eventUuid); @@ -1517,9 +1516,15 @@ public List saveBulkEvents( eventDto.setEventManagementStatus(updatedTempEvent.getEventManagementStatus()); } - save(eventDto); - processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.SUCCESS)); - changedEvents++; + try { + save(eventDto); + processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } catch (Exception e) { + processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + } + } } return processedEvents; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index 322d6920e03..18da6227751 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -372,14 +372,11 @@ public List saveBulkTasks( boolean taskStatusChange) { List processedTasks = new ArrayList<>(); - UserReferenceDto currentUser = userService.getCurrentUser().toReference(); - int changedTasks = 0; for (String taskUuid : taskUuidList) { Task task = taskService.getByUuid(taskUuid); TaskDto taskDto = toDto(task, createPseudonymizer()); - if (priorityChange) { taskDto.setPriority(updatedTempTask.getPriority()); } @@ -390,12 +387,13 @@ public List saveBulkTasks( if (taskStatusChange) { taskDto.setTaskStatus(updatedTempTask.getTaskStatus()); } - - saveTask(taskDto); - processedTasks.add(new ProcessedEntity(taskUuid, ProcessedEntityStatus.SUCCESS)); - changedTasks++; + try { + saveTask(taskDto); + processedTasks.add(new ProcessedEntity(taskUuid, ProcessedEntityStatus.SUCCESS)); + } catch (Exception e) { + processedTasks.add(new ProcessedEntity(taskUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + } } - //return changedTasks; return processedTasks; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java index 33c134eb963..311a14e0bb6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java @@ -1034,6 +1034,9 @@ public void showBulkCaseDataEditComponent(Collection CaseFacade caseFacade = FacadeProvider.getCaseFacade(); List selectedCasesCpy = new ArrayList<>(selectedCases); + Collection ineligibleCases = caseFacade.getIneligibleEntitiesForEditing(selectedCases); + Collection eligibleCases = caseFacade.getEligibleEntitiesForEditing(selectedCases, ineligibleCases); + if (facilityChange) { VaadinUiUtil.showChooseOptionPopup( I18nProperties.getCaption(Captions.caseInfrastructureDataChanged), @@ -1054,8 +1057,8 @@ public void showBulkCaseDataEditComponent(Collection surveillanceOfficerChange, e), selectedCasesCpy, - null, - null, + new ArrayList<>(eligibleCases), + new ArrayList<>(ineligibleCases), bulkOperationCallback(caseGrid, popupWindow))); } else { BulkOperationHandler. forBulkEdit() @@ -1070,8 +1073,8 @@ BulkOperationHandler. forBulkEdit() outcomeChange, surveillanceOfficerChange), selectedCasesCpy, - null, - null, + new ArrayList<>(eligibleCases), + new ArrayList<>(ineligibleCases), bulkOperationCallback(caseGrid, popupWindow)); } }); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index 9b07063d946..a86a5185139 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -719,7 +719,7 @@ public HorizontalLayout createStatusFilterBar() { menuBarItems.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkEdit), VaadinIcons.ELLIPSIS_H, mi -> { grid.bulkActionHandler( items -> ControllerProvider.getCaseController().showBulkCaseDataEditComponent(items, (AbstractCaseGrid) grid)); - }, hasBulkOperationsRight)); + }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_EDIT))); if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { menuBarItems.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, mi -> { grid.bulkActionHandler( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index ed148a38291..24bd97793c0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -723,8 +723,8 @@ private String getDeleteConfirmationDetails(List contactUuids) { return hasPendingRequest ? "
" + I18nProperties.getString(Strings.messageDeleteWithPendingShareRequest) + "
" : ""; } - public void showBulkContactDataEditComponent( - Collection selectedContacts, + public void showBulkContactDataEditComponent( + Collection selectedContacts, String caseUuid, AbstractContactGrid contactGrid) { if (selectedContacts.size() == 0) { @@ -766,6 +766,9 @@ public void showBulkContactDataEditComponent( boolean contactOfficerChange = district != null ? form.getContactOfficerCheckBox().getValue() : false; List selectedContactsCpy = new ArrayList<>(selectedContacts); + Collection ineligibleContacts = contactFacade.getIneligibleEntitiesForEditing(selectedContacts); + Collection eligibleContacts = contactFacade.getEligibleEntitiesForEditing(selectedContacts, ineligibleContacts); + BulkOperationHandler. forBulkEdit() .doBulkOperation( selectedEntries -> contactFacade.saveBulkContacts( @@ -774,8 +777,8 @@ BulkOperationHandler. forBulkEdit() classificationChange, contactOfficerChange), selectedContactsCpy, - null, - null, + new ArrayList<>(eligibleContacts), + new ArrayList<>(ineligibleContacts), bulkOperationCallback(caseUuid, contactGrid, popupWindow)); }); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java index fbb9684c9a3..f45c03b65e4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java @@ -518,7 +518,7 @@ public HorizontalLayout createStatusFilterBar() { mi -> grid.bulkActionHandler( items -> ControllerProvider.getContactController() .showBulkContactDataEditComponent(items, null, (AbstractContactGrid) grid)), - hasBulkOperationsRight), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EDIT)), new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.bulkCancelFollowUp), VaadinIcons.CLOSE, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index 3886b71badb..cd7a98269b7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -1005,6 +1005,9 @@ public void showBulkEventDataEditComponent(Collection selectedEve boolean eventManagementStatusChange = form.getEventManagementStatusCheckbox().getValue(); List selectedEventsCpy = new ArrayList<>(selectedEvents); + Collection ineligibleEvents = eventFacade.getIneligibleEntitiesForEditing(selectedEvents); + Collection eligibleEvents = eventFacade.getEligibleEntitiesForEditing(selectedEvents, ineligibleEvents); + BulkOperationHandler. forBulkEdit() .doBulkOperation( selectedEntries -> eventFacade.saveBulkEvents( @@ -1014,8 +1017,8 @@ BulkOperationHandler. forBulkEdit() eventInvestigationStatusChange, eventManagementStatusChange), selectedEventsCpy, - null, - null, + new ArrayList<>(eligibleEvents), + new ArrayList<>(ineligibleEvents), bulkOperationCallback(eventGrid, popupWindow)); }); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 99ebb259223..9d205e08d1a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -95,17 +95,16 @@ public BulkOperationHandler( this.infoBulkProcessFinishedWithoutSuccess = infoBulkProcessFinishedWithoutSuccess; } - //TODO: check if the 4 newly added fields can have value for bulk edit public static BulkOperationHandler forBulkEdit() { return new BulkOperationHandler<>( Strings.messageEntriesEdited, + Strings.messageEntitiesNotEditable, + Strings.headingSomeEntitiesNotEdited, + Strings.headingEntitiesNotEdited, + Strings.messageCountEntitiesNotEdited, null, null, - null, - null, - null, - null, - null, + Strings.messageCountEntitiesNotEditedAccessDeniedReason, Strings.messageEntriesEditedExceptArchived, null, Strings.infoBulkProcessFinishedWithSkips, From 6a2cbce65b168069db208cbc8297ae9def1ea46d Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 11 Aug 2023 17:09:51 +0300 Subject: [PATCH 032/144] #12257 - add missing message --- sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java | 1 + sormas-api/src/main/resources/strings.properties | 1 + .../java/de/symeda/sormas/ui/utils/BulkOperationHandler.java | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 96c4c03969b..f8309b42b79 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1308,6 +1308,7 @@ public interface Strings { String messageNoCsvFile = "messageNoCsvFile"; String messageNoDocumentTemplateUploadFile = "messageNoDocumentTemplateUploadFile"; String messageNoDocumentUploadFile = "messageNoDocumentUploadFile"; + String messageNoEligibleEntityForEditing = "messageNoEligibleEntityForEditing"; String messageNoEligibleEventForDeletionSelected = "messageNoEligibleEventForDeletionSelected"; String messageNoEligibleFollowUpForCancellation = "messageNoEligibleFollowUpForCancellation"; String messageNoEligibleFollowUpForSettingToLost = "messageNoEligibleFollowUpForSettingToLost"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 34ad08e7430..47889c9c536 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1249,6 +1249,7 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion messageNoEligibleFollowUpForCancellation = None of the follow-ups were eligible for cancellation messageNoEligibleFollowUpForSettingToLost = None of the follow-ups were eligible for setting to lost diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 9d205e08d1a..d5984bb6ff4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -106,7 +106,7 @@ public static BulkOperationHandler forBulkEdit() { null, Strings.messageCountEntitiesNotEditedAccessDeniedReason, Strings.messageEntriesEditedExceptArchived, - null, + Strings.messageNoEligibleEntityForEditing, Strings.infoBulkProcessFinishedWithSkips, Strings.infoBulkProcessFinishedWithoutSuccess); } From 0f869263c2b8f4325842d7ced638530aa5ab8e6c Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 11 Aug 2023 17:45:22 +0300 Subject: [PATCH 033/144] #12257 - delete unused messages --- .../de/symeda/sormas/api/i18n/Strings.java | 8 ----- .../src/main/resources/strings.properties | 25 -------------- .../sormas/ui/contact/ContactController.java | 2 -- .../sormas/ui/events/EventController.java | 3 +- .../ui/events/EventGroupController.java | 2 +- .../ExternalSurveillanceServiceGateway.java | 2 -- .../symeda/sormas/ui/user/UserController.java | 2 -- .../sormas/ui/utils/ArchiveMessages.java | 10 ------ .../sormas/ui/utils/ArchivingController.java | 1 - .../sormas/ui/utils/BulkOperationHandler.java | 6 ---- .../ui/utils/DeleteRestoreController.java | 1 - .../ui/utils/DeleteRestoreMessages.java | 34 ------------------- .../ui/utils/PermanentDeleteController.java | 1 - 13 files changed, 2 insertions(+), 95 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index f8309b42b79..d0c9d9abbd8 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -380,7 +380,6 @@ public interface Strings { String ExternalSurveillanceToolGateway_notificationEntrySent = "ExternalSurveillanceToolGateway.notificationEntrySent"; String ExternalSurveillanceToolGateway_notificationErrorDeleting = "ExternalSurveillanceToolGateway.notificationErrorDeleting"; String ExternalSurveillanceToolGateway_notificationErrorSending = "ExternalSurveillanceToolGateway.notificationErrorSending"; - String ExternalSurveillanceToolGateway_notificationSomeEntriesSent = "ExternalSurveillanceToolGateway.notificationSomeEntriesSent"; String ExternalSurveillanceToolGateway_sharedAt = "ExternalSurveillanceToolGateway.sharedAt"; String ExternalSurveillanceToolGateway_unableToSend = "ExternalSurveillanceToolGateway.unableToSend"; String ExternalSurveillanceToolGateway_versionRequestError = "ExternalSurveillanceToolGateway.versionRequestError"; @@ -1196,7 +1195,6 @@ public interface Strings { String messageEntitiesNotEditable = "messageEntitiesNotEditable"; String messageEntityNotFound = "messageEntityNotFound"; String messageEntriesEdited = "messageEntriesEdited"; - String messageEntriesEditedExceptArchived = "messageEntriesEditedExceptArchived"; String messageEntryCreated = "messageEntryCreated"; String messageEnvironmentArchived = "messageEnvironmentArchived"; String messageEnvironmentCreated = "messageEnvironmentCreated"; @@ -1372,12 +1370,6 @@ public interface Strings { String messageSamplesRestored = "messageSamplesRestored"; String messageSelectedPeriodTooLong = "messageSelectedPeriodTooLong"; String messageSetContactRegionAndDistrict = "messageSetContactRegionAndDistrict"; - String messageSomeContactsLinkedToEvent = "messageSomeContactsLinkedToEvent"; - String messageSomeEntitiesArchived = "messageSomeEntitiesArchived"; - String messageSomeEntitiesDearchived = "messageSomeEntitiesDearchived"; - String messageSomeEventsLinkedToGroup = "messageSomeEventsLinkedToGroup"; - String messageSomeUsersDisabled = "messageSomeUsersDisabled"; - String messageSomeUsersEnabled = "messageSomeUsersEnabled"; String messageSormasToSormasSimilarCaseFound = "messageSormasToSormasSimilarCaseFound"; String messageSormasToSormasSimilarCaseToContactFound = "messageSormasToSormasSimilarCaseToContactFound"; String messageSormasToSormasSimilarContactFound = "messageSormasToSormasSimilarContactFound"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 47889c9c536..71f93054151 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1042,7 +1042,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1065,26 +1064,17 @@ messageCaseSavedClassificationChanged = Case saved. The classification was autom messageCaseTransfered = Case has been transfered to another facility #check if these messages are still neccessary, if not delete them -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1104,7 +1094,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1132,7 +1121,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1145,7 +1133,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1153,7 +1140,6 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet @@ -1237,7 +1223,6 @@ messageImportSuccessful = Import successful!
All rows have been impor messageUploadSuccessful = Upload successful! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1285,7 +1270,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1294,7 +1278,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1303,7 +1286,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1315,7 +1297,6 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. @@ -1413,9 +1394,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1446,12 +1425,9 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived @@ -1659,7 +1635,6 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index 24bd97793c0..2cda82ccf5f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -856,7 +856,6 @@ public void cancelFollowUpOfAllSelectedItems( null, null, Strings.messageCountFollowUpsNotCancelledAccessDeniedReason, - null, Strings.messageNoEligibleFollowUpForCancellation, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { @@ -914,7 +913,6 @@ public void setAllSelectedItemsToLostToFollowUp( null, null, Strings.messageCountFollowUpsNotSetToLostAccessDeniedReason, - null, Strings.messageNoEligibleFollowUpForSettingToLost, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index cd7a98269b7..8d4782313c7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -354,7 +354,7 @@ private void linkContactsToEvent(EventReferenceDto eventReferenceDto, List( Strings.messageAllContactsLinkedToEvent, null, @@ -364,7 +364,6 @@ private void linkContactsToEvent(EventReferenceDto eventReferenceDto, List { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java index 767ce408783..37c3cf64cf2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java @@ -78,6 +78,7 @@ private void linkEventsToGroup( String messageEventsLinkedToGroup = eventReferences.size() > 1 ? Strings.messageEventsLinkedToGroup : Strings.messageEventLinkedToGroup; //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty + //messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group new BulkOperationHandler( messageEventsLinkedToGroup, null, @@ -87,7 +88,6 @@ private void linkEventsToGroup( null, null, null, - Strings.messageSomeEventsLinkedToGroup, null, null, null).doBulkOperation(batch -> { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java index 3beb591ebff..b20a960ff0c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java @@ -132,7 +132,6 @@ public static void sendCasesToExternalSurveillanceTool( Strings.messageCountEntitiesNotSentExternalReason, null, Strings.messageCountEntitiesNotSentAccessDeniedReason, - Strings.ExternalSurveillanceToolGateway_notificationSomeEntriesSent, null, null, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { @@ -189,7 +188,6 @@ public static void sendEventsToExternalSurveillanceTool( Strings.messageCountEntitiesNotSentExternalReason, null, Strings.messageCountEntitiesNotSentAccessDeniedReason, - Strings.ExternalSurveillanceToolGateway_notificationSomeEntriesSent, null, null, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java index e024548677a..439a3a3f12f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java @@ -376,7 +376,6 @@ public void enableAllSelectedItems(Collection selectedRows, UserGrid us null, null, null, - Strings.messageSomeUsersEnabled, null, Strings.infoBulkProcessFinishedWithSkips, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { @@ -424,7 +423,6 @@ public void disableAllSelectedItems(Collection selectedRows, UserGrid u null, null, null, - Strings.messageSomeUsersDisabled, null, Strings.infoBulkProcessFinishedWithSkips, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index 2785c19c0de..c7c64150bb8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -293,9 +293,7 @@ public enum ArchiveMessages { private final String headingConfirmationArchiving = Strings.headingConfirmArchiving; private final String headingConfirmationDearchiving = Strings.headingConfirmDearchiving; private final String messageAllEntitiesArchived = Strings.messageAllEntitiesArchived; - private final String messageSomeEntitiesArchived = Strings.messageSomeEntitiesArchived; private final String messageAllEntitiesDearchived = Strings.messageAllEntitiesDearchived; - private final String messageSomeEntitiesDearchived = Strings.messageSomeEntitiesDearchived; private final String messageCountEntitiesNotArchived = Strings.messageCountEntitiesNotArchived; private final String messageCountEntitiesNotDearchived = Strings.messageCountEntitiesNotDearchived; private final String headingSomeEntitiesNotArchived = Strings.headingSomeEntitiesNotArchived; @@ -410,18 +408,10 @@ public String getMessageAllEntitiesArchived() { return messageAllEntitiesArchived; } - public String getMessageSomeEntitiesArchived() { - return messageSomeEntitiesArchived; - } - public String getMessageAllEntitiesDearchived() { return messageAllEntitiesDearchived; } - public String getMessageSomeEntitiesDearchived() { - return messageSomeEntitiesDearchived; - } - public String getHeadingSomeEntitiesNotArchived() { return headingSomeEntitiesNotArchived; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index beb7f94459a..12e46d2c68e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -229,7 +229,6 @@ private BulkOperationHandler createBulkOperationHandler(I forArchive ? archiveMessages.getMessageCountEntitiesNotArchivedAccessDeniedReason() : archiveMessages.getMessageCountEntitiesNotDearchivedAccessDeniedReason(), - forArchive ? archiveMessages.getMessageSomeEntitiesArchived() : archiveMessages.getMessageSomeEntitiesDearchived(), null, Strings.infoBulkProcessFinishedWithSkips, Strings.infoBulkProcessFinishedWithoutSuccess); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index d5984bb6ff4..a3691b72ae4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -60,9 +60,6 @@ public class BulkOperationHandler { private final String countEntriesNotProcessedExternalReasonProperty; private final String countEntriesNotProcessedSormasToSormasReasonProperty; private final String countEntriesNotProcessedAccessDeniedReasonProperty; - - //TODO: check this field, if is not used delete - private final String someEntriesProcessedMessageProperty; private final String noEligibleEntityMessageProperty; private final String infoBulkProcessFinishedWithSkipsProperty; private final String infoBulkProcessFinishedWithoutSuccess; @@ -76,7 +73,6 @@ public BulkOperationHandler( String countEntriesNotProcessedExternalReasonProperty, String countEntriesNotProcessedSormasToSormasReasonProperty, String countEntriesNotProcessedAccessDeniedReasonProperty, - String someEntriesProcessedMessageProperty, String noEligibleEntityMessageProperty, String infoBulkProcessFinishedWithSkipsProperty, String infoBulkProcessFinishedWithoutSuccess) { @@ -89,7 +85,6 @@ public BulkOperationHandler( this.countEntriesNotProcessedExternalReasonProperty = countEntriesNotProcessedExternalReasonProperty; this.countEntriesNotProcessedSormasToSormasReasonProperty = countEntriesNotProcessedSormasToSormasReasonProperty; this.countEntriesNotProcessedAccessDeniedReasonProperty = countEntriesNotProcessedAccessDeniedReasonProperty; - this.someEntriesProcessedMessageProperty = someEntriesProcessedMessageProperty; this.noEligibleEntityMessageProperty = noEligibleEntityMessageProperty; this.infoBulkProcessFinishedWithSkipsProperty = infoBulkProcessFinishedWithSkipsProperty; this.infoBulkProcessFinishedWithoutSuccess = infoBulkProcessFinishedWithoutSuccess; @@ -105,7 +100,6 @@ public static BulkOperationHandler forBulkEdit() { null, null, Strings.messageCountEntitiesNotEditedAccessDeniedReason, - Strings.messageEntriesEditedExceptArchived, Strings.messageNoEligibleEntityForEditing, Strings.infoBulkProcessFinishedWithSkips, Strings.infoBulkProcessFinishedWithoutSuccess); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index 15e73965e10..f4b96d04d87 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -136,7 +136,6 @@ private BulkOperationHandler createBulkOperationHandler(I forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedExternalReason() : null, forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedSormasToSormasReason() : null, forDelete ? deleteRestoreMessages.getMessageCountEntitiesNotDeletedAccessDeniedReason() : null, - forDelete ? deleteRestoreMessages.getMessageEntitiesNotDeleted() : deleteRestoreMessages.getMessageEntitiesNotRestored(), forDelete ? deleteRestoreMessages.getMessageNoEligibleEntitySelected() : null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index f77f6dbd32c..726c5d7474c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -12,7 +12,6 @@ public enum DeleteRestoreMessages { Strings.headingCasesDeleted, Strings.messageCasesDeleted, Strings.headingCasesNotDeleted, - Strings.messageCasesNotDeleted, Strings.messageCountCasesNotDeletedExternalReason, Strings.messageCountCasesNotDeletedSormasToSormasReason, Strings.messageCountCasesNotDeletedAccessDeniedReason, @@ -22,7 +21,6 @@ public enum DeleteRestoreMessages { Strings.headingCasesRestored, Strings.messageCasesRestored, Strings.headingCasesNotRestored, - Strings.messageCasesNotRestored, Strings.headingSomeCasesNotRestored, Strings.messageCountCasesNotRestored), @@ -34,7 +32,6 @@ public enum DeleteRestoreMessages { Strings.headingEventsDeleted, Strings.messageEventsDeleted, Strings.headingEventsNotDeleted, - Strings.messageEventsNotDeleted, Strings.messageCountEventsNotDeletedExternalReason, Strings.messageCountContactsNotDeletedSormasToSormasReason, Strings.messageCountEventsNotDeletedAccessDeniedReason, @@ -43,7 +40,6 @@ public enum DeleteRestoreMessages { Strings.headingEventsRestored, Strings.messageEventsRestored, Strings.headingEventsNotRestored, - Strings.messageEventsNotRestored, Strings.headingSomeEventsNotRestored, Strings.messageCountEventsNotRestored), @@ -55,7 +51,6 @@ public enum DeleteRestoreMessages { Strings.headingEventParticipantsDeleted, Strings.messageEventParticipantsDeleted, Strings.headingEventParticipantsNotDeleted, - Strings.messageEventParticipantsNotDeleted, null, null, Strings.messageCountEventParticipantsNotDeletedAccessDeniedReason, @@ -64,7 +59,6 @@ public enum DeleteRestoreMessages { Strings.headingEventParticipantsRestored, Strings.messageEventParticipantsRestored, Strings.headingEventParticipantsNotRestored, - Strings.messageEventParticipantsNotRestored, Strings.headingSomeEventParticipantsNotRestored, Strings.messageCountEventParticipantsNotRestored), @@ -76,7 +70,6 @@ public enum DeleteRestoreMessages { Strings.headingContactsDeleted, Strings.messageContactsDeleted, Strings.headingContactsNotDeleted, - Strings.messageContactsNotDeleted, null, Strings.messageCountContactsNotDeletedSormasToSormasReason, Strings.messageCountContactsNotDeletedAccessDeniedReason, @@ -85,7 +78,6 @@ public enum DeleteRestoreMessages { Strings.headingContactsRestored, Strings.messageContactsRestored, Strings.headingContactsNotRestored, - Strings.messageContactsNotRestored, Strings.headingSomeContactsNotRestored, Strings.messageCountContactsNotRestored), @@ -97,7 +89,6 @@ public enum DeleteRestoreMessages { Strings.headingTravelEntriesDeleted, Strings.messageTravelEntriesDeleted, Strings.headingTravelEntriesNotDeleted, - Strings.messageTravelEntriesNotDeleted, null, null, Strings.messageCountTravelEntriesNotDeletedAccessDeniedReason, @@ -106,7 +97,6 @@ public enum DeleteRestoreMessages { Strings.headingTravelEntriesRestored, Strings.messageTravelEntriesRestored, Strings.headingTravelEntriesNotRestored, - Strings.messageTravelEntriesNotRestored, Strings.headingSomeTravelEntriesNotRestored, Strings.messageCountTravelEntriesNotRestored), @@ -118,7 +108,6 @@ public enum DeleteRestoreMessages { Strings.headingVisitsDeleted, Strings.messageVisitsDeleted, Strings.headingVisitsNotDeleted, - Strings.messageVisitsNotDeleted, null, null, Strings.messageCountVisitsNotDeletedAccessDeniedReason, @@ -128,7 +117,6 @@ public enum DeleteRestoreMessages { null, null, null, - null, null), TASK(Strings.entityTasks, @@ -139,7 +127,6 @@ public enum DeleteRestoreMessages { Strings.headingTasksDeleted, Strings.messageTasksDeleted, Strings.headingTasksNotDeleted, - Strings.messageTasksNotDeleted, null, null, Strings.messageCountTasksNotDeletedAccessDeniedReason, @@ -149,7 +136,6 @@ public enum DeleteRestoreMessages { null, null, null, - null, null), EXTERNAL_MESSAGE(Strings.entityExternalMessages, @@ -160,7 +146,6 @@ public enum DeleteRestoreMessages { Strings.headingExternalMessagesDeleted, Strings.messageExternalMessagesDeleted, Strings.headingExternalMessagesNotDeleted, - Strings.messageExternalMessagesNotDeleted, null, null, null, @@ -170,7 +155,6 @@ public enum DeleteRestoreMessages { null, null, null, - null, null), SAMPLE(Strings.entitySamples, @@ -181,7 +165,6 @@ public enum DeleteRestoreMessages { Strings.headingSamplesDeleted, Strings.messageSamplesDeleted, Strings.headingSamplesNotDeleted, - Strings.messageSamplesNotDeleted, null, null, null, @@ -190,7 +173,6 @@ public enum DeleteRestoreMessages { Strings.headingSamplesRestored, Strings.messageSamplesRestored, Strings.headingSamplesNotRestored, - Strings.messageSamplesNotRestored, Strings.headingSomeSamplesNotRestored, Strings.messageCountSamplesNotRestored), @@ -202,7 +184,6 @@ public enum DeleteRestoreMessages { Strings.headingImmunizationsDeleted, Strings.messageImmunizationsDeleted, Strings.headingImmunizationsNotDeleted, - Strings.messageImmunizationsNotDeleted, null, null, Strings.messageCountImmunizationsNotDeletedAccessDeniedReason, @@ -211,7 +192,6 @@ public enum DeleteRestoreMessages { Strings.headingImmunizationsRestored, Strings.messageImmunizationsRestored, Strings.headingImmunizationsNotRestored, - Strings.messageImmunizationsNotRestored, Strings.headingSomeImmunizationsNotRestored, Strings.messageCountImmunizationsNotRestored); @@ -223,7 +203,6 @@ public enum DeleteRestoreMessages { private final String headingEntitiesDeleted; private final String messageEntitiesDeleted; private final String headingEntitiesNotDeleted; - private final String messageEntitiesNotDeleted; private final String messageCountEntitiesNotDeletedExternalReason; private final String messageCountEntitiesNotDeletedSormasToSormasReason; private final String messageCountEntitiesNotDeletedAccessDeniedReason; @@ -232,7 +211,6 @@ public enum DeleteRestoreMessages { private final String headingEntitiesRestored; private final String messageEntitiesRestored; private final String headingEntitiesNotRestored; - private final String messageEntitiesNotRestored; private final String headingSomeEntitiesNotRestored; private final String messageCountEntitiesNotRestored; @@ -247,7 +225,6 @@ public enum DeleteRestoreMessages { String headingEntitiesDeleted, String messageEntitiesDeleted, String headingEntitiesNotDeleted, - String messageEntitiesNotDeleted, String messageCountEntitiesNotDeletedExternalReason, String messageCountEntitiesNotDeletedSormasToSormasReason, String messageCountEntitiesNotDeletedAccessDeniedReason, @@ -256,7 +233,6 @@ public enum DeleteRestoreMessages { String headingEntitiesRestored, String messageEntitiesRestored, String headingEntitiesNotRestored, - String messageEntitiesNotRestored, String headingSomeEntitiesNotRestored, String messageCountEntitiesNotRestored) { @@ -268,7 +244,6 @@ public enum DeleteRestoreMessages { this.headingEntitiesDeleted = headingEntitiesDeleted; this.messageEntitiesDeleted = messageEntitiesDeleted; this.headingEntitiesNotDeleted = headingEntitiesNotDeleted; - this.messageEntitiesNotDeleted = messageEntitiesNotDeleted; this.messageCountEntitiesNotDeletedExternalReason = messageCountEntitiesNotDeletedExternalReason; this.messageCountEntitiesNotDeletedSormasToSormasReason = messageCountEntitiesNotDeletedSormasToSormasReason; this.messageCountEntitiesNotDeletedAccessDeniedReason = messageCountEntitiesNotDeletedAccessDeniedReason; @@ -277,7 +252,6 @@ public enum DeleteRestoreMessages { this.headingEntitiesRestored = headingEntitiesRestored; this.messageEntitiesRestored = messageEntitiesRestored; this.headingEntitiesNotRestored = headingEntitiesNotRestored; - this.messageEntitiesNotRestored = messageEntitiesNotRestored; this.headingSomeEntitiesNotRestored = headingSomeEntitiesNotRestored; this.messageCountEntitiesNotRestored = messageCountEntitiesNotRestored; } @@ -314,10 +288,6 @@ public String getHeadingEntitiesNotDeleted() { return headingEntitiesNotDeleted; } - public String getMessageEntitiesNotDeleted() { - return messageEntitiesNotDeleted; - } - public String getMessageCountEntitiesNotDeletedExternalReason() { return messageCountEntitiesNotDeletedExternalReason; } @@ -354,10 +324,6 @@ public String getHeadingEntitiesNotRestored() { return headingEntitiesNotRestored; } - public String getMessageEntitiesNotRestored() { - return messageEntitiesNotRestored; - } - public String getHeadingSomeEntitiesNotRestored() { return headingSomeEntitiesNotRestored; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index b30a5ba7c2e..669f8a671c3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -97,7 +97,6 @@ private BulkOperationHandler createBulkOperationHandler(I null, null, deleteRestoreMessages.getMessageCountEntitiesNotDeletedAccessDeniedReason(), - deleteRestoreMessages.getMessageEntitiesNotDeleted(), null, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess); From a852469845b09eade3ab961a6c0a18b70ede14cc Mon Sep 17 00:00:00 2001 From: Razvan Date: Mon, 21 Aug 2023 11:17:52 +0300 Subject: [PATCH 034/144] SORQA-1053 : added first part of the test --- .../cases/EpidemiologicalDataCasePage.java | 4 + .../cases/EpidemiologicalDataCaseSteps.java | 83 +++++-------------- .../contacts/ContactDirectorySteps.java | 38 +-------- .../web/application/survnet/SurvNetSteps.java | 1 + .../features/sanity/web/Survnet.feature | 19 +++++ 5 files changed, 47 insertions(+), 98 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java index 1658256dc3a..9db69b3623b 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java @@ -23,11 +23,15 @@ public class EpidemiologicalDataCasePage { public static final By EXPOSURE_DETAILS_KNOWN_OPTIONS = By.cssSelector("#exposureDetailsKnown .v-select-option"); + public static final By CARE_IN_FACILITY_OPTIONS = + By.cssSelector("#activityAsCaseDetailsKnown .v-select-option"); public static final By EXPOSURE_DETAILS_NEW_ENTRY_BUTTON = By.cssSelector("#actionNewEntry"); public static final By START_OF_EXPOSURE_INPUT = By.cssSelector(".v-window #startDate input"); public static final By END_OF_EXPOSURE_INPUT = By.cssSelector(".v-window #endDate input"); public static final By EXPOSURE_DESCRIPTION_INPUT = By.cssSelector(".v-window #description"); public static final By TYPE_OF_ACTIVITY_COMBOBOX = By.cssSelector(".v-window #exposureType div"); + public static final By CARE_WORK_IN_FACILITY_COMBOBOX = + By.cssSelector(".v-window #activityAsCaseType div"); public static final By EXPOSURE_DETAILS_ROLE_COMBOBOX = By.cssSelector(".v-window div#exposureRole div"); public static final By ACTIVITY_AS_CASE_OPTIONS = diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EpidemiologicalDataCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EpidemiologicalDataCaseSteps.java index 08842b4ec7b..da54a3f00c1 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EpidemiologicalDataCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EpidemiologicalDataCaseSteps.java @@ -1,67 +1,7 @@ package org.sormas.e2etests.steps.web.application.cases; import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_SAVED_POPUP; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_CONTINENT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_COUNTRY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_DESCRIPTION; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_DETAILS_KNOWN_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_DETAILS_NEW_ENTRY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_DISCARD_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_DONE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_END_OF_ACTIVITY_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_START_OF_ACTIVITY_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_SUBCONTINENT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_TYPE_OF_ACTIVITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.BLUE_ERROR_EXCLAMATION_MARK_EXPOSURE_POPUP; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.BLUE_ERROR_EXCLAMATION_MARK_EXPOSURE_POPUP_TEXT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACTS_WITH_SOURCE_CASE_BOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACT_TO_BODY_FLUIDS_OPTONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACT_WITH_SOURCE_CASE_KNOWN; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTINENT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTINENT_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.COUNTRY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.DATE_EXPOSURE_TABLE; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.DISCARD_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.DONE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EDIT_SAVED_ACTIVITY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EDIT_SAVED_EXPOSURE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EDIT_SOURCE_CONTACTS_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EDIT_TRAVEL_ENTRY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.END_OF_EXPOSURE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EPIDEMIOLOGICAL_DATA_ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_ACTION_CANCEL; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_ACTION_CONFIRM; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_CHOOSE_CASE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DESCRIPTION_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DETAILS_KNOWN_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DETAILS_NEW_ENTRY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DETAILS_ROLE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_PROBABLE_INFECTION_ENVIRONMENT_CHECKBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.FACILITY_CATEGORY_POPUP_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.FACILITY_TYPE_POPUP_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.HANDLING_SAMPLES_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.INDOORS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.LONG_FACE_TO_FACE_CONTACT_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.NEW_CONTACT_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OPEN_SAVED_ACTIVITY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OPEN_SAVED_EXPOSURE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OTHER_PROTECTIVE_MEASURES_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OUTDOORS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.PERCUTANEOUS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.RESIDING_OR_TRAVELING_DETAILS_KNOWN_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.RESIDING_OR_WORKING_DETAILS_KNOWN_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.RISK_AREA_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.SAVE_BUTTON_EPIDEMIOLOGICAL_DATA; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.SHORT_DISTANCE_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.START_OF_EXPOSURE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.SUBCONTINENT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.SUBCONTINENT_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.TYPE_OF_ACTIVITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.TYPE_OF_ACTIVITY_EXPOSURES; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.TYPE_OF_PLACE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.WEARING_MASK_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.WEARING_PPE_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.getExposureTableData; +import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.*; import static org.sormas.e2etests.pages.application.contacts.CreateNewContactPage.RESPONSIBLE_DISTRICT_COMBOBOX; import static org.sormas.e2etests.pages.application.contacts.CreateNewContactPage.RESPONSIBLE_REGION_COMBOBOX; import static org.sormas.e2etests.pages.application.contacts.CreateNewContactPage.SOURCE_CASE_CONTACT_WINDOW_CONFIRM_BUTTON; @@ -197,6 +137,12 @@ public EpidemiologicalDataCaseSteps( webDriverHelpers.clickWebElementByText(EXPOSURE_DETAILS_KNOWN_OPTIONS, option); }); + When( + "I click on Care...In facility ([^\"]*) option", + (String option) -> { + webDriverHelpers.clickWebElementByText(CARE_IN_FACILITY_OPTIONS, option); + }); + When( "I click on Contacts with source case known with ([^\"]*) option for DE", (String option) -> { @@ -341,6 +287,21 @@ public EpidemiologicalDataCaseSteps( webDriverHelpers.clickOnWebElementBySelector(EXPOSURE_DETAILS_NEW_ENTRY_BUTTON); }); + When( + "I click on New Entry in Care...In Facility in Cases directory", + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + EXPOSURE_DETAILS_NEW_ENTRY_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(EXPOSURE_DETAILS_NEW_ENTRY_BUTTON); + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(NEW_ENTRY_POPUP); + }); + + When( + "I select {string} option in Art der Aktivitat from Combobox in Care In facility form", + (String typeOfactivity) -> { + webDriverHelpers.selectFromCombobox(CARE_WORK_IN_FACILITY_COMBOBOX, typeOfactivity); + }); + When( "I click on New Entry in Activity as Case in Cases directory", () -> diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/ContactDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/ContactDirectorySteps.java index 5774b5494bf..859ebb5406d 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/ContactDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/ContactDirectorySteps.java @@ -46,43 +46,7 @@ import static org.sormas.e2etests.pages.application.cases.EditContactsPage.COMMIT_BUTTON; import static org.sormas.e2etests.pages.application.cases.EditContactsPage.IMPORT_CASE_CONTACTS_BUTTON; import static org.sormas.e2etests.pages.application.cases.EditContactsPage.IMPORT_POPUP_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_TYPE_OF_ACTIVITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ADDITIONAL_INFORMATION_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CITY_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.COMMUNITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACT_TO_BODY_FLUIDS_OPTONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTINENT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.COUNTRY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.DISTRICT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.DONE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EDIT_SAVED_EXPOSURE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.END_OF_EXPOSURE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DESCRIPTION_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DETAILS_KNOWN_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DETAILS_NEW_ENTRY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EXPOSURE_DETAILS_ROLE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.HANDLING_SAMPLES_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.HOUSE_NUMBER_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.INDOORS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.LONG_FACE_TO_FACE_CONTACT_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.NEW_CONTACT_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OPEN_SAVED_ACTIVITY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OPEN_SAVED_EXPOSURE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OTHER_PROTECTIVE_MEASURES_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.OUTDOORS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.PERCUTANEOUS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.POSTAL_CODE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.RESIDING_OR_TRAVELING_DETAILS_KNOWN_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.RESIDING_OR_WORKING_DETAILS_KNOWN_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.RISK_AREA_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.SHORT_DISTANCE_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.START_OF_EXPOSURE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.STREET_INPUT; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.SUBCONTINENT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.TYPE_OF_ACTIVITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.TYPE_OF_PLACE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.WEARING_MASK_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.WEARING_PPE_OPTIONS; +import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.*; import static org.sormas.e2etests.pages.application.cases.LineListingPopup.LINE_LISTING_SAVE_BUTTON; import static org.sormas.e2etests.pages.application.configuration.DocumentTemplatesPage.FILE_PICKER; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.CLOSE_DETAILED_EXPORT_POPUP; diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index c90921cc865..7ddadc77645 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -776,6 +776,7 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "/srv/dockerdata/jenkins_new/sormas-files/case_" + externalUUID.get(0).substring(1, 37) + ".xml"); + log.info("Opened XML -> {}", singleXmlFile); }); And( diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index bc3aae155ac..a2a2f0c4fbf 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -434,4 +434,23 @@ Feature: Survnet tests And I collect case external UUID from Edit Case page Then I wait 50 seconds for system reaction And I open SORMAS generated XML file for single case message + Then I check if the exposure settings are correctly mapped in SORMAS generated single XML file + + @tmsLink=SORQA-1053 + Scenario: Check Epidemiology data "Betreuung ... in Einrichtung" of case when sending from SORMAS to Meldesoftware + Given I log in as a Survnet + When I click on the Cases button from navbar + And I click on the NEW CASE button + And I create a new case with mandatory data only for Survnet DE + And I navigate to epidemiological data tab in Edit case page + And I click on Care...In facility JA option + And I click on New Entry in Care...In Facility in Cases directory + Then I select "Unbekannt" option in Art der Aktivitat from Combobox in Care In facility form + And I click on save button in Exposure for Epidemiological data tab in Cases + And I click on save button from Epidemiological Data + And I navigate to case tab + And I click on Send to reporting tool button on Edit Case page + And I collect case external UUID from Edit Case page + Then I wait 50 seconds for system reaction + And I open SORMAS generated XML file for single case message Then I check if the exposure settings are correctly mapped in SORMAS generated single XML file \ No newline at end of file From 32a7584fc38b9692e87be63d7af30d89bd730156 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 21 Aug 2023 17:28:41 +0300 Subject: [PATCH 035/144] #12257 - fix failing test due to unnecessary messages --- .../java/de/symeda/sormas/api/i18n/Strings.java | 17 ----------------- .../src/main/resources/strings.properties | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index d5f76699562..f5fef1505a2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -1074,8 +1074,6 @@ public interface Strings { String messageCaseSavedClassificationChanged = "messageCaseSavedClassificationChanged"; String messageCasesDeleted = "messageCasesDeleted"; String messageCasesMerged = "messageCasesMerged"; - String messageCasesNotDeleted = "messageCasesNotDeleted"; - String messageCasesNotRestored = "messageCasesNotRestored"; String messageCasesRestored = "messageCasesRestored"; String messageCaseTransfered = "messageCaseTransfered"; String messageChangePathogenTestResult = "messageChangePathogenTestResult"; @@ -1107,8 +1105,6 @@ public interface Strings { String messageContactSaved = "messageContactSaved"; String messageContactsDeleted = "messageContactsDeleted"; String messageContactsMerged = "messageContactsMerged"; - String messageContactsNotDeleted = "messageContactsNotDeleted"; - String messageContactsNotRestored = "messageContactsNotRestored"; String messageContactsRestored = "messageContactsRestored"; String messageContactToCaseConfirmationRequired = "messageContactToCaseConfirmationRequired"; String messageContinentArchived = "messageContinentArchived"; @@ -1225,8 +1221,6 @@ public interface Strings { String messageEventParticipantResponsibleJurisdictionUpdated = "messageEventParticipantResponsibleJurisdictionUpdated"; String messageEventParticipantSaved = "messageEventParticipantSaved"; String messageEventParticipantsDeleted = "messageEventParticipantsDeleted"; - String messageEventParticipantsNotDeleted = "messageEventParticipantsNotDeleted"; - String messageEventParticipantsNotRestored = "messageEventParticipantsNotRestored"; String messageEventParticipantsRestored = "messageEventParticipantsRestored"; String messageEventParticipantToCaseWithoutEventDisease = "messageEventParticipantToCaseWithoutEventDisease"; String messageEventParticipantToContactWithoutEventDisease = "messageEventParticipantToContactWithoutEventDisease"; @@ -1234,9 +1228,7 @@ public interface Strings { String messageEventSaved = "messageEventSaved"; String messageEventsDeleted = "messageEventsDeleted"; String messageEventsLinkedToGroup = "messageEventsLinkedToGroup"; - String messageEventsNotDeleted = "messageEventsNotDeleted"; String messageEventsNotDeletedLinkedEntitiesReason = "messageEventsNotDeletedLinkedEntitiesReason"; - String messageEventsNotRestored = "messageEventsNotRestored"; String messageEventsRestored = "messageEventsRestored"; String messageEventsSentToSurvnet = "messageEventsSentToSurvnet"; String messageEventSubordinateEventUnlinked = "messageEventSubordinateEventUnlinked"; @@ -1250,7 +1242,6 @@ public interface Strings { String messageExternalMessagesAssigned = "messageExternalMessagesAssigned"; String messageExternalMessagesDeleted = "messageExternalMessagesDeleted"; String messageExternalMessagesEligibleForDeletion = "messageExternalMessagesEligibleForDeletion"; - String messageExternalMessagesNotDeleted = "messageExternalMessagesNotDeleted"; String messageFacilitiesArchived = "messageFacilitiesArchived"; String messageFacilitiesDearchived = "messageFacilitiesDearchived"; String messageFacilityArchived = "messageFacilityArchived"; @@ -1271,8 +1262,6 @@ public interface Strings { String messageImmunizationSaved = "messageImmunizationSaved"; String messageImmunizationSavedVaccinationStatusUpdated = "messageImmunizationSavedVaccinationStatusUpdated"; String messageImmunizationsDeleted = "messageImmunizationsDeleted"; - String messageImmunizationsNotDeleted = "messageImmunizationsNotDeleted"; - String messageImmunizationsNotRestored = "messageImmunizationsNotRestored"; String messageImmunizationsRestored = "messageImmunizationsRestored"; String messageImportCanceled = "messageImportCanceled"; String messageImportCanceledErrors = "messageImportCanceledErrors"; @@ -1367,8 +1356,6 @@ public interface Strings { String messageSampleOpened = "messageSampleOpened"; String messageSampleSaved = "messageSampleSaved"; String messageSamplesDeleted = "messageSamplesDeleted"; - String messageSamplesNotDeleted = "messageSamplesNotDeleted"; - String messageSamplesNotRestored = "messageSamplesNotRestored"; String messageSamplesRestored = "messageSamplesRestored"; String messageSelectedPeriodTooLong = "messageSelectedPeriodTooLong"; String messageSetContactRegionAndDistrict = "messageSetContactRegionAndDistrict"; @@ -1396,12 +1383,9 @@ public interface Strings { String messageTaskDearchived = "messageTaskDearchived"; String messageTasksDeleted = "messageTasksDeleted"; String messageTasksEdited = "messageTasksEdited"; - String messageTasksNotDeleted = "messageTasksNotDeleted"; String messageTemplateNotAvailable = "messageTemplateNotAvailable"; String messageThisPersonAlreadyEventParticipant = "messageThisPersonAlreadyEventParticipant"; String messageTravelEntriesDeleted = "messageTravelEntriesDeleted"; - String messageTravelEntriesNotDeleted = "messageTravelEntriesNotDeleted"; - String messageTravelEntriesNotRestored = "messageTravelEntriesNotRestored"; String messageTravelEntriesRestored = "messageTravelEntriesRestored"; String messageTravelEntryArchived = "messageTravelEntryArchived"; String messageTravelEntryDearchived = "messageTravelEntryDearchived"; @@ -1435,7 +1419,6 @@ public interface Strings { String messageVaccinationNotRelevantForEventParticipant = "messageVaccinationNotRelevantForEventParticipant"; String messageVaccinationOutsideJurisdictionDeletionDenied = "messageVaccinationOutsideJurisdictionDeletionDenied"; String messageVisitsDeleted = "messageVisitsDeleted"; - String messageVisitsNotDeleted = "messageVisitsNotDeleted"; String messageWrongFileType = "messageWrongFileType"; String messageWrongTemplateFileType = "messageWrongTemplateFileType"; String min = "min"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index b006cb43ef4..6377a47bb90 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1065,8 +1065,8 @@ messageCaseSavedClassificationChanged = Case saved. The classification was autom messageCaseTransfered = Case has been transfered to another facility #check if these messages are still neccessary, if not delete them -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored messageContactsRestored = All selected contacts have been restored From d7515f40bfd941b2a6d081417a74faed78483c3a Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 21 Aug 2023 19:58:52 +0300 Subject: [PATCH 036/144] #12257 - link event to contacts related changes --- .../de/symeda/sormas/api/i18n/Strings.java | 2 ++ .../src/main/resources/strings.properties | 8 ++--- .../sormas/ui/events/EventController.java | 32 ++++++++----------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index f5fef1505a2..b9ac81818d5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -462,6 +462,7 @@ public interface Strings { String headingContactsInQuarantine = "headingContactsInQuarantine"; String headingContactsLostToFollowUp = "headingContactsLostToFollowUp"; String headingContactsNotDeleted = "headingContactsNotDeleted"; + String headingContactsNotLinked = "headingContactsNotLinked"; String headingContactsNotRestored = "headingContactsNotRestored"; String headingContactsPerCase = "headingContactsPerCase"; String headingContactsPlacedInQuarantine = "headingContactsPlacedInQuarantine"; @@ -1130,6 +1131,7 @@ public interface Strings { String messageCountContactsNotDeleted = "messageCountContactsNotDeleted"; String messageCountContactsNotDeletedAccessDeniedReason = "messageCountContactsNotDeletedAccessDeniedReason"; String messageCountContactsNotDeletedSormasToSormasReason = "messageCountContactsNotDeletedSormasToSormasReason"; + String messageCountContactsNotLinkableAccessDeniedReason = "messageCountContactsNotLinkableAccessDeniedReason"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; String messageCountEntitiesNotArchived = "messageCountEntitiesNotArchived"; String messageCountEntitiesNotArchivedAccessDeniedReason = "messageCountEntitiesNotArchivedAccessDeniedReason"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 6377a47bb90..07a01636f48 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -463,6 +463,7 @@ headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked headingContactsNotRestored = = None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry @@ -830,7 +831,7 @@ immunizationVaccinationHeading = Vaccination immunizationRecoveryHeading = Recovery headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress -headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event +headingSomeContactsAlreadyInEvent = Some contacts are already linked headingEnvironmentJurisdictionUpdated = Environment location update # Info texts @@ -1063,8 +1064,6 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility - -#check if these messages are still neccessary, if not delete them messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. @@ -1101,7 +1100,7 @@ messageContactDuplicateDeleted = The duplicate contact has been deleted. messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. -messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountContactsAlreadyInEvent = %s contacts were already linked to the event messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1155,6 +1154,7 @@ messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restore messageCountContactsNotDeleted = %s contacts not deleted: %s messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned: %s messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s messageCountFollowUpsNotCancelled = %s contacts' follow-up not cancelled: %s messageCountFollowUpsNotCancelledAccessDeniedReason = %s contacts' follow-up not cancelled because the contact is not editable anymore or is outside the user's jurisdiction: %s diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index 8d4782313c7..6cbc9b29d00 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -352,47 +352,41 @@ private void linkContactsToEvent(EventReferenceDto eventReferenceDto, List( Strings.messageAllContactsLinkedToEvent, null, Strings.headingSomeContactsAlreadyInEvent, - null, + Strings.headingContactsNotLinked, Strings.messageCountContactsAlreadyInEvent, null, null, - null, + Strings.messageCountContactsNotLinkableAccessDeniedReason, Strings.messageAllContactsAlreadyInEvent, - null, - null).doBulkOperation(batch -> { - //TODO: check if contacts or events should be passed here - List processedEvents = new ArrayList<>(); - + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { + List processedContacts = new ArrayList<>(); batch.forEach(contactDataDto -> { EventParticipantDto ep = EventParticipantDto.buildFromPerson(personByUuid.get(contactDataDto.getPerson().getUuid()), eventReferenceDto, currentUser); try { FacadeProvider.getEventParticipantFacade().save(ep); - processedEvents.add(new ProcessedEntity(eventReferenceDto.getUuid(), ProcessedEntityStatus.SUCCESS)); + processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (AccessDeniedException e) { - processedEvents.add(new ProcessedEntity(eventReferenceDto.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); logger.error( - "The event participant of the event with uuid {} could not be linked due to an AccessDeniedException", - eventReferenceDto.getUuid(), + "The event participant for contact with uuid {} could not be saved due to an AccessDeniedException", + contactDataDto.getUuid(), e); } catch (Exception e) { - processedEvents.add(new ProcessedEntity(eventReferenceDto.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error( - "The event participant of the event with uuid {} could not be linked due to an Exception", - eventReferenceDto.getUuid(), + "The event participant for contact with uuid {} could not be saved due to an Exception", + contactDataDto.getUuid(), e); } - }); - return processedEvents; + return processedContacts; }, new ArrayList<>(contacts), new ArrayList<>(contactByPersonUuid.values()), alreadyLinkedContacts, callback); } From 64592dbf355f9b95f22733c0c49e3f16b76b2009 Mon Sep 17 00:00:00 2001 From: Razvan Date: Tue, 22 Aug 2023 14:33:05 +0300 Subject: [PATCH 037/144] SORQA-1053 :added code to print accessed xml --- .../java/org/sormas/e2etests/helpers/parsers/XMLParser.java | 5 +++++ .../e2etests/steps/web/application/survnet/SurvNetSteps.java | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java index 10b05630880..d9c5c990ede 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java @@ -31,4 +31,9 @@ public static Document findDocumentByName( SAXBuilder saxBuilder = new SAXBuilder(); return saxBuilder.build(file); } + + @SneakyThrows + public static void printDocumentContent(Document document) { + System.out.println(document.getDocument().getContent().get(0).getValue()); + } } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 7ddadc77645..297d146ca73 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -776,7 +776,8 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "/srv/dockerdata/jenkins_new/sormas-files/case_" + externalUUID.get(0).substring(1, 37) + ".xml"); - log.info("Opened XML -> {}", singleXmlFile); + log.info("Print Opened XML"); + XMLParser.printDocumentContent(singleXmlFile); }); And( From 30329c144769ce09231be688a7aac71253ef208f Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 22 Aug 2023 20:47:08 +0300 Subject: [PATCH 038/144] #12257 - link event to event groups changes --- .../sormas/api/event/EventGroupFacade.java | 7 +- .../de/symeda/sormas/api/i18n/Strings.java | 5 ++ .../src/main/resources/strings.properties | 7 +- .../backend/event/EventGroupFacadeEjb.java | 87 ++++++++++++++----- .../ui/events/EventGroupController.java | 62 ++++++------- .../sormas/ui/utils/BulkOperationHandler.java | 12 +-- 6 files changed, 112 insertions(+), 68 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupFacade.java index 3e9d1ae96a1..90e8f5ca389 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupFacade.java @@ -25,6 +25,7 @@ import javax.validation.constraints.NotNull; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.SortProperty; @@ -59,7 +60,7 @@ Page getIndexPage( void linkEventsToGroup(List eventReferences, EventGroupReferenceDto eventGroupReference); - void linkEventsToGroups(List eventUuids, List eventGroupReferences); + List linkEventsToGroups(List eventUuids, List eventGroupReferences); void unlinkEventGroup(EventReferenceDto eventReference, EventGroupReferenceDto eventGroupReference); @@ -76,4 +77,8 @@ Page getIndexPage( void notifyEventAddedToEventGroup(String eventGroupUuid, Set eventUuids); void notifyEventRemovedFromEventGroup(EventGroupReferenceDto eventGroupReference, List eventReferences); + + List getEligibleEventUuidsToBeLinkedToGroup(List eventUuids, List ineligibleEventUuids); + + List getIneligibleEventUuidsToBeLinkedToGroup(List eventUuids, List eventGroupUuids); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index b9ac81818d5..75098596c1e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -569,6 +569,7 @@ public interface Strings { String headingEventParticipantsNotRestored = "headingEventParticipantsNotRestored"; String headingEventParticipantsRestored = "headingEventParticipantsRestored"; String headingEventsDeleted = "headingEventsDeleted"; + String headingEventsNotLinked = "headingEventsNotLinked"; String headingEventsNotDeleted = "headingEventsNotDeleted"; String headingEventsNotRestored = "headingEventsNotRestored"; String headingEventsRestored = "headingEventsRestored"; @@ -749,6 +750,7 @@ public interface Strings { String headingSomeEntitiesNotDeleted = "headingSomeEntitiesNotDeleted"; String headingSomeEntitiesNotEdited = "headingSomeEntitiesNotEdited"; String headingSomeEventParticipantsNotRestored = "headingSomeEventParticipantsNotRestored"; + String headingSomeEventsNotLinked = "headingSomeEventsNotLinked"; String headingSomeEventsNotRestored = "headingSomeEventsNotRestored"; String headingSomeFollowUpsNotCancelled = "headingSomeFollowUpsNotCancelled"; String headingSomeFollowUpsNotSetToLost = "headingSomeFollowUpsNotSetToLost"; @@ -1039,6 +1041,7 @@ public interface Strings { String messageAllContactsLinkedToEvent = "messageAllContactsLinkedToEvent"; String messageAllEntitiesArchived = "messageAllEntitiesArchived"; String messageAllEntitiesDearchived = "messageAllEntitiesDearchived"; + String messageAllEventsAlreadyLinkedToGroup = "messageAllEventsAlreadyLinkedToGroup"; String messageAlreadyEventParticipant = "messageAlreadyEventParticipant"; String messageAnimalContactsHint = "messageAnimalContactsHint"; String messageArchiveUndoneReasonMandatory = "messageArchiveUndoneReasonMandatory"; @@ -1151,6 +1154,8 @@ public interface Strings { String messageCountEventsNotDeletedAccessDeniedReason = "messageCountEventsNotDeletedAccessDeniedReason"; String messageCountEventsNotDeletedExternalReason = "messageCountEventsNotDeletedExternalReason"; String messageCountEventsNotDeletedSormasToSormasReason = "messageCountEventsNotDeletedSormasToSormasReason"; + String messageCountEventsNotLinked = "messageCountEventsNotLinked"; + String messageCountEventsNotLinkedAccessDeniedReason = "messageCountEventsNotLinkedAccessDeniedReason"; String messageCountEventsNotRestored = "messageCountEventsNotRestored"; String messageCountExternalMessagesNotDeleted = "messageCountExternalMessagesNotDeleted"; String messageCountFollowUpsNotCancelled = "messageCountFollowUpsNotCancelled"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 07a01636f48..24e35a556f3 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -547,6 +547,7 @@ headingEventParticipantsNotRestored = None of the event participants were restor headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked headingEventsNotDeleted = None of the events were deleted headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed @@ -743,6 +744,7 @@ headingSomeEntitiesNotArchived= Some entities were not archived headingSomeEntitiesNotDearchived = Some entities were not dearchived headingSomeEntitiesNotDeleted= Some entities were not deleted headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEventsNotLinked = Some events were not linked headingSomeEventsNotRestored = Some events were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored @@ -1120,7 +1122,7 @@ messageEventGroupCreated = New event group created messageEventLinkedAsSuperordinate = The selected event was successfully linked to this event as its superordinate event messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group -messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group +messageEventsLinkedToGroup = The selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1171,6 +1173,8 @@ messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to t messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed: %s messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed: %s messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because is not allowed to link events from another region to an event group.: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted: %s messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned: %s @@ -1429,6 +1433,7 @@ messageUserRoleHasNoRights = This user role has no rights. Please select at leas messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived messageAllEntitiesDearchived = All selected entries have been dearchived +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java index fddddf3e352..b1f847582ef 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java @@ -55,6 +55,8 @@ import com.google.common.collect.Sets; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.event.EventGroupCriteria; import de.symeda.sormas.api.event.EventGroupDto; import de.symeda.sormas.api.event.EventGroupFacade; @@ -367,9 +369,9 @@ public void linkEventToGroups(EventReferenceDto eventReference, List eventUuids, List eventGroupUuids) { + public List linkEventsToGroups(List eventUuids, List eventGroupUuids) { if (CollectionUtils.isEmpty(eventGroupUuids) || CollectionUtils.isEmpty(eventUuids)) { - return; + return new ArrayList<>(); } List events = eventService.getByUuids(eventUuids); @@ -377,30 +379,34 @@ public void linkEventsToGroups(List eventUuids, List eventGroupU User currentUser = userService.getCurrentUser(); + List processedEvents = new ArrayList<>(); for (Event event : events) { - final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); - if (!eventFacade.isInJurisdictionOrOwned(event.getUuid()) && (jurisdictionLevel != JurisdictionLevel.NATION) && !currentUser.isAdmin()) { - throw new AccessDeniedException( - "User " + currentUser.getUuid() + " is not allowed to link events from another region to an event group."); - } - - // Check that the event group is not already related to this event - List filteredEventGroups = eventGroups; - if (eventGroups == null) { - filteredEventGroups = Collections.emptyList(); + try { + linkEventToGroup(event, currentUser, eventGroups); + processedEvents.add(new ProcessedEntity(event.getUuid(), ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEvents.add(new ProcessedEntity(event.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The event with uuid {} could not be linked due to an AccessDeniedException", event.getUuid(), e); + } catch (Exception e) { + processedEvents.add(new ProcessedEntity(event.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The event with uuid {} could not be linked due to an AccessDeniedException", event.getUuid(), e); } + } + return processedEvents; + } - if (event.getEventGroups() != null) { - Set alreadyRelatedUuids = event.getEventGroups().stream().map(EventGroup::getUuid).collect(Collectors.toSet()); - filteredEventGroups = filteredEventGroups.stream() - .filter(eventGroup -> !alreadyRelatedUuids.contains(eventGroup.getUuid())) - .collect(Collectors.toList()); - } + public void linkEventToGroup(Event event, User currentUser, List eventGroups) { + final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); + if (!eventFacade.isInJurisdictionOrOwned(event.getUuid()) && (jurisdictionLevel != JurisdictionLevel.NATION) && !currentUser.isAdmin()) { + throw new AccessDeniedException( + "User " + currentUser.getUuid() + " is not allowed to link events from another region to an event group."); + } - if (filteredEventGroups.isEmpty()) { - continue; - } + // Check that the event group is not already related to this event + List filteredEventGroups = eventGroups != null ? eventGroups : Collections.emptyList(); + filteredEventGroups = getFilteredEventGroups(event, filteredEventGroups); + if (!filteredEventGroups.isEmpty()) { List groups = new ArrayList<>(); if (event.getEventGroups() != null) { groups.addAll(event.getEventGroups()); @@ -412,6 +418,45 @@ public void linkEventsToGroups(List eventUuids, List eventGroupU } } + public List getEligibleEventUuidsToBeLinkedToGroup(List eventUuids, List ineligibleEventUuids) { + List eligibleEventUuids = ineligibleEventUuids.size() > 0 + ? eventUuids.stream().filter(uuid -> !ineligibleEventUuids.contains(uuid)).collect(Collectors.toCollection(ArrayList::new)) + : eventUuids; + + List eligibleEventReferences = new ArrayList<>(); + eligibleEventUuids.forEach(uuid -> eligibleEventReferences.add(new EventReferenceDto(uuid))); + + return eligibleEventReferences; + } + + public List getIneligibleEventUuidsToBeLinkedToGroup(List eventUuids, List eventGroupUuids) { + List events = eventService.getByUuids(eventUuids); + List eventGroups = eventGroupService.getByUuids(eventGroupUuids); + + List filteredEventGroups; + List inEligibleEventReferences = new ArrayList<>(); + for (Event event : events) { + filteredEventGroups = getFilteredEventGroups(event, eventGroups); + if (filteredEventGroups.isEmpty()) { + inEligibleEventReferences.add(new EventReferenceDto(event.getUuid())); + } + } + return inEligibleEventReferences; + } + + public List getFilteredEventGroups(Event event, List eventGroups) { + List filteredEventGroups = eventGroups != null ? eventGroups : Collections.emptyList(); + + // Check that the event group is not already related to this event + if (event.getEventGroups() != null) { + Set alreadyRelatedUuids = event.getEventGroups().stream().map(EventGroup::getUuid).collect(Collectors.toSet()); + filteredEventGroups = + filteredEventGroups.stream().filter(eventGroup -> !alreadyRelatedUuids.contains(eventGroup.getUuid())).collect(Collectors.toList()); + } + + return filteredEventGroups; + } + @Override @RightsAllowed(UserRight._EVENTGROUP_LINK) public void unlinkEventGroup(EventReferenceDto eventReference, EventGroupReferenceDto eventGroupReference) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java index 37c3cf64cf2..8b1b3129daf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java @@ -39,7 +39,6 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.common.progress.ProcessedEntity; -import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventGroupCriteria; import de.symeda.sormas.api.event.EventGroupDto; @@ -53,7 +52,6 @@ import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SormasUI; @@ -75,46 +73,38 @@ private void linkEventsToGroup( EventGroupReferenceDto eventGroupReference, Consumer> callback) { + List eventUuids = eventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); + List eventGroupUuids = Collections.singletonList(eventGroupReference.getUuid()); + + List alreadyLinkedEventsToGroup = + FacadeProvider.getEventGroupFacade().getIneligibleEventUuidsToBeLinkedToGroup(eventUuids, eventGroupUuids); + List eligibleEventReferences = FacadeProvider.getEventGroupFacade() + .getEligibleEventUuidsToBeLinkedToGroup( + eventUuids, + alreadyLinkedEventsToGroup.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList())); + String messageEventsLinkedToGroup = eventReferences.size() > 1 ? Strings.messageEventsLinkedToGroup : Strings.messageEventLinkedToGroup; - //TODO: check newly added message: headingNoProcessedEntities, countEntriesNotProcessedExternalReasonProperty, countEntriesNotProcessedSormastoSormasReasonProperty, - //countEntriesNotProcessedAccessDeniedReasonProperty, infoBulkProcessFinishedWithSkipsProperty - //messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group new BulkOperationHandler( messageEventsLinkedToGroup, null, + Strings.headingSomeEventsNotLinked, + Strings.headingEventsNotLinked, + Strings.messageCountEventsNotLinked, null, null, - null, - null, - null, - null, - null, - null, - null).doBulkOperation(batch -> { - List processedEventGroups = new ArrayList<>(); - //TODO: fill the items which are not eligible with a progressStatus (from below the below if) - try { - FacadeProvider.getEventGroupFacade() - .linkEventsToGroups( - batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()), - Collections.singletonList(eventGroupReference.getUuid())); - - FacadeProvider.getEventGroupFacade() - .notifyEventAddedToEventGroup( - eventGroupReference.getUuid(), - batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); - processedEventGroups.add(new ProcessedEntity(eventGroupReference.getUuid(), ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedEventGroups.add(new ProcessedEntity(eventGroupReference.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - logger - .error("The event group with uuid {} could not be linked due to an AccessDeniedException", eventGroupReference.getUuid(), e); - } catch (Exception e) { - processedEventGroups.add(new ProcessedEntity(eventGroupReference.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - logger - .error("The event group with uuid {} could not be linked due to an AccessDeniedException", eventGroupReference.getUuid(), e); - } - return processedEventGroups; - }, new ArrayList<>(eventReferences), null, null, callback); + Strings.messageCountEventsNotLinkedAccessDeniedReason, + Strings.messageAllEventsAlreadyLinkedToGroup, + Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { + + List eligibleEventUuids = eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); + List processedEvents = FacadeProvider.getEventGroupFacade().linkEventsToGroups(eligibleEventUuids, eventGroupUuids); + FacadeProvider.getEventGroupFacade() + .notifyEventAddedToEventGroup( + eventGroupReference.getUuid(), + batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); + return processedEvents; + }, new ArrayList<>(eventReferences), new ArrayList<>(eligibleEventReferences), new ArrayList<>(alreadyLinkedEventsToGroup), callback); } public void create(EventReferenceDto eventReference) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index a3691b72ae4..c30022eb3ab 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -269,15 +269,9 @@ public void processEntriesWithoutProgressBar( processedEntities = areIneligibleEntriesSelected ? bulkOperationFunction.apply(selectedEligibleEntries) : bulkOperationFunction.apply(selectedEntries); - //If the user does not have the proper rights to perform the action, there will be no processed entities - if (processedEntities.size() == 0) { - NotificationHelper.showNotification(I18nProperties.getString(Strings.errorForbidden), Notification.Type.WARNING_MESSAGE, -1); - return; - } else { - successfulEntryCount = (int) processedEntities.stream() - .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) - .count(); - } + successfulEntryCount = (int) processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .count(); } if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { From 75394d7010fc0c41451c76c8e95b3affdd68dac9 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 23 Aug 2023 00:38:24 +0300 Subject: [PATCH 039/144] #12257 - bugfixes --- .../main/java/de/symeda/sormas/api/i18n/Strings.java | 2 +- .../sormas/backend/event/EventGroupFacadeEjb.java | 3 +-- .../symeda/sormas/ui/events/EventGroupController.java | 11 +++++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 75098596c1e..f127a48472f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -569,8 +569,8 @@ public interface Strings { String headingEventParticipantsNotRestored = "headingEventParticipantsNotRestored"; String headingEventParticipantsRestored = "headingEventParticipantsRestored"; String headingEventsDeleted = "headingEventsDeleted"; - String headingEventsNotLinked = "headingEventsNotLinked"; String headingEventsNotDeleted = "headingEventsNotDeleted"; + String headingEventsNotLinked = "headingEventsNotLinked"; String headingEventsNotRestored = "headingEventsNotRestored"; String headingEventsRestored = "headingEventsRestored"; String headingExplanationOfTerms = "headingExplanationOfTerms"; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java index b1f847582ef..92e4c734f17 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java @@ -403,8 +403,7 @@ public void linkEventToGroup(Event event, User currentUser, List eve } // Check that the event group is not already related to this event - List filteredEventGroups = eventGroups != null ? eventGroups : Collections.emptyList(); - filteredEventGroups = getFilteredEventGroups(event, filteredEventGroups); + List filteredEventGroups = getFilteredEventGroups(event, eventGroups); if (!filteredEventGroups.isEmpty()) { List groups = new ArrayList<>(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java index 8b1b3129daf..5511c004909 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java @@ -98,11 +98,18 @@ private void linkEventsToGroup( Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List eligibleEventUuids = eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); - List processedEvents = FacadeProvider.getEventGroupFacade().linkEventsToGroups(eligibleEventUuids, eventGroupUuids); + List eligibleEventUuidsFromBatch = batch.stream() + .filter(eventReference -> eligibleEventUuids.contains(eventReference.getUuid())) + .map(EventReferenceDto::getUuid) + .collect(Collectors.toList()); + eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); + + List processedEvents = + FacadeProvider.getEventGroupFacade().linkEventsToGroups(eligibleEventUuidsFromBatch, eventGroupUuids); FacadeProvider.getEventGroupFacade() .notifyEventAddedToEventGroup( eventGroupReference.getUuid(), - batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); + eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); return processedEvents; }, new ArrayList<>(eventReferences), new ArrayList<>(eligibleEventReferences), new ArrayList<>(alreadyLinkedEventsToGroup), callback); } From 5d50560a71feb400440cf8dcc3276eb5b835d1bc Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 23 Aug 2023 01:06:40 +0300 Subject: [PATCH 040/144] #12257 - fix compilation errors after merging with development --- .../EnvironmentSampleFacadeEjb.java | 20 +++++++++++-------- .../EnvironmentSampleFacadeEjbTest.java | 18 +++++++++++++++-- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java index 824fa2b5b28..8cf7ed94600 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java @@ -36,6 +36,8 @@ import org.slf4j.LoggerFactory; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.environment.EnvironmentReferenceDto; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; @@ -191,21 +193,22 @@ private void delete(EnvironmentSample sample, DeletionDetails deletionDetails) { @Override @RightsAllowed(UserRight._ENVIRONMENT_SAMPLE_DELETE) - public List delete(List uuids, DeletionDetails deletionDetails) { - List deletedUuids = new ArrayList<>(); + public List delete(List uuids, DeletionDetails deletionDetails) { + List processedSamples = new ArrayList<>(); List samplesToDelete = service.getByUuids(uuids); if (samplesToDelete != null) { samplesToDelete.stream().filter(not(EnvironmentSample::isDeleted)).forEach(sample -> { try { delete(sample.getUuid(), deletionDetails); - deletedUuids.add(sample.getUuid()); + processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { + processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The environment sample with uuid: {} could not be deleted", sample.getUuid(), e); } }); } - return deletedUuids; + return processedSamples; } @Override @@ -221,21 +224,22 @@ private void restore(EnvironmentSample sample) { @Override @RightsAllowed(UserRight._ENVIRONMENT_SAMPLE_DELETE) - public List restore(List uuids) { - List restoredUuids = new ArrayList<>(); + public List restore(List uuids) { + List processedSamples = new ArrayList<>(); List samplesToRestore = service.getByUuids(uuids); if (samplesToRestore != null) { samplesToRestore.stream().filter(EnvironmentSample::isDeleted).forEach(sample -> { try { restore(sample); - restoredUuids.add(sample.getUuid()); + processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { + processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The sample with uuid: {} could not be restored", sample.getUuid(), e); } }); } - return restoredUuids; + return processedSamples; } @Override diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java index f398524834c..88ebec5fe25 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java @@ -28,11 +28,14 @@ import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.environment.EnvironmentDto; import de.symeda.sormas.api.environment.EnvironmentMedia; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; @@ -414,9 +417,14 @@ public void testDelete() { creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), null); getEnvironmentSampleFacade().delete(deletedSample.getUuid(), new DeletionDetails(DeletionReason.OTHER_REASON, "Test reason")); - List deletedUuids = getEnvironmentSampleFacade().delete( + List processedEntities = getEnvironmentSampleFacade().delete( Arrays.asList(deletedSample.getUuid(), sample1.getUuid(), sample2.getUuid()), new DeletionDetails(DeletionReason.OTHER_REASON, "Test reason")); + List deletedUuids = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); + assertThat(deletedUuids, not(containsInAnyOrder(deletedSample.getUuid()))); assertThat(deletedUuids, containsInAnyOrder(sample1.getUuid(), sample2.getUuid())); @@ -444,7 +452,13 @@ public void testRestore() { getEnvironmentSampleFacade() .delete(Arrays.asList(sample1.getUuid(), sample2.getUuid()), new DeletionDetails(DeletionReason.OTHER_REASON, "Test reason")); - List restoredUuids = getEnvironmentSampleFacade().restore(Arrays.asList(sample.getUuid(), sample1.getUuid(), sample2.getUuid())); + List processedEntities = + getEnvironmentSampleFacade().restore(Arrays.asList(sample.getUuid(), sample1.getUuid(), sample2.getUuid())); + List restoredUuids = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); + assertThat(restoredUuids, not(containsInAnyOrder(sample.getUuid()))); assertThat(restoredUuids, containsInAnyOrder(sample1.getUuid(), sample2.getUuid())); From f64ed6778471af5a9e1ff0c2f0087186aedf7f5a Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 23 Aug 2023 01:31:10 +0300 Subject: [PATCH 041/144] #12257 - fixes --- .../symeda/sormas/backend/caze/CaseFacadeEjb.java | 13 +------------ .../de/symeda/sormas/backend/caze/CaseService.java | 1 - .../sormas/backend/caze/CaseFacadeEjbTest.java | 13 +++++++++---- .../sormas/ui/utils/DeleteRestoreMessages.java | 1 - 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index abeb3f9629c..c0f7ad02d6d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2762,28 +2762,17 @@ public void deleteWithContacts(String caseUuid, DeletionDetails deletionDetails) private void deleteCase(Case caze, DeletionDetails deletionDetails) throws ExternalSurveillanceToolRuntimeException, SormasToSormasRuntimeException, AccessDeniedException { - //TODO: test this one if (!caseService.inJurisdictionOrOwned(caze)) { throw new AccessDeniedException(I18nProperties.getString(Strings.messageCaseOutsideJurisdictionDeletionDenied)); } externalJournalService.handleExternalJournalPersonUpdateAsync(caze.getPerson().toReference()); - //just for testing try { - if (caze.getUuid().equals("FHUY7T-TDIBAJ-BCOUS4-XFNJDPOQ")) { - throw SormasToSormasException.fromStringProperty(Strings.errorSormasToSormasRequestProcessed); - } + sormasToSormasFacade.revokePendingShareRequests(caze.getSormasToSormasShares(), true); } catch (SormasToSormasException e) { throw new SormasToSormasRuntimeException(e); } - /* - * try { - * sormasToSormasFacade.revokePendingShareRequests(caze.getSormasToSormasShares(), true); - * } catch (SormasToSormasException e) { - * throw new SormasToSormasRuntimeException(e); - * } - */ service.delete(caze, deletionDetails); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 52325d2ec92..18327ceb449 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -1135,7 +1135,6 @@ public List archive(List entityUuids) { return processedCases; } - //TODO: test archive and dearchive, for bulk and single cases for Events with/without Survnet failure -> test the other entities too @Override public List dearchive(List entityUuids, String dearchiveReason) { List processedCases = preprocessCases(entityUuids, false); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java index 5ff913e9a2a..9ff32cc896d 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java @@ -94,6 +94,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactReferenceDto; @@ -2821,7 +2822,6 @@ public void testDeleteWithContacts() { assertEquals("test reason", getCaseFacade().getByUuid(caze.getUuid()).getOtherDeletionReason()); } - //TODO: fix this one @Test public void testDeleteCasesOutsideJurisdiction() { @@ -2839,10 +2839,15 @@ public void testDeleteCasesOutsideJurisdiction() { loginWith(surveillanceOfficer); - List deleteUuids = getCaseFacade().delete(caseUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); + List processedEntities = + getCaseFacade().delete(caseUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); + List deletedUuids = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); - assertEquals(1, deleteUuids.size()); - assertEquals(caze1.getUuid(), deleteUuids.get(0).getEntityUuid()); + assertEquals(1, deletedUuids.size()); + assertEquals(caze1.getUuid(), deletedUuids.get(0)); loginWith(nationalUser); getCaseFacade().delete(caseUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index 726c5d7474c..1cf8f12e1ba 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -16,7 +16,6 @@ public enum DeleteRestoreMessages { Strings.messageCountCasesNotDeletedSormasToSormasReason, Strings.messageCountCasesNotDeletedAccessDeniedReason, null, - //TODO: change the next message and headingCasesNotDeleted to general ones as we have for archive Strings.messageCountCasesNotDeleted, Strings.headingCasesRestored, Strings.messageCasesRestored, From 9b7d335ebb7610a920171242c7fd046155fe52a8 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 23 Aug 2023 10:19:00 +0300 Subject: [PATCH 042/144] #12257 - fixing the failing unit tests --- .../sormas/backend/event/EventGroupFacadeEjb.java | 1 + .../backend/contact/ContactFacadeEjbTest.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java index 92e4c734f17..598158abaed 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java @@ -395,6 +395,7 @@ public List linkEventsToGroups(List eventUuids, List eventGroups) { final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); if (!eventFacade.isInJurisdictionOrOwned(event.getUuid()) && (jurisdictionLevel != JurisdictionLevel.NATION) && !currentUser.isAdmin()) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java index 9a473d97809..789c4dbe697 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java @@ -61,6 +61,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactClassification; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactDto; @@ -332,7 +333,6 @@ public void testContactFollowUpStatusCanceledWhenContactConvertedToCase() { assertEquals(FollowUpStatus.CANCELED, contact.getFollowUpStatus()); } - //TODO: fix this tests @Test public void testDeleteContactsOutsideJurisdiction() { RDCF rdcf = creator.createRDCF(); @@ -363,10 +363,15 @@ public void testDeleteContactsOutsideJurisdiction() { UserDto user = creator.createSurveillanceOfficer(rdcf1); loginWith(user); - List deleteUuids = + List processedEntities = getContactFacade().delete(contactUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); - assertEquals(1, deleteUuids.size()); - assertEquals(contact1.getUuid(), deleteUuids.get(0).getEntityUuid()); + List deletedUuids = processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); + + assertEquals(1, deletedUuids.size()); + assertEquals(contact1.getUuid(), deletedUuids.get(0)); loginWith(creatorUser); getContactFacade().delete(contactUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); From 8b1f4af28513c6bf1472364d42db0f06d3947b18 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 23 Aug 2023 10:23:44 +0300 Subject: [PATCH 043/144] #12257 - change back the batch size and the bulk action threshold --- .../java/de/symeda/sormas/ui/utils/BulkOperationHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index c30022eb3ab..40242cb06d3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -38,12 +38,11 @@ public class BulkOperationHandler { * Amount of DTOs that are forwarded to the backend in one single call * when displaying a progress layout. */ - //TODO: change back this - public static final int BULK_ACTION_BATCH_SIZE = 5; + public static final int BULK_ACTION_BATCH_SIZE = 20; /** * Amount of DTOs that have to be selected for the progress layout to be displayed. */ - public static final int BULK_ACTION_PROGRESS_THRESHOLD = 10; + public static final int BULK_ACTION_PROGRESS_THRESHOLD = 40; private boolean cancelAfterCurrentBatch; private boolean cancelButtonClicked; private final Lock cancelLock = new ReentrantLock(); From e718263e2673c141643e2b883d30dbb77cada775 Mon Sep 17 00:00:00 2001 From: Razvan Date: Wed, 23 Aug 2023 10:50:34 +0300 Subject: [PATCH 044/144] SORQA-1053 :added code to print files from dockerdata --- .../steps/web/application/survnet/SurvNetSteps.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 297d146ca73..58693ca66df 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -23,6 +23,8 @@ import static org.sormas.e2etests.steps.web.application.vaccination.CreateNewVaccinationSteps.vaccination; import cucumber.api.java8.En; + +import java.io.File; import java.time.LocalDate; import java.time.Period; import java.time.format.DateTimeFormatter; @@ -776,6 +778,12 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "/srv/dockerdata/jenkins_new/sormas-files/case_" + externalUUID.get(0).substring(1, 37) + ".xml"); + System.out.println("Printing files from dockerdata"); + File folder = new File("/srv/dockerdata/jenkins_new/sormas-files"); + File[] listOfFiles = folder.listFiles(); + for(File file : listOfFiles){ + System.out.println(file.getName()); + } log.info("Print Opened XML"); XMLParser.printDocumentContent(singleXmlFile); }); From 11e66c18a8dd8f26ae1251477d79325cf200e58b Mon Sep 17 00:00:00 2001 From: Razvan Date: Wed, 23 Aug 2023 18:42:29 +0300 Subject: [PATCH 045/144] SORQA-1053 :added code to print files from dockerdata --- .../steps/web/application/survnet/SurvNetSteps.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 58693ca66df..f37b20e5c44 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -32,6 +32,7 @@ import java.util.List; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; import org.jdom2.Attribute; import org.jdom2.DataConversionException; import org.jdom2.Document; @@ -773,17 +774,19 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { And( "^I open SORMAS generated XML file for single case message$", () -> { + String uuid = externalUUID.get(0).substring(1, 37); + System.out.println("Searching for UUID -> " + uuid); singleXmlFile = XMLParser.getDocument( "/srv/dockerdata/jenkins_new/sormas-files/case_" + externalUUID.get(0).substring(1, 37) + ".xml"); + System.out.println("Copy XML file to project !"); + FileUtils.copyFile(new File("/srv/dockerdata/jenkins_new/sormas-files/case_" + + externalUUID.get(0).substring(1, 37) + + ".xml"), + new File("sormas-e2e-tests/target")); System.out.println("Printing files from dockerdata"); - File folder = new File("/srv/dockerdata/jenkins_new/sormas-files"); - File[] listOfFiles = folder.listFiles(); - for(File file : listOfFiles){ - System.out.println(file.getName()); - } log.info("Print Opened XML"); XMLParser.printDocumentContent(singleXmlFile); }); From 24e7bc643bb1bf895781412a9dcc5cabaf11b677 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 24 Aug 2023 23:10:27 +0300 Subject: [PATCH 046/144] #12257 - refactorings after review, part1 --- .../java/de/symeda/sormas/ui/utils/ArchiveHandlers.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index 3e3fb6adc6b..3a87609df79 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -36,6 +36,7 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseFacade; import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactFacade; import de.symeda.sormas.api.environment.EnvironmentDto; @@ -314,12 +315,15 @@ public void archive(String entityUuid) { @Override public List dearchive(String entityUuid) { + List processedEntities = new ArrayList<>(); + try { - super.dearchive(entityUuid); + processedEntities = super.dearchive(entityUuid); } catch (AccessDeniedException e) { + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); } - return new ArrayList<>(); + return processedEntities; } @Override From c5f05c427db6677399ab5f2610f0dcc02445ed0a Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 24 Aug 2023 23:19:45 +0300 Subject: [PATCH 047/144] #12257 - refactorings after review --- .../java/de/symeda/sormas/api/CoreFacade.java | 7 - .../ExternalSurveillanceToolFacade.java | 5 +- .../de/symeda/sormas/api/i18n/Strings.java | 24 ++-- .../src/main/resources/strings.properties | 44 +++--- .../backend/campaign/CampaignFacadeEjb.java | 6 +- .../sormas/backend/caze/CaseFacadeEjb.java | 87 ++++++----- .../sormas/backend/caze/CaseService.java | 10 +- .../common/AbstractCoreAdoService.java | 29 +--- .../backend/common/AbstractCoreFacadeEjb.java | 21 --- .../backend/contact/ContactFacadeEjb.java | 81 ++++++----- .../sormas/backend/event/EventFacadeEjb.java | 49 ++++--- .../event/EventParticipantFacadeEjb.java | 30 ++-- .../ExternalMessageFacadeEjb.java | 18 +-- ...ernalSurveillanceToolGatewayFacadeEjb.java | 49 +++++-- .../backend/sample/SampleFacadeEjb.java | 14 +- .../sormas/backend/sample/SampleService.java | 8 +- .../sormas/backend/task/TaskFacadeEjb.java | 33 ++--- .../sormas/backend/task/TaskService.java | 9 +- .../travelentry/TravelEntryFacadeEjb.java | 6 +- .../sormas/backend/user/UserFacadeEjb.java | 19 +-- ...lSurveillanceToolGatewayFacadeEjbTest.java | 37 +++-- .../symeda/sormas/ui/caze/CaseController.java | 9 +- .../sormas/ui/contact/ContactController.java | 74 +++------- .../sormas/ui/events/EventController.java | 46 ++---- .../events/EventParticipantsController.java | 2 - .../ExternalSurveillanceServiceGateway.java | 67 ++------- .../sormas/ui/samples/SampleController.java | 2 - .../symeda/sormas/ui/task/TaskController.java | 2 - .../ui/travelentry/TravelEntryController.java | 2 - .../symeda/sormas/ui/user/UserController.java | 4 +- .../sormas/ui/utils/ArchivingController.java | 4 - .../sormas/ui/utils/BulkOperationHandler.java | 135 +++++++----------- .../ui/utils/DeleteRestoreController.java | 9 -- .../ui/utils/PermanentDeleteController.java | 2 - 34 files changed, 411 insertions(+), 533 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java index 6e55f424155..849e8837ac0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java @@ -16,14 +16,12 @@ package de.symeda.sormas.api; import java.io.Serializable; -import java.util.Collection; import java.util.Date; import java.util.List; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; -import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; public interface CoreFacade extends BaseFacade, EditPermissionFacade, DeletableFacade { @@ -44,11 +42,6 @@ public interface CoreFacade getArchivedUuidsSince(Date since); - List buildProcessedEntities(List entityUuids, boolean archiving); - Date calculateEndOfProcessingDate(String entityUuids); - Collection getIneligibleEntitiesForEditing(Collection selectedEntities); - - Collection getEligibleEntitiesForEditing(Collection selectedCases, Collection ineligibleCases); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolFacade.java index db333959468..36051b60b9c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalsurveillancetool/ExternalSurveillanceToolFacade.java @@ -20,6 +20,7 @@ import javax.ejb.Remote; import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.event.EventDto; /** @@ -36,9 +37,9 @@ public interface ExternalSurveillanceToolFacade { * @param caseUuids * @return http response code of the gateway */ - void sendCases(List caseUuids) throws ExternalSurveillanceToolException; + List sendCases(List caseUuids); - void sendEvents(List eventUuids) throws ExternalSurveillanceToolException; + List sendEvents(List eventUuids); void createCaseShareInfo(List caseUuids); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 5967e0176a9..fbd6217884f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -599,8 +599,6 @@ public interface Strings { String headingFetchExternalMessages = "headingFetchExternalMessages"; String headingFileExists = "headingFileExists"; String headingFilters = "headingFilters"; - String headingFollowUpsNotCancelled = "headingFollowUpsNotCancelled"; - String headingFollowUpsNotSetToLost = "headingFollowUpsNotSetToLost"; String headingFollowUpStatus = "headingFollowUpStatus"; String headingGenerateCases = "headingGenerateCases"; String headingGenerateContacts = "headingGenerateContacts"; @@ -759,13 +757,13 @@ public interface Strings { String headingSomeEventParticipantsNotRestored = "headingSomeEventParticipantsNotRestored"; String headingSomeEventsNotLinked = "headingSomeEventsNotLinked"; String headingSomeEventsNotRestored = "headingSomeEventsNotRestored"; - String headingSomeFollowUpsNotCancelled = "headingSomeFollowUpsNotCancelled"; - String headingSomeFollowUpsNotSetToLost = "headingSomeFollowUpsNotSetToLost"; String headingSomeImmunizationsNotRestored = "headingSomeImmunizationsNotRestored"; String headingSomeSamplesNotRestored = "headingSomeSamplesNotRestored"; String headingSomeTravelEntriesNotRestored = "headingSomeTravelEntriesNotRestored"; String headingSomeUsersNotDisabled = "headingSomeUsersNotDisabled"; String headingSomeUsersNotEnabled = "headingSomeUsersNotEnabled"; + String headingSomeVisitsNotCancelled = "headingSomeVisitsNotCancelled"; + String headingSomeVisitsNotSetToLost = "headingSomeVisitsNotSetToLost"; String headingSormasToSormasCanAcceptContactsWithoutCase = "headingSormasToSormasCanAcceptContactsWithoutCase"; String headingSormasToSormasCantShareContactWithoutCase = "headingSormasToSormasCantShareContactWithoutCase"; String headingSormasToSormasDuplicateDetection = "headingSormasToSormasDuplicateDetection"; @@ -813,7 +811,9 @@ public interface Strings { String headingViewVisit = "headingViewVisit"; String headingVisits = "headingVisits"; String headingVisitsDeleted = "headingVisitsDeleted"; + String headingVisitsNotCancelled = "headingVisitsNotCancelled"; String headingVisitsNotDeleted = "headingVisitsNotDeleted"; + String headingVisitsNotSetToLost = "headingVisitsNotSetToLost"; String headingVisualization = "headingVisualization"; String headingWaterUse = "headingWaterUse"; String headingWrongFileType = "headingWrongFileType"; @@ -1165,10 +1165,6 @@ public interface Strings { String messageCountEventsNotLinkedAccessDeniedReason = "messageCountEventsNotLinkedAccessDeniedReason"; String messageCountEventsNotRestored = "messageCountEventsNotRestored"; String messageCountExternalMessagesNotDeleted = "messageCountExternalMessagesNotDeleted"; - String messageCountFollowUpsNotCancelled = "messageCountFollowUpsNotCancelled"; - String messageCountFollowUpsNotCancelledAccessDeniedReason = "messageCountFollowUpsNotCancelledAccessDeniedReason"; - String messageCountFollowUpsNotSetToLost = "messageCountFollowUpsNotSetToLost"; - String messageCountFollowUpsNotSetToLostAccessDeniedReason = "messageCountFollowUpsNotSetToLostAccessDeniedReason"; String messageCountImmunizationsNotDeleted = "messageCountImmunizationsNotDeleted"; String messageCountImmunizationsNotDeletedAccessDeniedReason = "messageCountImmunizationsNotDeletedAccessDeniedReason"; String messageCountImmunizationsNotRestored = "messageCountImmunizationsNotRestored"; @@ -1186,8 +1182,12 @@ public interface Strings { String messageCountTravelEntriesNotRestored = "messageCountTravelEntriesNotRestored"; String messageCountUsersNotDisabled = "messageCountUsersNotDisabled"; String messageCountUsersNotEnabled = "messageCountUsersNotEnabled"; + String messageCountVisitsNotCancelled = "messageCountVisitsNotCancelled"; + String messageCountVisitsNotCancelledAccessDeniedReason = "messageCountVisitsNotCancelledAccessDeniedReason"; String messageCountVisitsNotDeleted = "messageCountVisitsNotDeleted"; String messageCountVisitsNotDeletedAccessDeniedReason = "messageCountVisitsNotDeletedAccessDeniedReason"; + String messageCountVisitsNotSetToLost = "messageCountVisitsNotSetToLost"; + String messageCountVisitsNotSetToLostAccessDeniedReason = "messageCountVisitsNotSetToLostAccessDeniedReason"; String messageCreateCollectionTask = "messageCreateCollectionTask"; String messageDatabaseExportFailed = "messageDatabaseExportFailed"; String messageDeleteImmunizationVaccinations = "messageDeleteImmunizationVaccinations"; @@ -1266,8 +1266,6 @@ public interface Strings { String messageFacilityMulitChanged = "messageFacilityMulitChanged"; String messageFollowUpCanceled = "messageFollowUpCanceled"; String messageFollowUpStatusChanged = "messageFollowUpStatusChanged"; - String messageFollowUpsWithWrongStatusNotCancelled = "messageFollowUpsWithWrongStatusNotCancelled"; - String messageFollowUpsWithWrongStatusNotSetToLost = "messageFollowUpsWithWrongStatusNotSetToLost"; String messageForwardedExternalMessageFound = "messageForwardedExternalMessageFound"; String messageGdpr = "messageGdpr"; String messageGdprCheck = "messageGdprCheck"; @@ -1314,8 +1312,8 @@ public interface Strings { String messageNoDocumentUploadFile = "messageNoDocumentUploadFile"; String messageNoEligibleEntityForEditing = "messageNoEligibleEntityForEditing"; String messageNoEligibleEventForDeletionSelected = "messageNoEligibleEventForDeletionSelected"; - String messageNoEligibleFollowUpForCancellation = "messageNoEligibleFollowUpForCancellation"; - String messageNoEligibleFollowUpForSettingToLost = "messageNoEligibleFollowUpForSettingToLost"; + String messageNoEligibleVisitForCancellation = "messageNoEligibleVisitForCancellation"; + String messageNoEligibleVisitForSettingToLost = "messageNoEligibleVisitForSettingToLost"; String messageNoEndDate = "messageNoEndDate"; String messageNoEnvironmentsSelected = "messageNoEnvironmentsSelected"; String messageNoEventFound = "messageNoEventFound"; @@ -1434,6 +1432,8 @@ public interface Strings { String messageVaccinationNotRelevantForEventParticipant = "messageVaccinationNotRelevantForEventParticipant"; String messageVaccinationOutsideJurisdictionDeletionDenied = "messageVaccinationOutsideJurisdictionDeletionDenied"; String messageVisitsDeleted = "messageVisitsDeleted"; + String messageVisitsWithWrongStatusNotCancelled = "messageVisitsWithWrongStatusNotCancelled"; + String messageVisitsWithWrongStatusNotSetToLost = "messageVisitsWithWrongStatusNotSetToLost"; String messageWrongFileType = "messageWrongFileType"; String messageWrongTemplateFileType = "messageWrongTemplateFileType"; String min = "min"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 16b90a52883..0822bd43ab4 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -536,8 +536,6 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent -headingFollowUpsNotCancelled= None of the follow-ups were cancelled -headingFollowUpsNotSetToLost= None of the follow-ups were set to lost headingEntitiesNotArchived = None of the entities were archived headingEntitiesNotDearchived = None of the entities were dearchived headingEntitiesNotEdited = None of the entities were edited @@ -695,7 +693,9 @@ headingViewVaccination = View vaccination headingViewVisit = View visit headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -727,7 +727,7 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored -headingImmunizationsDeleted = Immunizations were deleted +headingImmunizationsDeleted = Immunizations deleted headingImmunizationsNotDeleted = None of the immunizations were deleted headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored @@ -744,8 +744,6 @@ headingNoEventFound = No event found headingEventNotDeleted = Event not deleted headingSomeCasesNotRestored = Some cases were not restored headingSomeContactsNotRestored = Some contacts were not restored -headingSomeFollowUpsNotCancelled= Some follow-ups were not cancelled -headingSomeFollowUpsNotSetToLost= Some follow-ups were not set to lost headingSomeEntitiesNotArchived= Some entities were not archived headingSomeEntitiesNotDearchived = Some entities were not dearchived headingSomeEntitiesNotDeleted= Some entities were not deleted @@ -758,6 +756,8 @@ headingSomeSamplesNotRestored = Some samples were not restored headingSomeTravelEntriesNotRestored = Some travel entries were not restored headingSomeUsersNotDisabled = Some users were not disabled headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -1150,24 +1150,18 @@ messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet - -#change everywhere this message messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed: %s messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed: %s messageCountCasesNotDeleted = %s cases not deleted: %s messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned: %s messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed: %s -messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because they were already shared with Sormas to Sormas: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s): %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored: %s messageCountContactsNotDeleted = %s contacts not deleted: %s messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned: %s -messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because they were already shared with Sormas to Sormas: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s): %s messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored: %s -messageCountFollowUpsNotCancelled = %s contacts' follow-up not cancelled: %s -messageCountFollowUpsNotCancelledAccessDeniedReason = %s contacts' follow-up not cancelled because the contact is not editable anymore or is outside the user's jurisdiction: %s -messageCountFollowUpsNotSetToLost = %s contacts' follow-up not set to lost: %s -messageCountFollowUpsNotSetToLostAccessDeniedReason = %s contacts' follow-up not set to lost because the contact is not editable anymore or is outside the user's jurisdiction: %s messageCountEntitiesNotArchived = %s entities can not be archived: %s messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data: %s messageCountEntitiesNotDearchived = %s entities can not be dearchived: %s @@ -1180,33 +1174,35 @@ messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the r messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed: %s messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed: %s messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group: %s -messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because is not allowed to link events from another region to an event group.: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted: %s messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted: %s messageCountImmunizationsNotDeleted = %s immunizations not deleted: %s -messageCountImmunizationsNotDeletedAccessDeniedReason =%s immunizations not deleted because they are not in jurisdiction or owned: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored: %s messageCountSamplesNotDeleted = %s samples not deleted: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored: %s messageCountTasksNotDeleted = %s tasks not deleted: %s -messageCountTasksNotDeletedAccessDeniedReason =%s tasks not deleted because the they are not in jurisdiction or owned: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted: %s -messageCountTravelEntriesNotDeletedAccessDeniedReason =%s travel entries not deleted because the they are not in jurisdiction or owned: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored: %s messageCountUsersNotDisabled = %s users not disabled: %s messageCountUsersNotEnabled = %s users not enabled: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction: %s messageCountVisitsNotDeleted = %s visits not deleted: %s -messageCountVisitsNotDeletedAccessDeniedReason =%s visits not deleted because they are not in jurisdiction or owned: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction: %s messageCountEventsNotDeleted = %s events not deleted: %s messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned: %s messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed: %s -messageFollowUpsWithWrongStatusNotCancelled = Contacts' follow-up with CANCELLED or NO FOLLOW-UP status can not be cancelled -messageFollowUpsWithWrongStatusNotSetToLost = Contacts' follow-up with NO FOLLOW-UP status can not be set to lost messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. -messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because they were already shared with Sormas to Sormas: %s +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s): %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved @@ -1247,8 +1243,8 @@ messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Pl messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion -messageNoEligibleFollowUpForCancellation = None of the follow-ups were eligible for cancellation -messageNoEligibleFollowUpForSettingToLost = None of the follow-ups were eligible for setting to lost +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1309,6 +1305,8 @@ messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java index 63804aaa3b5..18bc80017fb 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java @@ -422,15 +422,13 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) public List archive(List entityUuids) { - super.archive(entityUuids); - return super.buildProcessedEntities(entityUuids, true); + return super.archive(entityUuids); } @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); - return super.buildProcessedEntities(entityUuids, false); + return super.dearchive(entityUuids, dearchiveReason); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index c0f7ad02d6d..043dd7cfb09 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -1539,20 +1539,26 @@ public List saveBulkCase( List processedCases = new ArrayList<>(); for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); - - if (service.isEditAllowed(caze)) { - CaseDataDto existingCaseDto = toDto(caze); - updateCaseWithBulkData( - updatedCaseBulkEditData, - caze, - diseaseChange, - diseaseVariantChange, - classificationChange, - investigationStatusChange, - outcomeChange, - surveillanceOfficerChange); - doSave(caze, true, existingCaseDto, true); - processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); + try { + if (service.isEditAllowed(caze)) { + CaseDataDto existingCaseDto = toDto(caze); + updateCaseWithBulkData( + updatedCaseBulkEditData, + caze, + diseaseChange, + diseaseVariantChange, + classificationChange, + investigationStatusChange, + outcomeChange, + surveillanceOfficerChange); + doSave(caze, true, existingCaseDto, true); + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); + } else { + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); + } + } catch (Exception e) { + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The case with uuid {} could not be saved due to an Exception", caseUuid, e); } } @@ -1584,31 +1590,35 @@ public List saveBulkEditWithFacilities( for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); - if (service.isEditAllowed(caze)) { - CaseDataDto existingCaseDto = toDto(caze); - updateCaseWithBulkData( - updatedCaseBulkEditData, - caze, - diseaseChange, - diseaseVariantChange, - classificationChange, - investigationStatusChange, - outcomeChange, - surveillanceOfficerChange); - - caze.setRegion(newRegion); - caze.setDistrict(newDistrict); - caze.setCommunity(newCommunity); - caze.setFacilityType(updatedCaseBulkEditData.getFacilityType()); - caze.setHealthFacility(newFacility); - caze.setHealthFacilityDetails(updatedCaseBulkEditData.getHealthFacilityDetails()); - try { + try { + if (service.isEditAllowed(caze)) { + CaseDataDto existingCaseDto = toDto(caze); + updateCaseWithBulkData( + updatedCaseBulkEditData, + caze, + diseaseChange, + diseaseVariantChange, + classificationChange, + investigationStatusChange, + outcomeChange, + surveillanceOfficerChange); + + caze.setRegion(newRegion); + caze.setDistrict(newDistrict); + caze.setCommunity(newCommunity); + caze.setFacilityType(updatedCaseBulkEditData.getFacilityType()); + caze.setHealthFacility(newFacility); + caze.setHealthFacilityDetails(updatedCaseBulkEditData.getHealthFacilityDetails()); + CaseLogic.handleHospitalization(toDto(caze), existingCaseDto, doTransfer); doSave(caze, true, existingCaseDto, true); processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.SUCCESS)); - } catch (Exception e) { - processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + } else { + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); } + } catch (Exception e) { + processedCases.add(new ProcessedEntity(caseUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The case with uuid {} could not be saved", caseUuid, e); } } @@ -2693,10 +2703,14 @@ public List delete(List uuids, DeletionDetails deletion if (casesToBeDeleted != null) { casesToBeDeleted.forEach(caseToBeDeleted -> { - if (!caseToBeDeleted.isDeleted()) { + try { + if (!caseToBeDeleted.isDeleted()) { deleteCase(caseToBeDeleted, deletionDetails); processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); + } else { + processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); + } } catch (ExternalSurveillanceToolRuntimeException e) { processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); logger.error( @@ -2716,7 +2730,6 @@ public List delete(List uuids, DeletionDetails deletion processedCases.add(new ProcessedEntity(caseToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The case with uuid {} could not be deleted due to an Exception", caseToBeDeleted.getUuid(), e); } - } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 18327ceb449..0f5986f689b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -1127,8 +1127,8 @@ public List archive(List entityUuids) { List remainingCasesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); List remainingUuidsToBeProcessed = remainingCasesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); - super.archive(remainingUuidsToBeProcessed); - if (remainingCasesToBeProcessed.size() > 0) { + if (remainingUuidsToBeProcessed.size() > 0) { + super.archive(remainingUuidsToBeProcessed); processedCases.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); } @@ -1141,15 +1141,15 @@ public List dearchive(List entityUuids, String dearchiv List remainingCasesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); List remainingUuidsToBeProcessed = remainingCasesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); - super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); - if (remainingCasesToBeProcessed.size() > 0) { + if (remainingUuidsToBeProcessed.size() > 0) { + super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); processedCases.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); } return processedCases; } - public List preprocessCases(List entityUuids, boolean archiving) { + private List preprocessCasesForArchiving(List entityUuids, boolean archiving) { List processedCases = new ArrayList<>(); List sharedCaseUuids = getEligibleSharedUuids(entityUuids); try { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index bca06818c35..07babe5006e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -136,6 +136,7 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public List archive(List entityUuids) { + List processedEntities = new ArrayList<>(); IterableHelper.executeBatched( entityUuids, ARCHIVE_BATCH_SIZE, @@ -153,11 +154,14 @@ public List archive(List entityUuids) { em.createQuery(cu).executeUpdate(); })); - return new ArrayList<>(); + entityUuids.forEach(uuid -> processedEntities.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + + return processedEntities; } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public List dearchive(List entityUuids, String dearchiveReason) { + List processedEntities = new ArrayList<>(); IterableHelper.executeBatched(entityUuids, ARCHIVE_BATCH_SIZE, batchedUuids -> { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaUpdate cu = cb.createCriteriaUpdate(getElementClass()); @@ -172,28 +176,7 @@ public List dearchive(List entityUuids, String dearchiv em.createQuery(cu).executeUpdate(); }); - - return new ArrayList<>(); - } - - public List buildProcessedEntities(List entityUuids, boolean archiving) { - List processedEntities = new ArrayList<>(); - List adoList = getByUuids(entityUuids); - if (adoList != null) { - for (ADO ado : adoList) { - if (archiving) { - processedEntities.add( - new ProcessedEntity( - ado.getUuid(), - ado.isArchived() ? ProcessedEntityStatus.SUCCESS : ProcessedEntityStatus.INTERNAL_FAILURE)); - } else { - processedEntities.add( - new ProcessedEntity( - ado.getUuid(), - !ado.isArchived() ? ProcessedEntityStatus.SUCCESS : ProcessedEntityStatus.INTERNAL_FAILURE)); - } - } - } + entityUuids.forEach(uuid -> processedEntities.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); return processedEntities; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index 0afe83264ca..c83c203400e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -16,12 +16,9 @@ package de.symeda.sormas.backend.common; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; -import java.util.stream.Collectors; import javax.annotation.security.DenyAll; import javax.ejb.TransactionAttribute; @@ -49,7 +46,6 @@ import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.criteria.BaseCriteria; -import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; import de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration; import de.symeda.sormas.backend.deletionconfiguration.DeletionConfigurationService; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; @@ -220,11 +216,6 @@ private Date getDeletionReferenceDate(String uuid, DeletionConfiguration entityC protected abstract CoreEntityType getCoreEntityType(); - @DenyAll - public List buildProcessedEntities(List entityUuids, boolean archiving) { - return service.buildProcessedEntities(entityUuids, archiving); - } - @DenyAll public void archive(String entityUuid, Date endOfProcessingDate) { service.archive(entityUuid, endOfProcessingDate); @@ -254,16 +245,4 @@ public boolean isEditAllowed(String uuid) { return service.isEditAllowed(service.getByUuid(uuid)); } - public Collection getIneligibleEntitiesForEditing(Collection selectedEntities) { - return selectedEntities.stream().filter(entity -> !this.isEditAllowed(entity.getUuid())).collect(Collectors.toList()); - } - - public Collection getEligibleEntitiesForEditing( - Collection selectedCases, - Collection ineligibleCases) { - return ineligibleCases.size() > 0 - ? selectedCases.stream().filter(row -> !ineligibleCases.contains(row)).collect(Collectors.toCollection(ArrayList::new)) - : selectedCases; - } - } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index 3c37c08b6aa..f853ca6ddd4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -566,29 +566,31 @@ public List delete(List uuids, DeletionDetails deletion if (contactsToBeDeleted != null) { contactsToBeDeleted.forEach(contactToBeDeleted -> { - if (!contactToBeDeleted.isDeleted()) { - try { + try { + if (!contactToBeDeleted.isDeleted()) { deleteContact(contactToBeDeleted, deletionDetails); processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); - } catch (ExternalSurveillanceToolRuntimeException e) { - processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); - logger.error( - "The contact with uuid {} could not be deleted due to a ExternalSurveillanceToolRuntimeException", - contactToBeDeleted.getUuid(), - e); - } catch (SormasToSormasRuntimeException e) { - processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); - logger.error( - "The contact with uuid {} could not be deleted due to a SormasToSormasRuntimeException", - contactToBeDeleted.getUuid(), - e); - } catch (AccessDeniedException e) { - processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - logger.error("The contact with uuid {} could not be deleted due to a AccessDeniedException", contactToBeDeleted.getUuid(), e); - } catch (Exception e) { - processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - logger.error("The contact with uuid {} could not be deleted", contactToBeDeleted.getUuid(), e); + } else { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } + } catch (ExternalSurveillanceToolRuntimeException e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + logger.error( + "The contact with uuid {} could not be deleted due to a ExternalSurveillanceToolRuntimeException", + contactToBeDeleted.getUuid(), + e); + } catch (SormasToSormasRuntimeException e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.SORMAS_TO_SORMAS_FAILURE)); + logger.error( + "The contact with uuid {} could not be deleted due to a SormasToSormasRuntimeException", + contactToBeDeleted.getUuid(), + e); + } catch (AccessDeniedException e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The contact with uuid {} could not be deleted due to a AccessDeniedException", contactToBeDeleted.getUuid(), e); + } catch (Exception e) { + processedContacts.add(new ProcessedEntity(contactToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The contact with uuid {} could not be deleted", contactToBeDeleted.getUuid(), e); } }); } @@ -650,15 +652,13 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._CONTACT_ARCHIVE) public List archive(List entityUuids) { - super.archive(entityUuids); - return super.buildProcessedEntities(entityUuids, true); + return super.archive(entityUuids); } @Override @RightsAllowed(UserRight._CONTACT_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); - return super.buildProcessedEntities(entityUuids, false); + return super.dearchive(entityUuids, dearchiveReason); } @Override @@ -2282,22 +2282,31 @@ public List saveBulkContacts( throws ValidationRuntimeException { List processedEntities = new ArrayList(); - for (String contactUuid : contactUuidList) { Contact contact = service.getByUuid(contactUuid); - if (service.isEditAllowed(contact)) { - ContactDto existingContactDto = toDto(contact); - if (classificationChange) { - existingContactDto.setContactClassification(updatedContactBulkEditData.getContactClassification()); - } - // Setting the contact officer is only allowed if all selected contacts are in the same district - if (contactOfficerChange) { - existingContactDto.setContactOfficer(updatedContactBulkEditData.getContactOfficer()); - } + try { + if (service.isEditAllowed(contact)) { + ContactDto existingContactDto = toDto(contact); + if (classificationChange) { + existingContactDto.setContactClassification(updatedContactBulkEditData.getContactClassification()); + } + // Setting the contact officer is only allowed if all selected contacts are in the same district + if (contactOfficerChange) { + existingContactDto.setContactOfficer(updatedContactBulkEditData.getContactOfficer()); + } - save(existingContactDto); - processedEntities.add(new ProcessedEntity(contactUuid, ProcessedEntityStatus.SUCCESS)); + save(existingContactDto); + processedEntities.add(new ProcessedEntity(contactUuid, ProcessedEntityStatus.SUCCESS)); + } else { + processedEntities.add(new ProcessedEntity(contactUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); + } + } catch (AccessDeniedException e) { + processedEntities.add(new ProcessedEntity(contactUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error("The contact with uuid {} could not be saved due to an AccessDeniedException", contactUuid, e); + } catch (Exception e) { + processedEntities.add(new ProcessedEntity(contactUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The contact with uuid {} could not be saved due to an Exception", contactUuid, e); } } return processedEntities; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index f6918f5ca1f..c41ba100cdb 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -172,6 +172,8 @@ public class EventFacadeEjb extends AbstractCoreFacadeEjb delete(List uuids, DeletionDetails deletion List eventsToBeDeleted = service.getByUuids(uuids); if (eventsToBeDeleted != null) { eventsToBeDeleted.forEach(eventToBeDeleted -> { - if (!eventToBeDeleted.isDeleted()) { + if (!eventToBeDeleted.isDeleted() && isEligibleEvent(eventToBeDeleted)) { try { deleteEvent(eventToBeDeleted, deletionDetails); processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); @@ -373,6 +380,8 @@ public List delete(List uuids, DeletionDetails deletion processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error("The event with uuid {} could not be deleted due to an Exception", eventToBeDeleted.getUuid(), e); } + } else { + processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } }); } @@ -1502,33 +1511,31 @@ public List saveBulkEvents( for (String eventUuid : eventUuidList) { Event event = service.getByUuid(eventUuid); - if (service.isEditAllowed(event)) { - EventDto eventDto = toDto(event); - if (eventStatusChange) { - eventDto.setEventStatus(updatedTempEvent.getEventStatus()); - } - - if (eventInvestigationStatusChange) { - eventDto.setEventInvestigationStatus(updatedTempEvent.getEventInvestigationStatus()); - } - - if (eventManagementStatusChange) { - eventDto.setEventManagementStatus(updatedTempEvent.getEventManagementStatus()); - } + try { + if (service.isEditAllowed(event)) { + EventDto eventDto = toDto(event); + if (eventStatusChange) { + eventDto.setEventStatus(updatedTempEvent.getEventStatus()); + } + if (eventInvestigationStatusChange) { + eventDto.setEventInvestigationStatus(updatedTempEvent.getEventInvestigationStatus()); + } + if (eventManagementStatusChange) { + eventDto.setEventManagementStatus(updatedTempEvent.getEventManagementStatus()); + } - try { save(eventDto); processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - } catch (Exception e) { - processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + } else { + processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.NOT_ELIGIBLE)); } - + } catch (AccessDeniedException e) { + processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } catch (Exception e) { + processedEvents.add(new ProcessedEntity(eventUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); } } return processedEvents; - } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index 5cc2bfd2cf6..a62780eea94 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -519,23 +519,27 @@ public List delete(List uuids, DeletionDetails deletion if (eventParticipantsToBeDeleted != null) { eventParticipantsToBeDeleted.forEach(eventParticipantToBeDeleted -> { - if (!eventParticipantToBeDeleted.isDeleted()) { - try { + + try { + if (!eventParticipantToBeDeleted.isDeleted()) { delete(eventParticipantToBeDeleted.getUuid(), deletionDetails); processedEventParticipants.add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedEventParticipants - .add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - logger.error( - "The event participant with uuid {} could not be deleted due to a AccessDeniedException", - eventParticipantToBeDeleted.getUuid(), - e); - } catch (Exception e) { + } else { processedEventParticipants - .add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - logger.error( - "The event participant with uuid:" + eventParticipantToBeDeleted.getUuid() + "could not be deleted due to an Exception"); + .add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } + } catch (AccessDeniedException e) { + processedEventParticipants + .add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + logger.error( + "The event participant with uuid {} could not be deleted due to a AccessDeniedException", + eventParticipantToBeDeleted.getUuid(), + e); + } catch (Exception e) { + processedEventParticipants + .add(new ProcessedEntity(eventParticipantToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error( + "The event participant with uuid:" + eventParticipantToBeDeleted.getUuid() + "could not be deleted due to an Exception"); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java index 42132090f31..f41dc661066 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java @@ -356,18 +356,18 @@ public List delete(List uuids) { if (externalMessagesToBeDeleted != null) { externalMessagesToBeDeleted.forEach(externalMessageToBeDeleted -> { - if (externalMessageToBeDeleted.getStatus() != ExternalMessageStatus.PROCESSED) { - try { + + try { + if (externalMessageToBeDeleted.getStatus() != ExternalMessageStatus.PROCESSED) { externalMessageService.deletePermanent(externalMessageToBeDeleted); processedExternalMessages.add(new ProcessedEntity(externalMessageToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); - } catch (Exception e) { - processedExternalMessages - .add(new ProcessedEntity(externalMessageToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - logger.error( - "The external message with uuid {} could not be deleted due to an Exception", - externalMessageToBeDeleted.getUuid(), - e); + } else { + processedExternalMessages.add(new ProcessedEntity(externalMessageToBeDeleted.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } + } catch (Exception e) { + processedExternalMessages.add(new ProcessedEntity(externalMessageToBeDeleted.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger + .error("The external message with uuid {} could not be deleted due to an Exception", externalMessageToBeDeleted.getUuid(), e); } }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java index 60275ae1410..16b6f1f79bc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java @@ -15,6 +15,7 @@ package de.symeda.sormas.backend.externalsurveillancetool; +import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.concurrent.TimeUnit; @@ -36,6 +37,8 @@ import de.symeda.sormas.api.audit.AuditIgnore; import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolFacade; @@ -78,8 +81,19 @@ public boolean isFeatureEnabled() { @Override @RightsAllowed(UserRight._EXTERNAL_SURVEILLANCE_SHARE) - public void sendCases(List caseUuids) throws ExternalSurveillanceToolException { - doSendCases(caseUuids, false); + public List sendCases(List caseUuids) { + List processedCases = new ArrayList<>(); + try { + doSendCases(caseUuids, false); + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } catch (ExternalSurveillanceToolException e) { + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } catch (Exception e) { + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.INTERNAL_FAILURE)); + } + return processedCases; } @RightsAllowed(UserRight._CASE_ARCHIVE) @@ -101,8 +115,19 @@ private void doSendCases(List caseUuids, boolean archived) throws Extern @Override @RightsAllowed(UserRight._EXTERNAL_SURVEILLANCE_SHARE) - public void sendEvents(List eventUuids) throws ExternalSurveillanceToolException { - doSendEvents(eventUuids, false); + public List sendEvents(List eventUuids) { + List processedEvents = new ArrayList<>(); + try { + doSendEvents(eventUuids, false); + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.SUCCESS)); + } catch (AccessDeniedException e) { + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } catch (ExternalSurveillanceToolException e) { + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } catch (Exception e) { + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.INTERNAL_FAILURE)); + } + return processedEvents; } @RightsAllowed(UserRight._EVENT_ARCHIVE) @@ -110,6 +135,15 @@ public void sendEventsInternal(List eventUuids, boolean archived) throws doSendEvents(eventUuids, archived); } + private List buildProcessedEntitiesListByStatus(List uuids, ProcessedEntityStatus processedEntityStatus) { + List processedEntities = new ArrayList<>(); + + //if for one entity occurs a type of exception (AccessDenied or ExternalSurveillanceTool) that exception will occur for the whole batch + uuids.forEach(uuid -> processedEntities.add(new ProcessedEntity(uuid, processedEntityStatus))); + + return processedEntities; + } + private void doSendEvents(List eventUuids, boolean archived) throws ExternalSurveillanceToolException { if (!userService.hasRight(UserRight.EVENT_EDIT)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorForbidden)); @@ -126,12 +160,7 @@ private void sendRequest(ExportParameters params) throws ExternalSurveillanceToo String serviceUrl = configFacade.getExternalSurveillanceToolGatewayUrl().trim(); Invocation.Builder request = - ClientBuilder.newBuilder() - .connectTimeout(30, TimeUnit.SECONDS) - .build() - .target(serviceUrl) - .path("export") - .request(); + ClientBuilder.newBuilder().connectTimeout(30, TimeUnit.SECONDS).build().target(serviceUrl).path("export").request(); Response response; try { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index 1929e5de6a2..6b3caa8907e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -799,18 +799,12 @@ public List delete(List sampleUuids, DeletionDetails de List processedSamples = new ArrayList<>(); IterableHelper - .executeBatched(sampleUuids, DELETED_BATCH_SIZE, batchedSampleUuids -> sampleService.deleteAll(batchedSampleUuids, deletionDetails)); + .executeBatched( + sampleUuids, + DELETED_BATCH_SIZE, + batchedSampleUuids -> processedSamples.addAll(sampleService.deleteAll(batchedSampleUuids, deletionDetails))); logger.debug("deleteAllSamples(sampleUuids) finished. samplesCount = {}, {}ms", sampleUuids.size(), DateHelper.durationMillies(startTime)); - List samplesList = getByUuids(sampleUuids); - for (SampleDto sample : samplesList) { - if (sample.isDeleted()) { - processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.SUCCESS)); - } else { - processedSamples.add(new ProcessedEntity(sample.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); - } - } - return processedSamples; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java index 2be96c26fc5..7f765985c16 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java @@ -59,6 +59,8 @@ import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.event.EventParticipantReferenceDto; @@ -1088,7 +1090,8 @@ private void deleteSampleLinks(Sample sample) { * {@link Sample}s identified by {@code List sampleUuids} to be deleted. */ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) - public void deleteAll(List sampleUuids, DeletionDetails deletionDetails) { + public List deleteAll(List sampleUuids, DeletionDetails deletionDetails) { + List processedSamples = new ArrayList<>(); List samplesList = getByUuids(sampleUuids); List pathogenTestUUIDsList = new ArrayList<>(); @@ -1164,6 +1167,9 @@ public void deleteAll(List sampleUuids, DeletionDetails deletionDetails) Case associatedCase = entry.getValue(); caseFacade.onCaseSampleChanged(associatedCase); } + + sampleUuids.forEach(uuid -> processedSamples.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + return processedSamples; } /** diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index 2b846e2b1f2..e4d15be8213 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -394,19 +394,22 @@ public List saveBulkTasks( UserReferenceDto currentUser = userService.getCurrentUser().toReference(); for (String taskUuid : taskUuidList) { - Task task = taskService.getByUuid(taskUuid); - TaskDto taskDto = toDto(task, createPseudonymizer()); - if (priorityChange) { - taskDto.setPriority(updatedTempTask.getPriority()); - } - if (assigneeChange) { - taskDto.setAssigneeUser(updatedTempTask.getAssigneeUser()); - taskDto.setAssignedByUser(currentUser); - } - if (taskStatusChange) { - taskDto.setTaskStatus(updatedTempTask.getTaskStatus()); - } + try { + Task task = taskService.getByUuid(taskUuid); + TaskDto taskDto = toDto(task, createPseudonymizer()); + + if (priorityChange) { + taskDto.setPriority(updatedTempTask.getPriority()); + } + if (assigneeChange) { + taskDto.setAssigneeUser(updatedTempTask.getAssigneeUser()); + taskDto.setAssignedByUser(currentUser); + } + if (taskStatusChange) { + taskDto.setTaskStatus(updatedTempTask.getTaskStatus()); + } + saveTask(taskDto); processedTasks.add(new ProcessedEntity(taskUuid, ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { @@ -1074,8 +1077,7 @@ public List dearchive(String uuid) { @RightsAllowed(UserRight._TASK_ARCHIVE) public List archive(List taskUuids) { List processedTasks = new ArrayList<>(); - IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> taskService.updateArchived(e, true)); - taskUuids.forEach(uuid -> processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> processedTasks.addAll(taskService.updateArchived(e, true))); return processedTasks; } @@ -1084,8 +1086,7 @@ public List archive(List taskUuids) { @RightsAllowed(UserRight._TASK_ARCHIVE) public List dearchive(List taskUuids) { List processedTasks = new ArrayList<>(); - IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> taskService.updateArchived(e, false)); - taskUuids.forEach(uuid -> processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> processedTasks.addAll(taskService.updateArchived(e, false))); return processedTasks; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java index baaef2af99a..6e614259361 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java @@ -47,6 +47,8 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.RequestContextHolder; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; @@ -761,7 +763,8 @@ public List findByAssigneeContactTypeAndStatuses( } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) - public void updateArchived(List taskUuids, boolean archived) { + public List updateArchived(List taskUuids, boolean archived) { + List processedTasks = new ArrayList<>(); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaUpdate cu = cb.createCriteriaUpdate(Task.class); @@ -773,6 +776,10 @@ public void updateArchived(List taskUuids, boolean archived) { cu.where(root.get(Task.UUID).in(taskUuids)); em.createQuery(cu).executeUpdate(); + + taskUuids.forEach(uuid -> processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + + return processedTasks; } public boolean isArchived(String taskUuid) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index 23a98e6b2a8..1b2ac303df9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -472,15 +472,13 @@ public void archive(String entityUuid, Date endOfProcessingDate) { @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) public List archive(List entityUuids) { - super.archive(entityUuids); - return super.buildProcessedEntities(entityUuids, true); + return super.archive(entityUuids); } @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason) { - super.dearchive(entityUuids, dearchiveReason); - return super.buildProcessedEntities(entityUuids, false); + return super.dearchive(entityUuids, dearchiveReason); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java index 33cabab5650..3f1caba748c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java @@ -54,6 +54,8 @@ import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EntityDto; @@ -141,6 +143,8 @@ public class UserFacadeEjb implements UserFacade { @PersistenceContext(unitName = ModelConstants.PERSISTENCE_UNIT_NAME) private EntityManager em; + private final Logger logger = LoggerFactory.getLogger(getClass()); + @EJB private CurrentUserService currentUserService; @EJB @@ -999,18 +1003,17 @@ private List updateActiveState(List userUuids, boolean List users = userService.getByUuids(userUuids); for (User user : users) { - User oldUser = new User(); try { - oldUser = (User) BeanUtils.cloneBean(user); + User oldUser = (User) BeanUtils.cloneBean(user); + user.setActive(active); + userService.ensurePersisted(user); + + userUpdateEvent.fire(new UserUpdateEvent(oldUser, user)); + processedEntities.add(new ProcessedEntity(user.getUuid(), ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { processedEntities.add(new ProcessedEntity(user.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The event with uuid {} could not be restored due to an Exception", user.getUuid(), e); } - - user.setActive(active); - userService.ensurePersisted(user); - - userUpdateEvent.fire(new UserUpdateEvent(oldUser, user)); - processedEntities.add(new ProcessedEntity(user.getUuid(), ProcessedEntityStatus.SUCCESS)); } return processedEntities; diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java index 4aa0a0c2138..14a03d4f909 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java @@ -31,7 +31,6 @@ import org.apache.commons.lang3.time.DateUtils; import org.apache.http.HttpStatus; -import org.hamcrest.Matchers; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -50,6 +49,8 @@ import de.symeda.sormas.api.common.CoreEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.document.DocumentRelatedEntityType; @@ -60,7 +61,6 @@ import de.symeda.sormas.api.event.TypeOfPlace; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolRuntimeException; -import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.immunization.ImmunizationDto; import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.person.PersonAddressType; @@ -170,11 +170,10 @@ public void testSendingCasesNotOk() { .withRequestBody(containing("VXAERX-5RCKFA-G5DVXH-DPHPCAFB")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - try { + List processedCases = getExternalSurveillanceToolGatewayFacade().sendCases(Arrays.asList("XRJOEJ-P2OY5E-CA5MYT-LSVCCGVY", "test-not-found")); - } catch (ExternalSurveillanceToolException e) { - assertThat(e.getMessage(), Matchers.is(I18nProperties.getString("ExternalSurveillanceToolGateway.notificationErrorSending"))); - } + assertEquals(processedCases.get(0).getProcessedEntityStatus(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + } @Test @@ -267,7 +266,9 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForForCase_WithProper .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - getCaseService().updateArchiveFlagInExternalSurveillanceToolForSharedCases(Collections.singletonList(caze.getUuid()), true); + //getCaseService().updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(caze.getUuid()), true); + + getCaseService().archive(caze.getUuid(), new Date()); wireMockRuntime.getWireMock().verify(exactly(1), postRequestedFor(urlEqualTo("/export"))); } @@ -289,8 +290,10 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithProperEnt .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - List sharedCaseUuids = caseService.getEligibleSharedUuids(Collections.singletonList(caze.getUuid())); - caseService.updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, true); + List sharedCaseUuids = caseService.getEligibleUuidsForSharingWithExternalSurveillanceTool(Collections.singletonList(caze.getUuid())); + //caseService.updateArchiveFlagInExternalSurveillanceTool(sharedCaseUuids, true); + + caseService.archive(caze.getUuid(), new Date()); wireMockRuntime.getWireMock().verify(exactly(0), postRequestedFor(urlEqualTo("/export"))); } @@ -310,8 +313,10 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithoutProper .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); //the case does not have an externalId set and after the filtering the sendCases will not be called - List sharedCaseUuids = caseService.getEligibleSharedUuids(Collections.singletonList(caze.getUuid())); - getCaseService().updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, true); + List sharedCaseUuids = caseService.getEligibleUuidsForSharingWithExternalSurveillanceTool(Collections.singletonList(caze.getUuid())); + //getCaseService().updateArchiveFlagInExternalSurveillanceTool(sharedCaseUuids, true); + + getCaseService().archive(caze.getUuid(), new Date()); wireMockRuntime.getWireMock().verify(exactly(0), postRequestedFor(urlEqualTo("/export"))); } @@ -331,9 +336,13 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_Exception() { .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_BAD_REQUEST))); - assertThrows( - ExternalSurveillanceToolRuntimeException.class, - () -> getCaseService().updateArchiveFlagInExternalSurveillanceToolForSharedCases(Collections.singletonList(caze.getUuid()), true)); + /* + * assertThrows( + * ExternalSurveillanceToolRuntimeException.class, + * () -> getCaseService().updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(caze.getUuid()), true)); + */ + + assertThrows(ExternalSurveillanceToolRuntimeException.class, () -> getCaseService().archive(caze.getUuid(), new Date())); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java index 311a14e0bb6..84e33359447 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java @@ -1034,8 +1034,6 @@ public void showBulkCaseDataEditComponent(Collection CaseFacade caseFacade = FacadeProvider.getCaseFacade(); List selectedCasesCpy = new ArrayList<>(selectedCases); - Collection ineligibleCases = caseFacade.getIneligibleEntitiesForEditing(selectedCases); - Collection eligibleCases = caseFacade.getEligibleEntitiesForEditing(selectedCases, ineligibleCases); if (facilityChange) { VaadinUiUtil.showChooseOptionPopup( @@ -1057,8 +1055,6 @@ public void showBulkCaseDataEditComponent(Collection surveillanceOfficerChange, e), selectedCasesCpy, - new ArrayList<>(eligibleCases), - new ArrayList<>(ineligibleCases), bulkOperationCallback(caseGrid, popupWindow))); } else { BulkOperationHandler. forBulkEdit() @@ -1073,8 +1069,6 @@ BulkOperationHandler. forBulkEdit() outcomeChange, surveillanceOfficerChange), selectedCasesCpy, - new ArrayList<>(eligibleCases), - new ArrayList<>(ineligibleCases), bulkOperationCallback(caseGrid, popupWindow)); } }); @@ -1557,8 +1551,7 @@ public void openClassificationRulesPopup(DiseaseClassificationCriteriaDto diseas public void deleteAllSelectedItems(Collection selectedRows, AbstractCaseGrid caseGrid) { ControllerProvider.getDeleteRestoreController() - .deleteAllSelectedItems(selectedRows, null, null, DeleteRestoreHandlers.forCase(), bulkOperationCallback(caseGrid, null)); - + .deleteAllSelectedItems(selectedRows, DeleteRestoreHandlers.forCase(), bulkOperationCallback(caseGrid, null)); } public void restoreSelectedCases(Collection selectedRows, AbstractCaseGrid caseGrid) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index 2cda82ccf5f..f79761dde51 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -766,8 +766,6 @@ public void showBulkContactDataEditComponent( boolean contactOfficerChange = district != null ? form.getContactOfficerCheckBox().getValue() : false; List selectedContactsCpy = new ArrayList<>(selectedContacts); - Collection ineligibleContacts = contactFacade.getIneligibleEntitiesForEditing(selectedContacts); - Collection eligibleContacts = contactFacade.getEligibleEntitiesForEditing(selectedContacts, ineligibleContacts); BulkOperationHandler. forBulkEdit() .doBulkOperation( @@ -777,8 +775,6 @@ BulkOperationHandler. forBulkEdit() classificationChange, contactOfficerChange), selectedContactsCpy, - new ArrayList<>(eligibleContacts), - new ArrayList<>(ineligibleContacts), bulkOperationCallback(caseUuid, contactGrid, popupWindow)); }); @@ -810,7 +806,7 @@ private Consumer> bulkOperationCallback(String caseUuid, A public void deleteAllSelectedItems(Collection selectedRows, AbstractContactGrid contactGrid) { ControllerProvider.getDeleteRestoreController() - .deleteAllSelectedItems(selectedRows, null, null, DeleteRestoreHandlers.forContact(), bulkOperationCallback(null, contactGrid, null)); + .deleteAllSelectedItems(selectedRows, DeleteRestoreHandlers.forContact(), bulkOperationCallback(null, contactGrid, null)); } @@ -841,22 +837,16 @@ public void cancelFollowUpOfAllSelectedItems( if (Boolean.TRUE.equals(confirmed)) { String userName = UserProvider.getCurrent().getUserName(); - List ineligibleStatuses = new ArrayList<>(); - ineligibleStatuses.add(FollowUpStatus.NO_FOLLOW_UP); - ineligibleStatuses.add(FollowUpStatus.CANCELED); - Collection ineligibleContacts = getIneligibleContacts(selectedRows, ineligibleStatuses); - Collection eligibleContacts = getEligibleContacts(selectedRows, ineligibleContacts); - new BulkOperationHandler( Strings.messageFollowUpCanceled, - Strings.messageFollowUpsWithWrongStatusNotCancelled, - Strings.headingSomeFollowUpsNotCancelled, - Strings.headingFollowUpsNotCancelled, - Strings.messageCountFollowUpsNotCancelled, + Strings.messageVisitsWithWrongStatusNotCancelled, + Strings.headingSomeVisitsNotCancelled, + Strings.headingVisitsNotCancelled, + Strings.messageCountVisitsNotCancelled, null, null, - Strings.messageCountFollowUpsNotCancelledAccessDeniedReason, - Strings.messageNoEligibleFollowUpForCancellation, + Strings.messageCountVisitsNotCancelledAccessDeniedReason, + Strings.messageNoEligibleVisitForCancellation, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List processedContacts = new ArrayList<>(); @@ -864,15 +854,13 @@ public void cancelFollowUpOfAllSelectedItems( for (ContactIndexDto contact : batch) { if (!FollowUpStatus.NO_FOLLOW_UP.equals(contact.getFollowUpStatus()) && !FollowUpStatus.CANCELED.equals(contact.getFollowUpStatus())) { - processedContacts.add(processContact(contact, FollowUpStatus.CANCELED, Strings.infoCanceledBy, userName)); + processedContacts.add(setFollowUpStatus(contact, FollowUpStatus.CANCELED, Strings.infoCanceledBy, userName)); + } else { + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } } return processedContacts; - }, - new ArrayList<>(selectedRows), - new ArrayList<>(eligibleContacts), - new ArrayList<>(ineligibleContacts), - bulkOperationCallback(caseUuid, contactGrid, null)); + }, new ArrayList<>(selectedRows), bulkOperationCallback(caseUuid, contactGrid, null)); } }); } @@ -899,42 +887,36 @@ public void setAllSelectedItemsToLostToFollowUp( if (Boolean.TRUE.equals(confirmed)) { String userName = UserProvider.getCurrent().getUserName(); - List ineligibleStatuses = new ArrayList<>(); - ineligibleStatuses.add(FollowUpStatus.NO_FOLLOW_UP); - Collection ineligibleContacts = getIneligibleContacts(selectedRows, ineligibleStatuses); - Collection eligibleContacts = getEligibleContacts(selectedRows, ineligibleContacts); - new BulkOperationHandler( Strings.messageFollowUpStatusChanged, - Strings.messageFollowUpsWithWrongStatusNotSetToLost, - Strings.headingSomeFollowUpsNotSetToLost, - Strings.headingFollowUpsNotSetToLost, - Strings.messageCountFollowUpsNotSetToLost, + Strings.messageVisitsWithWrongStatusNotSetToLost, + Strings.headingSomeVisitsNotSetToLost, + Strings.headingVisitsNotSetToLost, + Strings.messageCountVisitsNotSetToLost, null, null, - Strings.messageCountFollowUpsNotSetToLostAccessDeniedReason, - Strings.messageNoEligibleFollowUpForSettingToLost, + Strings.messageCountVisitsNotSetToLostAccessDeniedReason, + Strings.messageNoEligibleVisitForSettingToLost, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { List processedContacts = new ArrayList<>(); for (ContactIndexDto contact : batch) { if (contact.getFollowUpStatus() != FollowUpStatus.NO_FOLLOW_UP) { - processedContacts.add(processContact(contact, FollowUpStatus.LOST, Strings.infoLostToFollowUpBy, userName)); + processedContacts + .add(setFollowUpStatus(contact, FollowUpStatus.LOST, Strings.infoLostToFollowUpBy, userName)); + } else { + processedContacts.add(new ProcessedEntity(contact.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); } } return processedContacts; - }, - new ArrayList<>(selectedRows), - new ArrayList<>(eligibleContacts), - new ArrayList<>(ineligibleContacts), - bulkOperationCallback(caseUuid, contactGrid, null)); + }, new ArrayList<>(selectedRows), bulkOperationCallback(caseUuid, contactGrid, null)); } }); } } - public ProcessedEntity processContact(ContactIndexDto contact, FollowUpStatus followUpStatus, String followUpComment, String userName) { + public ProcessedEntity setFollowUpStatus(ContactIndexDto contact, FollowUpStatus followUpStatus, String followUpComment, String userName) { ProcessedEntity processedContact; ContactDto contactDto = FacadeProvider.getContactFacade().getByUuid(contact.getUuid()); @@ -953,16 +935,6 @@ public ProcessedEntity processContact(ContactIndexDto contact, FollowUpStatus fo return processedContact; } - public Collection getIneligibleContacts(Collection selectedRows, List ineligibleStatuses) { - return selectedRows.stream().filter(row -> ineligibleStatuses.contains(row.getFollowUpStatus())).collect(Collectors.toList()); - } - - public Collection getEligibleContacts(Collection selectedRows, Collection ineligibleContacts) { - return ineligibleContacts.size() > 0 - ? selectedRows.stream().filter(row -> !ineligibleContacts.contains(row)).collect(Collectors.toCollection(ArrayList::new)) - : selectedRows; - } - public void openSelectCaseForContactWindow(Disease disease, Consumer selectedCaseCallback) { CaseSelectionField selectionField = new CaseSelectionField(disease); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index 6cbc9b29d00..64b1fc14771 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -365,29 +365,36 @@ private void linkContactsToEvent(EventReferenceDto eventReferenceDto, List { List processedContacts = new ArrayList<>(); + batch.forEach(contactDataDto -> { - EventParticipantDto ep = - EventParticipantDto.buildFromPerson(personByUuid.get(contactDataDto.getPerson().getUuid()), eventReferenceDto, currentUser); try { - FacadeProvider.getEventParticipantFacade().save(ep); - processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.SUCCESS)); + if (!alreadyLinkedContacts.contains(contactDataDto)) { + + EventParticipantDto ep = EventParticipantDto + .buildFromPerson(personByUuid.get(contactDataDto.getPerson().getUuid()), eventReferenceDto, currentUser); + + FacadeProvider.getEventParticipantFacade().save(ep); + processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.SUCCESS)); + } else { + processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); + } } catch (AccessDeniedException e) { processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); logger.error( - "The event participant for contact with uuid {} could not be saved due to an AccessDeniedException", + "The event participant for contact with uuid {} could not be linked due to an AccessDeniedException", contactDataDto.getUuid(), e); } catch (Exception e) { processedContacts.add(new ProcessedEntity(contactDataDto.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE)); logger.error( - "The event participant for contact with uuid {} could not be saved due to an Exception", + "The event participant for contact with uuid {} could not be linked due to an Exception", contactDataDto.getUuid(), e); } }); return processedContacts; - }, new ArrayList<>(contacts), new ArrayList<>(contactByPersonUuid.values()), alreadyLinkedContacts, callback); + }, new ArrayList<>(contacts), callback); } public void selectEvent(EventGroupReferenceDto eventGroupReference) { @@ -998,8 +1005,6 @@ public void showBulkEventDataEditComponent(Collection selectedEve boolean eventManagementStatusChange = form.getEventManagementStatusCheckbox().getValue(); List selectedEventsCpy = new ArrayList<>(selectedEvents); - Collection ineligibleEvents = eventFacade.getIneligibleEntitiesForEditing(selectedEvents); - Collection eligibleEvents = eventFacade.getEligibleEntitiesForEditing(selectedEvents, ineligibleEvents); BulkOperationHandler. forBulkEdit() .doBulkOperation( @@ -1010,8 +1015,6 @@ BulkOperationHandler. forBulkEdit() eventInvestigationStatusChange, eventManagementStatusChange), selectedEventsCpy, - new ArrayList<>(eligibleEvents), - new ArrayList<>(ineligibleEvents), bulkOperationCallback(eventGrid, popupWindow)); }); @@ -1042,27 +1045,8 @@ public EventDto createNewEvent(Disease disease) { } public void deleteAllSelectedItems(Collection selectedRows, EventGrid eventGrid) { - - Collection ineligibleEvents = new ArrayList<>(); - selectedRows.stream().forEach(row -> { - List eventParticipantList = - FacadeProvider.getEventParticipantFacade().getAllActiveEventParticipantsByEvent(row.getUuid()); - if (eventParticipantList.size() > 0) { - ineligibleEvents.add(row); - } - }); - - Collection eligibleEvents = ineligibleEvents.size() > 0 - ? selectedRows.stream().filter(row -> !ineligibleEvents.contains(row)).collect(Collectors.toCollection(ArrayList::new)) - : selectedRows; - ControllerProvider.getDeleteRestoreController() - .deleteAllSelectedItems( - selectedRows, - eligibleEvents, - ineligibleEvents, - DeleteRestoreHandlers.forEvent(), - bulkOperationCallback(eventGrid, null)); + .deleteAllSelectedItems(selectedRows, DeleteRestoreHandlers.forEvent(), bulkOperationCallback(eventGrid, null)); } public void restoreSelectedEvents(Collection selectedRows, EventGrid eventGrid) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsController.java index c4ee3f11bc6..da18d837752 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsController.java @@ -182,8 +182,6 @@ public void deleteAllSelectedItems( ControllerProvider.getDeleteRestoreController() .deleteAllSelectedItems( selectedRows, - null, - null, DeleteRestoreHandlers.forEventParticipant(), bulkOperationCallback(eventParticipantGrid, noEntriesRemainingCallback, null)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java index b20a960ff0c..5e6e37e33c9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalsurveillanceservice/ExternalSurveillanceServiceGateway.java @@ -19,8 +19,6 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseIndexDto; -import de.symeda.sormas.api.common.progress.ProcessedEntity; -import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventIndexDto; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; @@ -28,8 +26,6 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.share.ExternalShareInfoCriteria; -import de.symeda.sormas.api.utils.AccessDeniedException; -import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.utils.BulkOperationHandler; import de.symeda.sormas.ui.utils.DirtyStateComponent; @@ -134,45 +130,16 @@ public static void sendCasesToExternalSurveillanceTool( Strings.messageCountEntitiesNotSentAccessDeniedReason, null, null, - Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { - List processedCases = new ArrayList<>(); - try { - FacadeProvider.getExternalSurveillanceToolFacade() - .sendCases(batch.stream().map(CaseIndexDto::getUuid).collect(Collectors.toList())); - processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - } catch (ExternalSurveillanceToolException e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); - } catch (Exception e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.INTERNAL_FAILURE)); - } - - return processedCases; - }, selectedCasesCpy, null, null, callback); + Strings.infoBulkProcessFinishedWithoutSuccess) + .doBulkOperation( + batch -> FacadeProvider.getExternalSurveillanceToolFacade() + .sendCases(batch.stream().map(CaseIndexDto::getUuid).collect(Collectors.toList())), + selectedCasesCpy, + callback); }, null, shouldConfirm, null); } - public static List buildProcessedEntitiesListByStatus( - Collection entities, - ProcessedEntityStatus processedEntityStatus) { - List processedEntities = new ArrayList<>(); - - //if for one entity occurs a type of exception (AccessDenied or ExternalSurveillanceTool) that exception will occur for the whole batch - entities.forEach(entity -> processedEntities.add(new ProcessedEntity(entity.getUuid(), processedEntityStatus))); - - if (processedEntityStatus.equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE)) { - logger.error("The selected entities could not be sent to the External Surveillance Tool due to an AccessDeniedException"); - } else if (processedEntityStatus.equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE)) { - logger.error("The selected entities could not be sent to the External Surveillance Tool due to an ExternalSurveillanceToolException"); - } else { - logger.error("The selected entities could not be sent to the External Surveillance Tool due to an Exception"); - } - - return processedEntities; - } - public static void sendEventsToExternalSurveillanceTool( Collection selectedEvents, boolean shouldConfirm, @@ -190,22 +157,12 @@ public static void sendEventsToExternalSurveillanceTool( Strings.messageCountEntitiesNotSentAccessDeniedReason, null, null, - Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { - List processedEvents = new ArrayList<>(); - try { - FacadeProvider.getExternalSurveillanceToolFacade() - .sendEvents(batch.stream().map(EventIndexDto::getUuid).collect(Collectors.toList())); - processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.SUCCESS)); - } catch (AccessDeniedException e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - } catch (ExternalSurveillanceToolException e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); - } catch (Exception e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(batch, ProcessedEntityStatus.INTERNAL_FAILURE)); - } - - return processedEvents; - }, selectedEventsCpy, null, null, callback); + Strings.infoBulkProcessFinishedWithoutSuccess) + .doBulkOperation( + batch -> FacadeProvider.getExternalSurveillanceToolFacade() + .sendEvents(batch.stream().map(EventIndexDto::getUuid).collect(Collectors.toList())), + selectedEventsCpy, + callback); }, null, shouldConfirm, null); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java index 96a16d89aa1..12d431c2851 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java @@ -620,8 +620,6 @@ public void deleteAllSelectedItems(Collection selectedRows, Samp ControllerProvider.getDeleteRestoreController() .deleteAllSelectedItems( selectedRows, - null, - null, DeleteRestoreHandlers.forSample(), bulkOperationCallback(sampleGrid, noEntriesRemainingCallback, null)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java index afe757a21bb..2c804dc5ee3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java @@ -214,8 +214,6 @@ BulkOperationHandler. forBulkEdit() form.getAssigneeCheckbox().getValue(), form.getTaskStatusCheckbox().getValue()), selectedTasksCpy, - null, - null, bulkOperationCallback(taskGrid, noEntriesRemainingCallback, popupWindow)); }); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryController.java index 21e6b3aa364..1936d115c6f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryController.java @@ -219,8 +219,6 @@ public void deleteAllSelectedItems( ControllerProvider.getDeleteRestoreController() .deleteAllSelectedItems( selectedRows, - null, - null, DeleteRestoreHandlers.forTravelEntry(), bulkOperationCallback(travelEntryGrid, noEntriesRemainingCallback, null)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java index 439a3a3f12f..926c2b49567 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java @@ -382,7 +382,7 @@ public void enableAllSelectedItems(Collection selectedRows, UserGrid us List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); return FacadeProvider.getUserFacade().enableUsers(uuids); - }, new ArrayList<>(selectedRows), null, null, remaining -> { + }, new ArrayList<>(selectedRows), remaining -> { userGrid.reload(); if (CollectionUtils.isNotEmpty(remaining)) { userGrid.asMultiSelect().selectItems(remaining.toArray(new UserDto[0])); @@ -429,7 +429,7 @@ public void disableAllSelectedItems(Collection selectedRows, UserGrid u List uuids = batch.stream().map(UserDto::getUuid).collect(Collectors.toList()); return FacadeProvider.getUserFacade().disableUsers(uuids); - }, new ArrayList<>(selectedRows), null, null, remaining -> { + }, new ArrayList<>(selectedRows), remaining -> { userGrid.reload(); if (CollectionUtils.isNotEmpty(remaining)) { userGrid.asMultiSelect().selectItems(remaining.toArray(new UserDto[0])); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index 12e46d2c68e..5456fe62897 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -206,8 +206,6 @@ this. createBulkOperationHandler(archiveHandler, true) selectedEntries -> archiveHandler .archive(selectedEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList())), selectedCasesCpy, - null, - null, batchCallback); } }); @@ -275,8 +273,6 @@ this. createBulkOperationHandler(archiveHandler, false) selectedEntries -> archiveHandler .dearchive(selectedEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList())), selectedCasesCpy, - null, - null, batchCallback); } return true; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 40242cb06d3..83af4939a50 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -38,17 +38,19 @@ public class BulkOperationHandler { * Amount of DTOs that are forwarded to the backend in one single call * when displaying a progress layout. */ - public static final int BULK_ACTION_BATCH_SIZE = 20; + public static final int BULK_ACTION_BATCH_SIZE = 5; /** * Amount of DTOs that have to be selected for the progress layout to be displayed. */ - public static final int BULK_ACTION_PROGRESS_THRESHOLD = 40; + public static final int BULK_ACTION_PROGRESS_THRESHOLD = 10; private boolean cancelAfterCurrentBatch; private boolean cancelButtonClicked; private final Lock cancelLock = new ReentrantLock(); private int initialEntryCount; - private int initialEligibleEntryCount; private int successfulEntryCount; + private int ineligibleEntryCount; + private int eligibleEntryCount; + private boolean areIneligibleEntriesSelected = false; private Window window; private final String allEntriesProcessedMessageProperty; @@ -107,19 +109,13 @@ public static BulkOperationHandler forBulkEdit() { public void doBulkOperation( Function, List> bulkOperationFunction, List selectedEntries, - List selectedEligibleEntries, - List selectedIneligibleEntries, Consumer> bulkOperationDoneCallback) { + initialEntryCount = selectedEntries.size(); if (selectedEntries.size() < BULK_ACTION_PROGRESS_THRESHOLD) { - processEntriesWithoutProgressBar(bulkOperationFunction, selectedEntries, selectedEligibleEntries, selectedIneligibleEntries); + processEntriesWithoutProgressBar(bulkOperationFunction, selectedEntries); bulkOperationDoneCallback.accept(Collections.emptyList()); } else { - initialEntryCount = selectedEntries.size(); - boolean areIneligibleEntriesSelected = areIneligibleEntriesSelected(selectedIneligibleEntries); - selectedEligibleEntries = !areIneligibleEntriesSelected ? selectedEntries : selectedEligibleEntries; - initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); - List entitiesToBeProcessed = new ArrayList<>(); UserDto currentUser = FacadeProvider.getUserFacade().getCurrentUser(); UI currentUI = UI.getCurrent(); @@ -127,37 +123,20 @@ public void doBulkOperation( BulkProgressLayout bulkProgressLayout = new BulkProgressLayout(currentUI, selectedEntries.size(), this::handleCancelButtonClicked); addWindow(bulkProgressLayout, currentUI); - List finalSelectedEligibleEntries = selectedEligibleEntries; Thread bulkThread = new Thread(() -> { currentUI.setPollInterval(300); I18nProperties.setUserLanguage(currentUser.getLanguage()); FacadeProvider.getI18nFacade().setUserLanguage(currentUser.getLanguage()); try { - List remainingEntries = performBulkOperation( - bulkOperationFunction, - selectedEntries, - finalSelectedEligibleEntries, - entitiesToBeProcessed, - bulkProgressLayout::updateProgress); + List remainingEntries = + performBulkOperation(bulkOperationFunction, selectedEntries, entitiesToBeProcessed, bulkProgressLayout::updateProgress); currentUI.access(() -> { window.setClosable(true); - if (initialEligibleEntryCount > 0) { - //If the user does not have the proper rights to perform the action, there will be no processed entities - if (remainingEntries.size() == initialEligibleEntryCount) { - bulkProgressLayout - .finishProgress(ProgressResult.FAILURE, I18nProperties.getString(Strings.errorForbidden), null, () -> { - window.close(); - bulkOperationDoneCallback.accept(Collections.emptyList()); - }); - return; - } - } - //all the selected items were ineligible - if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { + if (eligibleEntryCount == 0 && successfulEntryCount == 0) { bulkProgressLayout.finishProgress( ProgressResult.FAILURE, I18nProperties.getString(Strings.infoBulkProcessNoEligibleEntries), @@ -169,8 +148,10 @@ public void doBulkOperation( return; } - String ineligibleEntriesDescription = - buildIneligibleEntriesDescription(areIneligibleEntriesSelected, selectedIneligibleEntries); + areIneligibleEntriesSelected = ineligibleEntryCount > 0; + List ineligibleEntries = getEntriesByStatus(entitiesToBeProcessed, ProcessedEntityStatus.NOT_ELIGIBLE); + String ineligibleEntriesDescription = buildIneligibleEntriesDescription(areIneligibleEntriesSelected, ineligibleEntries); + String description = buildDescription(ineligibleEntriesDescription, entitiesToBeProcessed); if (cancelAfterCurrentBatch) { @@ -180,8 +161,8 @@ public void doBulkOperation( description, remainingEntries, bulkOperationDoneCallback); - } else if (initialEligibleEntryCount == successfulEntryCount) { - if (initialEntryCount == initialEligibleEntryCount) { + } else if (eligibleEntryCount == successfulEntryCount) { + if (initialEntryCount == eligibleEntryCount) { bulkProgressLayout .finishProgress(ProgressResult.SUCCESS, I18nProperties.getString(Strings.infoBulkProcessFinished), null, () -> { window.close(); @@ -253,39 +234,33 @@ public void handleProgressResultBasedOnSuccessfulEntryCount( } } - public void processEntriesWithoutProgressBar( - Function, List> bulkOperationFunction, - List selectedEntries, - List selectedEligibleEntries, - List selectedIneligibleEntries) { + public void processEntriesWithoutProgressBar(Function, List> bulkOperationFunction, List selectedEntries) { + List processedEntities = new ArrayList<>(); - initialEligibleEntryCount = getInitialEligibleEntryCount(selectedEntries, selectedIneligibleEntries, selectedEligibleEntries); - boolean areIneligibleEntriesSelected = areIneligibleEntriesSelected(selectedIneligibleEntries); - selectedEligibleEntries = !areIneligibleEntriesSelected ? selectedEntries : selectedEligibleEntries; + if (initialEntryCount > 0) { + processedEntities = bulkOperationFunction.apply(selectedEntries); - List processedEntities = new ArrayList<>(); - if (initialEligibleEntryCount > 0) { - processedEntities = - areIneligibleEntriesSelected ? bulkOperationFunction.apply(selectedEligibleEntries) : bulkOperationFunction.apply(selectedEntries); + successfulEntryCount = getEntriesByStatus(processedEntities, ProcessedEntityStatus.SUCCESS).size(); + ineligibleEntryCount = getEntriesByStatus(processedEntities, ProcessedEntityStatus.NOT_ELIGIBLE).size(); + eligibleEntryCount = getEligibleEntryCount(processedEntities); - successfulEntryCount = (int) processedEntities.stream() - .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) - .count(); + areIneligibleEntriesSelected = ineligibleEntryCount > 0; } - if (initialEligibleEntryCount == 0 && successfulEntryCount == 0) { + if (eligibleEntryCount == 0 && successfulEntryCount == 0) { //all the selected items were ineligible NotificationHelper.showNotification(I18nProperties.getString(noEligibleEntityMessageProperty), Notification.Type.WARNING_MESSAGE, -1); return; } - String ineligibleEntriesDescription = buildIneligibleEntriesDescription(areIneligibleEntriesSelected, selectedIneligibleEntries); + List ineligibleEntries = getEntriesByStatus(processedEntities, ProcessedEntityStatus.NOT_ELIGIBLE); + String ineligibleEntriesDescription = buildIneligibleEntriesDescription(areIneligibleEntriesSelected, ineligibleEntries); String heading = successfulEntryCount > 0 ? I18nProperties.getString(headingSomeEntitiesNotProcessed) : I18nProperties.getString(headingNoProcessedEntities); - if (initialEligibleEntryCount > successfulEntryCount) { + if (eligibleEntryCount > successfulEntryCount) { String description = buildDescription(ineligibleEntriesDescription, processedEntities); Window response = VaadinUiUtil.showSimplePopupWindow(heading, description, ContentMode.HTML); @@ -302,10 +277,21 @@ public void processEntriesWithoutProgressBar( } } + public List getEntriesByStatus(List processedEntities, ProcessedEntityStatus status) { + return processedEntities.stream() + .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(status)) + .collect(Collectors.toList()); + } + + public int getEligibleEntryCount(List processedEntities) { + return (int) processedEntities.stream() + .filter(processedEntity -> !processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.NOT_ELIGIBLE)) + .count(); + } + private List performBulkOperation( Function, List> bulkOperationFunction, List selectedEntities, - List selectedEligibleEntities, List entitiesToBeProcessed, Consumer progressUpdateCallback) throws InterruptedException { @@ -326,28 +312,23 @@ private List performBulkOperation( int entriesInBatch = Math.min(BULK_ACTION_BATCH_SIZE, selectedEntities.size() - i); List entitiesFromBatch = selectedEntities.subList(i, Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntities.size())); - List eligibleEntitiesFromBatch = getEligibleEntriesFromBatch(entitiesFromBatch, selectedEligibleEntities); - List ineligibleEntitiesFromBatch = getInEligibleEntriesFromBatch(entitiesFromBatch, selectedEligibleEntities); - List processedEntitiesFromBatch = bulkOperationFunction.apply(eligibleEntitiesFromBatch); - - if (ineligibleEntitiesFromBatch.size() > 0) { - ineligibleEntitiesFromBatch - .forEach(entity -> entitiesToBeProcessed.add(new ProcessedEntity(entity.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE))); - } + List processedEntitiesFromBatch = bulkOperationFunction.apply(entitiesFromBatch); if (processedEntitiesFromBatch.size() > 0) { entitiesToBeProcessed.addAll(processedEntitiesFromBatch); } - int successfullyProcessedInBatch = (int) processedEntitiesFromBatch.stream() - .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) - .count(); + int successfullyProcessedInBatch = getEntriesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.SUCCESS).size(); + int ineligibleEntriesInBatch = getEntriesByStatus(processedEntitiesFromBatch, ProcessedEntityStatus.NOT_ELIGIBLE).size(); + int eligibleEntriesInBatch = getEligibleEntryCount(processedEntitiesFromBatch); successfulEntryCount += successfullyProcessedInBatch; + ineligibleEntryCount += ineligibleEntriesInBatch; + eligibleEntryCount += eligibleEntriesInBatch; + lastProcessedEntry = Math.min(i + BULK_ACTION_BATCH_SIZE, selectedEntities.size() - 1); progressUpdateCallback.accept( new BulkProgressUpdateInfo(entriesInBatch, successfullyProcessedInBatch, entriesInBatch - successfullyProcessedInBatch)); - } } } finally { @@ -385,11 +366,11 @@ public String buildDescription(String ineligibleEntriesDescription, List selectedIneligibleEntries) { + public String buildIneligibleEntriesDescription(boolean areIneligibleEntriesSelected, List selectedIneligibleEntries) { String ineligibleEntriesDescription = StringUtils.EMPTY; if (areIneligibleEntriesSelected) { ineligibleEntriesDescription = getErrorDescription( - selectedIneligibleEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList()), + selectedIneligibleEntries.stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()), I18nProperties.getString(countEntriesNotProcessedMessageProperty), ineligibleEntriesNotProcessedMessageProperty != null ? I18nProperties.getString(ineligibleEntriesNotProcessedMessageProperty) : ""); } @@ -464,24 +445,6 @@ public String buildEntitiesString(List entityUuids) { return entitiesString.toString(); } - public int getInitialEligibleEntryCount(List selectedEntries, List selectedIneligibleEntries, List selectedEligibleEntries) { - return selectedIneligibleEntries != null && selectedIneligibleEntries.size() > 0 ? selectedEligibleEntries.size() : selectedEntries.size(); - } - - public List getEligibleEntriesFromBatch(List entitiesFromBatch, List selectedEligibleEntities) { - List selectedEligibleUuids = selectedEligibleEntities.stream().map(T::getUuid).collect(Collectors.toList()); - return entitiesFromBatch.stream().filter(entity -> selectedEligibleUuids.contains(entity.getUuid())).collect(Collectors.toList()); - } - - public List getInEligibleEntriesFromBatch(List entitiesFromBatch, List selectedEligibleEntities) { - List selectedIneligibleUuids = selectedEligibleEntities.stream().map(T::getUuid).collect(Collectors.toList()); - return entitiesFromBatch.stream().filter(entity -> !selectedIneligibleUuids.contains(entity.getUuid())).collect(Collectors.toList()); - } - - public boolean areIneligibleEntriesSelected(List selectedIneligibleEntries) { - return selectedIneligibleEntries != null && selectedIneligibleEntries.size() > 0; - } - public List getEntitiesByProcessingStatus(List processedEntities, ProcessedEntityStatus status) { return processedEntities.stream() .filter(processedEntity -> processedEntity.getProcessedEntityStatus().equals(status)) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index f4b96d04d87..ac8a07512d1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -51,13 +51,10 @@ public void restoreSelectedItems( confirmed -> { if (Boolean.TRUE.equals(confirmed)) { List selectedEntitiesCpy = new ArrayList<>(entities); - List selectedEligibleEntitiesCpy = new ArrayList<>(entities); this. createBulkOperationHandler(deleteHandler, false) .doBulkOperation( selectedEntries -> deleteHandler.restore(selectedEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList())), selectedEntitiesCpy, - selectedEligibleEntitiesCpy, - null, batchCallback); } }); @@ -65,8 +62,6 @@ this. createBulkOperationHandler(deleteHandler, false) public void deleteAllSelectedItems( Collection entities, - Collection eligibleEntities, - Collection ineligibleEntities, IDeleteRestoreHandler deleteHandler, Consumer> batchCallback) { @@ -105,8 +100,6 @@ public void deleteAllSelectedItems( deleteHandler.clearOtherReason(); List selectedEntitiesCpy = new ArrayList<>(entities); - List selectedEligibleEntitiesCpy = eligibleEntities != null ? new ArrayList<>(eligibleEntities) : new ArrayList<>(entities); - List selectedIneligibleEntitiesCpy = ineligibleEntities != null ? new ArrayList<>(ineligibleEntities) : null; this. createBulkOperationHandler(deleteHandler, true) .doBulkOperation( selectedEntries -> deleteHandler.delete( @@ -115,8 +108,6 @@ this. createBulkOperationHandler(deleteHandler, true) deleteHandler.getDeleteReasonComboBox().getValue(), deleteHandler.getOtherDeletionReason().getValue())), selectedEntitiesCpy, - selectedEligibleEntitiesCpy, - selectedIneligibleEntitiesCpy, batchCallback); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java index 669f8a671c3..10082854dd1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PermanentDeleteController.java @@ -63,8 +63,6 @@ this. createBulkOperationHandler(deleteHandler) .doBulkOperation( selectedEntries -> deleteHandler.delete(selectedEntries.stream().map(HasUuid::getUuid).collect(Collectors.toList())), selectedEntitiesCpy, - null, - null, batchCallback); } From 662988b4c53e58e324699e41c466289b4eb7e087 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 24 Aug 2023 23:24:01 +0300 Subject: [PATCH 048/144] #12257 - change back the batch size --- .../java/de/symeda/sormas/ui/utils/BulkOperationHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java index 83af4939a50..a8a65bce996 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/BulkOperationHandler.java @@ -38,11 +38,11 @@ public class BulkOperationHandler { * Amount of DTOs that are forwarded to the backend in one single call * when displaying a progress layout. */ - public static final int BULK_ACTION_BATCH_SIZE = 5; + public static final int BULK_ACTION_BATCH_SIZE = 20; /** * Amount of DTOs that have to be selected for the progress layout to be displayed. */ - public static final int BULK_ACTION_PROGRESS_THRESHOLD = 10; + public static final int BULK_ACTION_PROGRESS_THRESHOLD = 40; private boolean cancelAfterCurrentBatch; private boolean cancelButtonClicked; private final Lock cancelLock = new ReentrantLock(); From e18d2d92e40babcf268593d59d85dbb12ecab0ef Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 25 Aug 2023 16:56:23 +0300 Subject: [PATCH 049/144] #12257 - change back the api responses to List --- .../symeda/sormas/rest/resources/CaseResource.java | 9 +++++++-- .../sormas/rest/resources/CommunityResource.java | 11 +++++------ .../sormas/rest/resources/ContactResource.java | 12 +++++++----- .../sormas/rest/resources/ContinentResource.java | 10 +++++----- .../sormas/rest/resources/CountryResource.java | 11 +++++------ .../sormas/rest/resources/DistrictResource.java | 9 +++++---- .../symeda/sormas/rest/resources/EventResource.java | 9 +++++++-- .../sormas/rest/resources/FacilityResource.java | 9 +++++---- .../sormas/rest/resources/ImmunizationResource.java | 9 +++++++-- .../sormas/rest/resources/PointOfEntryResource.java | 9 +++++---- .../symeda/sormas/rest/resources/RegionResource.java | 9 +++++---- .../sormas/rest/resources/SubcontinentResource.java | 9 +++++---- .../symeda/sormas/rest/resources/TaskResource.java | 5 +++-- 13 files changed, 71 insertions(+), 50 deletions(-) diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java index 1888b172789..d2b2d094f48 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.validation.Valid; import javax.ws.rs.Consumes; @@ -211,8 +212,12 @@ public CaseDataDto postUpdate(@PathParam("uuid") String uuid, JsonNode caseDataD @POST @Path("/delete") - public List delete(List uuids) { - return FacadeProvider.getCaseFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); + public List delete(List uuids) { + return FacadeProvider.getCaseFacade() + .delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")) + .stream() + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); } @POST diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java index 744ad5ac9d5..cb62d33101f 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -76,16 +77,14 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - List processedEntities = FacadeProvider.getCommunityFacade().archive(uuids); - return processedEntities; + public List archive(@RequestBody List uuids) { + return FacadeProvider.getCommunityFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - List processedEntities = FacadeProvider.getCommunityFacade().dearchive(uuids); - return processedEntities; + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getCommunityFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java index 4f3b2463d5f..bec0fbcec0f 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java @@ -17,6 +17,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.validation.Valid; import javax.ws.rs.Consumes; @@ -149,11 +150,12 @@ public Response updateExternalData(@Valid List externalData) { @POST @Path("/delete") - public List delete(List uuids) { - List processedEntities = - FacadeProvider.getContactFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); - - return processedEntities; + public List delete(List uuids) { + return FacadeProvider.getContactFacade() + .delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")) + .stream() + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); } @GET diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java index 8e8e206ce05..76e764fe097 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -72,15 +73,14 @@ public List getAllUuids() { @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getContinentFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + return FacadeProvider.getContinentFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - List processedEntities = FacadeProvider.getContinentFacade().dearchive(uuids); - return processedEntities; + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getContinentFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java index 621fe0240f2..68a3a9bba96 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -77,16 +78,14 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - List processedEntities = FacadeProvider.getCountryFacade().archive(uuids); - return processedEntities; + public List archive(@RequestBody List uuids) { + return FacadeProvider.getCountryFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - List processedEntities = FacadeProvider.getCountryFacade().dearchive(uuids); - return processedEntities; + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getCountryFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java index f97377de662..53241eb06f3 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -77,14 +78,14 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getDistrictFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + return FacadeProvider.getDistrictFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getDistrictFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getDistrictFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java index 00c7a0eb3de..25045b6bc76 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -137,8 +138,12 @@ public Response updateExternalData(List externalData) { @POST @Path("/delete") - public List delete(List uuids) { - return FacadeProvider.getEventFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); + public List delete(List uuids) { + return FacadeProvider.getEventFacade() + .delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")) + .stream() + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); } @POST diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java index f8693a1e2f4..5b713c710cc 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -83,14 +84,14 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getFacilityFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + return FacadeProvider.getFacilityFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getFacilityFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getFacilityFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java index 7d82d4b518e..13bc938b59f 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.validation.Valid; import javax.ws.rs.Consumes; @@ -124,8 +125,12 @@ public Page getIndexList( @POST @Path("/delete") - public List delete(List uuids) { - return FacadeProvider.getImmunizationFacade().delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")); + public List delete(List uuids) { + return FacadeProvider.getImmunizationFacade() + .delete(uuids, new DeletionDetails(DeletionReason.OTHER_REASON, "Deleted via ReST call")) + .stream() + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toList()); } @POST diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java index fa6d0c7e710..bb34513d8f3 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -76,14 +77,14 @@ public List getAllUuids() { @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getPointOfEntryFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + return FacadeProvider.getPointOfEntryFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getPointOfEntryFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getPointOfEntryFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java index d2aa2aa737d..491c1fa0974 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -77,14 +78,14 @@ public Page getIndexList( @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getRegionFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + return FacadeProvider.getRegionFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getRegionFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getRegionFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java index b9d4d97c8f8..cacdbb98c08 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -72,14 +73,14 @@ public List getAllUuids() { @POST @Path("/archive") - public List archive(@RequestBody List uuids) { - return FacadeProvider.getSubcontinentFacade().archive(uuids); + public List archive(@RequestBody List uuids) { + return FacadeProvider.getSubcontinentFacade().archive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @POST @Path("/dearchive") - public List dearchive(@RequestBody List uuids) { - return FacadeProvider.getSubcontinentFacade().dearchive(uuids); + public List dearchive(@RequestBody List uuids) { + return FacadeProvider.getSubcontinentFacade().dearchive(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java index e1277389f7b..2729214eb71 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -108,8 +109,8 @@ public List getObsoleteUuidsSince(@PathParam("since") long since) { @POST @Path("/delete") - public List delete(List uuids) { - return FacadeProvider.getTaskFacade().delete(uuids); + public List delete(List uuids) { + return FacadeProvider.getTaskFacade().delete(uuids).stream().map(ProcessedEntity::getEntityUuid).collect(Collectors.toList()); } @Override From b7767e30ac6ebcda6b15ef49a7731f04f9d45ce8 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 25 Aug 2023 17:35:40 +0300 Subject: [PATCH 050/144] #12257 - refactor sendCasesInternal, sendEventsInternal --- .../sormas/backend/caze/CaseService.java | 62 +++++++---------- .../sormas/backend/event/EventService.java | 67 +++++++++---------- ...ernalSurveillanceToolGatewayFacadeEjb.java | 38 +++++++++-- .../AbstractInfrastructureFacadeEjb.java | 4 +- .../sormas/backend/task/TaskFacadeEjb.java | 1 + ...lSurveillanceToolGatewayFacadeEjbTest.java | 4 +- 6 files changed, 93 insertions(+), 83 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 0f5986f689b..cdeb4e5a095 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -105,7 +105,6 @@ import de.symeda.sormas.api.therapy.TherapyReferenceDto; import de.symeda.sormas.api.therapy.TreatmentCriteria; import de.symeda.sormas.api.user.JurisdictionLevel; -import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.YesNoUnknown; @@ -186,7 +185,6 @@ import de.symeda.sormas.backend.vaccination.VaccinationService; import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitFacadeEjb; -import de.symeda.sormas.backend.visit.VisitService; @Stateless @LocalBean @@ -201,8 +199,6 @@ public class CaseService extends AbstractCoreAdoService { @EJB private SampleService sampleService; @EJB - private VisitService visitService; - @EJB private EpiDataService epiDataService; @EJB private UserService userService; @@ -1116,16 +1112,21 @@ private void initVisitSubqueryForDeletion(CriteriaBuilder cb, Root visitR @Override public void archive(String entityUuid, Date endOfProcessingDate) { - super.archive(entityUuid, endOfProcessingDate); - List sharedCaseUuids = getEligibleSharedUuids(Collections.singletonList(entityUuid)); - updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, true); + List processedCases = updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(entityUuid), true); + List remainingUuidsToBeProcessed = getEntitiesToBeProcessed(Collections.singletonList(entityUuid), processedCases).stream() + .map(caze -> caze.getUuid()) + .collect(Collectors.toList()); + if (remainingUuidsToBeProcessed.size() > 0) { + super.archive(entityUuid, endOfProcessingDate); + } } @Override public List archive(List entityUuids) { - List processedCases = preprocessCases(entityUuids, true); - List remainingCasesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); - List remainingUuidsToBeProcessed = remainingCasesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + List processedCases = updateArchiveFlagInExternalSurveillanceTool(entityUuids, true); + + List remainingUuidsToBeProcessed = + getEntitiesToBeProcessed(entityUuids, processedCases).stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); if (remainingUuidsToBeProcessed.size() > 0) { super.archive(remainingUuidsToBeProcessed); @@ -1137,9 +1138,10 @@ public List archive(List entityUuids) { @Override public List dearchive(List entityUuids, String dearchiveReason) { - List processedCases = preprocessCases(entityUuids, false); - List remainingCasesToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedCases); - List remainingUuidsToBeProcessed = remainingCasesToBeProcessed.stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + List processedCases = updateArchiveFlagInExternalSurveillanceTool(entityUuids, false); + + List remainingUuidsToBeProcessed = + getEntitiesToBeProcessed(entityUuids, processedCases).stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); if (remainingUuidsToBeProcessed.size() > 0) { super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); @@ -1149,20 +1151,7 @@ public List dearchive(List entityUuids, String dearchiv return processedCases; } - private List preprocessCasesForArchiving(List entityUuids, boolean archiving) { - List processedCases = new ArrayList<>(); - List sharedCaseUuids = getEligibleSharedUuids(entityUuids); - try { - updateArchiveFlagInExternalSurveillanceToolForSharedCases(sharedCaseUuids, archiving); - } catch (ExternalSurveillanceToolRuntimeException e) { - processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); - } catch (AccessDeniedException e) { - processedCases = buildProcessedEntities(sharedCaseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); - } - return processedCases; - } - - public List getEligibleSharedUuids(List entityUuids) { + public List getEligibleUuidsForSharingWithExternalSurveillanceTool(List entityUuids) { List sharedCaseUuids = new ArrayList<>(); List uuidsAllowedToBeShared = getEntityUuidsAllowedToBeShared(entityUuids); if (!uuidsAllowedToBeShared.isEmpty()) { @@ -1172,18 +1161,15 @@ public List getEligibleSharedUuids(List entityUuids) { return sharedCaseUuids; } - public void updateArchiveFlagInExternalSurveillanceToolForSharedCases(List sharedCaseUuids, boolean archived) { - if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { - if (!sharedCaseUuids.isEmpty()) { - try { - externalSurveillanceToolGatewayFacade.sendCasesInternal(sharedCaseUuids, archived); - } catch (ExternalSurveillanceToolException e) { - throw new ExternalSurveillanceToolRuntimeException(e.getMessage(), e.getErrorCode()); - } catch (AccessDeniedException e) { - throw new AccessDeniedException(e.getMessage()); - } - } + private List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { + List processedEntities = new ArrayList<>(); + + List sharedCaseUuids = getEligibleUuidsForSharingWithExternalSurveillanceTool(entityUuids); + if (!sharedCaseUuids.isEmpty()) { + processedEntities = externalSurveillanceToolGatewayFacade.sendCasesInternal(sharedCaseUuids, archived); } + + return processedEntities; } public List getSharedCaseUuids(List entityUuids) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index e0c424392eb..b86c654f5b2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -62,7 +62,6 @@ import de.symeda.sormas.api.sormastosormas.SormasToSormasException; import de.symeda.sormas.api.task.TaskCriteria; import de.symeda.sormas.api.user.JurisdictionLevel; -import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; @@ -297,61 +296,55 @@ public Event getEventReferenceByEventParticipant(String eventParticipantUuid) { @Override public void archive(String entityUuid, Date endOfProcessingDate) { - super.archive(entityUuid, endOfProcessingDate); - List sharedEventUuids = getSharedEventUuids(Collections.singletonList(entityUuid)); - updateArchiveFlagInExternalSurveillanceToolForSharedEvents(sharedEventUuids, true); + List processedEvents = updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(entityUuid), true); + List remainingUuidsToBeProcessed = getEntitiesToBeProcessed(Collections.singletonList(entityUuid), processedEvents).stream() + .map(event -> event.getUuid()) + .collect(Collectors.toList()); + + if (remainingUuidsToBeProcessed.size() > 0) { + super.archive(entityUuid, endOfProcessingDate); + } } @Override public List archive(List entityUuids) { - List processedEvents = preprocessEvents(entityUuids, true); - List remainingEventsToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedEvents); - List remainingUuidsToBeProcessed = remainingEventsToBeProcessed.stream().map(event -> event.getUuid()).collect(Collectors.toList()); + List processedEvents = updateArchiveFlagInExternalSurveillanceTool(entityUuids, true); - super.archive(remainingUuidsToBeProcessed); - processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + List remainingUuidsToBeProcessed = + getEntitiesToBeProcessed(entityUuids, processedEvents).stream().map(event -> event.getUuid()).collect(Collectors.toList()); + + if (remainingUuidsToBeProcessed.size() > 0) { + super.archive(remainingUuidsToBeProcessed); + processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + } return processedEvents; } @Override public List dearchive(List entityUuids, String dearchiveReason) { - List processedEvents = preprocessEvents(entityUuids, false); - List remainingEventsToBeProcessed = getEntitiesToBeProcessed(entityUuids, processedEvents); - List remainingUuidsToBeProcessed = remainingEventsToBeProcessed.stream().map(event -> event.getUuid()).collect(Collectors.toList()); + List processedEvents = updateArchiveFlagInExternalSurveillanceTool(entityUuids, false); - super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); - processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + List remainingUuidsToBeProcessed = + getEntitiesToBeProcessed(entityUuids, processedEvents).stream().map(event -> event.getUuid()).collect(Collectors.toList()); + + if (remainingUuidsToBeProcessed.size() > 0) { + super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); + processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + } return processedEvents; } - public List preprocessEvents(List entityUuids, boolean archiving) { - List processedEvents = new ArrayList<>(); + public List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { + List processedEntities = new ArrayList<>(); + List sharedEventUuids = getSharedEventUuids(entityUuids); - try { - updateArchiveFlagInExternalSurveillanceToolForSharedEvents(sharedEventUuids, archiving); - } catch (ExternalSurveillanceToolRuntimeException e) { - processedEvents = buildProcessedEntities(sharedEventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); - } catch (AccessDeniedException e) { - processedEvents = buildProcessedEntities(sharedEventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + if (!sharedEventUuids.isEmpty()) { + processedEntities = externalSurveillanceToolGatewayFacade.sendEventsInternal(sharedEventUuids, archived); } - return processedEvents; - } - public void updateArchiveFlagInExternalSurveillanceToolForSharedEvents(List entityUuids, boolean archived) { - if (externalSurveillanceToolGatewayFacade.isFeatureEnabled()) { - List sharedEventUuids = getSharedEventUuids(entityUuids); - if (!sharedEventUuids.isEmpty()) { - try { - externalSurveillanceToolGatewayFacade.sendEventsInternal(sharedEventUuids, archived); - } catch (ExternalSurveillanceToolException e) { - throw new ExternalSurveillanceToolRuntimeException(e.getMessage(), e.getErrorCode()); - } catch (AccessDeniedException e) { - throw new AccessDeniedException(e.getMessage()); - } - } - } + return processedEntities; } public List getSharedEventUuids(List entityUuids) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java index 16b6f1f79bc..e661fa45c85 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java @@ -97,8 +97,23 @@ public List sendCases(List caseUuids) { } @RightsAllowed(UserRight._CASE_ARCHIVE) - public void sendCasesInternal(List caseUuids, boolean archived) throws ExternalSurveillanceToolException { - doSendCases(caseUuids, archived); + public List sendCasesInternal(List caseUuids, boolean archived) { + List processedCases = new ArrayList<>(); + + if (isFeatureEnabled()) { + try { + doSendCases(caseUuids, archived); + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.SUCCESS)); + } catch (ExternalSurveillanceToolException e) { + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } catch (AccessDeniedException e) { + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } + } else { + processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } + + return processedCases; } private void doSendCases(List caseUuids, boolean archived) throws ExternalSurveillanceToolException { @@ -131,8 +146,23 @@ public List sendEvents(List eventUuids) { } @RightsAllowed(UserRight._EVENT_ARCHIVE) - public void sendEventsInternal(List eventUuids, boolean archived) throws ExternalSurveillanceToolException { - doSendEvents(eventUuids, archived); + public List sendEventsInternal(List eventUuids, boolean archived) { + List processedEvents = new ArrayList<>(); + + if (isFeatureEnabled()) { + try { + doSendEvents(eventUuids, archived); + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.SUCCESS)); + } catch (ExternalSurveillanceToolException e) { + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } catch (AccessDeniedException e) { + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + } + } else { + processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + } + + return processedEvents; } private List buildProcessedEntitiesListByStatus(List uuids, ProcessedEntityStatus processedEntityStatus) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java index d99c83dee00..8d31235ac0f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java @@ -234,10 +234,10 @@ public List archive(List entityUuids) { @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) public List dearchive(List entityUuids) { List processedEntities = new ArrayList<>(); + entityUuids.forEach(entityUuid -> { if (!hasArchivedParentInfrastructure(Arrays.asList(entityUuid))) { - dearchive(entityUuid); - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); + processedEntities.addAll(dearchive(entityUuid)); } else { processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index e4d15be8213..825f0d73571 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -414,6 +414,7 @@ public List saveBulkTasks( processedTasks.add(new ProcessedEntity(taskUuid, ProcessedEntityStatus.SUCCESS)); } catch (Exception e) { processedTasks.add(new ProcessedEntity(taskUuid, ProcessedEntityStatus.INTERNAL_FAILURE)); + logger.error("The task with uuid {} could not be saved due to an Exception", taskUuid, e); } } return processedTasks; diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java index 14a03d4f909..d94292c09fc 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java @@ -377,7 +377,7 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_WithProperEn .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); List sharedEventUuids = eventService.getSharedEventUuids(Collections.singletonList(event.getUuid())); - eventService.updateArchiveFlagInExternalSurveillanceToolForSharedEvents(sharedEventUuids, false); + eventService.updateArchiveFlagInExternalSurveillanceTool(sharedEventUuids, false); wireMockRuntime.getWireMock().verify(exactly(1), postRequestedFor(urlEqualTo("/export"))); } @@ -414,7 +414,7 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_Exception() assertThrows( ExternalSurveillanceToolRuntimeException.class, - () -> eventService.updateArchiveFlagInExternalSurveillanceToolForSharedEvents(Collections.singletonList(eventDto.getUuid()), true)); + () -> eventService.updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(eventDto.getUuid()), true)); } @Test From 37c097caa2dfb2320c6f2ab8f2fa6a49e2a4aa5f Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Fri, 25 Aug 2023 17:52:05 +0300 Subject: [PATCH 051/144] #12257 - fix linking of events to event group --- .../sormas/ui/events/EventGroupController.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java index 5511c004909..2390c0b29bf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -78,11 +79,14 @@ private void linkEventsToGroup( List alreadyLinkedEventsToGroup = FacadeProvider.getEventGroupFacade().getIneligibleEventUuidsToBeLinkedToGroup(eventUuids, eventGroupUuids); + List eligibleEventReferences = FacadeProvider.getEventGroupFacade() .getEligibleEventUuidsToBeLinkedToGroup( eventUuids, alreadyLinkedEventsToGroup.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList())); + List eligibleEventUuids = eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); + String messageEventsLinkedToGroup = eventReferences.size() > 1 ? Strings.messageEventsLinkedToGroup : Strings.messageEventLinkedToGroup; new BulkOperationHandler( messageEventsLinkedToGroup, @@ -97,21 +101,19 @@ private void linkEventsToGroup( Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { - List eligibleEventUuids = eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); List eligibleEventUuidsFromBatch = batch.stream() .filter(eventReference -> eligibleEventUuids.contains(eventReference.getUuid())) .map(EventReferenceDto::getUuid) .collect(Collectors.toList()); - eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); List processedEvents = FacadeProvider.getEventGroupFacade().linkEventsToGroups(eligibleEventUuidsFromBatch, eventGroupUuids); + FacadeProvider.getEventGroupFacade() - .notifyEventAddedToEventGroup( - eventGroupReference.getUuid(), - eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toSet())); + .notifyEventAddedToEventGroup(eventGroupReference.getUuid(), new HashSet<>(eligibleEventUuidsFromBatch)); + return processedEvents; - }, new ArrayList<>(eventReferences), new ArrayList<>(eligibleEventReferences), new ArrayList<>(alreadyLinkedEventsToGroup), callback); + }, new ArrayList<>(eventReferences), callback); } public void create(EventReferenceDto eventReference) { From bc06cbad96a13d4b026ce340457bb584b0ee7447 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Tue, 29 Aug 2023 10:02:05 +0300 Subject: [PATCH 052/144] #11571 Add an import mechanism to the environment directory --- .../de/symeda/sormas/api/FacadeProvider.java | 5 + .../environment/EnvironmentImportFacade.java | 31 ++ .../de/symeda/sormas/api/i18n/Strings.java | 1 + .../symeda/sormas/api/i18n/Validations.java | 3 + .../sormas/api/importexport/ImportFacade.java | 11 +- .../src/main/resources/strings.properties | 1 + .../src/main/resources/validations.properties | 3 + .../common/StartupShutdownService.java | 6 + .../EnvironmentImportFacadeEjb.java | 343 ++++++++++++++++++ .../environment/EnvironmentService.java | 4 + .../eventimport/EventImportFacadeEjb.java | 12 +- .../backend/importexport/ImportFacadeEjb.java | 25 ++ .../backend/importexport/ImportHelper.java | 17 +- .../parser/ImportParserService.java | 32 ++ .../sormas/backend/ArchitectureTest.java | 6 + .../ui/environment/EnvironmentsView.java | 27 +- .../importer/EnvironmentImportLayout.java | 64 ++++ .../importer/EnvironmentImporter.java | 59 +++ .../sormas/backend/AbstractBeanTest.java | 5 + .../symeda/sormas/ui/FacadeProviderMock.java | 4 + .../environment/EnvironmentImporterTest.java | 108 ++++++ .../sormas_environment_import_test.csv | 7 + 22 files changed, 756 insertions(+), 18 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentImportFacade.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentImportFacadeEjb.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImportLayout.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImporter.java create mode 100644 sormas-ui/src/test/java/de/symeda/sormas/ui/environment/EnvironmentImporterTest.java create mode 100644 sormas-ui/src/test/resources/sormas_environment_import_test.csv diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java index e01f51223c4..73f28a30cfa 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java @@ -46,6 +46,7 @@ import de.symeda.sormas.api.docgeneneration.QuarantineOrderFacade; import de.symeda.sormas.api.document.DocumentFacade; import de.symeda.sormas.api.environment.EnvironmentFacade; +import de.symeda.sormas.api.environment.EnvironmentImportFacade; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleFacade; import de.symeda.sormas.api.epidata.EpiDataFacade; import de.symeda.sormas.api.event.EventFacade; @@ -509,6 +510,10 @@ public static EnvironmentSampleFacade getEnvironmentSampleFacade() { return get().lookupEjbRemote(EnvironmentSampleFacade.class); } + public static EnvironmentImportFacade getEnvironmentImportFacade() { + return get().lookupEjbRemote(EnvironmentImportFacade.class); + } + @SuppressWarnings("unchecked") public

P lookupEjbRemote(Class

clazz) { try { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentImportFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentImportFacade.java new file mode 100644 index 00000000000..782ed161713 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentImportFacade.java @@ -0,0 +1,31 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.api.environment; + +import javax.ejb.Remote; + +import de.symeda.sormas.api.importexport.ImportLineResultDto; + +@Remote +public interface EnvironmentImportFacade { + + ImportLineResultDto importEnvironmentData( + String[] values, + String[] entityClasses, + String[] entityProperties, + String[][] entityPropertyPaths, + boolean ignoreEmptyEntries); +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index f1cc4ada484..c19381d8f5c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -608,6 +608,7 @@ public interface Strings { String headingImportDistricts = "headingImportDistricts"; String headingImportedCaseInfo = "headingImportedCaseInfo"; String headingImportedPersonInfo = "headingImportedPersonInfo"; + String headingImportEnvironments = "headingImportEnvironments"; String headingImportError = "headingImportError"; String headingImportEvent = "headingImportEvent"; String headingImportEventParticipant = "headingImportEventParticipant"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java index 63265621591..a963bf6c348 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java @@ -101,6 +101,8 @@ public interface Validations { String importEntryDoesNotExistDbOrDistrict = "importEntryDoesNotExistDbOrDistrict"; String importEntryDoesNotExistDbOrRegion = "importEntryDoesNotExistDbOrRegion"; String importEntryRegionNotInUsersJurisdiction = "importEntryRegionNotInUsersJurisdiction"; + String importEnvironmentPropertyTypeNotAllowed = "importEnvironmentPropertyTypeNotAllowed"; + String importEnvironmentUnexpectedError = "importEnvironmentUnexpectedError"; String importErrorCustomizableEnumValue = "importErrorCustomizableEnumValue"; String importErrorInColumn = "importErrorInColumn"; String importEventParticipantsPropertyTypeNotAllowed = "importEventParticipantsPropertyTypeNotAllowed"; @@ -110,6 +112,7 @@ public interface Validations { String importFacilityNotUniqueInDistrict = "importFacilityNotUniqueInDistrict"; String importIncompleteContent = "importIncompleteContent"; String importInvalidDate = "importInvalidDate"; + String importInvalidWaterUseValue = "importInvalidWaterUseValue"; String importLabNotUnique = "importLabNotUnique"; String importLaboratoryAlreadyExists = "importLaboratoryAlreadyExists"; String importLineTooLong = "importLineTooLong"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportFacade.java index 06368120d2b..9df85b07100 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportFacade.java @@ -17,13 +17,14 @@ *******************************************************************************/ package de.symeda.sormas.api.importexport; -import de.symeda.sormas.api.feature.FeatureConfigurationDto; import java.io.IOException; import java.net.URI; - import java.util.List; + import javax.ejb.Remote; +import de.symeda.sormas.api.feature.FeatureConfigurationDto; + @Remote public interface ImportFacade { @@ -68,6 +69,8 @@ public interface ImportFacade { void generateContactImportTemplateFile(List featureConfigurations) throws IOException; + void generateEnvironmentImportTemplateFile(List featureConfigurations) throws IOException; + String getCaseImportTemplateFileName(); String getCaseImportTemplateFilePath(); @@ -141,4 +144,8 @@ public interface ImportFacade { String getContactImportTemplateFilePath(); String getImportTemplateContent(String templateFilePath) throws IOException; + + String getEnvironmentImportTemplateFilePath(); + + String getEnvironmentImportTemplateFileName(); } diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index b7b3177237b..1d0c14abfc5 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -574,6 +574,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction diff --git a/sormas-api/src/main/resources/validations.properties b/sormas-api/src/main/resources/validations.properties index e840ee0ed67..74c626dc7ef 100644 --- a/sormas-api/src/main/resources/validations.properties +++ b/sormas-api/src/main/resources/validations.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java index 4d2ed0ab404..a39104993ba 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java @@ -1001,6 +1001,12 @@ private void createImportTemplateFiles(List featureConf } catch (IOException e) { logger.error("Could not create event participant import template .csv file."); } + + try { + importFacade.generateEnvironmentImportTemplateFile(featureConfigurations); + } catch (IOException e) { + logger.error("Could not create environment import template .csv file."); + } } private void createMissingDiseaseConfigurations() { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentImportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentImportFacadeEjb.java new file mode 100644 index 00000000000..1d2aed4232a --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentImportFacadeEjb.java @@ -0,0 +1,343 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.backend.environment; + +import static de.symeda.sormas.backend.environment.EnvironmentFacadeEjb.EnvironmentFacadeEjbLocal; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.symeda.sormas.api.environment.EnvironmentDto; +import de.symeda.sormas.api.environment.EnvironmentImportFacade; +import de.symeda.sormas.api.environment.WaterUse; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.importexport.ImportCellData; +import de.symeda.sormas.api.importexport.ImportErrorException; +import de.symeda.sormas.api.importexport.ImportLineResultDto; +import de.symeda.sormas.api.importexport.InvalidColumnException; +import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.backend.importexport.ImportFacadeEjb.ImportFacadeEjbLocal; +import de.symeda.sormas.backend.importexport.ImportHelper; +import de.symeda.sormas.backend.infrastructure.community.CommunityFacadeEjb; +import de.symeda.sormas.backend.infrastructure.district.DistrictFacadeEjb; +import de.symeda.sormas.backend.infrastructure.facility.FacilityFacadeEjb; +import de.symeda.sormas.backend.user.UserFacadeEjb.UserFacadeEjbLocal; +import de.symeda.sormas.backend.util.RightsAllowed; + +@Stateless(name = "EnvironmentImportFacade") +@RightsAllowed(UserRight._ENVIRONMENT_IMPORT) +public class EnvironmentImportFacadeEjb implements EnvironmentImportFacade { + + private static final String ERROR_COLUMN_NAME = I18nProperties.getCaption(Captions.importErrorDescription); + private final Logger LOGGER = LoggerFactory.getLogger(getClass()); + @EJB + private UserFacadeEjbLocal userFacade; + @EJB + private EnvironmentFacadeEjbLocal environmentFacade; + @EJB + private ImportFacadeEjbLocal importFacade; + @EJB + private DistrictFacadeEjb.DistrictFacadeEjbLocal districtFacade; + @EJB + private CommunityFacadeEjb.CommunityFacadeEjbLocal communityFacade; + @EJB + private FacilityFacadeEjb.FacilityFacadeEjbLocal facilityFacade; + + @Override + public ImportLineResultDto importEnvironmentData( + String[] values, + String[] entityClasses, + String[] entityProperties, + String[][] entityPropertyPaths, + boolean ignoreEmptyEntries) { + // Check whether the new line has the same length as the header line + if (values.length > entityProperties.length) { + return ImportLineResultDto.errorResult(I18nProperties.getValidationError(Validations.importLineTooLong)); + } + + final EnvironmentDto environment = EnvironmentDto.build(userFacade.getCurrentUser()); + ImportLineResultDto importResult = + buildEnvironment(values, entityClasses, entityPropertyPaths, ignoreEmptyEntries, environment); + if (importResult.isError()) { + return importResult; + } + + ImportLineResultDto validationResult = validateEnvironment(environment); + if (validationResult.isError()) { + return validationResult; + } + + return saveEnvironment(environment); + } + + private ImportLineResultDto buildEnvironment( + String[] values, + String[] entityClasses, + String[][] entityPropertyPaths, + boolean ignoreEmptyEntries, + EnvironmentDto environment) { + + return (ImportLineResultDto) insertRowIntoData(values, entityClasses, entityPropertyPaths, ignoreEmptyEntries, (cellData) -> { + try { + if (!StringUtils.isEmpty(cellData.getValue())) { + insertColumnEntryIntoData(environment, cellData.getValue(), cellData.getEntityPropertyPath()); + } + } catch (ImportErrorException | InvalidColumnException e) { + return e; + } + + return null; + }); + } + + protected ImportLineResultDto insertRowIntoData( + String[] values, + String[] entityClasses, + String[][] entityPropertyPaths, + boolean ignoreEmptyEntries, + Function insertCallback) { + + String importError = null; + List invalidColumns = new ArrayList<>(); + + for (int i = 0; i < values.length; i++) { + String value = StringUtils.trimToNull(values[i]); + if (ignoreEmptyEntries && (value == null || value.isEmpty())) { + continue; + } + + String[] entityPropertyPath = entityPropertyPaths[i]; + // Error description column is ignored + if (entityPropertyPath[0].equals(ERROR_COLUMN_NAME)) { + continue; + } + + if (!(ignoreEmptyEntries && StringUtils.isEmpty(value))) { + Exception exception = + insertCallback.apply(new ImportCellData(value, entityClasses != null ? entityClasses[i] : null, entityPropertyPath)); + if (exception != null) { + if (exception instanceof ImportErrorException) { + importError = exception.getMessage(); + break; + } else if (exception instanceof InvalidColumnException) { + invalidColumns.add(((InvalidColumnException) exception).getColumnName()); + } + } + } + } + + if (!invalidColumns.isEmpty()) { + LOGGER.warn("Unhandled columns [{}]", String.join(", ", invalidColumns)); + } + + return importError != null ? ImportLineResultDto.errorResult(importError) : ImportLineResultDto.successResult(); + } + + private void insertColumnEntryIntoData(EnvironmentDto environment, String entry, String[] entryHeaderPath) + throws InvalidColumnException, ImportErrorException { + + Object currentElement = environment; + for (int i = 0; i < entryHeaderPath.length; i++) { + String headerPathElementName = entryHeaderPath[i]; + + try { + if (i != entryHeaderPath.length - 1) { + currentElement = new PropertyDescriptor(headerPathElementName, currentElement.getClass()).getReadMethod().invoke(currentElement); + } else { + PropertyDescriptor pd = new PropertyDescriptor(headerPathElementName, currentElement.getClass()); + Class propertyType = pd.getPropertyType(); + + // Execute the default invokes specified in the data importer; if none of those were triggered, execute additional invokes + if (importFacade.executeDefaultInvoke(pd, currentElement, entry, entryHeaderPath, true)) { + continue; + } + + if (EnvironmentDto.WATER_USE.equals(entryHeaderPath[0])) { + try { + ObjectMapper mapper = new ObjectMapper(); + Map waterUse = mapper.readValue(entry, new TypeReference<>() { + }); + + pd.getWriteMethod().invoke(currentElement, waterUse); + } catch (Exception e) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importInvalidWaterUseValue, + entry, + importFacade.buildEntityProperty(entryHeaderPath), + Stream.of(WaterUse.values()).map(WaterUse::name).collect(Collectors.joining(", ")))); + } + } else if (propertyType.isAssignableFrom(DistrictReferenceDto.class)) { + List district = districtFacade + .getByName(entry, ImportHelper.getRegionBasedOnDistrict(pd.getName(), environment.getLocation(), currentElement), false); + if (district.isEmpty()) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importEntryDoesNotExistDbOrRegion, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } else if (district.size() > 1) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importDistrictNotUnique, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } else { + pd.getWriteMethod().invoke(currentElement, district.get(0)); + } + } else if (propertyType.isAssignableFrom(CommunityReferenceDto.class)) { + List community = communityFacade.getByName( + entry, + ImportHelper.getDistrictBasedOnCommunity(pd.getName(), environment.getLocation(), currentElement), + false); + if (community.isEmpty()) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importEntryDoesNotExistDbOrDistrict, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } else if (community.size() > 1) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importCommunityNotUnique, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } else { + pd.getWriteMethod().invoke(currentElement, community.get(0)); + } + } else if (propertyType.isAssignableFrom(FacilityReferenceDto.class)) { + DataHelper.Pair infrastructureData = + ImportHelper.getDistrictAndCommunityBasedOnFacility(pd.getName(), environment.getLocation(), currentElement); + List facilities = facilityFacade.getByNameAndType( + entry, + infrastructureData.getElement0(), + infrastructureData.getElement1(), + environment.getLocation().getFacilityType(), + false); + + if (facilities.isEmpty()) { + if (infrastructureData.getElement1() != null) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importEntryDoesNotExistDbOrCommunity, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } else { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importEntryDoesNotExistDbOrDistrict, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } + } else if (facilities.size() > 1 && infrastructureData.getElement1() == null) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importFacilityNotUniqueInDistrict, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } else if (facilities.size() > 1 && infrastructureData.getElement1() != null) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importFacilityNotUniqueInCommunity, + entry, + importFacade.buildEntityProperty(entryHeaderPath))); + } else { + pd.getWriteMethod().invoke(currentElement, facilities.get(0)); + } + } else { + throw new UnsupportedOperationException( + I18nProperties.getValidationError(Validations.importEnvironmentPropertyTypeNotAllowed, propertyType.getName())); + } + } + } catch (IntrospectionException e) { + throw new InvalidColumnException(importFacade.buildEntityProperty(entryHeaderPath)); + } catch (InvocationTargetException | IllegalAccessException e) { + throw new ImportErrorException( + I18nProperties.getValidationError(Validations.importErrorInColumn, importFacade.buildEntityProperty(entryHeaderPath))); + } catch (IllegalArgumentException e) { + throw new ImportErrorException(entry, importFacade.buildEntityProperty(entryHeaderPath)); + } catch (ParseException e) { + throw new ImportErrorException( + I18nProperties.getValidationError( + Validations.importInvalidDate, + importFacade.buildEntityProperty(entryHeaderPath), + DateHelper.getAllowedDateFormats(I18nProperties.getUserLanguage().getDateFormat()))); + } catch (ImportErrorException e) { + throw e; + } catch (Exception e) { + LOGGER.error("Unexpected error when trying to import an environment: " + e.getMessage(), e); + throw new ImportErrorException(I18nProperties.getValidationError(Validations.importEnvironmentUnexpectedError)); + } + } + } + + private ImportLineResultDto validateEnvironment(EnvironmentDto environment) { + ImportLineResultDto validationResult = importFacade.validateConstraints(environment); + if (validationResult.isError()) { + return validationResult; + } + + try { + environmentFacade.validate(environment); + } catch (ValidationRuntimeException e) { + return ImportLineResultDto.errorResult(e.getMessage()); + } + + return ImportLineResultDto.successResult(); + } + + private ImportLineResultDto saveEnvironment(EnvironmentDto environment) { + try { + environmentFacade.save(environment); + + return ImportLineResultDto.successResult(); + } catch (ValidationRuntimeException e) { + return ImportLineResultDto.errorResult(e.getMessage()); + } + } + + @Stateless + @LocalBean + public static class EnvironmentImportFacadeEjbLocal extends EnvironmentImportFacadeEjb { + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java index 034cfc56a30..6b7348e8c3f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java @@ -133,6 +133,10 @@ protected > T addChangeDates(T builder, Environme public Predicate buildCriteriaFilter(EnvironmentCriteria environmentCriteria, EnvironmentQueryContext environmentQueryContext) { + if (environmentCriteria == null) { + return null; + } + CriteriaBuilder cb = environmentQueryContext.getCriteriaBuilder(); From from = environmentQueryContext.getRoot(); final EnvironmentJoins joins = environmentQueryContext.getJoins(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/eventimport/EventImportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/eventimport/EventImportFacadeEjb.java index ef4e5aaa544..2072f0706ae 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/eventimport/EventImportFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/eventimport/EventImportFacadeEjb.java @@ -335,7 +335,10 @@ private void insertColumnEntryIntoData(EventDto event, String entry, String[] en } } else if (propertyType.isAssignableFrom(DistrictReferenceDto.class)) { List district = - districtFacade.getByName(entry, ImportHelper.getRegionBasedOnDistrict(pd.getName(), event, currentElement), false); + districtFacade.getByName( + entry, + ImportHelper.getRegionBasedOnDistrict(pd.getName(), event.getEventLocation(), currentElement), + false); if (district.isEmpty()) { throw new ImportErrorException( I18nProperties.getValidationError( @@ -353,7 +356,10 @@ private void insertColumnEntryIntoData(EventDto event, String entry, String[] en } } else if (propertyType.isAssignableFrom(CommunityReferenceDto.class)) { List community = - communityFacade.getByName(entry, ImportHelper.getDistrictBasedOnCommunity(pd.getName(), event, currentElement), false); + communityFacade.getByName( + entry, + ImportHelper.getDistrictBasedOnCommunity(pd.getName(), event.getEventLocation(), currentElement), + false); if (community.isEmpty()) { throw new ImportErrorException( I18nProperties.getValidationError( @@ -371,7 +377,7 @@ private void insertColumnEntryIntoData(EventDto event, String entry, String[] en } } else if (propertyType.isAssignableFrom(FacilityReferenceDto.class)) { DataHelper.Pair infrastructureData = - ImportHelper.getDistrictAndCommunityBasedOnFacility(pd.getName(), event, currentElement); + ImportHelper.getDistrictAndCommunityBasedOnFacility(pd.getName(), event.getEventLocation(), currentElement); List facilities = facilityFacade.getByNameAndType( entry, infrastructureData.getElement0(), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java index ed279cb60f5..b100d4ecf50 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java @@ -94,6 +94,7 @@ import de.symeda.sormas.api.caze.PlagueType; import de.symeda.sormas.api.caze.RabiesType; import de.symeda.sormas.api.contact.ContactDto; +import de.symeda.sormas.api.environment.EnvironmentDto; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventGroupReferenceDto; import de.symeda.sormas.api.event.EventParticipantDto; @@ -224,6 +225,7 @@ public class ImportFacadeEjb implements ImportFacade { private static final String CONTACT_IMPORT_TEMPLATE_FILE_NAME = "import_contact_template.csv"; private static final String CAMPAIGN_FORM_IMPORT_TEMPLATE_FILE_NAME = "import_campaign_form_data_template.csv"; private static final String TRAVEL_ENTRY_IMPORT_TEMPLATE_FILE_NAME = "import_travel_entry_template.csv"; + private static final String ENVIRONMENT_IMPORT_TEMPLATE_FILE_NAME = "import_environment_template.csv"; private static final String ALL_COUNTRIES_IMPORT_FILE_NAME = "sormas_import_all_countries.csv"; private static final String ALL_SUBCONTINENTS_IMPORT_FILE_NAME = "sormas_import_all_subcontinents.csv"; @@ -514,6 +516,19 @@ private void generateImportTemplateFile(Class clazz, Pa writeTemplate(filePath, importColumns, false); } + @Override + public void generateEnvironmentImportTemplateFile(List featureConfigurations) throws IOException { + + createExportDirectoryIfNecessary(); + + char separator = configFacade.getCsvSeparator(); + + List importColumns = new ArrayList<>(); + appendListOfFields(importColumns, EnvironmentDto.class, "", separator, featureConfigurations); + + writeTemplate(Paths.get(getEnvironmentImportTemplateFilePath()), importColumns, true); + } + @Override public String getCaseImportTemplateFileName() { return getImportTemplateFileName(CASE_IMPORT_TEMPLATE_FILE_NAME); @@ -857,6 +872,16 @@ public String getImportTemplateContent(String templateFilePath) throws IOExcepti return resolvePlaceholders(content); } + @Override + public String getEnvironmentImportTemplateFilePath() { + return getImportTemplateFilePath(ENVIRONMENT_IMPORT_TEMPLATE_FILE_NAME); + } + + @Override + public String getEnvironmentImportTemplateFileName() { + return getImportTemplateFileName(ENVIRONMENT_IMPORT_TEMPLATE_FILE_NAME); + } + /** * Replaces placeholders in the given file content. * The placeholders are resolved using dynamic data. For any static data extend {@link ImportColumn}. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportHelper.java index 4e2fb1d28e9..0d4a7d0779c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportHelper.java @@ -18,7 +18,6 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseLogic; import de.symeda.sormas.api.contact.ContactDto; -import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventParticipantDto; import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; @@ -70,11 +69,11 @@ public static DataHelper.Pair getDi } } - public static RegionReferenceDto getRegionBasedOnDistrict(String propertyName, EventDto event, Object currentElement) { + public static RegionReferenceDto getRegionBasedOnDistrict(String propertyName, LocationDto associatedLocation, Object currentElement) { if (!(currentElement instanceof LocationDto)) { throw new IllegalArgumentException("currentElement is not a LocationDto: " + currentElement.getClass()); } - return event.getEventLocation().getRegion(); + return associatedLocation.getRegion(); } public static RegionReferenceDto getRegionBasedOnDistrict( @@ -123,11 +122,11 @@ public static RegionReferenceDto getTravelEntryRegion(String propertyName, Trave } } - public static DistrictReferenceDto getDistrictBasedOnCommunity(String propertyName, EventDto event, Object currentElement) { + public static DistrictReferenceDto getDistrictBasedOnCommunity(String propertyName, LocationDto associatedLocation, Object currentElement) { if (!(currentElement instanceof LocationDto)) { throw new IllegalArgumentException("currentElement is not a LocationDto: " + currentElement.getClass()); } - return event.getEventLocation().getDistrict(); + return associatedLocation.getDistrict(); } public static DistrictReferenceDto getDistrictBasedOnCommunity( @@ -181,9 +180,13 @@ public static DistrictReferenceDto getPersonDistrict(String propertyName, Person public static DataHelper.Pair getDistrictAndCommunityBasedOnFacility( String propertyName, - EventDto event, + LocationDto associatedLocation, Object currentElement) { - return DataHelper.Pair.createPair(event.getEventLocation().getDistrict(), event.getEventLocation().getCommunity()); + if (!(currentElement instanceof LocationDto)) { + throw new IllegalArgumentException("currentElement is not a LocationDto: " + currentElement.getClass()); + } + + return DataHelper.Pair.createPair(associatedLocation.getDistrict(), associatedLocation.getCommunity()); } public static DataHelper.Pair getDistrictAndCommunityBasedOnFacility( diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/parser/ImportParserService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/parser/ImportParserService.java index 1c432c446f4..eaf1f6a410c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/parser/ImportParserService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/parser/ImportParserService.java @@ -31,18 +31,22 @@ import de.symeda.sormas.api.importexport.format.ImportExportFormat; import de.symeda.sormas.api.importexport.format.ImportFormat; import de.symeda.sormas.api.infrastructure.area.AreaReferenceDto; +import de.symeda.sormas.api.infrastructure.continent.ContinentReferenceDto; import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.infrastructure.subcontinent.SubcontinentReferenceDto; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.common.EnumService; import de.symeda.sormas.backend.infrastructure.area.AreaFacadeEjb.AreaFacadeEjbLocal; +import de.symeda.sormas.backend.infrastructure.continent.ContinentFacadeEjb.ContinentFacadeEjbLocal; import de.symeda.sormas.backend.infrastructure.country.CountryFacadeEjb.CountryFacadeEjbLocal; import de.symeda.sormas.backend.infrastructure.region.Region; import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb; import de.symeda.sormas.backend.infrastructure.region.RegionService; +import de.symeda.sormas.backend.infrastructure.subcontinent.SubcontinentFacadeEjb.SubcontinentFacadeEjbLocal; import de.symeda.sormas.backend.user.UserFacadeEjb.UserFacadeEjbLocal; @Stateless @@ -51,6 +55,10 @@ public class ImportParserService { @EJB private EnumService enumService; @EJB + private ContinentFacadeEjbLocal continentFacade; + @EJB + private SubcontinentFacadeEjbLocal subcontinentFacade; + @EJB private CountryFacadeEjbLocal countryFacade; @EJB private AreaFacadeEjbLocal areaFacade; @@ -72,6 +80,8 @@ public ImportParserService() { .withParser(Float.class, (v, clazz, path) -> Float.parseFloat(v)) .withParser(Boolean.class, (v, clazz, path) -> DataHelper.parseBoolean(v)) .withParser(boolean.class, (v, clazz, path) -> DataHelper.parseBoolean(v)) + .withParser(ContinentReferenceDto.class, this::parseContinent) + .withParser(SubcontinentReferenceDto.class, this::parseSubContinent) .withParser(CountryReferenceDto.class, this::parseCountry) .withParser(AreaReferenceDto.class, this::parseArea) .withParser(RegionReferenceDto.class, this::parseRegion) @@ -190,6 +200,28 @@ private Date parseDateTime(String v, Class clazz, String path) throws Impo } } + private ContinentReferenceDto parseContinent(String entry, Class clazz, String path) throws ImportErrorException { + List continents = continentFacade.getByDefaultName(entry, false); + if (continents.isEmpty()) { + throw new ImportErrorException(I18nProperties.getValidationError(Validations.importEntryDoesNotExist, entry, path)); + } else if (continents.size() > 1) { + throw new ImportErrorException(I18nProperties.getValidationError(Validations.importSubcontinentNotUnique, entry, path)); + } else { + return continents.get(0); + } + } + + private SubcontinentReferenceDto parseSubContinent(String entry, Class clazz, String path) throws ImportErrorException { + List subcontinents = subcontinentFacade.getByDefaultName(entry, false); + if (subcontinents.isEmpty()) { + throw new ImportErrorException(I18nProperties.getValidationError(Validations.importEntryDoesNotExist, entry, path)); + } else if (subcontinents.size() > 1) { + throw new ImportErrorException(I18nProperties.getValidationError(Validations.importSubcontinentNotUnique, entry, path)); + } else { + return subcontinents.get(0); + } + } + private CountryReferenceDto parseCountry(String v, Class clazz, String path) throws ImportErrorException { List countries = countryFacade.getReferencesByName(v, false); if (countries.isEmpty()) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/ArchitectureTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/ArchitectureTest.java index f204727fba7..78c515431ca 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/ArchitectureTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/ArchitectureTest.java @@ -45,6 +45,7 @@ import de.symeda.sormas.backend.docgeneration.DocumentTemplateFacadeEjb; import de.symeda.sormas.backend.document.DocumentFacadeEjb; import de.symeda.sormas.backend.environment.EnvironmentFacadeEjb; +import de.symeda.sormas.backend.environment.EnvironmentImportFacadeEjb; import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleFacadeEjb; import de.symeda.sormas.backend.event.EventFacadeEjb; import de.symeda.sormas.backend.event.EventGroupFacadeEjb; @@ -456,6 +457,11 @@ public void testEnvironmentSampleFacadeEjbAuthorization(JavaClasses classes) { assertFacadeEjbAnnotated(EnvironmentSampleFacadeEjb.class, classes); } + @ArchTest + public void testEnvironmentImportFacadeEjbAuthorization(JavaClasses classes) { + assertFacadeEjbAnnotated(EnvironmentImportFacadeEjb.class, AuthMode.CLASS_ONLY, classes); + } + private void assertFacadeEjbAnnotated(Class facadeEjbClass, JavaClasses classes) { assertFacadeEjbAnnotated(facadeEjbClass, AuthMode.CLASS_AND_METHODS, Collections.emptyList(), classes); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java index 6c60d94abd5..aac3259570f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java @@ -18,17 +18,22 @@ import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.ui.Button; +import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.environment.EnvironmentCriteria; import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.environment.importer.EnvironmentImportLayout; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.ButtonHelper; +import de.symeda.sormas.ui.utils.VaadinUiUtil; import de.symeda.sormas.ui.utils.ViewConfiguration; public class EnvironmentsView extends AbstractView { @@ -49,6 +54,22 @@ public EnvironmentsView() { gridCriteria = ViewModelProviders.of(getClass()) .getOrDefault(EnvironmentCriteria.class, () -> new EnvironmentCriteria().relevanceStatus(EntityRelevanceStatus.ACTIVE)); + gridComponent = new EnvironmentGridComponent(gridCriteria, viewConfiguration, () -> navigateTo(gridCriteria, true), () -> { + ViewModelProviders.of(getClass()).remove(EnvironmentCriteria.class); + navigateTo(null, true); + }); + addComponent(gridComponent); + + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_IMPORT)) { + Button importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { + Window popupWindow = VaadinUiUtil.showPopupWindow(new EnvironmentImportLayout()); + popupWindow.setCaption(I18nProperties.getString(Strings.headingImportEnvironments)); + popupWindow.addCloseListener(c -> gridComponent.reload()); + }, ValoTheme.BUTTON_PRIMARY); + + addHeaderComponent(importButton); + } + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_CREATE)) { final Button btnNewContact = ButtonHelper.createIconButton( Captions.environmentNewEnvironment, @@ -56,14 +77,8 @@ public EnvironmentsView() { e -> ControllerProvider.getEnvironmentController().create(), ValoTheme.BUTTON_PRIMARY); addHeaderComponent(btnNewContact); - } - gridComponent = new EnvironmentGridComponent(gridCriteria, viewConfiguration, () -> navigateTo(gridCriteria, true), () -> { - ViewModelProviders.of(getClass()).remove(EnvironmentCriteria.class); - navigateTo(null, true); - }); - addComponent(gridComponent); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImportLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImportLayout.java new file mode 100644 index 00000000000..42743a11c73 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImportLayout.java @@ -0,0 +1,64 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.environment.importer; + +import java.io.IOException; + +import com.opencsv.exceptions.CsvValidationException; +import com.vaadin.server.ClassResource; +import com.vaadin.server.Page; +import com.vaadin.ui.Notification; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.importexport.ImportFacade; +import de.symeda.sormas.api.importexport.ValueSeparator; +import de.symeda.sormas.ui.importer.AbstractImportLayout; +import de.symeda.sormas.ui.importer.ImportReceiver; + +public class EnvironmentImportLayout extends AbstractImportLayout { + + private static final long serialVersionUID = 7909449323455621050L; + + public EnvironmentImportLayout() { + + super(); + + ImportFacade importFacade = FacadeProvider.getImportFacade(); + + addDownloadResourcesComponent(1, new ClassResource("/SORMAS_Environment_Import_Guide.pdf")); + addDownloadImportTemplateComponent( + 2, + importFacade.getEnvironmentImportTemplateFilePath(), + importFacade.getEnvironmentImportTemplateFileName()); + addImportCsvComponent(3, new ImportReceiver("_environment_import_", file -> { + resetDownloadErrorReportButton(); + + try { + EnvironmentImporter importer = new EnvironmentImporter(file, true, currentUser, (ValueSeparator) separator.getValue()); + importer.startImport(EnvironmentImportLayout.this::extendDownloadErrorReportButton, currentUI, true); + } catch (IOException | CsvValidationException e) { + new Notification( + I18nProperties.getString(Strings.headingImportFailed), + I18nProperties.getString(Strings.messageImportFailed), + Notification.Type.ERROR_MESSAGE, + false).show(Page.getCurrent()); + } + })); + addDownloadErrorReportComponent(4); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImporter.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImporter.java new file mode 100644 index 00000000000..733ef49094e --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/importer/EnvironmentImporter.java @@ -0,0 +1,59 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.environment.importer; + +import java.io.File; +import java.io.IOException; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.environment.EnvironmentDto; +import de.symeda.sormas.api.environment.EnvironmentImportFacade; +import de.symeda.sormas.api.importexport.ImportLineResultDto; +import de.symeda.sormas.api.importexport.InvalidColumnException; +import de.symeda.sormas.api.importexport.ValueSeparator; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.ui.importer.DataImporter; +import de.symeda.sormas.ui.importer.ImportLineResult; + +public class EnvironmentImporter extends DataImporter { + + private final EnvironmentImportFacade environmentImportFacade; + + public EnvironmentImporter(File inputFile, boolean hasEntityClassRow, UserDto currentUser, ValueSeparator csvSeparator) throws IOException { + super(inputFile, hasEntityClassRow, currentUser, csvSeparator); + + environmentImportFacade = FacadeProvider.getEnvironmentImportFacade(); + } + + @Override + protected ImportLineResult importDataFromCsvLine( + String[] values, + String[] entityClasses, + String[] entityProperties, + String[][] entityPropertyPaths, + boolean firstLine) + throws IOException, InvalidColumnException, InterruptedException { + ImportLineResultDto importResult = + environmentImportFacade.importEnvironmentData(values, entityClasses, entityProperties, entityPropertyPaths, !firstLine); + + if (importResult.isError()) { + writeImportError(values, importResult.getMessage()); + return ImportLineResult.ERROR; + } + + return ImportLineResult.SUCCESS; + } +} diff --git a/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index 6b356b6cf00..1ac1a0f0c1d 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -150,6 +150,7 @@ import de.symeda.sormas.backend.docgeneration.QuarantineOrderFacadeEjb; import de.symeda.sormas.backend.document.DocumentFacadeEjb; import de.symeda.sormas.backend.document.DocumentService; +import de.symeda.sormas.backend.environment.EnvironmentFacadeEjb.EnvironmentFacadeEjbLocal; import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; import de.symeda.sormas.backend.event.EventParticipantFacadeEjb.EventParticipantFacadeEjbLocal; import de.symeda.sormas.backend.event.EventParticipantService; @@ -981,6 +982,10 @@ public SampleReportFacade getSampleReportFacade() { return getBean(SampleReportFacadeEjb.SampleReportFacadeEjbLocal.class); } + public EnvironmentFacadeEjbLocal getEnvironmentFacade() { + return getBean(EnvironmentFacadeEjbLocal.class); + } + public SampleReportService getSampleReportService() { return getBean(SampleReportService.class); } diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/FacadeProviderMock.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/FacadeProviderMock.java index b79601dc6c5..71d868fb000 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/FacadeProviderMock.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/FacadeProviderMock.java @@ -28,6 +28,7 @@ import de.symeda.sormas.api.dashboard.sample.SampleDashboardFacade; import de.symeda.sormas.api.document.DocumentFacade; import de.symeda.sormas.api.environment.EnvironmentFacade; +import de.symeda.sormas.api.environment.EnvironmentImportFacade; import de.symeda.sormas.api.epidata.EpiDataFacade; import de.symeda.sormas.api.event.EventFacade; import de.symeda.sormas.api.event.EventParticipantFacade; @@ -70,6 +71,7 @@ import de.symeda.sormas.backend.dashboard.sample.SampleDashboardFacadeEjb; import de.symeda.sormas.backend.document.DocumentFacadeEjb.DocumentFacadeEjbLocal; import de.symeda.sormas.backend.environment.EnvironmentFacadeEjb; +import de.symeda.sormas.backend.environment.EnvironmentImportFacadeEjb; import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleFacadeEjb; import de.symeda.sormas.backend.epidata.EpiDataFacadeEjb.EpiDataFacadeEjbLocal; import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; @@ -207,6 +209,8 @@ public

P lookupEjbRemote(Class

clazz) { return (P) beanTest.getBean(EnvironmentFacadeEjb.EnvironmentFacadeEjbLocal.class); } else if (EnvironmentSampleFacadeEjb.class == clazz) { return (P) beanTest.getBean(EnvironmentSampleFacadeEjb.EnvironmentSampleFacadeEjbLocal.class); + } else if (EnvironmentImportFacade.class == clazz) { + return (P) beanTest.getBean(EnvironmentImportFacadeEjb.EnvironmentImportFacadeEjbLocal.class); } return null; diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/environment/EnvironmentImporterTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/environment/EnvironmentImporterTest.java new file mode 100644 index 00000000000..dd08885e519 --- /dev/null +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/environment/EnvironmentImporterTest.java @@ -0,0 +1,108 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.environment; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import org.apache.commons.io.output.StringBuilderWriter; +import org.junit.jupiter.api.Test; + +import com.opencsv.exceptions.CsvValidationException; + +import de.symeda.sormas.api.caze.InvestigationStatus; +import de.symeda.sormas.api.environment.EnvironmentDto; +import de.symeda.sormas.api.environment.EnvironmentMedia; +import de.symeda.sormas.api.environment.WaterType; +import de.symeda.sormas.api.environment.WaterUse; +import de.symeda.sormas.api.importexport.InvalidColumnException; +import de.symeda.sormas.api.importexport.ValueSeparator; +import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.ui.AbstractUiBeanTest; +import de.symeda.sormas.ui.environment.importer.EnvironmentImporter; +import de.symeda.sormas.ui.importer.ImportResultStatus; + +public class EnvironmentImporterTest extends AbstractUiBeanTest { + + @Test + public void testImportEnvironments() + throws IOException, CsvValidationException, InvalidColumnException, InterruptedException, URISyntaxException { + var rdcf = creator.createRDCF("Default Region", "Default District", "Default Community", "Default Facility"); + UserDto user = creator.createUser( + rdcf.region.getUuid(), + rdcf.district.getUuid(), + rdcf.facility.getUuid(), + "Surv", + "Sup", + creator.getUserRoleReference(DefaultUserRole.SURVEILLANCE_SUPERVISOR)); + + File csvFile = new File(getClass().getClassLoader().getResource("sormas_environment_import_test.csv").toURI()); + + EnvironmentImporterExtension importer = new EnvironmentImporterExtension(csvFile, true, user); + ImportResultStatus importResult = importer.runImport(); + + assertEquals(ImportResultStatus.COMPLETED, importResult, importer.errors.toString()); + assertEquals(3, getEnvironmentFacade().count(null)); + + List environments = getEnvironmentFacade().getAllAfter(null); + + EnvironmentDto firstEnvironment = environments.stream().filter(e -> "Import environment 1".equals(e.getEnvironmentName())).findFirst().get(); + + assertThat(firstEnvironment.getExternalId(), is("Env-ext-1")); + assertThat(firstEnvironment.getInvestigationStatus(), is(InvestigationStatus.PENDING)); + assertThat(firstEnvironment.getEnvironmentMedia(), is(EnvironmentMedia.WATER)); + assertThat(firstEnvironment.getEnvironmentMedia(), is(EnvironmentMedia.WATER)); + assertThat(firstEnvironment.getWaterType(), is(WaterType.GROUNDWATER)); + assertThat(firstEnvironment.getWaterUse().getOrDefault(WaterUse.INDUSTRY_COMMERCE, null), is(true)); + assertThat(firstEnvironment.getWaterUse().getOrDefault(WaterUse.OTHER, null), is(true)); + assertThat(firstEnvironment.getOtherWaterUse(), is("Other water use")); + assertThat(firstEnvironment.getLocation().getRegion(), is(rdcf.region)); + assertThat(firstEnvironment.getLocation().getDistrict(), is(rdcf.district)); + assertThat(firstEnvironment.getLocation().getCity(), is("City")); + assertThat(firstEnvironment.getLocation().getStreet(), is("Street")); + assertThat(firstEnvironment.getLocation().getContactPersonFirstName(), is("Contact F")); + assertThat(firstEnvironment.getLocation().getContactPersonLastName(), is("Contact L")); + } + + private static class EnvironmentImporterExtension extends EnvironmentImporter { + + private StringBuilder errors = new StringBuilder(""); + private StringBuilderWriter writer = new StringBuilderWriter(errors); + + private EnvironmentImporterExtension(File inputFile, boolean hasEntityClassRow, UserDto currentUser) throws IOException { + super(inputFile, hasEntityClassRow, currentUser, ValueSeparator.DEFAULT); + } + + protected Writer createErrorReportWriter() { + return writer; + } + + @Override + protected Path getErrorReportFolderPath() { + return Paths.get(System.getProperty("java.io.tmpdir")); + } + } +} diff --git a/sormas-ui/src/test/resources/sormas_environment_import_test.csv b/sormas-ui/src/test/resources/sormas_environment_import_test.csv new file mode 100644 index 00000000000..0c63645e068 --- /dev/null +++ b/sormas-ui/src/test/resources/sormas_environment_import_test.csv @@ -0,0 +1,7 @@ +Environment,Environment,Environment,Environment,Environment,Environment,Environment,Environment,Environment,Environment,Environment,Environment,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Location,Environment,Environment,Environment +reportDate,environmentName,description,externalId,investigationStatus,environmentMedia,waterType,otherWaterType,infrastructureDetails,otherInfrastructureDetails,waterUse,otherWaterUse,location.continent,location.subcontinent,location.country,location.region,location.district,location.community,location.details,location.city,location.areaType,location.latitude,location.longitude,location.latLonAccuracy,location.postalCode,location.street,location.houseNumber,location.additionalInformation,location.addressType,location.addressTypeDetails,location.facilityType,location.facility,location.facilityDetails,location.contactPersonFirstName,location.contactPersonLastName,location.contactPersonPhone,location.contactPersonEmail,deleted,deletionReason,otherDeletionReason +##Report date,Environment name,Description,External ID,Investigation status,Environment media,Water type,Other water type,Infrastructure details,Other infrastructure details,Water use,Other water use,Continent,Subcontinent,Country,Region,District,Community,Community contact person,City,Area type (urban/rural),GPS latitude,GPS longitude,GPS accuracy in m,Postal code,Street,House number,Additional information,Address Type,Address name / description,Facility type,Facility,Facility name & description,Contact person first name,Contact person last name,Contact person phone number,Contact person email address,deleted,Reason for deletion,Reason for deletion details +##Date: dd/MM/yyyy,Text,Text,Text,"PENDING,DONE,DISCARDED","WATER,SOIL_ROCK,AIR,BIOTA","WASTEWATER,GROUNDWATER,SURFACE_WATER,PRECIPITATION,OTHER,UNKNOWN",Text,"SEPTIC_TANK,LATRIN,TOILET,MANHOLE,WELLS,SURFACE_WATER,OPEN_DRAIN,OTHER,UNKNOWN",Text,,Text,Name of Continent,Name of Subcontinent,Name of Country,Name of Region,Name of District,Name of Community,Text,Text,"URBAN,RURAL,UNKNOWN",Number,Number,Number,Text,Text,Text,Text,"HOME,PLACE_OF_RESIDENCE,PLACE_OF_EXPOSURE,PLACE_OF_WORK,PLACE_OF_ISOLATION,EVENT_LOCATION,OTHER_ADDRESS",Text,"ASSOCIATION,BUSINESS,BAR,CAMPSITE,CANTINE,CHILDRENS_DAY_CARE,CHILDRENS_HOME,CORRECTIONAL_FACILITY,CRUISE_SHIP,ELDERLY_DAY_CARE,EVENT_VENUE,FOOD_STALL,HOLIDAY_CAMP,HOMELESS_SHELTER,HOSPITAL,HOSTEL,HOTEL,KINDERGARTEN,LABORATORY,MASS_ACCOMMODATION,MILITARY_BARRACKS,MOBILE_NURSING_SERVICE,NIGHT_CLUB,OTHER_ACCOMMODATION,OTHER_CARE_FACILITY,OTHER_CATERING_OUTLET,OTHER_EDUCATIONAL_FACILITY,OTHER_LEISURE_FACILITY,OTHER_MEDICAL_FACILITY,OTHER_RESIDENCE,OTHER_WORKING_PLACE,OTHER_COMMERCE,OUTPATIENT_TREATMENT_FACILITY,PLACE_OF_WORSHIP,PUBLIC_PLACE,REFUGEE_ACCOMMODATION,REHAB_FACILITY,RESTAURANT,RETIREMENT_HOME,RETAIL,WHOLESALE,SCHOOL,SWIMMING_POOL,THEATER,UNIVERSITY,ZOO,AMBULATORY_SURGERY_FACILITY,DIALYSIS_FACILITY,DAY_HOSPITAL,MATERNITY_FACILITY,MEDICAL_PRACTICE,DENTAL_PRACTICE,OTHER_MEDICAL_PRACTICE,DIAGNOSTIC_PREVENTATIVE_THERAPEUTIC_FACILITY,EMERGENCY_MEDICAL_SERVICES,ELDERLY_CARE_FACILITY,DISABLED_PERSON_HABITATION,CARE_RECIPIENT_HABITATION,VISITING_AMBULATORY_AID,AFTER_SCHOOL",Name of a configured facility (requires FacilityType), OTHER_FACILITY (requires FacilityType and FacilityDetails) or NO_FACILITY,Text,Text,Text,Text,Text,,"GDPR,DELETION_REQUEST,CREATED_WITH_NO_LEGAL_REASON,TRANSFERRED_RESPONSIBILITY,DUPLICATE_ENTRIES,OTHER_REASON",Text +08/25/23,Import environment 1,Import environment 1,Env-ext-1,PENDING,WATER,GROUNDWATER,,TOILET,,"{"INDUSTRY_COMMERCE": true, "OTHER": true}",Other water use,,,,Default Region,Default District,,Import env location,City,RURAL,1,2,3,123,Street,12,Additional,EVENT_LOCATION,,,,,Contact F,Contact L,123,123@123.123,,, +08/25/23,Import environment 2,Import environment 2,Env-ext-2,PENDING,WATER,OTHER,Other water type,UNKNOWN,Other infrastructure details,"{"AGRICULTURE": true}",,,,,Default Region,Default District,,Import env location,City,RURAL,1,2,3,123,Street,12,Additional,OTHER_ADDRESS,Other location,,,,Contact F,Contact L,123,123@123.123,,, +08/25/23,Import environment 3,Import environment 3,Env-ext-3,PENDING,WATER,OTHER,Other water type,UNKNOWN,Other infrastructure details,,,,,,Default Region,Default District,,Import env location,City,RURAL,1,2,3,123,Street,12,Additional,OTHER_ADDRESS,Other location,,,,Contact F,Contact L,123,123@123.123,,, From 6fbd6bdc8dcf48033e8b7c9bbb5cd9611f008263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 29 Aug 2023 09:49:29 +0200 Subject: [PATCH 053/144] #11571 - Added import guide --- .../SORMAS_Environment_Import_Guide.docx | Bin 0 -> 19719 bytes .../SORMAS_Environment_Import_Guide.pdf | Bin 0 -> 124789 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 sormas-ui/src/main/resources/SORMAS_Environment_Import_Guide.docx create mode 100644 sormas-ui/src/main/resources/SORMAS_Environment_Import_Guide.pdf diff --git a/sormas-ui/src/main/resources/SORMAS_Environment_Import_Guide.docx b/sormas-ui/src/main/resources/SORMAS_Environment_Import_Guide.docx new file mode 100644 index 0000000000000000000000000000000000000000..5f49642d4a9cad234d7b2143b4d7ba84295e47d3 GIT binary patch literal 19719 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 @_JoC3K?bkw=J9PaDx-!@ zy9JBMLBc=SsLI?!V zvw+ohA{s@4l_KR#kRdhQbv$u3>mK0%WFcWWFi;l2X0qb({IMI!0P~fMufERDAdmz^ z_f`20O;GKSShsHD9T9sHSR4A%qoDL5SfoSrx&;T#o$*D(j11xS> z4fpZJ5b-c*uFj?7X1xPRk5x2VtgB~E_Om@$GAtI@?QKjO46&;3u0XW@q!6#opyhQCT$gmhrf)ZClkL}1VF>}Q$L?6)wb-lU`LX*bJ zn{}6#x_I+&`*=TU&%#z%v_VWP$@F@7(uU*V_2PcNfAXVScTpYqxZf@6e7_FBDjw-F z*5-PC8_qM<_PQT@fWyAT@c}b*$r=#I#o7bLxkiV!2gm<%<%awQKFioIg(#M;Bf0zC zSh<_L&D{Q2zh@Hmsz@>9m&b)ptT0l7qIc5wDuLg&}A zWIeXWb19^<7%x89yrFsyT?z6KR?5Md{Ma_N%xg{LH9c>~D;=Wz;svU{hZ!|C3BcP< zTvAK$NWE>0i)H$$ZRNI1kQp3tHl7h!YQO5Naa%b~)R$|Wx6Xc*raTF?L$hvXa%ceG zo?T4*bVtJlAq^~L+b=?Zws%FPMP3Sz**exQ&CLTZ!Y?u+_GdK45sSBjNP?<6-K${T0?Dmy z*uPbSFe$%xji#wes7eFDVuBjaaH2GkWKvOFS}CZ5C^PIrDVPs83!8zA%a|D>dLTuH z?RgIJUvc9?f=ThkfT-VO0-dc+cMmr3{}MYWvf6GUGX7`@(sWd|dpyJPb(Kj(okYaY zHiBfQaGFCrz7X0-b|!#BIg+}@_z<|>Y#|Nz+IHnS&}PF|Hywzl#2v**cjnq7A?><}B!jp=&xqX;#lN@1D*~7x&jx>~{2{ z+3<)(>cv$J;SM>Z)RcEbKLKdFW2r9}V8Uf3eM=!35arxy*I4Ci8|1#%-Ei5LI_4f% z=^2u54fK9#wmE(&33F6N_N|>c6oq?}!|`^QACnT(DNtl<4d3B@uz`VxJ47~e(kk@j zKoua|xdTbT3ZWhbWK-9R1s`ozHB|1oEHp9V7G`e^<-(c<0|!VI5%LcCjGTFZ)TwQt z+>8ui{Q6NSqg=Rb|2-1oPp-Bl@2L+ zp0=V&$x)IPNSd+y_E+r&)j>6QW$Vh4+MM>60esO zKm>`6+=YF);E>BTY|@BvI85?yJveXKy>j8~^n96PsS_S!%UK^^^E4bcZZ0#CY+WCJ zje4=GNu6x|t{H*3vYqw>ar3mw%JY8tjBZa2TzrKg-@U5|x~ z`lttSkKF7gE}GBj&yc}Qf@X#Pa`u>ct5MgmIRd(+702mmi4 z2_cPn8?KaW&z9Xd4H#=>clv|Z;rGm0$aSg zZI9q?)Ww$xE(OsXY!h`11h7i5-3uWs@1`}rQ6!sd=YTRc{Lzs2$+%UX<5w{2WJxOE z^LG~Lnr*2_l3AszpPIrLE6nh)@e|NeUWK`FUIZc6S!z3EBuTExoj$l%Au~=+;qGIU z&E!)$)aD)W0P$q&l^}@U5pHl{lgJQQj((4%7h3*V8MyLfH8JEAhQWp} z6Xq6-2@a`H8h%~qO!74T z%{Bd3f*ec1%xO{$RY8{f(aGpBKq@9g0YNJPyV1#T49)JVazrG=ghq1=dz=Jb3{X;H z2(B{vS`vspdTxqE5lq*z8Iw4n93*rqVj7Q82BGL>-FU3L2|ga12#j$=p71e?luk7a z`wT-~9jpt!bGH`H;mVj9r`#DANRqX!1ir*Cz+Bl8zp|gPW~rW{$5y%t`Og9on19CQ zoywV6Eb)tdi?F62gL*_%#bd$Lpa%7BDmE1}F~yV_oE`YO{Ufr;Y<-QOG0jC7#wfn0 z?BjimqzHV>Q}=cX?l30D(*?gi^vpGn_mz*YRr~C0Xf}icxh8(DuioJBWcQwoGMEm4p z81#2Olr2nCxM*=>)3s1s%A;$d`=%+Z!yYs@WUASQKJndS{utp}aF=6;1@YFVvr|Ns z)?}|x)6u{k!dw$U!_XsPu)ekmyLE%;Jl$(S=7d{82GYl}nep0vil@27N z2`}cL?1WKpC)Xn?36I7#Lm@SUGLa|pKT|;4vjV%YdbVZHbxD!qO;3#jmbElyk8#$B zRbU#>Q8GL2g3?T1jF<4XI=`?=$8p-B8EzLs(G8ai%Axk_CAi9(9B3UDb@S{B&UL13 zzC!)eu-U0>%s==!pfY|g&X54e0rVa19jq-?EG_6v9SkjhpJ(Ie5(AKD<9`Mb=mYCC#_p~j8aiYab(QP(P{k#XqLmu!Jh zTnI&Wi{S3&yJBbbe_2)kj@V8yT5+y34qSq5l>auc@dK8_aWJEg zjNk_kC9E@7ZkmIZYOhYa7=S2|MVZ9p*7bX+v$w}q;jg@}u|736=7+4=#Vl9h#`OO5XAoC< z(Wx&98Tlc-6W_-91s0K39mR$QLRH0)hDb%p5$xwq;JEl&_MX-~<1)PZNLEhgyl9ji zaT3mOvI3>?4SC;-Q9WG*pZ<~OhQui7z4PgoX(a&w5I@`T_b`E#qotmq-KS&zeHo`Q zYPHLPypDFrgAUXxaa%~NpYDTao2K`ToSve!kmMU`E*kktWYZ1Po4==$S5CfGBF$=a zvPAB%4bn2QtAi`;JjFGx@QuD71Rkxg1Nk*S~vWBji<%^di`#hi;Bwuq#?l?Z-z zE!rPw!>j1-wS~oE_Y~bVVKebN61w$1B??_F(q~hg&`l2XUziP?K^S!>r08STUijd;XgbV|66IX;7ToD{e5~snH)TH<914SVr zPsfd-2Sra+J@Ud5cxsR-BeVJRX+Qc%J0Z&hl0e_)2}cGW7DE!uwNHR2Vh`X#I#daS z2+v>&_v*bWe$5Qv9vegpG6RNO(M;5uh?z!$kduq-w`?8_n$&Z~$qhCrA4Ug>A7m3# z_LNf$ibjjb)JVWj69=~F$v$n8oJ*ABP+l=|#k}{n?4h$m19ja?LQpIaWWf;lnkxw& zv`9?^aRj-cog9{m*6O=hN3EU)7PZgUMnLG1`tBLbVY_s8c z{ud>J;?|+r1CSd-5F|AUerJ~l_Xr7=RL5$M%+}J-A11TRX3yew-z;pU$4;}JI=rVRBr?|5xw5u zlOBWh?Asqs6^<=1%qiEojeb(bAuq4ea2)8@#T6ztVvMl~%Bn zP?%IZ91qyYVF|u7VZG}A1}?)8ljl09XJ%2CYd)c znTGSTrtqr@lXhmqN5}hY0;?p5N86jEdmUJQ{lJQ@I;-!spaL1Wwh5iYRA&Z6ttGc_ z$7zos_S{m*SBJcT!-5@hxOOFt%BpvYiK(Bcht~OQQ}X>Okj4~V?ER|k3hAb{3&+ZG z>Fe_SfPQuUJleL`KCXs~&4(5#0300ZicLP1hf>^LTE-{j`i9?XAiXrC&BvG37M7;S zkT{}pEJrF^Nz3a3XcpO_J-$h^pmxWH%j0d#8l$&f@?~*{zYZ{}pmlY)H$FaS2aup9 zs;KPL0Yiv;q@wGFJRy@&*Hrg;gd!y-OWSTnkr>hD)RC~9E?0b`)1JLn)6)UeH=E=Y zv`SdmAJw{%oH6mSU~hL_=QQ-z?nEyR92XvpvT|wQgx7VMMA$R&0B-l{HNRD}ef!$R zMX~lN(+ghLv9!|als*mv7x$>QtE^m>DNih1BvIION_p&^dmR{S6jSR%*C;C_dtX=_ zeHJe}G*k~yeroCd2)KI#^+j5EfM)1JNHtepQ;9h+GLSBqXdiGUI!}v~&!5Pr)4o!Mw zeoMobFvw(1jOj!|rv@$u92n@@8S51ww+uE`#!s&SKe;3dY?^x3A)Vb5@wcs{k%-o4 zvUdD`qMRp6+xDzqQ&cLSvy5n1D!eFvz2}GJx6XJQ<6i)WMqvxA++Wp&gT4ebw+oyF z7-xCG^-FEtW{Wi1!(aO>63 zsR{iV*K+~@_$=@*k6`cMYGL^MGOaB`+l*snXPv<7aBD{u4| zAe=CU#503&(@{ZX8BuxobSjuNDuu5Gw<9;x7uxUdO`DlK2mR(_H{StgUhNSx!%+om zUO90OwtdN{Kk$<{6~PV|#Z_{&jG}h^4W)nCk;MK_&xVUH921?zEf2-41; z5_jrM{ahF|7RGL+FoSnpr5_dBw3{7_Fm$Tq5*!v*>%&>RxGq6wTkW#V1@E)<1@5!e`|q>m`|h*Fd+)OW z;f&k%F{JK-%L5lh=TJdb=xjO*xU)LHU~UhtcMw0?HdO(5uAM<_M*ZaKe6ejRvgbL! zKRp{<&n&-MGb=+`BTp&l*GU*Jpq5j;%-*8wHKkUhmd~BJyv-eCisePrDIHUy>+>@u zV5({o4n`>XaML;zql>=Lp~W2yKk(z2nAPS?6vwS5m*eEq83<#v9}AY2F!q>W$_z|r ztUk(aMTDMVOhM?|kL8N3alu58*5)S`g)H+{y1U^E6MzSH?CFt!y+}1Mc-mIl>pc+T z_pM`$WJfrmk_^UJxLoPd2}}Y7Wol!jPu>pj`NdR9QEDo{q&OQ)T3(1Su8xwWaHBLE zykGI#i6j=cHC%46WN4E!&d;~W^^8F|uM+xZJo&3+#s)z2jPaFNlO_kq$e;d zUnRMiXp9BROkhfqOp2&!%V5rI8fx@h{3}3gNNUq1K+jZs!QV@p>Q*w4Q>@oVw{g_# z0!NQ6l?czYB8U$Sse8#%nLXZG_fjZFGeP4j4X{UzaiPR|`HD<)GlZNfO z?R3owU<5u2I$E#^n)OG!zqCfBh?u@QwZzdQfH`mkp9K9}-QuNnOerA?1a%<|<0CZ~ zdzRSZ@w{HA4L)p%_<0XTh|$E&VMhs8@bn86!F! z<5>xH|21#<7}NaQ+NEU=sMRBCw~IUt+&51M(4Rh7+)FUn^E#9Ii3dGTD5b1XX3a2B zZf(6`ovCE{DdVHbRzO(z%g`*}YboMwQ}Wq=1;a$ybOj1?Y4t=iaQe#I1wK?s2pCMz z(^E>LqbFcNhmU}P3LSfID<7&bOusD8`_F`n;e4 zW=+nMCR>HnL@O{D6C9zY)^82V8Bx2F@M#Ua#vr8QSC~Acq@Sqs8>ngaNqWy66zlhl zI|by~T}yKlounGc-iK|4lZWY3giKUapkeEqX0UO-*3XZv4Kp-DJupB$@eLqMV(Z(j zmb$sBttVbJz7%4$OSx}^4hkYjpq16VvFw}F&eu{bv5qyeF0mX4kH1k{8aZ{>GfV$7m--pnEd?Zmei)}x;Bg0_*7F=Fnttgn1oBKazBR& zKB#$BS9*or?YxE}NVU6Q^b^R`a2eHiP*b*^AYqFc`mPCNisOxWxAB4uw~0$g&yvjssD=w-qSqPw$Rkt@vd)m|9+gbReArlE`HwiC4w&fd2`M&k44IK!cS?! z^MkIEr8e9h*S!dfHP?B=mdK3^pEXyR)GjqoE;en3gS7>rJuV*0XF|zFu*;CjBx+P? zYJ*IjH&nV2vl_~V$jusT4ZL240ElJ|kOPDjh(tl>oJ2u{7Yc=NiZ9^v&Ne7CnSx0a z5@r1Z0%iUqIEviAu74sFg1`S>>~3w9W4zrTlENg14_K`j-UqdGnGP17vVIT(W##1) z;qm8tlmgiSkO;pO6)Wyq6EBYTMg7kur6$a0D3q05f5@{RpAc@o0Oa4R_MZp+Rv&`@ zuHtx7z?V;mEnmR>ZxFm3KFHr|@gKGSsuUt6{R1Lp{=XkCpzN`rE!#?4x7nX{=b%-y z`B7HZD!+NA-eNiD>7_7B#ai~!4sI;R4N}31d!FW&hbJ(mM=(xdHn@1qvZ#UR^SpDj z>iU4g&GKW5Kk3+=V9dD?z;kL5FN$&ln}!a%4f^8+o+ zM{oTy^S*NaD&YDPGq+X4aw6BF8S|I!D0UM>9keY}tzoeEL}HF`gMq5Mk~nI2otkfl znMY(-OrZP=K%OApR%lEYJ@wcmvt)HSrGombUMdL3b zy>dWNJmY_a)#p3)Qmg^1uuwmJP=AB zo(V^GZvmF`g$w}^0Z{X5Dm?8Y(@RIx#{JqHl4-8ZLw#*BL|_#hnabvFb&SIl>Vl9&`-_HVtq zipF_pN;z{^_VZaBNyxLSX4j;f^8-<7n~v~tKSy2&x6L7nN@ zyD%=lHM=`0X`5_4LvX!--NGu-rSoJj3Rjg~Rm7dGc2`6x0QSxSd(J|PVLMW}hxw`P zc-ad{MZu9K6*(d+F(Dq$o4$n%?;Vc_ZSx*_c!0}??hgLppM@jH z6iT|#gIWVRt6;%L^MNESv0-KBvllBR_K$iGu^$h+v;;T5CYJY*fG}=b&|&0bycbo_ zJBRyUR?X;LzpRsC|J92_Gp*ArSacBG-eu#gg;Ph}GtsN#1p zj_4;JQ>06j0g1QjmOVXBnc7f8dj5+|vS_Ev-yE4*JZ~HDZowx?vkh8DRX{qSx9>@APRvh*7pZJy;A!5wO3F%0RiS!Q=dr%pKu+k((?u{}FeMN2|96O;5OUzETXZy4U_v)WqJw4?*!%psmmqbrzy zS_x{O-ugLw{{J-|;!m+bqtAb@E9mN382%O;Y)g=gTA_#kev$BuN4S~9MzAf8r9`Qj zujOXqJYQ#vt@pK&XqEc%g2M?>2ddrx&KtnkqSHW&v3GY?N}(HTHjpYM$HZH)pHgBp*NoIY_VT|ulC`YeT4`erfd5$>IQ-@_hFIMVDVu`ex(e+4Hp2pAH~lbyJH*a^4nbMOTwgT*ygM>xq_tYvaC+4e{-z zF;Of|5rnw;1aPgn%Ws`^@51vn`pjdkz#UQFf?btcxN7rR_FIL(F^xawY0!M!r8xTU}l&5J1YXPI>& zw03XbK)Fp|Cd0thja^8pNPG^6z(CxsI9AAd%d7c{P+$)aUU1TE-vo#;-I$Z zhH9U$f=9tq!ivgss?7y(De<`?meFX$(IQ1`-Lbb<9~;JIkvu#g;SdT^r7{cG?A?SX zDfa@?)#04LjwCkWgn-A`%O+{z2h%j{*l$C`KSV3Y2*!AHKF5fj&wh&VNpt(;w*4OT zr_;B#`@M^P{#*P1xNVQlHsfvrB_9JIK6g4oA|5#HvRH4d&P1MH zq0bpRxg7>!QC;%$y7sB_=GU$D?or232961lcmn=0!k+g|L9|&$c9O+@;1EM1MfbHF zuP-LONvf81e_N(CoM?X+Hns z&?yp6+j08YEssB47yO^QrLK+5Zv*H5^~%pK`CG4)@3vZ{hi->k;z4g^wVT1W{36sJ zt#_iU{-w`yvQ&bs$3QfCE_-<~supW<*(p^zD(ZF?NwoV+-8}S5U~z_K%~8Gqh}thR zOJ}Nkl^-3=MuHME3o~qCR8DXoX&H+q|AR#7hO3gy(h^CPNR0gIT9}>pgX_XuO$H$63bU z;K;ZNI$mkeTFDC@L^W6SFx5Uc4Zbiqe~x-Qq;gJr*lW)?*fRmibX>7+S76S3Qgr3g z3Y3Lx?9-E+#o1?qw~=mwAjSLsv4XQul-h~p+MfAbL{%6jDyrQiO%|D`=OVxJ$sqlQ zf!l$H-L2>I4*92*;C@=jABpXMk(B=@z5Ra-<=+hD-$(dlP3Y&I6QEmfTN~Xb*6C|9 zBM3#}6b>9>u&tQFq7wR}DrTme9s7k;4u|9+A1|^$+XDnO8S08mKB=8D=r}OkQlOqM zZ)RUY`v?#!cnGUt* z7G!hUj_nIioq+3cC9r-z9_W}dZ(Q3PED?Fm%|y-+=)VL5oX}7qi>hA@C?iUnT=^Kb zKzcVzOF|)9&F^Nt*8eB{3I{?4ZUL)RSkzcu}x zTm5$xe`nYIp#qHP-zxshwfj5#uPl>4zyJW;%r^Wo1E`$S^`!qTn(cjMgA6U&T=>Px# literal 0 HcmV?d00001 diff --git a/sormas-ui/src/main/resources/SORMAS_Environment_Import_Guide.pdf b/sormas-ui/src/main/resources/SORMAS_Environment_Import_Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..be47a4685d4995cfa3f9b4a916a9d64102c2d35e GIT binary patch literal 124789 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�NX7)lt=?PJyM*nAJ*{+{$n? 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%0D-Jj08>A(3KfE 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 Date: Wed, 30 Aug 2023 13:42:03 +0200 Subject: [PATCH 054/144] SORQA-1071 Stabilize "Test Hide country specific fields in the 'Person search option' pop-up in Case Contact director" - increased waitForPageLoadingSpinnerToDisappear time --- .../steps/web/application/cases/CreateNewCaseSteps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java index fe7b2a98b51..e7a77cff225 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java @@ -1047,7 +1047,7 @@ public CreateNewCaseSteps( When( "^I check that ([^\"]*) is not visible in Person search popup$", (String option) -> { - webDriverHelpers.waitForPageLoadingSpinnerToDisappear(20); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); String selector = "//div[@class='popupContent']//div[contains(@class,'v-grid-column-header-content') and text()=\"%s\"]"; Boolean elementVisible = true; From 99db17dc1ed17fa55545e57bd3be7ab07289986e Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 31 Aug 2023 10:27:06 +0200 Subject: [PATCH 055/144] SORQA-1076 Stabilize "User permissions check for users" -actualized - actualized UserRights json files --- .../AutomationAdminUserRights.json | 167 +----------------- .../AutomationAdminUserRightsDE.json | 167 +----------------- .../NationalUserRights.json | 124 +------------ .../NationalUserRightsDE.json | 123 +------------ .../SormasToSormasUserRights.json | 2 +- .../SurvnetUserRights.json | 2 +- .../resources/features/sanity/api/Api.feature | 8 +- 7 files changed, 11 insertions(+), 582 deletions(-) diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json index e906242e301..908f75e64ea 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json @@ -1,165 +1,2 @@ -[ - "ACTION_CREATE", - "ACTION_DELETE", - "ACTION_EDIT", - "ADDITIONAL_TEST_CREATE", - "ADDITIONAL_TEST_DELETE", - "ADDITIONAL_TEST_EDIT", - "ADDITIONAL_TEST_VIEW", - "AGGREGATE_REPORT_EDIT", - "AGGREGATE_REPORT_EXPORT", - "AGGREGATE_REPORT_VIEW", - "CAMPAIGN_ARCHIVE", - "CAMPAIGN_DELETE", - "CAMPAIGN_EDIT", - "CAMPAIGN_FORM_DATA_ARCHIVE", - "CAMPAIGN_FORM_DATA_DELETE", - "CAMPAIGN_FORM_DATA_EDIT", - "CAMPAIGN_FORM_DATA_EXPORT", - "CAMPAIGN_FORM_DATA_VIEW", - "CAMPAIGN_VIEW", - "CASE_ARCHIVE", - "CASE_CHANGE_DISEASE", - "CASE_CHANGE_EPID_NUMBER", - "CASE_CLASSIFY", - "CASE_CLINICIAN_VIEW", - "CASE_CREATE", - "CASE_DELETE", - "CASE_EDIT", - "CASE_EXPORT", - "CASE_IMPORT", - "CASE_INVESTIGATE", - "CASE_MERGE", - "CASE_REFER_FROM_POE", - "CASE_SHARE", - "CASE_TRANSFER", - "CASE_VIEW", - "CLINICAL_COURSE_EDIT", - "CLINICAL_COURSE_VIEW", - "CLINICAL_VISIT_CREATE", - "CLINICAL_VISIT_DELETE", - "CLINICAL_VISIT_EDIT", - "CONTACT_ARCHIVE", - "CONTACT_CONVERT", - "CONTACT_CREATE", - "CONTACT_DELETE", - "CONTACT_EDIT", - "CONTACT_EXPORT", - "CONTACT_IMPORT", - "CONTACT_MERGE", - "CONTACT_REASSIGN_CASE", - "CONTACT_VIEW", - "DASHBOARD_CAMPAIGNS_VIEW", - "DASHBOARD_CONTACT_VIEW", - "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", - "DASHBOARD_SAMPLES_VIEW", - "DASHBOARD_SURVEILLANCE_VIEW", - "DATABASE_EXPORT_ACCESS", - "DEV_MODE", - "DOCUMENT_DELETE", - "DOCUMENT_TEMPLATE_MANAGEMENT", - "DOCUMENT_UPLOAD", - "DOCUMENT_VIEW", - "EVENTGROUP_ARCHIVE", - "EVENTGROUP_CREATE", - "EVENTGROUP_DELETE", - "EVENTGROUP_EDIT", - "EVENTGROUP_LINK", - "EVENTPARTICIPANT_ARCHIVE", - "EVENTPARTICIPANT_CREATE", - "EVENTPARTICIPANT_DELETE", - "EVENTPARTICIPANT_EDIT", - "EVENTPARTICIPANT_IMPORT", - "EVENTPARTICIPANT_VIEW", - "EVENT_ARCHIVE", - "EVENT_CREATE", - "EVENT_DELETE", - "EVENT_EDIT", - "EVENT_EXPORT", - "EVENT_IMPORT", - "EVENT_VIEW", - "EXPORT_DATA_PROTECTION_DATA", - "EXTERNAL_MESSAGE_DELETE", - "EXTERNAL_MESSAGE_PROCESS", - "EXTERNAL_MESSAGE_VIEW", - "IMMUNIZATION_ARCHIVE", - "IMMUNIZATION_CREATE", - "IMMUNIZATION_DELETE", - "IMMUNIZATION_EDIT", - "IMMUNIZATION_VIEW", - "INFRASTRUCTURE_ARCHIVE", - "INFRASTRUCTURE_CREATE", - "INFRASTRUCTURE_EDIT", - "INFRASTRUCTURE_EXPORT", - "INFRASTRUCTURE_IMPORT", - "INFRASTRUCTURE_VIEW", - "LINE_LISTING_CONFIGURE", - "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", - "MANAGE_PUBLIC_EXPORT_CONFIGURATION", - "OUTBREAK_EDIT", - "OUTBREAK_VIEW", - "PATHOGEN_TEST_CREATE", - "PATHOGEN_TEST_DELETE", - "PATHOGEN_TEST_EDIT", - "PERFORM_BULK_OPERATIONS", - "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", - "PERFORM_BULK_OPERATIONS_EVENT", - "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", - "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", - "PERFORM_BULK_OPERATIONS_PSEUDONYM", - "PERSON_CONTACT_DETAILS_DELETE", - "PERSON_DELETE", - "PERSON_EDIT", - "PERSON_EXPORT", - "PERSON_MERGE", - "PERSON_VIEW", - "POPULATION_MANAGE", - "PORT_HEALTH_INFO_EDIT", - "PORT_HEALTH_INFO_VIEW", - "PRESCRIPTION_CREATE", - "PRESCRIPTION_DELETE", - "PRESCRIPTION_EDIT", - "QUARANTINE_ORDER_CREATE", - "SAMPLE_CREATE", - "SAMPLE_DELETE", - "SAMPLE_EDIT", - "SAMPLE_EDIT_NOT_OWNED", - "SAMPLE_EXPORT", - "SAMPLE_TRANSFER", - "SAMPLE_VIEW", - "SEE_PERSONAL_DATA_IN_JURISDICTION", - "SEE_SENSITIVE_DATA_IN_JURISDICTION", - "SEND_MANUAL_EXTERNAL_MESSAGES", - "SORMAS_REST", - "SORMAS_UI", - "STATISTICS_ACCESS", - "STATISTICS_EXPORT", - "TASK_ARCHIVE", - "TASK_ASSIGN", - "TASK_CREATE", - "TASK_DELETE", - "TASK_EDIT", - "TASK_EXPORT", - "TASK_VIEW", - "THERAPY_VIEW", - "TRAVEL_ENTRY_ARCHIVE", - "TRAVEL_ENTRY_CREATE", - "TRAVEL_ENTRY_DELETE", - "TRAVEL_ENTRY_EDIT", - "TRAVEL_ENTRY_MANAGEMENT_ACCESS", - "TRAVEL_ENTRY_VIEW", - "TREATMENT_CREATE", - "TREATMENT_DELETE", - "TREATMENT_EDIT", - "USER_CREATE", - "USER_EDIT", - "USER_ROLE_DELETE", - "USER_ROLE_EDIT", - "USER_ROLE_VIEW", - "USER_VIEW", - "VISIT_CREATE", - "VISIT_DELETE", - "VISIT_EDIT", - "VISIT_EXPORT", - "WEEKLYREPORT_VIEW" - ] \ No newline at end of file + +["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json index 8ba422b1064..d6c3748c3cb 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json @@ -1,166 +1 @@ -[ - "ACTION_CREATE", - "ACTION_DELETE", - "ACTION_EDIT", - "ADDITIONAL_TEST_CREATE", - "ADDITIONAL_TEST_DELETE", - "ADDITIONAL_TEST_EDIT", - "ADDITIONAL_TEST_VIEW", - "AGGREGATE_REPORT_EDIT", - "AGGREGATE_REPORT_EXPORT", - "AGGREGATE_REPORT_VIEW", - "CAMPAIGN_ARCHIVE", - "CAMPAIGN_DELETE", - "CAMPAIGN_EDIT", - "CAMPAIGN_FORM_DATA_ARCHIVE", - "CAMPAIGN_FORM_DATA_DELETE", - "CAMPAIGN_FORM_DATA_EDIT", - "CAMPAIGN_FORM_DATA_EXPORT", - "CAMPAIGN_FORM_DATA_VIEW", - "CAMPAIGN_VIEW", - "CASE_ARCHIVE", - "CASE_CHANGE_DISEASE", - "CASE_CHANGE_EPID_NUMBER", - "CASE_CLASSIFY", - "CASE_CLINICIAN_VIEW", - "CASE_CREATE", - "CASE_DELETE", - "CASE_EDIT", - "CASE_EXPORT", - "CASE_IMPORT", - "CASE_INVESTIGATE", - "CASE_MERGE", - "CASE_REFER_FROM_POE", - "CASE_SHARE", - "CASE_TRANSFER", - "CASE_VIEW", - "CLINICAL_COURSE_EDIT", - "CLINICAL_COURSE_VIEW", - "CLINICAL_VISIT_CREATE", - "CLINICAL_VISIT_DELETE", - "CLINICAL_VISIT_EDIT", - "CONTACT_ARCHIVE", - "CONTACT_CONVERT", - "CONTACT_CREATE", - "CONTACT_DELETE", - "CONTACT_EDIT", - "CONTACT_EXPORT", - "CONTACT_IMPORT", - "CONTACT_MERGE", - "CONTACT_REASSIGN_CASE", - "CONTACT_VIEW", - "DASHBOARD_CAMPAIGNS_VIEW", - "DASHBOARD_CONTACT_VIEW", - "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", - "DASHBOARD_SAMPLES_VIEW", - "DASHBOARD_SURVEILLANCE_VIEW", - "DATABASE_EXPORT_ACCESS", - "DEV_MODE", - "DOCUMENT_DELETE", - "DOCUMENT_TEMPLATE_MANAGEMENT", - "DOCUMENT_UPLOAD", - "DOCUMENT_VIEW", - "EVENTGROUP_ARCHIVE", - "EVENTGROUP_CREATE", - "EVENTGROUP_DELETE", - "EVENTGROUP_EDIT", - "EVENTGROUP_LINK", - "EVENTPARTICIPANT_ARCHIVE", - "EVENTPARTICIPANT_CREATE", - "EVENTPARTICIPANT_DELETE", - "EVENTPARTICIPANT_EDIT", - "EVENTPARTICIPANT_IMPORT", - "EVENTPARTICIPANT_VIEW", - "EVENT_ARCHIVE", - "EVENT_CREATE", - "EVENT_DELETE", - "EVENT_EDIT", - "EVENT_EXPORT", - "EVENT_IMPORT", - "EVENT_VIEW", - "EXPORT_DATA_PROTECTION_DATA", - "EXTERNAL_MESSAGE_DELETE", - "EXTERNAL_MESSAGE_PROCESS", - "EXTERNAL_MESSAGE_VIEW", - "IMMUNIZATION_ARCHIVE", - "IMMUNIZATION_CREATE", - "IMMUNIZATION_DELETE", - "IMMUNIZATION_EDIT", - "IMMUNIZATION_VIEW", - "INFRASTRUCTURE_ARCHIVE", - "INFRASTRUCTURE_CREATE", - "INFRASTRUCTURE_EDIT", - "INFRASTRUCTURE_EXPORT", - "INFRASTRUCTURE_IMPORT", - "INFRASTRUCTURE_VIEW", - "LINE_LISTING_CONFIGURE", - "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", - "MANAGE_PUBLIC_EXPORT_CONFIGURATION", - "OUTBREAK_EDIT", - "OUTBREAK_VIEW", - "PATHOGEN_TEST_CREATE", - "PATHOGEN_TEST_DELETE", - "PATHOGEN_TEST_EDIT", - "PERFORM_BULK_OPERATIONS", - "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", - "PERFORM_BULK_OPERATIONS_EVENT", - "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", - "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", - "PERFORM_BULK_OPERATIONS_PSEUDONYM", - "PERSON_CONTACT_DETAILS_DELETE", - "PERSON_DELETE", - "PERSON_EDIT", - "PERSON_EXPORT", - "PERSON_MERGE", - "PERSON_VIEW", - "POPULATION_MANAGE", - "PORT_HEALTH_INFO_EDIT", - "PORT_HEALTH_INFO_VIEW", - "PRESCRIPTION_CREATE", - "PRESCRIPTION_DELETE", - "PRESCRIPTION_EDIT", - "QUARANTINE_ORDER_CREATE", - "SAMPLE_CREATE", - "SAMPLE_DELETE", - "SAMPLE_EDIT", - "SAMPLE_EDIT_NOT_OWNED", - "SAMPLE_EXPORT", - "SAMPLE_TRANSFER", - "SAMPLE_VIEW", - "SEE_PERSONAL_DATA_IN_JURISDICTION", - "SEE_SENSITIVE_DATA_IN_JURISDICTION", - "SEND_MANUAL_EXTERNAL_MESSAGES", - "SORMAS_REST", - "SORMAS_UI", - "STATISTICS_ACCESS", - "STATISTICS_EXPORT", - "TASK_ARCHIVE", - "TASK_ASSIGN", - "TASK_CREATE", - "TASK_DELETE", - "TASK_EDIT", - "TASK_EXPORT", - "TASK_VIEW", - "THERAPY_VIEW", - "TRAVEL_ENTRY_ARCHIVE", - "TRAVEL_ENTRY_CREATE", - "TRAVEL_ENTRY_DELETE", - "TRAVEL_ENTRY_EDIT", - "TRAVEL_ENTRY_MANAGEMENT_ACCESS", - "TRAVEL_ENTRY_VIEW", - "TREATMENT_CREATE", - "TREATMENT_DELETE", - "TREATMENT_EDIT", - "USER_CREATE", - "USER_EDIT", - "USER_ROLE_DELETE", - "USER_ROLE_EDIT", - "USER_ROLE_VIEW", - "USER_VIEW", - "VISIT_CREATE", - "VISIT_DELETE", - "VISIT_EDIT", - "VISIT_EXPORT", - "WEEKLYREPORT_CREATE", - "WEEKLYREPORT_VIEW" -] \ No newline at end of file +["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_CREATE","WEEKLYREPORT_VIEW"] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json index 0ff26d58d6c..4050da8d1b6 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json @@ -1,123 +1 @@ -[ - "ACTION_CREATE", - "ACTION_DELETE", - "ACTION_EDIT", - "ADDITIONAL_TEST_DELETE", - "ADDITIONAL_TEST_VIEW", - "AGGREGATE_REPORT_EDIT", - "AGGREGATE_REPORT_EXPORT", - "AGGREGATE_REPORT_VIEW", - "CAMPAIGN_ARCHIVE", - "CAMPAIGN_FORM_DATA_ARCHIVE", - "CAMPAIGN_FORM_DATA_EDIT", - "CAMPAIGN_FORM_DATA_EXPORT", - "CAMPAIGN_FORM_DATA_VIEW", - "CAMPAIGN_VIEW", - "CASE_CHANGE_DISEASE", - "CASE_CHANGE_EPID_NUMBER", - "CASE_CLASSIFY", - "CASE_CREATE", - "CASE_DELETE", - "CASE_EDIT", - "CASE_EXPORT", - "CASE_INVESTIGATE", - "CASE_MERGE", - "CASE_REFER_FROM_POE", - "CASE_SHARE", - "CASE_TRANSFER", - "CASE_VIEW", - "CLINICAL_COURSE_VIEW", - "CLINICAL_VISIT_DELETE", - "CONTACT_CONVERT", - "CONTACT_CREATE", - "CONTACT_DELETE", - "CONTACT_EDIT", - "CONTACT_EXPORT", - "CONTACT_MERGE", - "CONTACT_REASSIGN_CASE", - "CONTACT_VIEW", - "DASHBOARD_CAMPAIGNS_VIEW", - "DASHBOARD_CONTACT_VIEW", - "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", - "DASHBOARD_SAMPLES_VIEW", - "DASHBOARD_SURVEILLANCE_VIEW", - "DATABASE_EXPORT_ACCESS", - "DOCUMENT_DELETE", - "DOCUMENT_UPLOAD", - "DOCUMENT_VIEW", - "EVENTGROUP_CREATE", - "EVENTGROUP_DELETE", - "EVENTGROUP_EDIT", - "EVENTGROUP_LINK", - "EVENTPARTICIPANT_CREATE", - "EVENTPARTICIPANT_DELETE", - "EVENTPARTICIPANT_EDIT", - "EVENTPARTICIPANT_IMPORT", - "EVENTPARTICIPANT_VIEW", - "EVENT_CREATE", - "EVENT_DELETE", - "EVENT_EDIT", - "EVENT_EXPORT", - "EVENT_VIEW", - "EXTERNAL_MESSAGE_DELETE", - "EXTERNAL_MESSAGE_PROCESS", - "EXTERNAL_MESSAGE_VIEW", - "IMMUNIZATION_CREATE", - "IMMUNIZATION_DELETE", - "IMMUNIZATION_EDIT", - "IMMUNIZATION_VIEW", - "INFRASTRUCTURE_ARCHIVE", - "INFRASTRUCTURE_EXPORT", - "INFRASTRUCTURE_VIEW", - "LINE_LISTING_CONFIGURE", - "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", - "MANAGE_PUBLIC_EXPORT_CONFIGURATION", - "OUTBREAK_EDIT", - "OUTBREAK_VIEW", - "PATHOGEN_TEST_CREATE", - "PATHOGEN_TEST_DELETE", - "PATHOGEN_TEST_EDIT", - "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", - "PERSON_CONTACT_DETAILS_DELETE", - "PERSON_DELETE", - "PERSON_EDIT", - "PERSON_EXPORT", - "PERSON_MERGE", - "PERSON_VIEW", - "PORT_HEALTH_INFO_EDIT", - "PORT_HEALTH_INFO_VIEW", - "PRESCRIPTION_DELETE", - "QUARANTINE_ORDER_CREATE", - "SAMPLE_CREATE", - "SAMPLE_DELETE", - "SAMPLE_EDIT", - "SAMPLE_EXPORT", - "SAMPLE_TRANSFER", - "SAMPLE_VIEW", - "SEE_PERSONAL_DATA_IN_JURISDICTION", - "SEE_SENSITIVE_DATA_IN_JURISDICTION", - "SEND_MANUAL_EXTERNAL_MESSAGES", - "SORMAS_REST", - "SORMAS_UI", - "STATISTICS_ACCESS", - "STATISTICS_EXPORT", - "TASK_ARCHIVE", - "TASK_ASSIGN", - "TASK_CREATE", - "TASK_DELETE", - "TASK_EDIT", - "TASK_EXPORT", - "TASK_VIEW", - "THERAPY_VIEW", - "TRAVEL_ENTRY_CREATE", - "TRAVEL_ENTRY_DELETE", - "TRAVEL_ENTRY_EDIT", - "TRAVEL_ENTRY_MANAGEMENT_ACCESS", - "TRAVEL_ENTRY_VIEW", - "TREATMENT_DELETE", - "VISIT_CREATE", - "VISIT_DELETE", - "VISIT_EDIT", - "VISIT_EXPORT", - "WEEKLYREPORT_VIEW" -] \ No newline at end of file +["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_DELETE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DOCUMENT_DELETE","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_VIEW","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_DELETE","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_DELETE","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json index 3c010685f0c..cb6ba1e051b 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json @@ -1,122 +1 @@ -[ - "ACTION_CREATE", - "ACTION_DELETE", - "ACTION_EDIT", - "ADDITIONAL_TEST_DELETE", - "ADDITIONAL_TEST_VIEW", - "AGGREGATE_REPORT_EDIT", - "AGGREGATE_REPORT_EXPORT", - "AGGREGATE_REPORT_VIEW", - "CAMPAIGN_ARCHIVE", - "CAMPAIGN_FORM_DATA_ARCHIVE", - "CAMPAIGN_FORM_DATA_EDIT", - "CAMPAIGN_FORM_DATA_EXPORT", - "CAMPAIGN_FORM_DATA_VIEW", - "CAMPAIGN_VIEW", - "CASE_CHANGE_DISEASE", - "CASE_CHANGE_EPID_NUMBER", - "CASE_CLASSIFY", - "CASE_CREATE", - "CASE_DELETE", - "CASE_EDIT", - "CASE_EXPORT", - "CASE_INVESTIGATE", - "CASE_REFER_FROM_POE", - "CASE_SHARE", - "CASE_TRANSFER", - "CASE_VIEW", - "CLINICAL_COURSE_VIEW", - "CLINICAL_VISIT_DELETE", - "CONTACT_CONVERT", - "CONTACT_CREATE", - "CONTACT_DELETE", - "CONTACT_EDIT", - "CONTACT_EXPORT", - "CONTACT_REASSIGN_CASE", - "CONTACT_VIEW", - "DASHBOARD_CAMPAIGNS_VIEW", - "DASHBOARD_CONTACT_VIEW", - "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", - "DASHBOARD_SAMPLES_VIEW", - "DASHBOARD_SURVEILLANCE_VIEW", - "DATABASE_EXPORT_ACCESS", - "DOCUMENT_DELETE", - "DOCUMENT_UPLOAD", - "DOCUMENT_VIEW", - "EVENTGROUP_CREATE", - "EVENTGROUP_DELETE", - "EVENTGROUP_EDIT", - "EVENTGROUP_LINK", - "EVENTPARTICIPANT_CREATE", - "EVENTPARTICIPANT_DELETE", - "EVENTPARTICIPANT_EDIT", - "EVENTPARTICIPANT_IMPORT", - "EVENTPARTICIPANT_VIEW", - "EVENT_CREATE", - "EVENT_DELETE", - "EVENT_EDIT", - "EVENT_EXPORT", - "EVENT_VIEW", - "EXTERNAL_MESSAGE_DELETE", - "EXTERNAL_MESSAGE_PROCESS", - "EXTERNAL_MESSAGE_VIEW", - "IMMUNIZATION_CREATE", - "IMMUNIZATION_DELETE", - "IMMUNIZATION_EDIT", - "IMMUNIZATION_VIEW", - "INFRASTRUCTURE_ARCHIVE", - "INFRASTRUCTURE_EXPORT", - "INFRASTRUCTURE_VIEW", - "LINE_LISTING_CONFIGURE", - "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", - "MANAGE_PUBLIC_EXPORT_CONFIGURATION", - "OUTBREAK_EDIT", - "OUTBREAK_VIEW", - "PATHOGEN_TEST_CREATE", - "PATHOGEN_TEST_DELETE", - "PATHOGEN_TEST_EDIT", - "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", - "PERSON_CONTACT_DETAILS_DELETE", - "PERSON_DELETE", - "PERSON_EDIT", - "PERSON_EXPORT", - "PERSON_MERGE", - "PERSON_VIEW", - "PORT_HEALTH_INFO_EDIT", - "PORT_HEALTH_INFO_VIEW", - "PRESCRIPTION_DELETE", - "QUARANTINE_ORDER_CREATE", - "SAMPLE_CREATE", - "SAMPLE_DELETE", - "SAMPLE_EDIT", - "SAMPLE_EXPORT", - "SAMPLE_TRANSFER", - "SAMPLE_VIEW", - "SEE_PERSONAL_DATA_IN_JURISDICTION", - "SEE_SENSITIVE_DATA_IN_JURISDICTION", - "SEND_MANUAL_EXTERNAL_MESSAGES", - "SORMAS_REST", - "SORMAS_UI", - "STATISTICS_ACCESS", - "STATISTICS_EXPORT", - "TASK_ARCHIVE", - "TASK_ASSIGN", - "TASK_CREATE", - "TASK_DELETE", - "TASK_EDIT", - "TASK_EXPORT", - "TASK_VIEW", - "THERAPY_VIEW", - "TRAVEL_ENTRY_CREATE", - "TRAVEL_ENTRY_DELETE", - "TRAVEL_ENTRY_EDIT", - "TRAVEL_ENTRY_MANAGEMENT_ACCESS", - "TRAVEL_ENTRY_VIEW", - "TREATMENT_DELETE", - "VISIT_CREATE", - "VISIT_DELETE", - "VISIT_EDIT", - "VISIT_EXPORT", - "WEEKLYREPORT_CREATE", - "WEEKLYREPORT_VIEW" -] \ No newline at end of file +["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_INVESTIGATE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_DELETE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DOCUMENT_DELETE","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_VIEW","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_DELETE","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_DELETE","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_CREATE","WEEKLYREPORT_VIEW"] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json index d917fa82687..2b77d5f90fe 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json @@ -1 +1 @@ -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_TO_SORMAS_CLIENT","SORMAS_TO_SORMAS_PROCESS","SORMAS_TO_SORMAS_SHARE","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file +["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_TO_SORMAS_CLIENT","SORMAS_TO_SORMAS_PROCESS","SORMAS_TO_SORMAS_SHARE","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json index f659d8dc7fc..913ac1de6b0 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json @@ -1 +1 @@ -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_SHARE","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_TO_SORMAS_CLIENT","SORMAS_TO_SORMAS_PROCESS","SORMAS_TO_SORMAS_SHARE","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] +["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_SHARE","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_TO_SORMAS_CLIENT","SORMAS_TO_SORMAS_PROCESS","SORMAS_TO_SORMAS_SHARE","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature b/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature index 0848791585e..99db93e8e7b 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature @@ -169,7 +169,7 @@ Feature: Check basic POSTs RestApi endpoints Then API: I create a new travel entry with creation date 14 days ago And API: I check that POST call status code is 200 - @env_main @precon + @tmsLink=SORDEV-9788mk @env_main @precon Scenario Outline: User permissions check Given API:I Login into Environment Then API: I get response with user permission rights @@ -182,7 +182,7 @@ Feature: Check basic POSTs RestApi endpoints | Admin User | | National User | - @env_de @precon + @tmsLink=SORDEV-9788mk @env_de @precon Scenario Outline: User permissions check DE version Given API:I Login into Environment Then API: I get response with user permission rights @@ -195,7 +195,7 @@ Feature: Check basic POSTs RestApi endpoints | Admin User | | National User | - @env_survnet @precon + @tmsLink=SORDEV-9788mk @env_survnet @precon Scenario: User permissions check for Survnet User Given API:I Login into Environment Then API: I get response with Survnet user permission rights @@ -203,7 +203,7 @@ Feature: Check basic POSTs RestApi endpoints And I prepare collection of Survnet rights based on json files And I check that user rights are complete - @env_s2s_1 @precon + @tmsLink=SORDEV-9788mk @env_s2s_1 @precon Scenario: User permissions check for SormasToSormas User Given API:I Login into Environment Then API: I get response with S2S user permission rights From a5c9b35db84b81470a53f882b4df155cd3c66124 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 31 Aug 2023 11:03:06 +0200 Subject: [PATCH 056/144] SORQA-1076 Stabilize "User permissions check for users" -actualized - removed tags --- .../src/test/resources/features/sanity/api/Api.feature | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature b/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature index 99db93e8e7b..0848791585e 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/api/Api.feature @@ -169,7 +169,7 @@ Feature: Check basic POSTs RestApi endpoints Then API: I create a new travel entry with creation date 14 days ago And API: I check that POST call status code is 200 - @tmsLink=SORDEV-9788mk @env_main @precon + @env_main @precon Scenario Outline: User permissions check Given API:I Login into Environment Then API: I get response with user permission rights @@ -182,7 +182,7 @@ Feature: Check basic POSTs RestApi endpoints | Admin User | | National User | - @tmsLink=SORDEV-9788mk @env_de @precon + @env_de @precon Scenario Outline: User permissions check DE version Given API:I Login into Environment Then API: I get response with user permission rights @@ -195,7 +195,7 @@ Feature: Check basic POSTs RestApi endpoints | Admin User | | National User | - @tmsLink=SORDEV-9788mk @env_survnet @precon + @env_survnet @precon Scenario: User permissions check for Survnet User Given API:I Login into Environment Then API: I get response with Survnet user permission rights @@ -203,7 +203,7 @@ Feature: Check basic POSTs RestApi endpoints And I prepare collection of Survnet rights based on json files And I check that user rights are complete - @tmsLink=SORDEV-9788mk @env_s2s_1 @precon + @env_s2s_1 @precon Scenario: User permissions check for SormasToSormas User Given API:I Login into Environment Then API: I get response with S2S user permission rights From 0cbfc3f84b8e946cbcc5e2d2576e403a8699dbca Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 31 Aug 2023 14:17:04 +0200 Subject: [PATCH 057/144] [GITFLOW]updating poms for 1.89.0-SNAPSHOT development --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-serverlibs/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 23f0f4f4b8a..d8c6a1cf9e4 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index c1fafd00a37..24ee76cc1e0 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 674093ae74c..b65a3a4ed62 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index bc414b4f8c3..5240cd89452 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index d165ca0684a..1c7c5505f5a 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index beea0412087..1472d34945e 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index de81549a60a..85d50aff6b2 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 24f4029ac59..030ef6bb665 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index 7ea59230dd3..c0904a45e42 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 5d38a3c77e0..d5033a43e5e 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 8861c89c7ec..88bc5a439c9 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0-SNAPSHOT + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 From 9a99a578d055f1a83968482cc98c5b256357c484 Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 31 Aug 2023 14:35:51 +0200 Subject: [PATCH 058/144] [GITFLOW]updating develop poms to master versions to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-serverlibs/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index d8c6a1cf9e4..477ed070b02 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 24ee76cc1e0..3a3a532b5ad 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index b65a3a4ed62..72fae75314b 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 5240cd89452..520692220e1 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.89.0-SNAPSHOT + 1.88.0 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 1c7c5505f5a..c1b830c6f48 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 1472d34945e..6126a952cf3 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 85d50aff6b2..b0c61e211e9 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 030ef6bb665..014f1d668bf 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index c0904a45e42..e0d08f38448 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index d5033a43e5e..8fbf791a120 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 88bc5a439c9..87bac3399db 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.0 ../sormas-base 4.0.0 From 3c9d30f718cc9aeabf1696107c2bfb7b560a2ed6 Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 31 Aug 2023 14:35:53 +0200 Subject: [PATCH 059/144] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-serverlibs/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 477ed070b02..d8c6a1cf9e4 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 3a3a532b5ad..24ee76cc1e0 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 72fae75314b..b65a3a4ed62 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 520692220e1..5240cd89452 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.88.0 + 1.89.0-SNAPSHOT 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index c1b830c6f48..1c7c5505f5a 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 6126a952cf3..1472d34945e 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index b0c61e211e9..85d50aff6b2 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 014f1d668bf..030ef6bb665 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index e0d08f38448..c0904a45e42 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 8fbf791a120..d5033a43e5e 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 87bac3399db..88bc5a439c9 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.0 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 From fee805d4da791a80eeaf03eb4e7da60e4a90afd9 Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Thu, 31 Aug 2023 12:47:38 +0000 Subject: [PATCH 060/144] [GitHub Actions] Update openAPI spec files --- sormas-rest/swagger.json | 2 +- sormas-rest/swagger.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index c2a8f3fcb98..e5898275507 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -7,7 +7,7 @@ "url" : "https://www.gnu.org/licenses/gpl-3.0.html" }, "title" : "SORMAS REST API", - "version" : "1.88.0-SNAPSHOT" + "version" : "1.89.0-SNAPSHOT" }, "servers" : [ { "url" : "/sormas-rest" diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index 837f1c661a4..ca69487d566 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -10,7 +10,7 @@ info: name: GPL v3 url: https://www.gnu.org/licenses/gpl-3.0.html title: SORMAS REST API - version: 1.88.0-SNAPSHOT + version: 1.89.0-SNAPSHOT servers: - url: /sormas-rest paths: From 6e804cb29391def2eb5f8b29fee4abbf0598d89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 1 Sep 2023 13:01:07 +0200 Subject: [PATCH 061/144] #12368 - Fix user redirection --- .../de/symeda/sormas/app/login/LoginActivity.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/login/LoginActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/login/LoginActivity.java index 6d0350a3277..82f5d00742f 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/login/LoginActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/login/LoginActivity.java @@ -272,10 +272,10 @@ private void openLandingActivity() { User user = ConfigProvider.getUser(); - boolean caseSuveillance = !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.CASE_SURVEILANCE); - boolean campaigns = !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.CAMPAIGNS); + boolean caseSurveillanceActive = !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.CASE_SURVEILANCE); + boolean campaignsActive = !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.CAMPAIGNS); - if (caseSuveillance) { + if (caseSurveillanceActive) { if (ConfigProvider.hasUserRight(UserRight.CASE_VIEW) && (ConfigProvider.hasUserRight(UserRight.CASE_RESPONSIBLE) || user.hasJurisdictionLevel(JurisdictionLevel.HEALTH_FACILITY, JurisdictionLevel.COMMUNITY, JurisdictionLevel.POINT_OF_ENTRY))) { @@ -284,10 +284,14 @@ private void openLandingActivity() { NavigationHelper.goToContacts(LoginActivity.this); } else if (ConfigProvider.hasUserRight(UserRight.CASE_VIEW)) { NavigationHelper.goToCases(LoginActivity.this); + } else if (ConfigProvider.hasUserRight(UserRight.ENVIRONMENT_VIEW)) { + NavigationHelper.goToEnvironments(LoginActivity.this); + } else if (ConfigProvider.hasUserRight(UserRight.EVENT_VIEW)) { + NavigationHelper.goToEvents(LoginActivity.this); } else { NavigationHelper.goToSettings(LoginActivity.this); } - } else if (campaigns && ConfigProvider.hasUserRight(UserRight.CAMPAIGN_FORM_DATA_VIEW)) { + } else if (campaignsActive && ConfigProvider.hasUserRight(UserRight.CAMPAIGN_FORM_DATA_VIEW)) { NavigationHelper.goToCampaigns(LoginActivity.this); } else { NavigationHelper.goToSettings(LoginActivity.this); From f5978126f03d42bf82bc878319e5cf15d1b07de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 1 Sep 2023 14:14:08 +0200 Subject: [PATCH 062/144] #12346 - Delete archived immunizations --- .../symeda/sormas/ui/immunization/ImmunizationController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationController.java index 4221e443dbf..a0b48bd8f0a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationController.java @@ -216,7 +216,7 @@ public void discard() { null, UserRight.IMMUNIZATION_DELETE, UserRight.IMMUNIZATION_ARCHIVE, - null, + FacadeProvider.getImmunizationFacade().getEditPermissionType(immunizationDto.getUuid()), immunizationDto.isInJurisdiction()); return editComponent; From a22ee25a0c05529cc792aa51745d1e7700a78819 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 4 Sep 2023 11:47:46 +0200 Subject: [PATCH 063/144] SORQA-1054 Check Current condition of person of case when sending from SORMAS to Meldesoftware --- .../web/application/cases/EditCaseSteps.java | 30 ++++++++++++++ .../web/application/survnet/SurvNetSteps.java | 39 +++++++++++++++++++ .../features/sanity/web/Survnet.feature | 37 +++++++++++++++++- 3 files changed, 105 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 385dc0e1fbc..ad96a9dc193 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -243,6 +243,7 @@ import static org.sormas.e2etests.pages.application.cases.EditCasePage.getPreExistingConditionComboboxToSelectValue_DE; import static org.sormas.e2etests.pages.application.cases.EditCasePage.getPreExistingConditionComboboxWithValue_DE; import static org.sormas.e2etests.pages.application.cases.EditCasePage.getPreExistingConditionCombobox_DE; +import static org.sormas.e2etests.pages.application.cases.EditCasePersonPage.DATE_OF_DEATH_INPUT; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACT_TO_BODY_FLUIDS_OPTONS; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACT_TO_CASE_COMBOBOX; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTINENT_COMBOBOX; @@ -284,6 +285,7 @@ import static org.sormas.e2etests.pages.application.immunizations.EditImmunizationPage.getReasonForDeletionDetailsFieldLabel; import static org.sormas.e2etests.pages.application.immunizations.EditImmunizationPage.getVaccinationByIndex; import static org.sormas.e2etests.pages.application.persons.EditPersonPage.EVENT_PARTICIPANTS_DATA_TAB; +import static org.sormas.e2etests.pages.application.persons.EditPersonPage.PRESENT_CONDITION_COMBOBOX; import static org.sormas.e2etests.pages.application.samples.CreateNewSamplePage.SAMPLE_TYPE_COMBOBOX; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.DELETE_SAMPLE_REASON_POPUP; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.DELETE_SAMPLE_REASON_POPUP_FOR_DE; @@ -353,6 +355,7 @@ public class EditCaseSteps implements En { public static final String userDirPath = System.getProperty("user.dir"); public static String caseUuid; public static List externalUUID = new ArrayList<>(); + public static LocalDate dateOfDeath; @SneakyThrows @Inject @@ -474,6 +477,26 @@ public EditCaseSteps( "I navigate to case person tab", () -> webDriverHelpers.clickOnWebElementBySelector(CASE_PERSON_TAB)); + And( + "I set the present condition of person value to \"([^\"]*)\" on Case Person page", + (String presentCondition) -> { + webDriverHelpers.selectFromCombobox(PRESENT_CONDITION_COMBOBOX, presentCondition); + }); + + And( + "I click on Save button on Case Person page", + () -> { + webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); + }); + + And( + "^I set the Date of death to (\\d+) days ago$", + (Integer dateOfDeathAgo) -> { + dateOfDeath = LocalDate.now().minusDays(dateOfDeathAgo); + System.out.print(dateOfDeath); + fillDateOfDeath(dateOfDeath, Locale.GERMAN); + }); + And( "^I set previous infection date (\\d+) days from report date to case in person tab$", (Integer daysBeforeReportDate) -> { @@ -3208,6 +3231,13 @@ private LocalDate getDateOfReportDE() { return LocalDate.parse(dateOfReport, DATE_FORMATTER_DE); } + private void fillDateOfDeath(LocalDate date, Locale locale) { + DateTimeFormatter formatter; + if (locale.equals(Locale.GERMAN)) formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + else formatter = DateTimeFormatter.ofPattern("M/d/yyyy"); + webDriverHelpers.fillInWebElement(DATE_OF_DEATH_INPUT, formatter.format(date)); + } + private LocalDate getDateReceivedAtDistrictLevel() { String dateOfReport = webDriverHelpers.getValueFromWebElement(DATE_RECEIVED_AT_DISTRICT_LEVEL_INPUT); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index c90921cc865..c8ff2dace59 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -14,6 +14,7 @@ import static org.sormas.e2etests.steps.web.application.cases.CaseReinfectionSteps.PreviousCovidInfectionIsKnownValue; import static org.sormas.e2etests.steps.web.application.cases.CaseReinfectionSteps.TheLastPositivePCRDetectionWasMoreThan3MonthsAgo; import static org.sormas.e2etests.steps.web.application.cases.CreateNewCaseSteps.survnetCase; +import static org.sormas.e2etests.steps.web.application.cases.EditCaseSteps.dateOfDeath; import static org.sormas.e2etests.steps.web.application.cases.EditCaseSteps.externalUUID; import static org.sormas.e2etests.steps.web.application.cases.HospitalizationTabSteps.*; import static org.sormas.e2etests.steps.web.application.cases.PreviousHospitalizationSteps.previousHospitalization; @@ -90,6 +91,13 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { vaccinationDate, expectedVaccinationDate, "Vaccination date is incorrect!"); softly.assertAll(); break; + case "date of death": + softly.assertEquals( + getDateValueFromSpecificChildNodeFieldByName(singleXmlFile, "DeceasedDate"), + dateOfDeath, + "Date of Death is incorrect!"); + softly.assertAll(); + break; } }); @@ -862,6 +870,16 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { softly.assertAll(); }); + And( + "^I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct$", + () -> { + softly.assertEquals( + getValueFromSpecificFieldByName(singleXmlFile, "DeceasedReason"), + "1", + "Deceased reason is not set correct!"); + softly.assertAll(); + }); + And( "^I check if case external UUID in SORMAS generated XML file is correct$", () -> { @@ -1051,6 +1069,27 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { } }); + Then( + "^I check if the present condition status \"([^\"]*)\" is correctly mapped in SORMAS generated single XML file$", + (String presentConditionOption) -> { + switch (presentConditionOption) { + case "Lebendig": + softly.assertEquals( + getValueFromSpecificFieldByName(singleXmlFile, "StatusDeceased"), + "10", + "Mapped value for Present condition is incorrect"); + softly.assertAll(); + break; + case "Verstorben": + softly.assertEquals( + getValueFromSpecificFieldByName(singleXmlFile, "StatusDeceased"), + "20", + "Mapped value for Present condition is incorrect"); + softly.assertAll(); + break; + } + }); + Then( "^I check if the exposure settings are correctly mapped in SORMAS generated single XML file$", () -> { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index bc3aae155ac..44c1be7c546 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -434,4 +434,39 @@ Feature: Survnet tests And I collect case external UUID from Edit Case page Then I wait 50 seconds for system reaction And I open SORMAS generated XML file for single case message - Then I check if the exposure settings are correctly mapped in SORMAS generated single XML file \ No newline at end of file + Then I check if the exposure settings are correctly mapped in SORMAS generated single XML file + + @tmsLink=SORQA-1054 + Scenario: Check Current condition of person of case when sending from SORMAS to Meldesoftware [1] + Given I log in as a Survnet + When I click on the Cases button from navbar + And I click on the NEW CASE button + And I create a new case with mandatory data only for Survnet DE + Then I navigate to case person tab + And I set the present condition of person value to "Lebendig" on Case Person page + And I click on Save button on Case Person page + And I navigate to case tab + And I click on Send to reporting tool button on Edit Case page + And I collect case external UUID from Edit Case page + Then I wait 50 seconds for system reaction + And I open SORMAS generated XML file for single case message + Then I check if the present condition status "Lebendig" is correctly mapped in SORMAS generated single XML file + + @tmsLink=SORQA-1054 + Scenario: Check Current condition of person of case when sending from SORMAS to Meldesoftware [2] + Given I log in as a Survnet + When I click on the Cases button from navbar + And I click on the NEW CASE button + And I create a new case with mandatory data only for Survnet DE + Then I navigate to case person tab + And I set the present condition of person value to "Verstorben" on Case Person page + Then I set the Date of death to 2 days ago + And I click on Save button on Case Person page + And I navigate to case tab + And I click on Send to reporting tool button on Edit Case page + And I collect case external UUID from Edit Case page + Then I wait 50 seconds for system reaction + And I open SORMAS generated XML file for single case message + Then I check if the present condition status "Verstorben" is correctly mapped in SORMAS generated single XML file + And I check if "date of death" in SORMAS generated XML file is correct + And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct \ No newline at end of file From 33d29f23c7d85bf90a5ede50add3d983f040d41c Mon Sep 17 00:00:00 2001 From: Razvan Date: Mon, 4 Sep 2023 14:50:17 +0300 Subject: [PATCH 064/144] SORQA-1063 : created test, refactoring and fixes --- .../pages/application/cases/EditCasePage.java | 7 + .../e2etests/entities/pojo/api/Case.java | 1 + .../e2etests/entities/pojo/api/EpiData.java | 5 +- .../entities/pojo/api/HealthConditions.java | 5 +- .../pojo/api/PointOfEntryDetails.java | 35 +++ .../entities/pojo/api/PortHealthInfo.java | 3 + .../e2etests/entities/pojo/api/Therapy.java | 3 + .../entities/services/api/CaseApiService.java | 71 ++++- .../helpers/api/sormasrest/CaseHelper.java | 6 + .../sormas/e2etests/steps/api/CaseSteps.java | 10 + .../cases/CaseImportExportSteps.java | 2 +- .../web/application/cases/EditCaseSteps.java | 260 ++++-------------- .../features/sanity/web/SharedCases.feature | 24 ++ .../features/sanity/web/TravelEntry.feature | 4 +- 14 files changed, 227 insertions(+), 209 deletions(-) create mode 100644 sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PointOfEntryDetails.java diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java index c2e890d2e12..e8a860e8f43 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java @@ -299,6 +299,13 @@ public class EditCasePage { By.cssSelector(".popupContent #region div[role='button'"); public static final By REFER_CASE_FROM_POINT_OF_ENTRY_DISTRICT = By.cssSelector(".popupContent #district div[role='button'"); + public static final By REFER_CASE_FROM_POINT_OF_ENTRY_FACILITY_CATEGORY = + By.cssSelector(".popupContent #typeGroup div[role='button'"); + public static final By REFER_CASE_FROM_POINT_OF_ENTRY_FACILITY_TYPE = + By.cssSelector(".popupContent #type div[role='button'"); + public static final By REFER_CASE_FROM_POINT_OF_ENTRY_HEALTH_FACILITY = + By.cssSelector(".popupContent #healthFacility div[role='button'"); + public static final By REFER_CASE_FROM_POINT_OF_ENTRY_SAVE_BUTTON = By.cssSelector(".popupContent #commit"); public static final By CASE_ORIGIN = By.cssSelector("#caseOrigin input"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Case.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Case.java index e9129a3dcc8..2ba356ff009 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Case.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Case.java @@ -62,6 +62,7 @@ public class Case { MaternalHistory maternalHistory; String facilityType; String pointOfEntryDetails; + PointOfEntryDetails pointOfEntry; Boolean sharedToCountry; Boolean nosocomialOutbreak; Boolean quarantineOrderedVerbally; diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/EpiData.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/EpiData.java index 31e02c968fd..b020e0c96b5 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/EpiData.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/EpiData.java @@ -18,6 +18,7 @@ package org.sormas.e2etests.entities.pojo.api; import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.Date; import java.util.List; import lombok.*; import lombok.Builder; @@ -31,8 +32,8 @@ public class EpiData { List exposures; Boolean pseudonymized; - Long changeDate; + Date changeDate; List activitiesAsCase; - Long creationDate; + Date creationDate; String uuid; } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/HealthConditions.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/HealthConditions.java index a54608eeca8..ba7abdc7c47 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/HealthConditions.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/HealthConditions.java @@ -18,6 +18,7 @@ package org.sormas.e2etests.entities.pojo.api; import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.Date; import lombok.*; import lombok.Builder; import lombok.Value; @@ -29,7 +30,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class HealthConditions { Boolean pseudonymized; - Long changeDate; - Long creationDate; + Date changeDate; + Date creationDate; String uuid; } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PointOfEntryDetails.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PointOfEntryDetails.java new file mode 100644 index 00000000000..ea1a1b6b74e --- /dev/null +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PointOfEntryDetails.java @@ -0,0 +1,35 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.sormas.e2etests.entities.pojo.api; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +@Value +@AllArgsConstructor +@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE) +@Builder(toBuilder = true, builderClassName = "builder") +@Jacksonized +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PointOfEntryDetails { + String uuid; + String caption; + String externalId; + String pointOfEntryType; +} diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PortHealthInfo.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PortHealthInfo.java index d72057c7620..a990977f763 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PortHealthInfo.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/PortHealthInfo.java @@ -18,6 +18,7 @@ package org.sormas.e2etests.entities.pojo.api; import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.Date; import lombok.*; import lombok.extern.jackson.Jacksonized; @@ -29,4 +30,6 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class PortHealthInfo { String uuid; + Date changeDate; + Date creationDate; } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Therapy.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Therapy.java index aa0be798d26..04a1ab3f6b1 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Therapy.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/pojo/api/Therapy.java @@ -18,6 +18,7 @@ package org.sormas.e2etests.entities.pojo.api; import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.Date; import lombok.*; import lombok.extern.jackson.Jacksonized; @@ -29,4 +30,6 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Therapy { String uuid; + Date creationDate; + Date changeDate; } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/api/CaseApiService.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/api/CaseApiService.java index d2114d2bcdc..276726673c5 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/api/CaseApiService.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/api/CaseApiService.java @@ -50,7 +50,6 @@ public Case buildGeneratedCase(Person person) { EnvironmentManager environmentManager = new EnvironmentManager(restAssuredClient); return Case.builder() .disease(DiseasesValues.CORONAVIRUS.getDiseaseName()) - .diseaseDetails("Test Disease") .pseudonymized(false) .uuid(generateShortUUID()) .reportDate(new Date()) @@ -134,7 +133,7 @@ public Case buildGeneratedCase(Person person) { .healthFacilityDetails("Details") .caseOrigin("IN_COUNTRY") .facilityType("HOSPITAL") - .pointOfEntryDetails("") + .pointOfEntry(null) .sharedToCountry(false) .nosocomialOutbreak(false) .quarantineOrderedVerbally(false) @@ -258,7 +257,7 @@ public Case buildGeneratedCaseWithCreationDate(Person person, Integer days) { .healthFacilityDetails("Details") .caseOrigin("IN_COUNTRY") .facilityType("HOSPITAL") - .pointOfEntryDetails("") + .pointOfEntry(null) .sharedToCountry(false) .nosocomialOutbreak(false) .quarantineOrderedVerbally(false) @@ -351,6 +350,7 @@ public Case buildGeneratedCaseWithParamRegionAndDistrictAndFacility( .caseOrigin("IN_COUNTRY") .facilityType("HOSPITAL") .pointOfEntryDetails("") + .pointOfEntry(null) .sharedToCountry(false) .nosocomialOutbreak(false) .quarantineOrderedVerbally(false) @@ -382,6 +382,71 @@ public Case buildGeneratedCaseWithParamRegionAndDistrictAndFacility( .build(); } + @SneakyThrows + public Case buildGeneratedCaseTypePointOfEntry(Person person, String region, String district) { + EnvironmentManager environmentManager = new EnvironmentManager(restAssuredClient); + return Case.builder() + .uuid(generateShortUUID()) + .disease(DiseasesValues.CORONAVIRUS.getDiseaseName()) + .diseaseDetails("Test Disease") + .person( + Person.builder() + .uuid(person.getUuid()) + .firstName(person.getFirstName()) + .lastName(person.getLastName()) + .build()) + .reportDate(new Date()) + .reportingUser( + ReportingUser.builder() + .uuid( + runningConfiguration + .getUserByRole(locale, UserRoles.RestUser.getRole()) + .getUuid()) + .build()) + .caseClassification("NOT_CLASSIFIED") + .investigationStatus("PENDING") + .outcome("NO_OUTCOME") + .responsibleRegion(Region.builder().uuid(environmentManager.getRegionUUID(region)).build()) + .responsibleDistrict( + District.builder().uuid(environmentManager.getDistrictUUID(district)).build()) + .district(District.builder().uuid(environmentManager.getDistrictUUID(district)).build()) + .region(Region.builder().uuid(environmentManager.getRegionUUID(region)).build()) + .healthFacilityDetails("") + .healthConditions( + HealthConditions.builder() + .uuid(generateShortUUID()) + .creationDate(new Date()) + .changeDate(new Date()) + .build()) + .hospitalization(Hospitalization.builder().uuid(generateShortUUID()).build()) + .epiData( + EpiData.builder() + .uuid(generateShortUUID()) + .changeDate(new Date()) + .creationDate(new Date()) + .build()) + .therapy( + Therapy.builder() + .uuid(generateShortUUID()) + .changeDate(new Date()) + .creationDate(new Date()) + .build()) + .portHealthInfo( + PortHealthInfo.builder() + .uuid(generateShortUUID()) + .changeDate(new Date()) + .creationDate(new Date()) + .build()) + .caseOrigin("POINT_OF_ENTRY") + .pointOfEntry( + PointOfEntryDetails.builder() + .uuid("SORMAS-CONSTID-OTHERS-AIRPORTX") + .pointOfEntryType("AIRPORT") + .build()) + .pointOfEntryDetails("other") + .build(); + } + public Case buildCaseWithClassification(Person person, String classification) { Case caze = buildGeneratedCase(person); return caze.toBuilder() diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/api/sormasrest/CaseHelper.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/api/sormasrest/CaseHelper.java index f89cac6c231..3d04607ff27 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/api/sormasrest/CaseHelper.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/api/sormasrest/CaseHelper.java @@ -76,6 +76,12 @@ public void createCase(Case caze) { .build()); } + @SneakyThrows + public void getCase(String caseId) { + restAssuredClient.sendRequest( + Request.builder().method(Method.GET).path(CASES_PATH + caseId).build()); + } + @SneakyThrows public void createMultipleCases(List casesList) { final ByteArrayOutputStream out = new ByteArrayOutputStream(); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/CaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/CaseSteps.java index da045ca7806..69ef5beddfe 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/CaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/CaseSteps.java @@ -61,6 +61,16 @@ public CaseSteps(CaseHelper caseHelper, ApiState apiState, CaseApiService caseAp apiState.setCreatedCase(caze); }); + When( + "API: I create a new case Point Of Entry type with {string} region and {string} district", + (String region, String district) -> { + Case caze = + caseApiService.buildGeneratedCaseTypePointOfEntry( + apiState.getLastCreatedPerson(), region, district); + caseHelper.createCase(caze); + apiState.setCreatedCase(caze); + }); + When( "API: I create a new case classified as {string}", (String caseClassification) -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java index a986b6c8149..6c962ef033f 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java @@ -186,7 +186,7 @@ public CaseImportExportSteps( "Cases Classification are not equal"); softly.assertEquals( reader.getPointOfEntry(), - apiState.getCreatedCase().getPointOfEntryDetails(), + apiState.getCreatedCase().getPointOfEntry(), "Point of entries of case are not equal"); softly.assertEquals( String.format(reader.getFirstName(), Locale.GERMAN), diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 385dc0e1fbc..6579cbdb738 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -46,203 +46,7 @@ import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.CONTACTS_DATA_TAB; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.EPIDEMIOLOGICAL_DATA_TAB; import static org.sormas.e2etests.pages.application.cases.CreateNewCasePage.DATE_OF_REPORT_NO_POPUP_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ACTION_CANCEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ACTION_CONFIRM; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ADD_A_PARTICIPANT_HEADER_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ARCHIVE_CASE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ARCHIVE_RELATED_CONTACTS_CHECKBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.BACK_TO_CASES_LIST_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.BLOOD_ORGAN_TISSUE_DONATION_IN_THE_LAST_6_MONTHS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.BUTTONS_IN_VACCINATIONS_LOCATION; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CANCEL_FOLLOW_UP_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_CLASSIFICATION_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_CLASSIFICATION_RADIOBUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_CLASSIFICATION_SPAN; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_CONFIRMATION_BASIS_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_IDENTIFICATION_SOURCE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_ORIGIN; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_PERSON_TAB; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_SAVED_POPUP; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CASE_TAB; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CHANGE_DISEASE_CONFIRMATION_POPUP; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CLINICAL_CONFIRMATION_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CLINICAL_COURSE_TAB; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.COMMUNITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.COMMUNITY_COMBOBOX_BY_PLACE_OF_STAY; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.COMMUNITY_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CONFIRM_ACTION; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CREATE_DOCUMENT_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CREATE_DOCUMENT_BUTTON_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CREATE_DOCUMENT_TEMPLATES; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CREATE_DOCUMENT_TEMPLATES_POPUP_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CREATE_QUARANTINE_ORDER_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CREATE_QUARANTINE_ORDER_BUTTON_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.CURRENT_HOSPITALIZATION_POPUP; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_OFFICIAL_QUARANTINE_ORDER_WAS_SENT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_OF_FOLLOW_UP_STATUS_CHANGE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_OF_FOLLOW_UP_STATUS_CHANGE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_OF_OUTCOME; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_OF_OUTCOME_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_OF_THE_VERBAL_ORDER; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_RECEIVED_AT_DISTRICT_LEVEL_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_RECEIVED_AT_NATIONAL_LEVEL_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DATE_RECEIVED_AT_REGION_LEVEL_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DELETE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DELETE_POPUP_YES_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DELETE_VACCINATION_REASON_POPUP_DE_VERSION; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DISCARD_BUTTON_POPUP; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DISEASE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DISEASE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DISEASE_VARIANT_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DISTRICT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.DISTRICT_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EDIT_IMMUNIZATION_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EDIT_REPORT_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EDIT_TASK_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EDIT_TRAVEL_ENTRY_FROM_CASE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EDIT_VACCINATION_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EPIDEMIOLOGICAL_CONFIRMATION_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EPID_NUMBER_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ERROR_DESCRIPTION_REQUEST_PROCESSED; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ERROR_IN_HANDOVER_HEADER_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ERROR_REVOKE_DESCRIPTION_REQUEST_PROCESSED; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.ERROR_REVOKE_IN_HANDOVER_HEADER_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EXPECTED_FOLLOWUP_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EXPECTED_FOLLOWUP_POPUP_TEXT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EXPECTED_FOLLOWUP_VALUE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EXPECTED_FOLLOW_UP_UNTIL_DATE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EXTERNAL_ID_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EXTERNAL_TOKEN_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.EXTRA_COMMENT_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FACILITY_ACTIVITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FACILITY_CATEGORY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FACILITY_HEALTH_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FACILITY_HEALTH_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FACILITY_TYPE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FOLLOW_UP_COMMENT_FIELD; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FOLLOW_UP_STATUS_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FOLLOW_UP_TAB; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.FOLLOW_UP_UNTIL_DATE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.GENERAL_COMMENT_TEXTAREA; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.GENERAL_COMMENT_TEXT_AREA; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.GENERATED_DOCUMENT_NAME; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.GENERATED_DOCUMENT_NAME_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.HOME_BASED_QUARANTINE_POSSIBLE_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.HOSPITALIZATION_TAB; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.IMMUNIZATION_CARD_IMMUNIZATION_PERIOD_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.IMMUNIZATION_CARD_IMMUNIZATION_STATUS_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.IMMUNIZATION_CARD_IMMUNIZATION_UUID; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.IMMUNIZATION_CARD_MANAGEMENT_STATUS_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.IMMUNIZATION_CARD_MEANS_OF_IMMUNIZATION_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.INFECTION_SETTINGS_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.INFRASTRUCTURE_DATA_POPUP; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.INTERNAL_TOKEN_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.INVESTIGATED_DATE_FIELD; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.INVESTIGATION_STATUS_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.LABORATORY_DIAGNOSTIC_CONFIRMATION_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.LAB_MESSAGE_WINDOW_HEADER_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.LINKED_EVENT_TITLE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.LINK_EVENT_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.LINK_EVENT_BUTTON_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.LOST_TO_FOLLOW_UP_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.NEW_IMMUNIZATION_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.NEW_SAMPLE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.NEW_SAMPLE_BUTTON_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.NEW_TASK_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.NEW_TRAVEL_ENTRY_BUTTON_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.NOSOCOMIAL_OUTBRAKE_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.OFFICIAL_QUARANTINE_ORDER_SENT_CHECKBOX_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.OFFICIAL_QUARANTINE_ORDER_SENT_CHECKBOX_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.OUTCOME_OF_CASE_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.OVERWRITE_FOLLOW_UP_UNTIL_DATE_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_DESCRIPTION_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_CHECKBOX_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_CHECKBOX_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_DISTRICT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_DISTRICT_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_REGION_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_REGION_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PLACE_OF_STAY_SELECTED_VALUE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.POINT_OF_ENTRY_DETAILS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.POINT_OF_ENTRY_TEXT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.POPUPS_INPUTS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PREGNANCY_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PREVIOUS_INFECTION_DATE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.PROHIBITION_TO_WORK_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_CHANGE_COMMENT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_DATE_FROM; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_DATE_FROM_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_DATE_TO; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_DATE_TO_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDERED_BY_DOCUMENT_CHECKBOX_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDERED_BY_DOCUMENT_CHECKBOX_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDERED_BY_DOCUMENT_DATE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDERED_VERBALLY_CHECKBOX_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDERED_VERBALLY_CHECKBOX_LABEL; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDER_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDER_POPUP_SAMPLE_FIELD; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_POPUP_DISCARD_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_POPUP_MESSAGE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_POPUP_SAVE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_TYPE_DETAILS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REASON_FOR_DELETION_DETAILS_TEXTAREA; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REFERENCE_DEFINITION_TEXT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REFER_CASE_FROM_POINT_OF_ENTRY; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REFER_CASE_FROM_POINT_OF_ENTRY_DISTRICT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REFER_CASE_FROM_POINT_OF_ENTRY_POPUP_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REFER_CASE_FROM_POINT_OF_ENTRY_REGION; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REFER_CASE_FROM_POINT_OF_ENTRY_SAVE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REGION_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REGION_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REINFECTION_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REJECT_SHARED_CASE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REPORTER_FACILITY_DETAILS_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REPORTER_FACILITY_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REPORTING_TOOL_MESSAGE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REPORT_DATE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REPORT_GPS_ACCURACY_IN_M_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REPORT_GPS_LATITUDE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REPORT_GPS_LONGITUDE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.RESPONSIBLE_COMMUNITY_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.RESPONSIBLE_DISTRICT_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.RESPONSIBLE_REGION_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.RESPONSIBLE_SURVEILLANCE_OFFICER_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.RESPONSIBLE_USER_FOR_FOLLOW_UP_STATUS_CHANGE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.RESPONSIBLE_USER_FOR_FOLLOW_UP_STATUS_CHANGE_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.RESUME_FOLLOW_UP_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.REVOKE_CASE_POPUP_HEADER; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SAHRE_SAMPLES_CHECKBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SAVE_AND_OPEN_HOSPITALIZATION_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SAVE_POPUP_CONTENT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SEND_TO_REPORTING_TOOL_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SEQUELAE_DETAILS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SEQUELAE_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SHARE_IMMUNIZATION_CHECKBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SHARE_PENDING_WARNING_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SHARE_REPORTS_CHECKBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SHOW_SAMPLE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SURVEILLANCE_OFFICER_FIELD_ABOVE_GENERAL_COMMENT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.SYMPTOMS_TAB; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.TRIMESTER_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.UPLOAD_DOCUMENT_CHECKBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.USER_INFORMATION; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_CARD_INFO_ICON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_CARD_INFO_POPUP_TEXT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_CARD_VACCINATION_DATE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_CARD_VACCINATION_NAME; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_STATUS_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_STATUS_FOR_THIS_DISEASE_COMBOBOX; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_STATUS_INPUT; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_STATUS_UPDATE_POPUP_HEADER; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.WINDOW_CLOSE_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.checkIfTextExists; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.getByImmunizationUuid; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.getEditTaskButtonByNumber; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.getPreExistingConditionComboboxToSelectValue_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.getPreExistingConditionComboboxWithValue_DE; -import static org.sormas.e2etests.pages.application.cases.EditCasePage.getPreExistingConditionCombobox_DE; +import static org.sormas.e2etests.pages.application.cases.EditCasePage.*; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACT_TO_BODY_FLUIDS_OPTONS; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTACT_TO_CASE_COMBOBOX; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.CONTINENT_COMBOBOX; @@ -1992,7 +1796,7 @@ public EditCaseSteps( }); And( - "^I refer case from Point Of Entry$", + "I refer case from Point Of Entry with Place of Stay ZUHAUSE", () -> { webDriverHelpers.clickOnWebElementBySelector(REFER_CASE_FROM_POINT_OF_ENTRY); webDriverHelpers.waitForPageLoadingSpinnerToDisappear(20); @@ -2006,7 +1810,27 @@ public EditCaseSteps( }); And( - "^I check that Point Of Entry and Place Of Stay information is correctly display on Edit case page$", + "I refer case from Point Of Entry with Place of Stay EINRICHTUNG", + () -> { + webDriverHelpers.clickOnWebElementBySelector(REFER_CASE_FROM_POINT_OF_ENTRY); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(20); + webDriverHelpers.waitUntilIdentifiedElementIsPresent( + REFER_CASE_FROM_POINT_OF_ENTRY_POPUP_DE); + webDriverHelpers.selectFromCombobox(REFER_CASE_FROM_POINT_OF_ENTRY_REGION, "Brandenburg"); + webDriverHelpers.selectFromCombobox(REFER_CASE_FROM_POINT_OF_ENTRY_DISTRICT, "LK Barnim"); + webDriverHelpers.clickWebElementByText(PLACE_OF_STAY_OPTIONS, "EINRICHTUNG"); + webDriverHelpers.selectFromCombobox( + REFER_CASE_FROM_POINT_OF_ENTRY_FACILITY_CATEGORY, "Medizinische Einrichtung"); + webDriverHelpers.selectFromCombobox( + REFER_CASE_FROM_POINT_OF_ENTRY_FACILITY_TYPE, "Krankenhaus"); + webDriverHelpers.selectFromCombobox( + REFER_CASE_FROM_POINT_OF_ENTRY_HEALTH_FACILITY, "share"); + + webDriverHelpers.clickOnWebElementBySelector(REFER_CASE_FROM_POINT_OF_ENTRY_SAVE_BUTTON); + }); + + And( + "^I check that Point Of Entry and Place Of Stay ZUHAUSE information is correctly display on Edit case page$", () -> { String referenceReadOnlyAttribute = webDriverHelpers.getAttributeFromWebElement(POINT_OF_ENTRY_TEXT, "readonly"); @@ -2043,6 +1867,44 @@ public EditCaseSteps( softly.assertAll(); }); + And( + "^I check that Point Of Entry and Place Of Stay EINRICHTUNG information is correctly display on Edit case page$", + () -> { + String referenceReadOnlyAttribute = + webDriverHelpers.getAttributeFromWebElement(POINT_OF_ENTRY_TEXT, "readonly"); + softly.assertNotNull( + referenceReadOnlyAttribute, + "The case reference definition shouldn't be editable, but it is!"); + + softly.assertEquals( + webDriverHelpers.getCheckedOptionFromHorizontalOptionGroup( + PLACE_OF_STAY_SELECTED_VALUE), + "EINRICHTUNG", + "Place of stay is not correct"); + + softly.assertEquals( + webDriverHelpers.getValueFromCombobox(PLACE_OF_STAY_REGION_COMBOBOX), + "Brandenburg", + "Place of stay region is not correct"); + + softly.assertEquals( + webDriverHelpers.getValueFromCombobox(PLACE_OF_STAY_DISTRICT_COMBOBOX), + "LK Barnim", + "Place of stay district is not correct"); + + softly.assertEquals( + webDriverHelpers.getValueFromWebElement(POINT_OF_ENTRY_TEXT), + "Anderer Flughafen", + "Point of entry is not correct"); + + softly.assertEquals( + webDriverHelpers.getValueFromWebElement(POINT_OF_ENTRY_DETAILS), + "other", + "Point of entry details are not correct"); + + softly.assertAll(); + }); + And( "^I check that Case Origin is set to Point Of Entry$", () -> { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature index 28808c85c5c..b71ed401308 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature @@ -1198,3 +1198,27 @@ Feature: Sharing cases between environments tests And I click on "accept" shared case button with copied case description Then I check if Share request not found popup message appeared for DE And I click on okay button + + @tmsLink=SORQA-1063 @env_s2s_1 + Scenario: S2S - Share a Case type POINT OF ENTRY + Given API: I create a new person with "Baden-Württemberg" region and "LK Alb-Donau-Kreis" district + And API: I check that POST call status code is 200 + And API: I create a new case Point Of Entry type with "Baden-Württemberg" region and "LK Alb-Donau-Kreis" district + And API: I check that POST call status code is 200 + Given I log in as a S2S + Then I navigate to the last created case via the url + Then I collect uuid of the case + And I refer case from Point Of Entry with Place of Stay EINRICHTUNG + And I click on save button from Edit Case page + Then I click on share button + And I select organization to share with "s2s_2" + And I click to hand over the ownership in Share popup + And I fill comment in share popup for case with random string + Then I click on share button in s2s share popup and wait for share to finish + Then I navigate to "s2s_2" environment in new driver tab + Given I log in as a S2S + And I click on the Shares button from navbar + Then I accept first entity from table in Shares Page + And I click on the Cases button from navbar + And I select first created case for person from Cases list + Then I check that Point Of Entry and Place Of Stay EINRICHTUNG information is correctly display on Edit case page \ No newline at end of file diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/TravelEntry.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/TravelEntry.feature index 57e7b05cc30..695e5573eab 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/TravelEntry.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/TravelEntry.feature @@ -276,8 +276,8 @@ Feature: Create travel entries When I create a new case with Point Of Entry for DE version And I click on save button in the case popup And I check that Point Of Entry information is displayed as read-only on Edit case page - And I refer case from Point Of Entry - And I check that Point Of Entry and Place Of Stay information is correctly display on Edit case page + And I refer case from Point Of Entry with Place of Stay ZUHAUSE + And I check that Point Of Entry and Place Of Stay ZUHAUSE information is correctly display on Edit case page Then I click on the Entries button from navbar And I click on the New Travel Entry button from Travel Entries directory And I check if Different Point Of Entry Jurisdiction checkbox appears in New Travel Entry popup From b6ff8b1da10cdb6df359438594ba0870b5b15aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Mon, 4 Sep 2023 14:29:53 +0200 Subject: [PATCH 065/144] #12468 - Add environment sample list to app --- sormas-app/app/src/main/AndroidManifest.xml | 6 + .../de/symeda/sormas/app/BaseActivity.java | 9 + .../environmentsample/EnvironmentSample.java | 679 +++++++++--------- .../EnvironmentSampleCriteria.java | 46 ++ .../EnvironmentSampleDao.java | 149 ++-- .../list/EnvironmentSampleListActivity.java | 152 ++++ .../list/EnvironmentSampleListAdapter.java | 58 ++ .../list/EnvironmentSampleListFragment.java | 68 ++ .../list/EnvironmentSampleListViewModel.java | 134 ++++ .../sormas/app/util/NavigationHelper.java | 7 +- .../app/util/TextViewBindingAdapters.java | 33 +- ...ic_drawer_environment_sample_blue_36dp.xml | 23 + .../filter_environment_sample_list_layout.xml | 53 ++ ...ow_environment_sample_list_item_layout.xml | 190 +++++ .../src/main/res/menu/drawer_main_menu.xml | 14 +- .../app/src/main/res/values/strings.xml | 4 + 16 files changed, 1235 insertions(+), 390 deletions(-) create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleCriteria.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListActivity.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListAdapter.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListViewModel.java create mode 100644 sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_36dp.xml create mode 100644 sormas-app/app/src/main/res/layout/filter_environment_sample_list_layout.xml create mode 100644 sormas-app/app/src/main/res/layout/row_environment_sample_list_item_layout.xml diff --git a/sormas-app/app/src/main/AndroidManifest.xml b/sormas-app/app/src/main/AndroidManifest.xml index 43d89dfdebc..93972bbdef3 100644 --- a/sormas-app/app/src/main/AndroidManifest.xml +++ b/sormas-app/app/src/main/AndroidManifest.xml @@ -452,6 +452,12 @@ android:launchMode="singleTop"> + + requestedPathogenTests; - @Column(length = CHARACTER_LIMIT_TEXT) - private String otherRequestedPathogenTests; - @Column(name = "weatherConditions", length = CHARACTER_LIMIT_TEXT) - private String weatherConditionsJson; - private Map weatherConditions; - @Enumerated - private YesNoUnknown heavyRain; - @Column - private boolean dispatched; - @DatabaseField(dataType = DataType.DATE_LONG) - private Date dispatchDate; - @Column(length = CHARACTER_LIMIT_TEXT) - private String dispatchDetails; - @Column - private boolean received; - @DatabaseField(dataType = DataType.DATE_LONG) - private Date receivalDate; - @Column(length = CHARACTER_LIMIT_TEXT) - private String labSampleId; - @Enumerated - private SpecimenCondition specimenCondition; - @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "location_id") - private Location location; - @Column(length = CHARACTER_LIMIT_TEXT) - private String generalComment; - - public Environment getEnvironment() { - return environment; - } - - public void setEnvironment(Environment environment) { - this.environment = environment; - } - - public User getReportingUser() { - return reportingUser; - } - - public void setReportingUser(User reportingUser) { - this.reportingUser = reportingUser; - } - - public Date getSampleDateTime() { - return sampleDateTime; - } - - public void setSampleDateTime(Date sampleDateTime) { - this.sampleDateTime = sampleDateTime; - } - - public EnvironmentSampleMaterial getSampleMaterial() { - return sampleMaterial; - } - - public void setSampleMaterial(EnvironmentSampleMaterial sampleMaterial) { - this.sampleMaterial = sampleMaterial; - } - - public String getOtherSampleMaterial() { - return otherSampleMaterial; - } - - public void setOtherSampleMaterial(String otherSampleMaterial) { - this.otherSampleMaterial = otherSampleMaterial; - } - - public Float getSampleVolume() { - return sampleVolume; - } - - public void setSampleVolume(Float sampleVolume) { - this.sampleVolume = sampleVolume; - } - - public String getFieldSampleId() { - return fieldSampleId; - } - - public void setFieldSampleId(String fieldSampleId) { - this.fieldSampleId = fieldSampleId; - } - - public Integer getTurbidity() { - return turbidity; - } - - public void setTurbidity(Integer turbidity) { - this.turbidity = turbidity; - } - - public Integer getPhValue() { - return phValue; - } - - public void setPhValue(Integer phValue) { - this.phValue = phValue; - } - - public Integer getSampleTemperature() { - return sampleTemperature; - } - - public void setSampleTemperature(Integer sampleTemperature) { - this.sampleTemperature = sampleTemperature; - } - - public Float getChlorineResiduals() { - return chlorineResiduals; - } - - public void setChlorineResiduals(Float chlorineResiduals) { - this.chlorineResiduals = chlorineResiduals; - } - - public Facility getLaboratory() { - return laboratory; - } - - public void setLaboratory(Facility laboratory) { - this.laboratory = laboratory; - } - - public String getLaboratoryDetails() { - return laboratoryDetails; - } - - public void setLaboratoryDetails(String laboratoryDetails) { - this.laboratoryDetails = laboratoryDetails; - } - - public String getRequestedPathogenTestsJson() { - return requestedPathogenTestsJson; - } - - public void setRequestedPathogenTestsJson(String requestedPathogenTestsJson) { - this.requestedPathogenTestsJson = requestedPathogenTestsJson; - } - - public Set getRequestedPathogenTests() { - if (requestedPathogenTests == null) { - Gson gson = new Gson(); - Type type = new TypeToken>() { - }.getType(); - List list = gson.fromJson(requestedPathogenTestsJson, type); - CustomizableEnumValueDao customizableEnumValueDao = DatabaseHelper.getCustomizableEnumValueDao(); - - requestedPathogenTests = list != null ? list.stream().map(p -> customizableEnumValueDao.getEnumValue(CustomizableEnumType.PATHOGEN, p)).collect(Collectors.toSet()) : new HashSet<>(); - } - - return requestedPathogenTests; - } - - public void setRequestedPathogenTests(Set requestedPathogenTests) { - this.requestedPathogenTests = requestedPathogenTests; - Gson gson = new Gson(); - Type type = new TypeToken>() { - }.getType(); - - requestedPathogenTestsJson = gson.toJson(requestedPathogenTests.stream().map(CustomizableEnum::getValue).collect(Collectors.toSet()), type); - } - - public String getOtherRequestedPathogenTests() { - return otherRequestedPathogenTests; - } - - public void setOtherRequestedPathogenTests(String otherRequestedPathogenTests) { - this.otherRequestedPathogenTests = otherRequestedPathogenTests; - } - - public String getWeatherConditionsJson() { - return weatherConditionsJson; - } - - public void setWeatherConditionsJson(String weatherConditionsJson) { - this.weatherConditionsJson = weatherConditionsJson; - } + public static final String I18N_PREFIX = "EnvironmentSample"; + + public static final String TABLE_NAME = "environmentSamples"; + + public static final String SAMPLE_DATE_TIME = "sampleDateTime"; + public static final String REQUESTED_PATHOGEN_TESTS = "requestedPathogenTests"; + public static final String WEATHER_CONDITIONS = "weatherConditions"; + public static final String LOCATION = "location"; + public static final String ENVIRONMENT = "environment"; + public static final String DISPATCHED = "dispatched"; + public static final String RECEIVED = "received"; + + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "environment_id") + private Environment environment; + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "reportingUser_id") + private User reportingUser; + @DatabaseField(dataType = DataType.DATE_LONG) + private Date sampleDateTime; + @Enumerated(EnumType.STRING) + private EnvironmentSampleMaterial sampleMaterial; + @Column(length = CHARACTER_LIMIT_TEXT) + private String otherSampleMaterial; + @Column + private Float sampleVolume; + @Column(length = CHARACTER_LIMIT_TEXT) + private String fieldSampleId; + @Column + private Integer turbidity; + @Column + private Integer phValue; + @Column + private Integer sampleTemperature; + @Column + private Float chlorineResiduals; + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "laboratory_id") + private Facility laboratory; + @Column(length = CHARACTER_LIMIT_TEXT) + private String laboratoryDetails; + @Column(name = "requestedPathogenTests", length = CHARACTER_LIMIT_TEXT) + private String requestedPathogenTestsJson; + private Set requestedPathogenTests; + @Column(length = CHARACTER_LIMIT_TEXT) + private String otherRequestedPathogenTests; + @Column(name = "weatherConditions", length = CHARACTER_LIMIT_TEXT) + private String weatherConditionsJson; + private Map weatherConditions; + @Enumerated + private YesNoUnknown heavyRain; + @Column + private boolean dispatched; + @DatabaseField(dataType = DataType.DATE_LONG) + private Date dispatchDate; + @Column(length = CHARACTER_LIMIT_TEXT) + private String dispatchDetails; + @Column + private boolean received; + @DatabaseField(dataType = DataType.DATE_LONG) + private Date receivalDate; + @Column(length = CHARACTER_LIMIT_TEXT) + private String labSampleId; + @Enumerated + private SpecimenCondition specimenCondition; + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "location_id") + private Location location; + @Column(length = CHARACTER_LIMIT_TEXT) + private String generalComment; + + public Environment getEnvironment() { + return environment; + } + + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + public User getReportingUser() { + return reportingUser; + } + + public void setReportingUser(User reportingUser) { + this.reportingUser = reportingUser; + } + + public Date getSampleDateTime() { + return sampleDateTime; + } + + public void setSampleDateTime(Date sampleDateTime) { + this.sampleDateTime = sampleDateTime; + } + + public EnvironmentSampleMaterial getSampleMaterial() { + return sampleMaterial; + } + + public void setSampleMaterial(EnvironmentSampleMaterial sampleMaterial) { + this.sampleMaterial = sampleMaterial; + } + + public String getOtherSampleMaterial() { + return otherSampleMaterial; + } + + public void setOtherSampleMaterial(String otherSampleMaterial) { + this.otherSampleMaterial = otherSampleMaterial; + } + + public Float getSampleVolume() { + return sampleVolume; + } + + public void setSampleVolume(Float sampleVolume) { + this.sampleVolume = sampleVolume; + } + + public String getFieldSampleId() { + return fieldSampleId; + } + + public void setFieldSampleId(String fieldSampleId) { + this.fieldSampleId = fieldSampleId; + } + + public Integer getTurbidity() { + return turbidity; + } + + public void setTurbidity(Integer turbidity) { + this.turbidity = turbidity; + } + + public Integer getPhValue() { + return phValue; + } + + public void setPhValue(Integer phValue) { + this.phValue = phValue; + } + + public Integer getSampleTemperature() { + return sampleTemperature; + } + + public void setSampleTemperature(Integer sampleTemperature) { + this.sampleTemperature = sampleTemperature; + } + + public Float getChlorineResiduals() { + return chlorineResiduals; + } + + public void setChlorineResiduals(Float chlorineResiduals) { + this.chlorineResiduals = chlorineResiduals; + } + + public Facility getLaboratory() { + return laboratory; + } + + public void setLaboratory(Facility laboratory) { + this.laboratory = laboratory; + } + + public String getLaboratoryDetails() { + return laboratoryDetails; + } + + public void setLaboratoryDetails(String laboratoryDetails) { + this.laboratoryDetails = laboratoryDetails; + } + + public String getRequestedPathogenTestsJson() { + return requestedPathogenTestsJson; + } + + public void setRequestedPathogenTestsJson(String requestedPathogenTestsJson) { + this.requestedPathogenTestsJson = requestedPathogenTestsJson; + } + + public Set getRequestedPathogenTests() { + if (requestedPathogenTests == null) { + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + List list = gson.fromJson(requestedPathogenTestsJson, type); + CustomizableEnumValueDao customizableEnumValueDao = DatabaseHelper.getCustomizableEnumValueDao(); + + requestedPathogenTests = list != null + ? list.stream() + .map(p -> customizableEnumValueDao. getEnumValue(CustomizableEnumType.PATHOGEN, p)) + .collect(Collectors.toSet()) + : new HashSet<>(); + } + + return requestedPathogenTests; + } + + public void setRequestedPathogenTests(Set requestedPathogenTests) { + if (requestedPathogenTests == null) { + this.requestedPathogenTests = null; + this.requestedPathogenTestsJson = null; + } else { + this.requestedPathogenTests = requestedPathogenTests; + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + + requestedPathogenTestsJson = + gson.toJson(requestedPathogenTests.stream().map(CustomizableEnum::getValue).collect(Collectors.toSet()), type); + } + } + + public String getOtherRequestedPathogenTests() { + return otherRequestedPathogenTests; + } + + public void setOtherRequestedPathogenTests(String otherRequestedPathogenTests) { + this.otherRequestedPathogenTests = otherRequestedPathogenTests; + } + + public String getWeatherConditionsJson() { + return weatherConditionsJson; + } + + public void setWeatherConditionsJson(String weatherConditionsJson) { + this.weatherConditionsJson = weatherConditionsJson; + } + + public Map getWeatherConditions() { + if (weatherConditions == null) { + Gson gson = getGsonForWeatherConditions(); + Type type = new TypeToken>() { + }.getType(); + + weatherConditions = gson.fromJson(weatherConditionsJson, type); + if (weatherConditions == null) { + weatherConditions = new HashMap<>(); + } + } + + return weatherConditions; + } + + public void setWeatherConditions(Map weatherConditions) { + this.weatherConditions = weatherConditions; + Gson gson = getGsonForWeatherConditions(); + Type type = new TypeToken>() { + }.getType(); + + weatherConditionsJson = gson.toJson(weatherConditions, type); + + } + + public YesNoUnknown getHeavyRain() { + return heavyRain; + } + + public void setHeavyRain(YesNoUnknown heavyRain) { + this.heavyRain = heavyRain; + } + + public boolean isDispatched() { + return dispatched; + } + + public void setDispatched(boolean dispatched) { + this.dispatched = dispatched; + } + + public Date getDispatchDate() { + return dispatchDate; + } + + public void setDispatchDate(Date dispatchDate) { + this.dispatchDate = dispatchDate; + } + + public String getDispatchDetails() { + return dispatchDetails; + } + + public void setDispatchDetails(String dispatchDetails) { + this.dispatchDetails = dispatchDetails; + } + + public boolean isReceived() { + return received; + } + + public void setReceived(boolean received) { + this.received = received; + } + + public Date getReceivalDate() { + return receivalDate; + } + + public void setReceivalDate(Date receivalDate) { + this.receivalDate = receivalDate; + } + + public String getLabSampleId() { + return labSampleId; + } + + public void setLabSampleId(String labSampleId) { + this.labSampleId = labSampleId; + } + + public SpecimenCondition getSpecimenCondition() { + return specimenCondition; + } + + public void setSpecimenCondition(SpecimenCondition specimenCondition) { + this.specimenCondition = specimenCondition; + } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + + public String getGeneralComment() { + return generalComment; + } + + public void setGeneralComment(String generalComment) { + this.generalComment = generalComment; + } - public Map getWeatherConditions() { - if (weatherConditions == null) { - Gson gson = getGsonForWeatherConditions(); - Type type = new TypeToken>() { - }.getType(); + @Override + public String getI18nPrefix() { + return I18N_PREFIX; + } - weatherConditions = gson.fromJson(weatherConditionsJson, type); - if (weatherConditions == null) { - weatherConditions = new HashMap<>(); - } - } - - return weatherConditions; - } - - public void setWeatherConditions(Map weatherConditions) { - this.weatherConditions = weatherConditions; - Gson gson = getGsonForWeatherConditions(); - Type type = new TypeToken>() { - }.getType(); - - weatherConditionsJson = gson.toJson(weatherConditions, type); - - } - - public YesNoUnknown getHeavyRain() { - return heavyRain; - } - - public void setHeavyRain(YesNoUnknown heavyRain) { - this.heavyRain = heavyRain; - } - - public boolean isDispatched() { - return dispatched; - } - - public void setDispatched(boolean dispatched) { - this.dispatched = dispatched; - } - - public Date getDispatchDate() { - return dispatchDate; - } - - public void setDispatchDate(Date dispatchDate) { - this.dispatchDate = dispatchDate; - } - - public String getDispatchDetails() { - return dispatchDetails; - } - - public void setDispatchDetails(String dispatchDetails) { - this.dispatchDetails = dispatchDetails; - } - - public boolean isReceived() { - return received; - } - - public void setReceived(boolean received) { - this.received = received; - } - - public Date getReceivalDate() { - return receivalDate; - } - - public void setReceivalDate(Date receivalDate) { - this.receivalDate = receivalDate; - } - - public String getLabSampleId() { - return labSampleId; - } - - public void setLabSampleId(String labSampleId) { - this.labSampleId = labSampleId; - } - - public SpecimenCondition getSpecimenCondition() { - return specimenCondition; - } - - public void setSpecimenCondition(SpecimenCondition specimenCondition) { - this.specimenCondition = specimenCondition; - } - - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } - - public String getGeneralComment() { - return generalComment; - } - - public void setGeneralComment(String generalComment) { - this.generalComment = generalComment; - } - - @Override - public String getI18nPrefix() { - return I18N_PREFIX; - } - private static Gson getGsonForWeatherConditions() { - return new GsonBuilder().enableComplexMapKeySerialization().registerTypeAdapter(WeatherCondition.class, new EnumMapKeySerializer<>(WeatherCondition.class)).create(); - } + private static Gson getGsonForWeatherConditions() { + return new GsonBuilder().enableComplexMapKeySerialization() + .registerTypeAdapter(WeatherCondition.class, new EnumMapKeySerializer<>(WeatherCondition.class)) + .create(); + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleCriteria.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleCriteria.java new file mode 100644 index 00000000000..51f6d436e45 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleCriteria.java @@ -0,0 +1,46 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.backend.environment.environmentsample; + +import java.io.Serializable; + +import de.symeda.sormas.app.backend.environment.Environment; +import de.symeda.sormas.app.sample.ShipmentStatus; + +public class EnvironmentSampleCriteria implements Serializable { + + private ShipmentStatus shipmentStatus; + private Environment environment; + + public EnvironmentSampleCriteria shipmentStatus(ShipmentStatus shipmentStatus) { + this.shipmentStatus = shipmentStatus; + return this; + } + + public ShipmentStatus getShipmentStatus() { + return shipmentStatus; + } + + public EnvironmentSampleCriteria environment(Environment environment) { + this.environment = environment; + return this; + } + + public Environment getEnvironment() { + return environment; + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java index 28f71e93463..99f39ad8867 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java @@ -1,57 +1,112 @@ package de.symeda.sormas.app.backend.environment.environmentsample; -import com.j256.ormlite.dao.Dao; - import java.sql.SQLException; import java.util.Date; +import java.util.List; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.stmt.Where; + +import android.util.Log; import de.symeda.sormas.app.backend.common.AbstractAdoDao; +import de.symeda.sormas.app.backend.common.AbstractDomainObject; import de.symeda.sormas.app.backend.location.Location; public class EnvironmentSampleDao extends AbstractAdoDao { - public EnvironmentSampleDao(Dao innerDao) { - super(innerDao); - } - - @Override - protected Class getAdoClass() { - return EnvironmentSample.class; - } - - @Override - public String getTableName() { - return EnvironmentSample.TABLE_NAME; - } - - @Override - public Date getLatestChangeDate() { - Date date = super.getLatestChangeDate(); - if (date == null) { - return null; - } - - Date locationDate = getLatestChangeDateJoin(Location.TABLE_NAME, EnvironmentSample.LOCATION); - if (locationDate != null && locationDate.after(date)) { - date = locationDate; - } - - return date; - } - - public void deleteEnvironmentSampleAndAllDependingEntities(String environmentUuid) throws SQLException { - EnvironmentSample sample = queryUuidWithEmbedded(environmentUuid); - - // Cancel if not in local database - if (sample == null) { - return; - } - - // Delete case - deleteCascade(sample); - } - - @Override - public void create(EnvironmentSample data) throws SQLException { - super.create(data); - } + + public EnvironmentSampleDao(Dao innerDao) { + super(innerDao); + } + + @Override + protected Class getAdoClass() { + return EnvironmentSample.class; + } + + @Override + public String getTableName() { + return EnvironmentSample.TABLE_NAME; + } + + @Override + public Date getLatestChangeDate() { + Date date = super.getLatestChangeDate(); + if (date == null) { + return null; + } + + Date locationDate = getLatestChangeDateJoin(Location.TABLE_NAME, EnvironmentSample.LOCATION); + if (locationDate != null && locationDate.after(date)) { + date = locationDate; + } + + return date; + } + + public long countByCriteria(EnvironmentSampleCriteria criteria) { + try { + return buildQueryBuilder(criteria).countOf(); + } catch (SQLException e) { + Log.e(getTableName(), "Could not perform countByCriteria on EnvironmentSample"); + throw new RuntimeException(e); + } + } + + public List queryByCriteria(EnvironmentSampleCriteria criteria, long offset, long limit) { + try { + return buildQueryBuilder(criteria).orderBy(EnvironmentSample.SAMPLE_DATE_TIME, true).offset(offset).limit(limit).query(); + } catch (SQLException e) { + Log.e(getTableName(), "Could not perform queryByCriteria on EnvironmentSample"); + throw new RuntimeException(e); + } + } + + public void deleteEnvironmentSampleAndAllDependingEntities(String environmentUuid) throws SQLException { + EnvironmentSample sample = queryUuidWithEmbedded(environmentUuid); + + // Cancel if not in local database + if (sample == null) { + return; + } + + // Delete case + deleteCascade(sample); + } + + private QueryBuilder buildQueryBuilder(EnvironmentSampleCriteria criteria) throws SQLException { + + QueryBuilder queryBuilder = queryBuilder(); + Where where = queryBuilder.where().eq(AbstractDomainObject.SNAPSHOT, false); + + if (criteria.getEnvironment() != null) { + where.and().eq(EnvironmentSample.ENVIRONMENT + "_id", criteria.getEnvironment()); + } else { + if (criteria.getShipmentStatus() != null) { + switch (criteria.getShipmentStatus()) { + case NOT_SHIPPED: + where.and().and(where.eq(EnvironmentSample.DISPATCHED, false), where.eq(EnvironmentSample.RECEIVED, false)); + break; + case SHIPPED: + where.and().and(where.eq(EnvironmentSample.DISPATCHED, true), where.eq(EnvironmentSample.RECEIVED, false)); + break; + case RECEIVED: + where.and().eq(EnvironmentSample.RECEIVED, true); + break; + default: + throw new IllegalArgumentException(criteria.getShipmentStatus().toString()); + } + } + } + + queryBuilder.setWhere(where); + return queryBuilder; + + } + + @Override + public void create(EnvironmentSample data) throws SQLException { + super.create(data); + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListActivity.java new file mode 100644 index 00000000000..c4efb790de6 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListActivity.java @@ -0,0 +1,152 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.list; + +import java.util.List; + +import android.content.Context; +import android.os.Bundle; +import android.view.Menu; +import android.view.View; + +import androidx.databinding.DataBindingUtil; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.RecyclerView; + +import de.symeda.sormas.app.BaseListActivity; +import de.symeda.sormas.app.PagedBaseListActivity; +import de.symeda.sormas.app.PagedBaseListFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.component.menu.PageMenuItem; +import de.symeda.sormas.app.databinding.FilterEnvironmentSampleListLayoutBinding; +import de.symeda.sormas.app.sample.ShipmentStatus; +import de.symeda.sormas.app.util.Callback; + +public class EnvironmentSampleListActivity extends PagedBaseListActivity { + + private static ShipmentStatus[] statusFilters = new ShipmentStatus[] { + null, + ShipmentStatus.NOT_SHIPPED, + ShipmentStatus.SHIPPED, + ShipmentStatus.RECEIVED }; + + private EnvironmentSampleListViewModel model; + private FilterEnvironmentSampleListLayoutBinding filterBinding; + + public static void startActivity(Context context, ShipmentStatus listFilter) { + BaseListActivity.startActivity(context, EnvironmentSampleListActivity.class, buildBundle(getStatusFilterPosition(statusFilters, listFilter))); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + showPreloader(); + + adapter = new EnvironmentSampleListAdapter(); + adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + // Scroll to the topmost position after environment samples have been inserted + if (positionStart == 0) { + RecyclerView recyclerView = findViewById(R.id.recyclerViewForList); + if (recyclerView != null) { + recyclerView.scrollToPosition(0); + } + } + } + + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { + RecyclerView recyclerView = findViewById(R.id.recyclerViewForList); + if (recyclerView != null) { + recyclerView.scrollToPosition(0); + } + } + }); + + model = new ViewModelProvider(this).get(EnvironmentSampleListViewModel.class); + model.initializeViewModel(); + model.getEnvironmentSamples().observe(this, es -> { + adapter.submitList(es); + hidePreloader(); + }); + setOpenPageCallback(p -> { + showPreloader(); + model.getCriteria().shipmentStatus(statusFilters[((PageMenuItem) p).getPosition()]); + model.notifyCriteriaUpdated(); + }); + } + + @Override + public void onPause() { + super.onPause(); + getIntent().putExtra("refreshOnResume", true); + } + + @Override + public void onResume() { + super.onResume(); + if (getIntent().getBooleanExtra("refreshOnResume", false)) { + showPreloader(); + model.getEnvironmentSamples().getValue().getDataSource().invalidate(); + } + } + + @Override + public List getPageMenuData() { + return PageMenuItem.fromEnum(statusFilters, getContext()); + } + + @Override + protected Callback getSynchronizeResultCallback() { + // Reload the list after a synchronization has been done + return () -> { + showPreloader(); + model.getEnvironmentSamples().getValue().getDataSource().invalidate(); + }; + } + + @Override + protected PagedBaseListFragment buildListFragment(PageMenuItem menuItem) { + if (menuItem != null) { + ShipmentStatus listFilter = statusFilters[menuItem.getPosition()]; + return EnvironmentSampleListFragment.newInstance(listFilter); + } + return null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + getNewMenu().setTitle(R.string.action_new_environment_sample); + return true; + } + + @Override + protected int getActivityTitle() { + return R.string.heading_environment_sample_list; + } + + @Override + public void addFiltersToPageMenu() { + View sampleListFilterView = getLayoutInflater().inflate(R.layout.filter_environment_sample_list_layout, null); + filterBinding = DataBindingUtil.bind(sampleListFilterView); + pageMenu.addFilter(sampleListFilterView); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListAdapter.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListAdapter.java new file mode 100644 index 00000000000..08d431e47df --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListAdapter.java @@ -0,0 +1,58 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.list; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.core.adapter.databinding.BindingPagedListAdapter; +import de.symeda.sormas.app.core.adapter.databinding.BindingViewHolder; +import de.symeda.sormas.app.databinding.RowEnvironmentSampleListItemLayoutBinding; + +public class EnvironmentSampleListAdapter extends BindingPagedListAdapter { + + public EnvironmentSampleListAdapter() { + super(R.layout.row_environment_sample_list_item_layout); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + + super.onBindViewHolder(holder, position); + + if (getItemViewType(position) == TYPE_ITEM) { + BindingViewHolder pagedHolder = (BindingViewHolder) holder; + EnvironmentSample item = getItem(position); + + pagedHolder.setOnListItemClickListener(this.mOnListItemClickListener); + + if (item.isModifiedOrChildModified()) { + pagedHolder.binding.imgSyncIcon.setVisibility(View.VISIBLE); + pagedHolder.binding.imgSyncIcon.setImageResource(R.drawable.ic_sync_blue_24dp); + } else { + pagedHolder.binding.imgSyncIcon.setVisibility(View.GONE); + } + } + + // TODO #704 +// updateUnreadIndicator(holder, record); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java new file mode 100644 index 00000000000..2c25782e5bd --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java @@ -0,0 +1,68 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.list; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import de.symeda.sormas.app.PagedBaseListFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.core.adapter.databinding.OnListItemClickListener; +import de.symeda.sormas.app.sample.ShipmentStatus; + +public class EnvironmentSampleListFragment extends PagedBaseListFragment implements OnListItemClickListener { + + private LinearLayoutManager linearLayoutManager; + private RecyclerView recyclerViewForList; + + public static EnvironmentSampleListFragment newInstance(ShipmentStatus listFilter) { + return newInstance(EnvironmentSampleListFragment.class, null, listFilter); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + linearLayoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false); + recyclerViewForList = view.findViewById(R.id.recyclerViewForList); + + return view; + } + + @Override + public EnvironmentSampleListAdapter getNewListAdapter() { + return (EnvironmentSampleListAdapter) ((EnvironmentSampleListActivity) getActivity()).getAdapter(); + } + + @Override + public void onListItemClick(View view, int position, Object item) { + EnvironmentSample environmentSample = (EnvironmentSample) item; + //EnvironmentSampleReadActivity.startActivity(getContext(), environmentSample.getUuid()); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + recyclerViewForList.setLayoutManager(linearLayoutManager); + recyclerViewForList.setAdapter(getListAdapter()); + } +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListViewModel.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListViewModel.java new file mode 100644 index 00000000000..19c509a1f26 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListViewModel.java @@ -0,0 +1,134 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.list; + +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import androidx.paging.DataSource; +import androidx.paging.LivePagedListBuilder; +import androidx.paging.PagedList; +import androidx.paging.PositionalDataSource; + +import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.Environment; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSampleCriteria; + +public class EnvironmentSampleListViewModel extends ViewModel { + + private LiveData> environmentSamples; + private EnvironmentSampleDataFactory environmentSampleDataFactory; + + public void initializeViewModel(Environment environment) { + environmentSampleDataFactory = new EnvironmentSampleListViewModel.EnvironmentSampleDataFactory(); + EnvironmentSampleCriteria criteria = new EnvironmentSampleCriteria(); + criteria.environment(environment); + environmentSampleDataFactory.setCriteria(criteria); + initializeList(); + } + + public void initializeViewModel() { + environmentSampleDataFactory = new EnvironmentSampleListViewModel.EnvironmentSampleDataFactory(); + EnvironmentSampleCriteria criteria = new EnvironmentSampleCriteria(); + criteria.shipmentStatus(null); + environmentSampleDataFactory.setCriteria(criteria); + initializeList(); + } + + public LiveData> getEnvironmentSamples() { + return environmentSamples; + } + + void notifyCriteriaUpdated() { + if (environmentSamples.getValue() != null) { + environmentSamples.getValue().getDataSource().invalidate(); + if (!environmentSamples.getValue().isEmpty()) { + environmentSamples.getValue().loadAround(0); + } + } + } + + public EnvironmentSampleCriteria getCriteria() { + return environmentSampleDataFactory.getCriteria(); + } + + public static class EnvironmmentSampleDataSource extends PositionalDataSource { + + private EnvironmentSampleCriteria criteria; + + EnvironmmentSampleDataSource(EnvironmentSampleCriteria criteria) { + this.criteria = criteria; + } + + @Override + public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) { + long totalCount = DatabaseHelper.getEnvironmentSampleDao().countByCriteria(criteria); + int offset = params.requestedStartPosition; + int count = params.requestedLoadSize; + if (offset + count > totalCount) { + offset = (int) Math.max(0, totalCount - count); + } + List environmentSamples = DatabaseHelper.getEnvironmentSampleDao().queryByCriteria(criteria, offset, count); + callback.onResult(environmentSamples, offset, (int) totalCount); + } + + @Override + public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback callback) { + List environmentSamples = + DatabaseHelper.getEnvironmentSampleDao().queryByCriteria(criteria, params.startPosition, params.loadSize); + callback.onResult(environmentSamples); + } + } + + public static class EnvironmentSampleDataFactory extends DataSource.Factory { + + private MutableLiveData mutableDataSource; + private EnvironmentSampleListViewModel.EnvironmmentSampleDataSource dataSource; + private EnvironmentSampleCriteria criteria; + + EnvironmentSampleDataFactory() { + this.mutableDataSource = new MutableLiveData<>(); + } + + @NonNull + @Override + public DataSource create() { + dataSource = new EnvironmentSampleListViewModel.EnvironmmentSampleDataSource(criteria); + mutableDataSource.postValue(dataSource); + return dataSource; + } + + void setCriteria(EnvironmentSampleCriteria criteria) { + this.criteria = criteria; + } + + EnvironmentSampleCriteria getCriteria() { + return criteria; + } + } + + private void initializeList() { + PagedList.Config config = new PagedList.Config.Builder().setEnablePlaceholders(true).setInitialLoadSizeHint(16).setPageSize(8).build(); + + LivePagedListBuilder listBuilder = new LivePagedListBuilder(environmentSampleDataFactory, config); + environmentSamples = listBuilder.build(); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/NavigationHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/NavigationHelper.java index a7a6547d1d4..79cb6ba94ec 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/NavigationHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/NavigationHelper.java @@ -29,6 +29,7 @@ import de.symeda.sormas.app.contact.list.ContactListActivity; import de.symeda.sormas.app.dashboard.DashboardActivity; import de.symeda.sormas.app.environment.list.EnvironmentListActivity; +import de.symeda.sormas.app.environmentsample.list.EnvironmentSampleListActivity; import de.symeda.sormas.app.event.list.EventListActivity; import de.symeda.sormas.app.immunization.list.ImmunizationListActivity; import de.symeda.sormas.app.report.ReportActivity; @@ -74,10 +75,14 @@ public static void goToSamples(Context context) { SampleListActivity.startActivity(context, null); } - public static void goToEnvironments(Context context){ + public static void goToEnvironments(Context context) { EnvironmentListActivity.startActivity(context); } + public static void goToEnvironmentSamples(Context context) { + EnvironmentSampleListActivity.startActivity(context, null); + } + public static void goToImmunizations(Context context) { ImmunizationListActivity.startActivity(context); } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/TextViewBindingAdapters.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/TextViewBindingAdapters.java index 7a9df84981b..d22ed5d331e 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/TextViewBindingAdapters.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/TextViewBindingAdapters.java @@ -17,6 +17,14 @@ import static android.view.View.VISIBLE; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; + import android.content.Context; import android.content.res.Resources; import android.graphics.Typeface; @@ -30,14 +38,6 @@ import androidx.databinding.BindingAdapter; import androidx.databinding.ObservableList; -import org.apache.commons.lang3.StringUtils; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.i18n.I18nProperties; @@ -59,6 +59,7 @@ import de.symeda.sormas.app.backend.caze.Case; import de.symeda.sormas.app.backend.common.AbstractDomainObject; import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.Environment; import de.symeda.sormas.app.backend.event.Event; import de.symeda.sormas.app.backend.facility.Facility; import de.symeda.sormas.app.backend.infrastructure.PointOfEntry; @@ -725,6 +726,22 @@ public static void setPatientValue(TextView textField, Task task, String valueFo } } + @BindingAdapter(value = { + "environmentValue", + "defaultValue" }, requireAll = false) + public static void setEnvironmentValue(TextView textField, Environment environment, String defaultValue) { + if (environment == null) { + textField.setText(defaultValue); + } else { + if (environment.isPseudonymized()) { + ViewHelper.formatInaccessibleTextView(textField); + } else { + ViewHelper.removeInaccessibleTextViewFormat(textField); + textField.setText(environment.getEnvironmentName()); + } + } + } + @BindingAdapter(value = { "dueDateValue", "valueFormat", diff --git a/sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_36dp.xml b/sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_36dp.xml new file mode 100644 index 00000000000..460b09e9c2e --- /dev/null +++ b/sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_36dp.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/sormas-app/app/src/main/res/layout/filter_environment_sample_list_layout.xml b/sormas-app/app/src/main/res/layout/filter_environment_sample_list_layout.xml new file mode 100644 index 00000000000..804097cbf8e --- /dev/null +++ b/sormas-app/app/src/main/res/layout/filter_environment_sample_list_layout.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sormas-app/app/src/main/res/layout/row_environment_sample_list_item_layout.xml b/sormas-app/app/src/main/res/layout/row_environment_sample_list_item_layout.xml new file mode 100644 index 00000000000..19616680126 --- /dev/null +++ b/sormas-app/app/src/main/res/layout/row_environment_sample_list_item_layout.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sormas-app/app/src/main/res/menu/drawer_main_menu.xml b/sormas-app/app/src/main/res/menu/drawer_main_menu.xml index a07d658b89e..712b36382f7 100644 --- a/sormas-app/app/src/main/res/menu/drawer_main_menu.xml +++ b/sormas-app/app/src/main/res/menu/drawer_main_menu.xml @@ -86,26 +86,34 @@ android:orderInCategory="8" /> + + diff --git a/sormas-app/app/src/main/res/values/strings.xml b/sormas-app/app/src/main/res/values/strings.xml index e1b8e04ad4b..f471663fe2e 100644 --- a/sormas-app/app/src/main/res/values/strings.xml +++ b/sormas-app/app/src/main/res/values/strings.xml @@ -79,6 +79,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -396,6 +397,7 @@ Read Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -526,6 +528,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -699,5 +702,6 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A From 17670c847efcd1b59d769b24f09365f712b78dc1 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 4 Sep 2023 15:50:11 +0200 Subject: [PATCH 066/144] SORQA-1061 "S2S - Actions on Shares directory" --- .../features/sanity/web/SharedCases.feature | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature index b71ed401308..ce380657982 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature @@ -1221,4 +1221,24 @@ Feature: Sharing cases between environments tests Then I accept first entity from table in Shares Page And I click on the Cases button from navbar And I select first created case for person from Cases list - Then I check that Point Of Entry and Place Of Stay EINRICHTUNG information is correctly display on Edit case page \ No newline at end of file + Then I check that Point Of Entry and Place Of Stay EINRICHTUNG information is correctly display on Edit case page + + + @tmsLink=SORQA-1061 @env_s2s_1 + Scenario: S2S - Actions on Shares directory + Given API: I create a new person with "Baden-Württemberg" region and "LK Alb-Donau-Kreis" district + And API: I check that POST call status code is 200 + And API: I create a new case with "Baden-Württemberg" region and "LK Alb-Donau-Kreis" district and "General Hospital" facility + And API: I check that POST call status code is 200 + Given I log in as a S2S + Then I navigate to the last created case via the url + And I collect uuid of the case + Then I click on share button + And I select organization to share with "s2s_2" + And I fill comment in share popup for case with random string + Then I click on share button in s2s share popup and wait for share to finish + Then I navigate to "s2s_2" environment in new driver tab + Given I log in as a S2S + And I click on the Shares button from navbar + And I click on the The Eye Icon located in the Shares Page + And I click on the shortened case/contact ID to open the case From 1432ae22c329d06b8398bb0fa3e56128e1d04579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 5 Sep 2023 09:07:51 +0200 Subject: [PATCH 067/144] New Crowdin updates (#12462) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations enum.properties (Romanian) * New translations enum.properties (French) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (French, Congo) * New translations enum.properties (French, Tunisia) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (French, Congo) * New translations strings.properties (French, Tunisia) * New translations validations.properties (Romanian) * New translations validations.properties (French) * New translations validations.properties (Spanish) * New translations validations.properties (Arabic) * New translations validations.properties (Czech) * New translations validations.properties (German) * New translations validations.properties (Finnish) * New translations validations.properties (Italian) * New translations validations.properties (Japanese) * New translations validations.properties (Dutch) * New translations validations.properties (Norwegian) * New translations validations.properties (Polish) * New translations validations.properties (Portuguese) * New translations validations.properties (Russian) * New translations validations.properties (Swedish) * New translations validations.properties (Turkish) * New translations validations.properties (Ukrainian) * New translations validations.properties (Chinese Simplified) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Croatian) * New translations validations.properties (Hindi) * New translations validations.properties (Filipino) * New translations validations.properties (Fijian) * New translations validations.properties (Swahili) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Nepali) * New translations validations.properties (French, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations validations.properties (Dari) * New translations validations.properties (Pashto) * New translations validations.properties (Spanish, Cuba) * New translations validations.properties (English, Afghanistan) * New translations validations.properties (English, Nigeria) * New translations validations.properties (English, Ghana) * New translations validations.properties (French, Congo) * New translations validations.properties (French, Tunisia) * New translations strings.xml (Romanian) * New translations strings.xml (French) * New translations strings.xml (Spanish) * New translations strings.xml (Arabic) * New translations strings.xml (Czech) * New translations strings.xml (German) * New translations strings.xml (Finnish) * New translations strings.xml (Italian) * New translations strings.xml (Japanese) * New translations strings.xml (Dutch) * New translations strings.xml (Norwegian) * New translations strings.xml (Polish) * New translations strings.xml (Portuguese) * New translations strings.xml (Russian) * New translations strings.xml (Swedish) * New translations strings.xml (Turkish) * New translations strings.xml (Ukrainian) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Urdu (Pakistan)) * New translations strings.xml (Croatian) * New translations strings.xml (Hindi) * New translations strings.xml (Filipino) * New translations strings.xml (Fijian) * New translations strings.xml (Swahili) * New translations strings.xml (German, Switzerland) * New translations strings.xml (Nepali) * New translations strings.xml (French, Switzerland) * New translations strings.xml (Italian, Switzerland) * New translations strings.xml (Dari) * New translations strings.xml (Pashto) * New translations strings.xml (Spanish, Cuba) * New translations strings.xml (English, Afghanistan) * New translations strings.xml (English, Nigeria) * New translations strings.xml (English, Ghana) * New translations strings.xml (French, Congo) * New translations strings.xml (French, Tunisia) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Czech) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Czech) * New translations captions.properties (Czech) * New translations enum.properties (Czech) * New translations strings.properties (Czech) * New translations captions.properties (Spanish, Cuba) * New translations enum.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations captions.properties (Spanish, Cuba) * New translations enum.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations strings.xml (Spanish, Cuba) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations captions.properties (Czech) * New translations captions.properties (Spanish, Cuba) --- .../main/resources/captions_ar-SA.properties | 1 + .../main/resources/captions_cs-CZ.properties | 79 ++++++------ .../main/resources/captions_de-CH.properties | 1 + .../main/resources/captions_de-DE.properties | 1 + .../main/resources/captions_en-AF.properties | 1 + .../main/resources/captions_en-GH.properties | 1 + .../main/resources/captions_en-NG.properties | 1 + .../main/resources/captions_es-CU.properties | 119 +++++++++--------- .../main/resources/captions_es-ES.properties | 1 + .../main/resources/captions_fa-AF.properties | 1 + .../main/resources/captions_fi-FI.properties | 1 + .../main/resources/captions_fil-PH.properties | 1 + .../main/resources/captions_fj-FJ.properties | 1 + .../main/resources/captions_fr-CD.properties | 1 + .../main/resources/captions_fr-CH.properties | 1 + .../main/resources/captions_fr-FR.properties | 1 + .../main/resources/captions_fr-TN.properties | 1 + .../main/resources/captions_hi-IN.properties | 1 + .../main/resources/captions_hr-HR.properties | 1 + .../main/resources/captions_it-CH.properties | 1 + .../main/resources/captions_it-IT.properties | 1 + .../main/resources/captions_ja-JP.properties | 1 + .../main/resources/captions_ne-NP.properties | 1 + .../main/resources/captions_nl-NL.properties | 1 + .../main/resources/captions_no-NO.properties | 1 + .../main/resources/captions_pl-PL.properties | 1 + .../main/resources/captions_ps-AF.properties | 1 + .../main/resources/captions_pt-PT.properties | 1 + .../main/resources/captions_ro-RO.properties | 1 + .../main/resources/captions_ru-RU.properties | 1 + .../main/resources/captions_sv-SE.properties | 1 + .../main/resources/captions_sw-KE.properties | 1 + .../main/resources/captions_tr-TR.properties | 1 + .../main/resources/captions_uk-UA.properties | 1 + .../main/resources/captions_ur-PK.properties | 17 +-- .../main/resources/captions_zh-CN.properties | 1 + .../src/main/resources/enum_cs-CZ.properties | 30 ++--- .../src/main/resources/enum_es-CU.properties | 68 +++++----- .../main/resources/strings_cs-CZ.properties | 4 +- .../main/resources/strings_es-CU.properties | 22 ++-- .../resources/validations_es-CU.properties | 2 +- .../src/main/res/values-es-rCU/strings.xml | 20 +-- 42 files changed, 215 insertions(+), 179 deletions(-) diff --git a/sormas-api/src/main/resources/captions_ar-SA.properties b/sormas-api/src/main/resources/captions_ar-SA.properties index 881d24add74..49d7c993329 100644 --- a/sormas-api/src/main/resources/captions_ar-SA.properties +++ b/sormas-api/src/main/resources/captions_ar-SA.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index 177fecdb0b2..12e5dff505a 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -1132,31 +1132,31 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample -EnvironmentSample.environment = Environment -EnvironmentSample.sampleDateTime = Date of sampling -EnvironmentSample.sampleMaterial = Sample material -EnvironmentSample.otherSampleMaterial = Specify sample material -EnvironmentSample.sampleVolume = Volume (in mL) +EnvironmentSample.environment = Prostředí +EnvironmentSample.sampleDateTime = Datum odběru vzorků +EnvironmentSample.sampleMaterial = Materiál vzorku +EnvironmentSample.otherSampleMaterial = Specifikujte materiál vzorku +EnvironmentSample.sampleVolume = Objem (v mL) EnvironmentSample.fieldSampleId = Field sample ID -EnvironmentSample.turbidity = Turbidity (in NTU) -EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in -EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) -EnvironmentSample.laboratory = Laboratory -EnvironmentSample.laboratoryDetails = Laboratory details +EnvironmentSample.turbidity = Turbidita (v NTU) +EnvironmentSample.phValue = pH vzorku +EnvironmentSample.sampleTemperature = Teplota (v �C) +EnvironmentSample.chlorineResiduals = Zbytky chloru celkem (mg/L) +EnvironmentSample.laboratory = Laboratoř +EnvironmentSample.laboratoryDetails = Detaily laboratoře EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested EnvironmentSample.otherRequestedPathogenTests = Other requested pathogens to be tested EnvironmentSample.weatherConditions = Weather conditions at time of sampling EnvironmentSample.heavyRain = Heavy rain in the past 24 hours before sampling? -EnvironmentSample.dispatched = Sent/dispatched -EnvironmentSample.dispatchDate = Dispatchment date -EnvironmentSample.dispatchDetails = Dispatchment details -EnvironmentSample.received = Received -EnvironmentSample.receivalDate = Receival date -EnvironmentSample.labSampleId = Lab sample ID -EnvironmentSample.specimenCondition = Specimen condition -EnvironmentSample.location = Location of sampling site -EnvironmentSample.generalComment = General comment +EnvironmentSample.dispatched = Odesláno/vydáno +EnvironmentSample.dispatchDate = Datum odeslání +EnvironmentSample.dispatchDetails = Detaily odeslání +EnvironmentSample.received = Přijato +EnvironmentSample.receivalDate = Datum přijetí +EnvironmentSample.labSampleId = ID laboratorního vzorku +EnvironmentSample.specimenCondition = Stav vzorku +EnvironmentSample.location = Umístění místa odběru vzorků +EnvironmentSample.generalComment = Obecný komentář # Event eventActiveEvents=Aktivní události @@ -1563,10 +1563,10 @@ ExternalMessage.assignee=Přiřazený ExternalMessage.type=Typ ExternalMessage.surveillanceReport=Odkaz na hlášení ExternalMessage.caseReportDate=Case report date -ExternalMessage.personExternalId=External ID +ExternalMessage.personExternalId=Externí ID ExternalMessage.personNationalHealthId=National health ID ExternalMessage.personPhoneNumberType=Phone number type -ExternalMessage.personCountry=Country +ExternalMessage.personCountry=Země externalMessageFetch=Načíst zprávy externalMessageProcess=Zpracování externalMessageNoDisease=Nebyla nalezena žádná nemoc @@ -1736,14 +1736,14 @@ PathogenTest.ctValueS=Ct target S PathogenTest.ctValueOrf1=Ct target ORF1 PathogenTest.ctValueRdrpS=Ct target RDRP/S PathogenTest.prescriber=Prescriber -PathogenTest.prescriberPhysicianCode=Physician code -PathogenTest.prescriberFirstName=First name -PathogenTest.prescriberLastName=Last name -PathogenTest.prescriberPhoneNumber=Phone number -PathogenTest.prescriberAddress=Address -PathogenTest.prescriberPostalCode=Postal code -PathogenTest.prescriberCity=City -PathogenTest.prescriberCountry=Country +PathogenTest.prescriberPhysicianCode=Kód lékaře +PathogenTest.prescriberFirstName=Jméno +PathogenTest.prescriberLastName=Příjmení +PathogenTest.prescriberPhoneNumber=Telefonní číslo +PathogenTest.prescriberAddress=Adresa +PathogenTest.prescriberPostalCode=PSČ +PathogenTest.prescriberCity=Město +PathogenTest.prescriberCountry=Země # Person personPersonsList=Seznam osob personCreateNew=Vytvořit novou osobu @@ -2403,6 +2403,7 @@ Task.contextReference=Související odkaz Task.creatorComment=Komentáře k úkolu Task.creatorUser=Vytvořil Task.dueDate=Termín +Task.environment = Související prostředí Task.event=Související událost Task.observerUsers=Pozorováno Task.perceivedStart=Přípustný start @@ -2433,14 +2434,14 @@ TestReport.ctValueRdrp=Ct target RDRP TestReport.ctValueS=Ct target S TestReport.ctValueOrf1=Ct target ORF1 TestReport.ctValueRdrpS=Ct target RDRP/S -TestReport.prescriberPhysicianCode=Physician code -TestReport.prescriberFirstName=First name -TestReport.prescriberLastName=Last name -TestReport.prescriberPhoneNumber=Phone number -TestReport.prescriberAddress=Address -TestReport.prescriberPostalCode=Postal code -TestReport.prescriberCity=City -TestReport.prescriberCountry=Country +TestReport.prescriberPhysicianCode=Kód lékaře +TestReport.prescriberFirstName=Jméno +TestReport.prescriberLastName=Příjmení +TestReport.prescriberPhoneNumber=Telefonní číslo +TestReport.prescriberAddress=Adresa +TestReport.prescriberPostalCode=PSČ +TestReport.prescriberCity=Město +TestReport.prescriberCountry=Země # TravelEntry travelEntryCreateCase=Vytvořit případ travelEntryOnlyRecoveredEntries=Pouze obnovené položky @@ -2671,7 +2672,7 @@ View.user.users=Správa uživatelů View.user.userroles=Uživatelské role View.users.sub= View.shareRequests=Sdílet adresář -View.environments=Environment directory +View.environments=Adresář prostředí # Visit visitNewVisit=Nová návštěva Visit=Návštěva diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index 74f6739e22e..ea8cf1a89a1 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Verknüpfter Link Task.creatorComment=Kommentare zur Aufgabe Task.creatorUser=Erstellt von Task.dueDate=Fälligkeitsdatum +Task.environment = Associated environment Task.event=Zugehöriges Ereignis Task.observerUsers=Beobachtet von Task.perceivedStart=Erfasster Start diff --git a/sormas-api/src/main/resources/captions_de-DE.properties b/sormas-api/src/main/resources/captions_de-DE.properties index 22fe63331af..2f9cd831bef 100644 --- a/sormas-api/src/main/resources/captions_de-DE.properties +++ b/sormas-api/src/main/resources/captions_de-DE.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Verknüpfter Link Task.creatorComment=Kommentare zur Aufgabe Task.creatorUser=Erstellt von Task.dueDate=Fälligkeitsdatum +Task.environment = Associated environment Task.event=Zugehöriges Ereignis Task.observerUsers=Beobachtet von Task.perceivedStart=Erfasster Start diff --git a/sormas-api/src/main/resources/captions_en-AF.properties b/sormas-api/src/main/resources/captions_en-AF.properties index 2b8d15d81ec..ab02b0a77a0 100644 --- a/sormas-api/src/main/resources/captions_en-AF.properties +++ b/sormas-api/src/main/resources/captions_en-AF.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_en-GH.properties b/sormas-api/src/main/resources/captions_en-GH.properties index 112674cf48a..5af9c6b234b 100644 --- a/sormas-api/src/main/resources/captions_en-GH.properties +++ b/sormas-api/src/main/resources/captions_en-GH.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_en-NG.properties b/sormas-api/src/main/resources/captions_en-NG.properties index 2937a8d21b7..cfaa30ad4e8 100644 --- a/sormas-api/src/main/resources/captions_en-NG.properties +++ b/sormas-api/src/main/resources/captions_en-NG.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_es-CU.properties b/sormas-api/src/main/resources/captions_es-CU.properties index 27a42150857..0aa78515bad 100644 --- a/sormas-api/src/main/resources/captions_es-CU.properties +++ b/sormas-api/src/main/resources/captions_es-CU.properties @@ -1132,31 +1132,31 @@ environmentNewEnvironment= Nuevo ambiente environmentEnvironmentsList=Lista de ambientes # EnvironmentSample -EnvironmentSample.environment = Environment -EnvironmentSample.sampleDateTime = Date of sampling -EnvironmentSample.sampleMaterial = Sample material -EnvironmentSample.otherSampleMaterial = Specify sample material -EnvironmentSample.sampleVolume = Volume (in mL) -EnvironmentSample.fieldSampleId = Field sample ID -EnvironmentSample.turbidity = Turbidity (in NTU) -EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in -EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) -EnvironmentSample.laboratory = Laboratory -EnvironmentSample.laboratoryDetails = Laboratory details -EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested -EnvironmentSample.otherRequestedPathogenTests = Other requested pathogens to be tested -EnvironmentSample.weatherConditions = Weather conditions at time of sampling -EnvironmentSample.heavyRain = Heavy rain in the past 24 hours before sampling? -EnvironmentSample.dispatched = Sent/dispatched -EnvironmentSample.dispatchDate = Dispatchment date -EnvironmentSample.dispatchDetails = Dispatchment details -EnvironmentSample.received = Received -EnvironmentSample.receivalDate = Receival date -EnvironmentSample.labSampleId = Lab sample ID -EnvironmentSample.specimenCondition = Specimen condition -EnvironmentSample.location = Location of sampling site -EnvironmentSample.generalComment = General comment +EnvironmentSample.environment = Ambiente +EnvironmentSample.sampleDateTime = Fecha de la muestra +EnvironmentSample.sampleMaterial = Material de la muestra +EnvironmentSample.otherSampleMaterial = Especificar material de la muestra +EnvironmentSample.sampleVolume = Volumen (en mL) +EnvironmentSample.fieldSampleId = ID de muestra de campo +EnvironmentSample.turbidity = Turbidez (en NTU) +EnvironmentSample.phValue = pH de la muestra +EnvironmentSample.sampleTemperature = Temperatura (en �C) +EnvironmentSample.chlorineResiduals = Residuos totales de clorina (mg/L) +EnvironmentSample.laboratory = Laboratorio +EnvironmentSample.laboratoryDetails = Detalles de laboratorio +EnvironmentSample.requestedPathogenTests = Pruebas de patógeno solicitadas +EnvironmentSample.otherRequestedPathogenTests = Otras pruebas de patógeno solicitadas +EnvironmentSample.weatherConditions = Condiciones meteorológicas al tomar la muestra +EnvironmentSample.heavyRain = ¿Lluvia fuerte en las últimas 24 horas antes de tomar la muestra? +EnvironmentSample.dispatched = Enviada/despachada +EnvironmentSample.dispatchDate = Fecha de envío +EnvironmentSample.dispatchDetails = Detalles del envío +EnvironmentSample.received = Recibida +EnvironmentSample.receivalDate = Fecha de recepción +EnvironmentSample.labSampleId = ID de muestra de laboratorio +EnvironmentSample.specimenCondition = Condición del espécimen +EnvironmentSample.location = Ubicación del sitio de la muestra +EnvironmentSample.generalComment = Comentario general # Event eventActiveEvents=Eventos activos @@ -1562,11 +1562,11 @@ ExternalMessage.sampleOverallTestResult=Resultado global de la prueba ExternalMessage.assignee=Responsable ExternalMessage.type=Tipo ExternalMessage.surveillanceReport=Informe vinculado -ExternalMessage.caseReportDate=Case report date -ExternalMessage.personExternalId=External ID -ExternalMessage.personNationalHealthId=National health ID -ExternalMessage.personPhoneNumberType=Phone number type -ExternalMessage.personCountry=Country +ExternalMessage.caseReportDate=Fecha de informe del caso +ExternalMessage.personExternalId=ID externo +ExternalMessage.personNationalHealthId=Carnet de identidad +ExternalMessage.personPhoneNumberType=Tipo de número telefónico +ExternalMessage.personCountry=País externalMessageFetch=Obtener mensajes externalMessageProcess=Proceso externalMessageNoDisease=No se encontró enfermedad @@ -1729,21 +1729,21 @@ PathogenTest.viaLims=Vía LIMS PathogenTest.testedDiseaseVariantDetails=Detalles de variante de enfermedad PathogenTest.externalOrderId=ID de solicitud externa PathogenTest.preliminary=Preliminar -PathogenTest.ctValueE=Ct target E -PathogenTest.ctValueN=Ct target N -PathogenTest.ctValueRdrp=Ct target RDRP -PathogenTest.ctValueS=Ct target S -PathogenTest.ctValueOrf1=Ct target ORF1 -PathogenTest.ctValueRdrpS=Ct target RDRP/S -PathogenTest.prescriber=Prescriber -PathogenTest.prescriberPhysicianCode=Physician code -PathogenTest.prescriberFirstName=First name -PathogenTest.prescriberLastName=Last name -PathogenTest.prescriberPhoneNumber=Phone number -PathogenTest.prescriberAddress=Address -PathogenTest.prescriberPostalCode=Postal code -PathogenTest.prescriberCity=City -PathogenTest.prescriberCountry=Country +PathogenTest.ctValueE=Valor Ct gen E +PathogenTest.ctValueN=Valor Ct gen N +PathogenTest.ctValueRdrp=Valor Ct gen RDRP +PathogenTest.ctValueS=Valor Ct gen S +PathogenTest.ctValueOrf1=Valor Ct gen ORF1 +PathogenTest.ctValueRdrpS=Valor Ct gen RDRP/S +PathogenTest.prescriber=Prescriptor +PathogenTest.prescriberPhysicianCode=Código médico +PathogenTest.prescriberFirstName=Nombre +PathogenTest.prescriberLastName=Apellidos +PathogenTest.prescriberPhoneNumber=Número telefónico +PathogenTest.prescriberAddress=Dirección +PathogenTest.prescriberPostalCode=Código postal +PathogenTest.prescriberCity=Ciudad +PathogenTest.prescriberCountry=País # Person personPersonsList=Lista de personas personCreateNew=Crear una nueva persona @@ -2403,6 +2403,7 @@ Task.contextReference=Enlace asociado Task.creatorComment=Comentarios sobre la tarea Task.creatorUser=Creada por Task.dueDate=Fecha de vencimiento +Task.environment = Ambiente asociado Task.event=Evento asociado Task.observerUsers=Observado por Task.perceivedStart=Inicio percibido @@ -2427,20 +2428,20 @@ TestReport.testLabName=Nombre del laboratorio TestReport.testLabPostalCode=Código postal del laboratorio TestReport.testResult=Resultado de prueba TestReport.testType=Tipo de prueba -TestReport.ctValueE=Ct target E -TestReport.ctValueN=Ct target N -TestReport.ctValueRdrp=Ct target RDRP -TestReport.ctValueS=Ct target S -TestReport.ctValueOrf1=Ct target ORF1 -TestReport.ctValueRdrpS=Ct target RDRP/S -TestReport.prescriberPhysicianCode=Physician code -TestReport.prescriberFirstName=First name -TestReport.prescriberLastName=Last name -TestReport.prescriberPhoneNumber=Phone number -TestReport.prescriberAddress=Address -TestReport.prescriberPostalCode=Postal code -TestReport.prescriberCity=City -TestReport.prescriberCountry=Country +TestReport.ctValueE=Valor Ct gen E +TestReport.ctValueN=Valor Ct gen N +TestReport.ctValueRdrp=Valor Ct gen RDRP +TestReport.ctValueS=Valor Ct gen S +TestReport.ctValueOrf1=Valor Ct gen ORF1 +TestReport.ctValueRdrpS=Valor Ct gen RDRP/S +TestReport.prescriberPhysicianCode=Código médico +TestReport.prescriberFirstName=Nombre +TestReport.prescriberLastName=Apellidos +TestReport.prescriberPhoneNumber=Número telefónico +TestReport.prescriberAddress=Dirección +TestReport.prescriberPostalCode=Código postal +TestReport.prescriberCity=Ciudad +TestReport.prescriberCountry=País # TravelEntry travelEntryCreateCase=Crear caso travelEntryOnlyRecoveredEntries=Sólo entradas recuperadas diff --git a/sormas-api/src/main/resources/captions_es-ES.properties b/sormas-api/src/main/resources/captions_es-ES.properties index 11a5fd31ea1..920f20c968c 100644 --- a/sormas-api/src/main/resources/captions_es-ES.properties +++ b/sormas-api/src/main/resources/captions_es-ES.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_fa-AF.properties b/sormas-api/src/main/resources/captions_fa-AF.properties index 7cc85bcc4e3..9991e295f0a 100644 --- a/sormas-api/src/main/resources/captions_fa-AF.properties +++ b/sormas-api/src/main/resources/captions_fa-AF.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_fi-FI.properties b/sormas-api/src/main/resources/captions_fi-FI.properties index 3e2f695769e..81a90e576ab 100644 --- a/sormas-api/src/main/resources/captions_fi-FI.properties +++ b/sormas-api/src/main/resources/captions_fi-FI.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Yhteyslinkki Task.creatorComment=Huomiot tehtävästä Task.creatorUser=Luonut Task.dueDate=Määräpäivä +Task.environment = Associated environment Task.event=Tehtävään liittyvä tapahtuma Task.observerUsers=Observed by Task.perceivedStart=Havaittu aloitus diff --git a/sormas-api/src/main/resources/captions_fil-PH.properties b/sormas-api/src/main/resources/captions_fil-PH.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_fil-PH.properties +++ b/sormas-api/src/main/resources/captions_fil-PH.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_fj-FJ.properties b/sormas-api/src/main/resources/captions_fj-FJ.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_fj-FJ.properties +++ b/sormas-api/src/main/resources/captions_fj-FJ.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_fr-CD.properties b/sormas-api/src/main/resources/captions_fr-CD.properties index cb622fb79ba..6c3226a9aa3 100644 --- a/sormas-api/src/main/resources/captions_fr-CD.properties +++ b/sormas-api/src/main/resources/captions_fr-CD.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_fr-CH.properties b/sormas-api/src/main/resources/captions_fr-CH.properties index ed36ae4dba1..fcc7a732c80 100644 --- a/sormas-api/src/main/resources/captions_fr-CH.properties +++ b/sormas-api/src/main/resources/captions_fr-CH.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Lien associé Task.creatorComment=Commentaires sur la tâche Task.creatorUser=Créé par Task.dueDate=Date d’échéance +Task.environment = Associated environment Task.event=Événement associé Task.observerUsers=Observed by Task.perceivedStart=Début perçue diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index ff7e675f47a..6dff31da57d 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Lien associé Task.creatorComment=Commentaires sur la tâche Task.creatorUser=Créé par Task.dueDate=Date d’échéance +Task.environment = Associated environment Task.event=Événement associé Task.observerUsers=Observé par Task.perceivedStart=Début perçue diff --git a/sormas-api/src/main/resources/captions_fr-TN.properties b/sormas-api/src/main/resources/captions_fr-TN.properties index bb22184e28d..5136975f565 100644 --- a/sormas-api/src/main/resources/captions_fr-TN.properties +++ b/sormas-api/src/main/resources/captions_fr-TN.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Lien associé Task.creatorComment=Commentaires sur la tâche Task.creatorUser=Créé par Task.dueDate=Date d’échéance +Task.environment = Associated environment Task.event=Événement associé Task.observerUsers=Observé par Task.perceivedStart=Début perçue diff --git a/sormas-api/src/main/resources/captions_hi-IN.properties b/sormas-api/src/main/resources/captions_hi-IN.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_hi-IN.properties +++ b/sormas-api/src/main/resources/captions_hi-IN.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_hr-HR.properties b/sormas-api/src/main/resources/captions_hr-HR.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_hr-HR.properties +++ b/sormas-api/src/main/resources/captions_hr-HR.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_it-CH.properties b/sormas-api/src/main/resources/captions_it-CH.properties index f86acb654a0..9bdd4f84038 100644 --- a/sormas-api/src/main/resources/captions_it-CH.properties +++ b/sormas-api/src/main/resources/captions_it-CH.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Link collegato Task.creatorComment=Commenta attività Task.creatorUser=Creato da Task.dueDate=Data di scadenza +Task.environment = Associated environment Task.event=Evanto collegato Task.observerUsers=Observed by Task.perceivedStart=Inizio registrato diff --git a/sormas-api/src/main/resources/captions_it-IT.properties b/sormas-api/src/main/resources/captions_it-IT.properties index 2c0b6715e83..42bbcc10c2a 100644 --- a/sormas-api/src/main/resources/captions_it-IT.properties +++ b/sormas-api/src/main/resources/captions_it-IT.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Link collegato Task.creatorComment=Commenta attività Task.creatorUser=Creato da Task.dueDate=Data di scadenza +Task.environment = Associated environment Task.event=Evanto collegato Task.observerUsers=Observed by Task.perceivedStart=Inizio registrato diff --git a/sormas-api/src/main/resources/captions_ja-JP.properties b/sormas-api/src/main/resources/captions_ja-JP.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_ja-JP.properties +++ b/sormas-api/src/main/resources/captions_ja-JP.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_ne-NP.properties b/sormas-api/src/main/resources/captions_ne-NP.properties index 881d24add74..49d7c993329 100644 --- a/sormas-api/src/main/resources/captions_ne-NP.properties +++ b/sormas-api/src/main/resources/captions_ne-NP.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_nl-NL.properties b/sormas-api/src/main/resources/captions_nl-NL.properties index 8217ac88790..c8bc3da0512 100644 --- a/sormas-api/src/main/resources/captions_nl-NL.properties +++ b/sormas-api/src/main/resources/captions_nl-NL.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_no-NO.properties b/sormas-api/src/main/resources/captions_no-NO.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_no-NO.properties +++ b/sormas-api/src/main/resources/captions_no-NO.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index 3c6ed66e2a5..8813277716e 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_ps-AF.properties b/sormas-api/src/main/resources/captions_ps-AF.properties index 5c158820a8e..10821913e20 100644 --- a/sormas-api/src/main/resources/captions_ps-AF.properties +++ b/sormas-api/src/main/resources/captions_ps-AF.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_pt-PT.properties b/sormas-api/src/main/resources/captions_pt-PT.properties index 4de03b8a3cf..4adf8de84a4 100644 --- a/sormas-api/src/main/resources/captions_pt-PT.properties +++ b/sormas-api/src/main/resources/captions_pt-PT.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_ro-RO.properties b/sormas-api/src/main/resources/captions_ro-RO.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_ro-RO.properties +++ b/sormas-api/src/main/resources/captions_ro-RO.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_ru-RU.properties b/sormas-api/src/main/resources/captions_ru-RU.properties index 4c89799732f..dff566ee196 100644 --- a/sormas-api/src/main/resources/captions_ru-RU.properties +++ b/sormas-api/src/main/resources/captions_ru-RU.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_sv-SE.properties b/sormas-api/src/main/resources/captions_sv-SE.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_sv-SE.properties +++ b/sormas-api/src/main/resources/captions_sv-SE.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_sw-KE.properties b/sormas-api/src/main/resources/captions_sw-KE.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_sw-KE.properties +++ b/sormas-api/src/main/resources/captions_sw-KE.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_tr-TR.properties b/sormas-api/src/main/resources/captions_tr-TR.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_tr-TR.properties +++ b/sormas-api/src/main/resources/captions_tr-TR.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_uk-UA.properties b/sormas-api/src/main/resources/captions_uk-UA.properties index 0257525492d..45da8b1daf0 100644 --- a/sormas-api/src/main/resources/captions_uk-UA.properties +++ b/sormas-api/src/main/resources/captions_uk-UA.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index bcc26c42027..59f63a544ad 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -1132,14 +1132,14 @@ environmentNewEnvironment= نیا ماحول environmentEnvironmentsList=ماحولیات کی فہرست # EnvironmentSample -EnvironmentSample.environment = Environment -EnvironmentSample.sampleDateTime = Date of sampling -EnvironmentSample.sampleMaterial = Sample material -EnvironmentSample.otherSampleMaterial = Specify sample material -EnvironmentSample.sampleVolume = Volume (in mL) -EnvironmentSample.fieldSampleId = Field sample ID -EnvironmentSample.turbidity = Turbidity (in NTU) -EnvironmentSample.phValue = pH of sample +EnvironmentSample.environment = ماحول +EnvironmentSample.sampleDateTime = نمونے لینے کی تاریخ +EnvironmentSample.sampleMaterial = نمونہ کا مواد +EnvironmentSample.otherSampleMaterial = نمونے کے مواد کی وضاحت کریں +EnvironmentSample.sampleVolume = حجم (ایم ایل میں) +EnvironmentSample.fieldSampleId = فیلڈ کے نمونے کی شناخت +EnvironmentSample.turbidity = ٹربائڈیٹی (این ٹی یو میں) +EnvironmentSample.phValue = نمونے کا پی ایچ EnvironmentSample.sampleTemperature = Temperature (in EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory @@ -2403,6 +2403,7 @@ Task.contextReference=منسلک لنک Task.creatorComment=کام پر تبصرے Task.creatorUser=کی طرف بنایا گیا Task.dueDate=آخری تاریخ +Task.environment = Associated environment Task.event=وابستہ تقریب Task.observerUsers=مشاہدہ کرنے والا Task.perceivedStart=خیالی آغاز diff --git a/sormas-api/src/main/resources/captions_zh-CN.properties b/sormas-api/src/main/resources/captions_zh-CN.properties index 57ef124133e..983ed05d6c4 100644 --- a/sormas-api/src/main/resources/captions_zh-CN.properties +++ b/sormas-api/src/main/resources/captions_zh-CN.properties @@ -2403,6 +2403,7 @@ Task.contextReference=Associated link Task.creatorComment=Comments on task Task.creatorUser=Created by Task.dueDate=Due date +Task.environment = Associated environment Task.event=Associated event Task.observerUsers=Observed by Task.perceivedStart=Perceived start diff --git a/sormas-api/src/main/resources/enum_cs-CZ.properties b/sormas-api/src/main/resources/enum_cs-CZ.properties index a4b28a36941..b863b1c0bf6 100644 --- a/sormas-api/src/main/resources/enum_cs-CZ.properties +++ b/sormas-api/src/main/resources/enum_cs-CZ.properties @@ -1250,7 +1250,7 @@ TaskContext.CONTACT = Kontakt TaskContext.EVENT = Událost TaskContext.GENERAL = Obecné TaskContext.TRAVEL_ENTRY = Místo vstupu -TaskContext.ENVIRONMENT = Environment +TaskContext.ENVIRONMENT = Prostředí # TaskDateType TaskDateType.SUGGESTED_START_DATE = Navrhované datum zahájení @@ -1296,7 +1296,7 @@ TaskType.SURVEILLANCE_REPORT_GENERATION = vytvořit zprávu o dohledu TaskType.TREATMENT_CENTER_ESTABLISHMENT = zřízení místního střediska pro léčbu TaskType.VACCINATION_ACTIVITIES = očkovací činnosti TaskType.WEEKLY_REPORT_GENERATION = vytvořit týdenní zprávu -TaskType.ENVIRONMENT_INVESTIGATION = environment investigation +TaskType.ENVIRONMENT_INVESTIGATION = Průzkum životního prostředí # TemperatureSource TemperatureSource.AXILLARY=axilární @@ -2211,7 +2211,7 @@ SampleShipmentStatus.RECEIVED=Přijato Pathogen.CAMPYLOBACTER_JEJUNI = Campylobacter jejuni Pathogen.ESCHERICHIA_COLI = Escherichia coli Pathogen.SALMONELLA_SPP = Salmonella spp. -Pathogen.SHIGELLA_SPP = Shigella spp. +Pathogen.SHIGELLA_SPP = Sigella spp. Pathogen.VIBRIO_CHOLERAE = Vibrio cholerae Pathogen.YERSINIA_SPP = Yersinia spp. Pathogen.SARS_COV_2 = SARS-CoV-2 @@ -2222,23 +2222,23 @@ Pathogen.ECHOVIRUS = Echovirus Pathogen.HEPATITIS_A_VIRUS = Hepatitis A virus Pathogen.HEPATITIS_E_VIRUS = Hepatitis E virus Pathogen.HUMAN_CALICIVIRUS = Human calicivirus -Pathogen.POLIO_VIRUS = Polio virus 2 +Pathogen.POLIO_VIRUS = Virus Polio 2 Pathogen.REOVIRUS = Reovirus Pathogen.ROTAVIRUS = Rotavirus -Pathogen.TT_HEPATITIS = TT hepatitis -Pathogen.OTHER = Other +Pathogen.TT_HEPATITIS = TT hepatitida +Pathogen.OTHER = Jiné # EnvironmentSampleMaterial -EnvironmentSampleMaterial.WATER = Water -EnvironmentSampleMaterial.SOIL = Soil -EnvironmentSampleMaterial.AIR = Air -EnvironmentSampleMaterial.VECTORS = Vectors -EnvironmentSampleMaterial.OTHER = Other +EnvironmentSampleMaterial.WATER = Voda +EnvironmentSampleMaterial.SOIL = Půda +EnvironmentSampleMaterial.AIR = Vzduch +EnvironmentSampleMaterial.VECTORS = Vektory +EnvironmentSampleMaterial.OTHER = Ostatní # WeatherCondition -WeatherCondition.SUNNY = Sunny -WeatherCondition.CLOUDY = Cloudy -WeatherCondition.RAINING = Raining -WeatherCondition.WINDY = Windy +WeatherCondition.SUNNY = Slunečno +WeatherCondition.CLOUDY = Zataženo +WeatherCondition.RAINING = Deštivo +WeatherCondition.WINDY = Větrno #Pathogen Customizable enum \ No newline at end of file diff --git a/sormas-api/src/main/resources/enum_es-CU.properties b/sormas-api/src/main/resources/enum_es-CU.properties index b08b85d92eb..ad76e59fbce 100644 --- a/sormas-api/src/main/resources/enum_es-CU.properties +++ b/sormas-api/src/main/resources/enum_es-CU.properties @@ -1250,7 +1250,7 @@ TaskContext.CONTACT = Contacto TaskContext.EVENT = Evento TaskContext.GENERAL = General TaskContext.TRAVEL_ENTRY = Entrada de viaje -TaskContext.ENVIRONMENT = Environment +TaskContext.ENVIRONMENT = Ambiente # TaskDateType TaskDateType.SUGGESTED_START_DATE = Fecha de inicio sugerida @@ -1296,7 +1296,7 @@ TaskType.SURVEILLANCE_REPORT_GENERATION = generar informe de vigilancia TaskType.TREATMENT_CENTER_ESTABLISHMENT = establecimiento de centro local de tratamiento TaskType.VACCINATION_ACTIVITIES = actividades de vacunación TaskType.WEEKLY_REPORT_GENERATION = generar informe semanal -TaskType.ENVIRONMENT_INVESTIGATION = environment investigation +TaskType.ENVIRONMENT_INVESTIGATION = investigación de ambiente # TemperatureSource TemperatureSource.AXILLARY=axilar @@ -1566,14 +1566,14 @@ UserRight.ENVIRONMENT_ARCHIVE = Archivar ambientes UserRight.ENVIRONMENT_DELETE = Eliminar ambientes del sistema UserRight.ENVIRONMENT_IMPORT = Importar ambientes UserRight.ENVIRONMENT_EXPORT = Exportar ambientes -UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples -UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information -UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information -UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system -UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples -UserRight.ENVIRONMENT_SAMPLE_EXPORT = Export environment samples +UserRight.ENVIRONMENT_SAMPLE_VIEW = Ver muestras ambientales existentes +UserRight.ENVIRONMENT_SAMPLE_CREATE = Crear nuevas muestras ambientales +UserRight.ENVIRONMENT_SAMPLE_EDIT = Editar muestras ambientales existentes +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Editar información de envío de muestra ambiental +UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Editar información de recepción de muestras ambientales +UserRight.ENVIRONMENT_SAMPLE_DELETE = Eliminar muestras ambientales del sistema +UserRight.ENVIRONMENT_SAMPLE_IMPORT = Importar muestras ambientales +UserRight.ENVIRONMENT_SAMPLE_EXPORT = Exportar muestras ambientales # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Puede archivar casos @@ -1759,14 +1759,14 @@ UserRight.Desc.ENVIRONMENT_ARCHIVE = Puede archivar ambientes UserRight.Desc.ENVIRONMENT_DELETE = Puede eliminar ambientes del sistema UserRight.Desc.ENVIRONMENT_IMPORT = Puede importar ambientes UserRight.Desc.ENVIRONMENT_EXPORT = Puede exportar ambientes -UserRight.Desc.ENVIRONMENT_SAMPLE_VIEW = Able to view existing environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_CREATE = Able to create new environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT = Able to edit existing environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Able to edit environment samples dispatch information -UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Able to edit environment samples receival information -UserRight.Desc.ENVIRONMENT_SAMPLE_DELETE = Able to delete environment samples from the system -UserRight.Desc.ENVIRONMENT_SAMPLE_IMPORT = Able to import environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_EXPORT = Able to export environment samples +UserRight.Desc.ENVIRONMENT_SAMPLE_VIEW = Puede ver muestras ambientales existentes +UserRight.Desc.ENVIRONMENT_SAMPLE_CREATE = Puede crear nuevas muestras ambientales +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT = Puede editar muestras ambientales existentes +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Puede editar información de envío de muestras ambientales +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Puede editar información de recepción de muestras ambientales +UserRight.Desc.ENVIRONMENT_SAMPLE_DELETE = Puede eliminar muestras ambientales del sistema +UserRight.Desc.ENVIRONMENT_SAMPLE_IMPORT = Puede importar muestras ambientales +UserRight.Desc.ENVIRONMENT_SAMPLE_EXPORT = Puede exportar muestras ambientales # UserRightGroup UserRightGroup.GENERAL = General @@ -2217,28 +2217,28 @@ Pathogen.YERSINIA_SPP = Yersinia spp. Pathogen.SARS_COV_2 = SARS-CoV-2 Pathogen.ADENOVIRUS = Adenovirus Pathogen.ASTROVIRUS = Astrovirus -Pathogen.COXSACKIE_VIRUS = Coxsackie virus +Pathogen.COXSACKIE_VIRUS = Virus de Coxsackie Pathogen.ECHOVIRUS = Echovirus -Pathogen.HEPATITIS_A_VIRUS = Hepatitis A virus -Pathogen.HEPATITIS_E_VIRUS = Hepatitis E virus -Pathogen.HUMAN_CALICIVIRUS = Human calicivirus -Pathogen.POLIO_VIRUS = Polio virus 2 +Pathogen.HEPATITIS_A_VIRUS = Virus de hepatitis A +Pathogen.HEPATITIS_E_VIRUS = Virus de hepatitis E +Pathogen.HUMAN_CALICIVIRUS = Calicivirus humano +Pathogen.POLIO_VIRUS = Virus de la polio 2 Pathogen.REOVIRUS = Reovirus Pathogen.ROTAVIRUS = Rotavirus -Pathogen.TT_HEPATITIS = TT hepatitis -Pathogen.OTHER = Other +Pathogen.TT_HEPATITIS = Hepatitis TT +Pathogen.OTHER = Otro # EnvironmentSampleMaterial -EnvironmentSampleMaterial.WATER = Water -EnvironmentSampleMaterial.SOIL = Soil -EnvironmentSampleMaterial.AIR = Air -EnvironmentSampleMaterial.VECTORS = Vectors -EnvironmentSampleMaterial.OTHER = Other +EnvironmentSampleMaterial.WATER = Agua +EnvironmentSampleMaterial.SOIL = Suelo +EnvironmentSampleMaterial.AIR = Aire +EnvironmentSampleMaterial.VECTORS = Vectores +EnvironmentSampleMaterial.OTHER = Otro # WeatherCondition -WeatherCondition.SUNNY = Sunny -WeatherCondition.CLOUDY = Cloudy -WeatherCondition.RAINING = Raining -WeatherCondition.WINDY = Windy +WeatherCondition.SUNNY = Soleado +WeatherCondition.CLOUDY = Nublado +WeatherCondition.RAINING = Lluvioso +WeatherCondition.WINDY = Ventoso #Pathogen Customizable enum \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 16d9dcc2e47..674aa442f75 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -273,7 +273,7 @@ entityDistrict=Okres entityDistricts=Okresy entityDocuments=Dokumenty entityEnvironment = Environment -entityEnvironments = Environments +entityEnvironments = Prostředí entityEnvironmentSample = Environment sample entityEnvironmentSamples = Environment samples entityEvent=Událost @@ -417,7 +417,7 @@ errorNoRightsForChangingMultipleFields = Nemáte žádná práva pro změnu %s a errorNotFound = Požadovaný subjekt nebyl nalezen errorDeleteUserRoleUsedAlone = Nelze odstranit uživatelskou roli, protože následující uživatelé by zůstali bez uživatelské role\:

%s

Prosím, dejte jim jinou roli a zkuste to znovu smazat. errorSurveillanceReportNotEditable = Tato zpráva již není upravitelná -errorEnvironmentSampleNotEditable = This environment sample is not editable anymore +errorEnvironmentSampleNotEditable = Tento vzorek prostředí již není upravitelný errorEnvironmentSampleNoDispatchRight = You do not have the necessary user right to change the dispatch status of this environment sample errorEnvironmentSampleNoReceivalRight = You do not have the necessary user right to change the receival status of this environment sample # headings diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 455b77d17f6..4b41f7ad47f 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -38,7 +38,7 @@ fileName = Nombre de archivo forCase = para el caso forContact = para el contacto forEventParticipant = para participante de evento -forEnvironment = for environment +forEnvironment = para el ambiente inactive = Inactivo inColumn = en columna lastTwoDays = últimos dos días @@ -273,9 +273,9 @@ entityDistrict=Municipio entityDistricts=Municipios entityDocuments=Documentos entityEnvironment = Ambiente -entityEnvironments = Environments -entityEnvironmentSample = Environment sample -entityEnvironmentSamples = Environment samples +entityEnvironments = Ambientes +entityEnvironmentSample = Muestra ambiental +entityEnvironmentSamples = Muestras ambientales entityEvent=Evento entityEvents=Eventos entityEventGroup=Grupo de eventos @@ -417,9 +417,9 @@ errorNoRightsForChangingMultipleFields = No tiene permisos para cambiar %s y cam errorNotFound = No se encontró la entidad solicitada errorDeleteUserRoleUsedAlone = No se puede eliminar el rol de usuario, porque los siguientes usuarios quedarían sin un rol de usuario\:

%s

Por favor, asígneles un rol diferente y vuelva a intentar eliminar este. errorSurveillanceReportNotEditable = Este informe ya no es editable -errorEnvironmentSampleNotEditable = This environment sample is not editable anymore -errorEnvironmentSampleNoDispatchRight = You do not have the necessary user right to change the dispatch status of this environment sample -errorEnvironmentSampleNoReceivalRight = You do not have the necessary user right to change the receival status of this environment sample +errorEnvironmentSampleNotEditable = Esta muestra ambiental ya no es editable +errorEnvironmentSampleNoDispatchRight = No tiene el derecho de usuario necesario para cambiar el estado de envío de esta muestra ambiental +errorEnvironmentSampleNoReceivalRight = No tiene el derecho de usuario necesario para cambiar el estado de recepción de esta muestra ambiental # headings headingAccessDenied = Acceso denegado headingActivityAsCase = Actividad como caso @@ -812,7 +812,7 @@ immunizationRecoveryHeading = Recuperación headingAutomaticDeletionStarted = Eliminación automática iniciada headingBulkOperationProgress = Progreso de la operación masiva headingSomeContactsAlreadyInEvent = Algunos contactos ya están vinculados al evento seleccionado -headingEnvironmentJurisdictionUpdated = Environment location update +headingEnvironmentJurisdictionUpdated = Actualización de ubicación del ambiente # Info texts infoActivityAsCaseInvestigation = Por favor, documente TODAS las actividades relevantes después de la infección\: @@ -1398,8 +1398,8 @@ messageEnvironmentCreated = El ambiente fue creado messageEnvironmentSaved = El ambiente fue guardado messageEnvironmentArchived = El ambiente fue archivado messageEnvironmentDearchived = El ambiente fue desarchivado -messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted -messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageEnvironmentSampleOutsideJurisdictionDeletionDenied = La muestra ambiental fuera de la jurisdicción del usuario no puede ser eliminada +messageEnvironmentJurisdictionUpdated = Cambiar la ubicación de este ambiente puede hacerle perder el acceso a sus detalles o no permitirle editar en el futuro. ¿Está seguro de que desea continuar? # Notifications notificationCaseClassificationChanged = La clasificación del caso %s se cambió a %s. @@ -1426,7 +1426,7 @@ notificationTaskAssociatedCaseLink = Enlace al caso asociado\: %s notificationTaskAssociatedContactLink = Enlace al contacto asociado\: %s notificationTaskAssociatedEventLink = Enlace al evento asociado\: %s notificationTaskAssociatedTravelEntryLink = Enlace a la entrada de viaje asociada\: %s -notificationTaskAssociatedEnvironmentLink = Link to the associated environment entry\: %s +notificationTaskAssociatedEnvironmentLink = Enlace a la entrada de ambiente asociada\: %s notificationTaskGeneralUpdatedAssigneeUserSource = Su tarea %s ha sido asignada a otro usuario. Ya no está a cargo de esta tarea. notificationTaskGeneralUpdatedAssigneeUserTarget = Una tarea %s le ha sido asignada. notificationTaskSpecificUpdatedAssigneeUserSource = Su tarea %s para %s ha sido asignada a otro usuario. Ya no está a cargo de esta tarea. diff --git a/sormas-api/src/main/resources/validations_es-CU.properties b/sormas-api/src/main/resources/validations_es-CU.properties index 86fe21d30ea..e136c054ed1 100644 --- a/sormas-api/src/main/resources/validations_es-CU.properties +++ b/sormas-api/src/main/resources/validations_es-CU.properties @@ -132,7 +132,7 @@ validHealthConditions = Tiene que vincular condiciones de salud válidas validImmunization = Tiene que vincular una inmunización válida validReportingUser = Debe especificar un usuario válido de la base de datos SORMAS validDateOfArrival = Por favor especifique una fecha de llegada válida -validLaboratory = You have to specify a valid laboratory +validLaboratory = Debe especificar un laboratorio válido visitAfterFollowUp = La visita no puede ser más de %d días después del final de la duración del seguimiento. visitBeforeCaseReport=La visita no puede ser más de %d días antes de la fecha de informe del caso. visitBeforeContactReport=La visita no puede ser más de %d días antes de la fecha de informe del contacto. diff --git a/sormas-app/app/src/main/res/values-es-rCU/strings.xml b/sormas-app/app/src/main/res/values-es-rCU/strings.xml index aa3e62059c9..f74cf8c6941 100644 --- a/sormas-app/app/src/main/res/values-es-rCU/strings.xml +++ b/sormas-app/app/src/main/res/values-es-rCU/strings.xml @@ -54,7 +54,7 @@ Editar Editar caso Editar contacto - Edit Environment + Editar ambiente Editar evento Editar muestra ¿Olvidó el PIN? @@ -72,7 +72,7 @@ Nueva inmunización Nuevos datos de formulario de campaña Nuevo contacto - New Environment + Nuevo ambiente Nuevo evento Nueva muestra Nueva tarea @@ -166,8 +166,8 @@ Descartado Semana epi Informe - Environment Information - Environment Tasks + Información del ambiente + Tareas del ambiente Descripción Ubicación Fecha del evento @@ -278,7 +278,7 @@ ¿Está seguro de que desea extender la cuarentena? ¿Está seguro de que desea reducir la cuarentena? ¿También desea ampliar el período de seguimiento en consecuencia? - Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? + Cambiar la ubicación de este ambiente puede hacerle perder el acceso a sus detalles o no permitirle editar en el futuro. ¿Está seguro de que desea continuar? Semana epi Nombre Apellidos @@ -386,11 +386,11 @@ Leer muestra Resumen de la muestra Listado de muestras - Environment Listing - Edit Environment - New Environment - Read Environment - Environment location update + Listado de ambientes + Editar ambiente + Nuevo ambiente + Leer ambiente + Actualización de ubicación del ambiente Editar inmunización Nueva inmunización Leer inmunización From 0932a3f0d4e0951d283e4546e5cb14c88eeed645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 5 Sep 2023 10:22:09 +0200 Subject: [PATCH 068/144] #12501 - Add report date to environment sample --- .../EnvironmentSampleDto.java | 11 + .../app/backend/common/DatabaseHelper.java | 35 +- .../environmentsample/EnvironmentSample.java | 677 +++++++++--------- .../EnvironmentSampleDtoHelper.java | 181 ++--- .../environmentsample/EnvironmentSample.java | 11 + .../EnvironmentSampleFacadeEjb.java | 2 + .../src/main/resources/sql/sormas_schema.sql | 8 + .../EnvironmentSampleFacadeEjbTest.java | 3 + 8 files changed, 493 insertions(+), 435 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java index 2f5bfa9b789..68feb319912 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java @@ -51,6 +51,8 @@ public class EnvironmentSampleDto extends PseudonymizableDto { @NotNull private EnvironmentReferenceDto environment; @NotNull + private Date reportDate; + @NotNull private UserReferenceDto reportingUser; @NotNull private Date sampleDateTime; @@ -108,6 +110,7 @@ public static EnvironmentSampleDto build(EnvironmentReferenceDto environment, Us sample.setUuid(DataHelper.createUuid()); sample.setEnvironment(environment); + sample.setReportDate(new Date()); sample.setReportingUser(reportingUser); sample.setSampleDateTime(new Date()); sample.setLocation(LocationDto.build()); @@ -123,6 +126,14 @@ public void setEnvironment(EnvironmentReferenceDto environment) { this.environment = environment; } + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } + public UserReferenceDto getReportingUser() { return reportingUser; } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java index 75db112160d..a60ea564dfd 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java @@ -190,7 +190,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public static final String DATABASE_NAME = "sormas.db"; // any time you make changes to your database objects, you may have to increase the database version - public static final int DATABASE_VERSION = 351; + public static final int DATABASE_VERSION = 352; private static DatabaseHelper instance = null; @@ -3115,20 +3115,24 @@ public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int case 349: currentVersion = 349; getDao(Task.class).executeRaw("ALTER TABLE tasks ADD COLUMN environment_id BIGINT REFERENCES environment(id);"); - case 350: - currentVersion = 350; - getDao(EnvironmentSample.class).executeRaw( - "CREATE TABLE environmentSamples(id integer primary key autoincrement, uuid VARCHAR(36) NOT NULL, changeDate TIMESTAMP NOT NULL, " - + "creationDate TIMESTAMP NOT NULL, lastOpenedDate TIMESTAMP, localChangeDate TIMESTAMP NOT NULL, modified INTEGER, snapshot INTEGER, " - + "environment_id BIGINT NOT NULL, reportingUser_id BIGINT NOT NULL, sampleDateTime TIMESTAMP NOT NULL, sampleMaterial varchar(255) NOT NULL, otherSampleMaterial text, " - + "sampleVolume float, fieldSampleId varchar(255), turbidity int, phValue int, sampleTemperature int, chlorineResiduals float, " - + "laboratory_id BIGINT, laboratoryDetails text, requestedPathogenTests text, otherRequestedPathogenTests text, " - + "weatherConditions text, heavyRain varchar(255), dispatched boolean, dispatchDate TIMESTAMP, dispatchDetails text, " - + "received boolean, receivalDate TIMESTAMP, labSampleId text, specimenCondition varchar(255), location_id BIGINT NOT NULL, generalComment text, " - + "pseudonymized boolean, " - + "UNIQUE(snapshot, uuid));"); - - // ATTENTION: break should only be done after last version + + case 350: + currentVersion = 350; + getDao(EnvironmentSample.class).executeRaw( + "CREATE TABLE environmentSamples(id integer primary key autoincrement, uuid VARCHAR(36) NOT NULL, changeDate TIMESTAMP NOT NULL, " + + "creationDate TIMESTAMP NOT NULL, lastOpenedDate TIMESTAMP, localChangeDate TIMESTAMP NOT NULL, modified INTEGER, snapshot INTEGER, " + + "environment_id BIGINT NOT NULL, reportingUser_id BIGINT NOT NULL, sampleDateTime TIMESTAMP NOT NULL, sampleMaterial varchar(255) NOT NULL, otherSampleMaterial text, " + + "sampleVolume float, fieldSampleId varchar(255), turbidity int, phValue int, sampleTemperature int, chlorineResiduals float, " + + "laboratory_id BIGINT, laboratoryDetails text, requestedPathogenTests text, otherRequestedPathogenTests text, " + + "weatherConditions text, heavyRain varchar(255), dispatched boolean, dispatchDate TIMESTAMP, dispatchDetails text, " + + "received boolean, receivalDate TIMESTAMP, labSampleId text, specimenCondition varchar(255), location_id BIGINT NOT NULL, generalComment text, " + + "pseudonymized boolean, " + "UNIQUE(snapshot, uuid));"); + + case 351: + currentVersion = 351; + getDao(EnvironmentSample.class).executeRaw("ALTER TABLE environmentSamples ADD COLUMN reportDate TIMESTAMP;"); + + // ATTENTION: break should only be done after last version break; default: @@ -4342,7 +4346,6 @@ public static EnvironmentDao getEnvironmentDao() { return (EnvironmentDao) getAdoDao(Environment.class); } - public static EnvironmentSampleDao getEnvironmentSampleDao() { return (EnvironmentSampleDao) getAdoDao(EnvironmentSample.class); } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java index 565e5b557d4..0c77eb1aaed 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java @@ -2,13 +2,6 @@ import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_TEXT; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.j256.ormlite.field.DataType; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; - import java.lang.reflect.Type; import java.util.Date; import java.util.HashMap; @@ -23,6 +16,13 @@ import javax.persistence.EnumType; import javax.persistence.Enumerated; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + import de.symeda.sormas.api.customizableenum.CustomizableEnum; import de.symeda.sormas.api.customizableenum.CustomizableEnumType; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleMaterial; @@ -42,331 +42,348 @@ @Entity(name = EnvironmentSample.TABLE_NAME) @DatabaseTable(tableName = EnvironmentSample.TABLE_NAME) public class EnvironmentSample extends PseudonymizableAdo { - public static final String I18N_PREFIX = "EnvironmentSample"; - - public static final String TABLE_NAME = "environmentSamples"; - - public static final String REQUESTED_PATHOGEN_TESTS = "requestedPathogenTests"; - public static final String WEATHER_CONDITIONS = "weatherConditions"; - public static final String LOCATION = "location"; - - @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "environment_id") - private Environment environment; - @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "reportingUser_id") - private User reportingUser; - @DatabaseField(dataType = DataType.DATE_LONG) - private Date sampleDateTime; - @Enumerated(EnumType.STRING) - private EnvironmentSampleMaterial sampleMaterial; - @Column(length = CHARACTER_LIMIT_TEXT) - private String otherSampleMaterial; - @Column - private Float sampleVolume; - @Column(length = CHARACTER_LIMIT_TEXT) - private String fieldSampleId; - @Column - private Integer turbidity; - @Column - private Integer phValue; - @Column - private Integer sampleTemperature; - @Column - private Float chlorineResiduals; - @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "laboratory_id") - private Facility laboratory; - @Column(length = CHARACTER_LIMIT_TEXT) - private String laboratoryDetails; - @Column(name = "requestedPathogenTests", length = CHARACTER_LIMIT_TEXT) - private String requestedPathogenTestsJson; - private Set requestedPathogenTests; - @Column(length = CHARACTER_LIMIT_TEXT) - private String otherRequestedPathogenTests; - @Column(name = "weatherConditions", length = CHARACTER_LIMIT_TEXT) - private String weatherConditionsJson; - private Map weatherConditions; - @Enumerated - private YesNoUnknown heavyRain; - @Column - private boolean dispatched; - @DatabaseField(dataType = DataType.DATE_LONG) - private Date dispatchDate; - @Column(length = CHARACTER_LIMIT_TEXT) - private String dispatchDetails; - @Column - private boolean received; - @DatabaseField(dataType = DataType.DATE_LONG) - private Date receivalDate; - @Column(length = CHARACTER_LIMIT_TEXT) - private String labSampleId; - @Enumerated - private SpecimenCondition specimenCondition; - @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "location_id") - private Location location; - @Column(length = CHARACTER_LIMIT_TEXT) - private String generalComment; - - public Environment getEnvironment() { - return environment; - } - - public void setEnvironment(Environment environment) { - this.environment = environment; - } - - public User getReportingUser() { - return reportingUser; - } - - public void setReportingUser(User reportingUser) { - this.reportingUser = reportingUser; - } - - public Date getSampleDateTime() { - return sampleDateTime; - } - - public void setSampleDateTime(Date sampleDateTime) { - this.sampleDateTime = sampleDateTime; - } - - public EnvironmentSampleMaterial getSampleMaterial() { - return sampleMaterial; - } - - public void setSampleMaterial(EnvironmentSampleMaterial sampleMaterial) { - this.sampleMaterial = sampleMaterial; - } - - public String getOtherSampleMaterial() { - return otherSampleMaterial; - } - - public void setOtherSampleMaterial(String otherSampleMaterial) { - this.otherSampleMaterial = otherSampleMaterial; - } - - public Float getSampleVolume() { - return sampleVolume; - } - - public void setSampleVolume(Float sampleVolume) { - this.sampleVolume = sampleVolume; - } - - public String getFieldSampleId() { - return fieldSampleId; - } - - public void setFieldSampleId(String fieldSampleId) { - this.fieldSampleId = fieldSampleId; - } - - public Integer getTurbidity() { - return turbidity; - } - - public void setTurbidity(Integer turbidity) { - this.turbidity = turbidity; - } - - public Integer getPhValue() { - return phValue; - } - - public void setPhValue(Integer phValue) { - this.phValue = phValue; - } - - public Integer getSampleTemperature() { - return sampleTemperature; - } - - public void setSampleTemperature(Integer sampleTemperature) { - this.sampleTemperature = sampleTemperature; - } - - public Float getChlorineResiduals() { - return chlorineResiduals; - } - - public void setChlorineResiduals(Float chlorineResiduals) { - this.chlorineResiduals = chlorineResiduals; - } - - public Facility getLaboratory() { - return laboratory; - } - - public void setLaboratory(Facility laboratory) { - this.laboratory = laboratory; - } - - public String getLaboratoryDetails() { - return laboratoryDetails; - } - - public void setLaboratoryDetails(String laboratoryDetails) { - this.laboratoryDetails = laboratoryDetails; - } - - public String getRequestedPathogenTestsJson() { - return requestedPathogenTestsJson; - } - - public void setRequestedPathogenTestsJson(String requestedPathogenTestsJson) { - this.requestedPathogenTestsJson = requestedPathogenTestsJson; - } - - public Set getRequestedPathogenTests() { - if (requestedPathogenTests == null) { - Gson gson = new Gson(); - Type type = new TypeToken>() { - }.getType(); - List list = gson.fromJson(requestedPathogenTestsJson, type); - CustomizableEnumValueDao customizableEnumValueDao = DatabaseHelper.getCustomizableEnumValueDao(); - - requestedPathogenTests = list != null ? list.stream().map(p -> customizableEnumValueDao.getEnumValue(CustomizableEnumType.PATHOGEN, p)).collect(Collectors.toSet()) : new HashSet<>(); - } - - return requestedPathogenTests; - } - - public void setRequestedPathogenTests(Set requestedPathogenTests) { - this.requestedPathogenTests = requestedPathogenTests; - Gson gson = new Gson(); - Type type = new TypeToken>() { - }.getType(); - - requestedPathogenTestsJson = gson.toJson(requestedPathogenTests.stream().map(CustomizableEnum::getValue).collect(Collectors.toSet()), type); - } - - public String getOtherRequestedPathogenTests() { - return otherRequestedPathogenTests; - } - - public void setOtherRequestedPathogenTests(String otherRequestedPathogenTests) { - this.otherRequestedPathogenTests = otherRequestedPathogenTests; - } - - public String getWeatherConditionsJson() { - return weatherConditionsJson; - } - public void setWeatherConditionsJson(String weatherConditionsJson) { - this.weatherConditionsJson = weatherConditionsJson; - } + public static final String I18N_PREFIX = "EnvironmentSample"; + + public static final String TABLE_NAME = "environmentSamples"; + + public static final String REQUESTED_PATHOGEN_TESTS = "requestedPathogenTests"; + public static final String WEATHER_CONDITIONS = "weatherConditions"; + public static final String LOCATION = "location"; + + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "environment_id") + private Environment environment; + @DatabaseField(dataType = DataType.DATE_LONG) + private Date reportDate; + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "reportingUser_id") + private User reportingUser; + @DatabaseField(dataType = DataType.DATE_LONG) + private Date sampleDateTime; + @Enumerated(EnumType.STRING) + private EnvironmentSampleMaterial sampleMaterial; + @Column(length = CHARACTER_LIMIT_TEXT) + private String otherSampleMaterial; + @Column + private Float sampleVolume; + @Column(length = CHARACTER_LIMIT_TEXT) + private String fieldSampleId; + @Column + private Integer turbidity; + @Column + private Integer phValue; + @Column + private Integer sampleTemperature; + @Column + private Float chlorineResiduals; + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "laboratory_id") + private Facility laboratory; + @Column(length = CHARACTER_LIMIT_TEXT) + private String laboratoryDetails; + @Column(name = "requestedPathogenTests", length = CHARACTER_LIMIT_TEXT) + private String requestedPathogenTestsJson; + private Set requestedPathogenTests; + @Column(length = CHARACTER_LIMIT_TEXT) + private String otherRequestedPathogenTests; + @Column(name = "weatherConditions", length = CHARACTER_LIMIT_TEXT) + private String weatherConditionsJson; + private Map weatherConditions; + @Enumerated + private YesNoUnknown heavyRain; + @Column + private boolean dispatched; + @DatabaseField(dataType = DataType.DATE_LONG) + private Date dispatchDate; + @Column(length = CHARACTER_LIMIT_TEXT) + private String dispatchDetails; + @Column + private boolean received; + @DatabaseField(dataType = DataType.DATE_LONG) + private Date receivalDate; + @Column(length = CHARACTER_LIMIT_TEXT) + private String labSampleId; + @Enumerated + private SpecimenCondition specimenCondition; + @DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "location_id") + private Location location; + @Column(length = CHARACTER_LIMIT_TEXT) + private String generalComment; + + public Environment getEnvironment() { + return environment; + } + + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } + + public User getReportingUser() { + return reportingUser; + } + + public void setReportingUser(User reportingUser) { + this.reportingUser = reportingUser; + } + + public Date getSampleDateTime() { + return sampleDateTime; + } + + public void setSampleDateTime(Date sampleDateTime) { + this.sampleDateTime = sampleDateTime; + } + + public EnvironmentSampleMaterial getSampleMaterial() { + return sampleMaterial; + } + + public void setSampleMaterial(EnvironmentSampleMaterial sampleMaterial) { + this.sampleMaterial = sampleMaterial; + } + + public String getOtherSampleMaterial() { + return otherSampleMaterial; + } + + public void setOtherSampleMaterial(String otherSampleMaterial) { + this.otherSampleMaterial = otherSampleMaterial; + } + + public Float getSampleVolume() { + return sampleVolume; + } + + public void setSampleVolume(Float sampleVolume) { + this.sampleVolume = sampleVolume; + } + + public String getFieldSampleId() { + return fieldSampleId; + } + + public void setFieldSampleId(String fieldSampleId) { + this.fieldSampleId = fieldSampleId; + } + + public Integer getTurbidity() { + return turbidity; + } + + public void setTurbidity(Integer turbidity) { + this.turbidity = turbidity; + } + + public Integer getPhValue() { + return phValue; + } + + public void setPhValue(Integer phValue) { + this.phValue = phValue; + } + + public Integer getSampleTemperature() { + return sampleTemperature; + } + + public void setSampleTemperature(Integer sampleTemperature) { + this.sampleTemperature = sampleTemperature; + } + + public Float getChlorineResiduals() { + return chlorineResiduals; + } + + public void setChlorineResiduals(Float chlorineResiduals) { + this.chlorineResiduals = chlorineResiduals; + } + + public Facility getLaboratory() { + return laboratory; + } + + public void setLaboratory(Facility laboratory) { + this.laboratory = laboratory; + } + + public String getLaboratoryDetails() { + return laboratoryDetails; + } + + public void setLaboratoryDetails(String laboratoryDetails) { + this.laboratoryDetails = laboratoryDetails; + } + + public String getRequestedPathogenTestsJson() { + return requestedPathogenTestsJson; + } + + public void setRequestedPathogenTestsJson(String requestedPathogenTestsJson) { + this.requestedPathogenTestsJson = requestedPathogenTestsJson; + } + + public Set getRequestedPathogenTests() { + if (requestedPathogenTests == null) { + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + List list = gson.fromJson(requestedPathogenTestsJson, type); + CustomizableEnumValueDao customizableEnumValueDao = DatabaseHelper.getCustomizableEnumValueDao(); + + requestedPathogenTests = list != null + ? list.stream() + .map(p -> customizableEnumValueDao. getEnumValue(CustomizableEnumType.PATHOGEN, p)) + .collect(Collectors.toSet()) + : new HashSet<>(); + } + + return requestedPathogenTests; + } + + public void setRequestedPathogenTests(Set requestedPathogenTests) { + this.requestedPathogenTests = requestedPathogenTests; + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + + requestedPathogenTestsJson = gson.toJson(requestedPathogenTests.stream().map(CustomizableEnum::getValue).collect(Collectors.toSet()), type); + } + + public String getOtherRequestedPathogenTests() { + return otherRequestedPathogenTests; + } + + public void setOtherRequestedPathogenTests(String otherRequestedPathogenTests) { + this.otherRequestedPathogenTests = otherRequestedPathogenTests; + } + + public String getWeatherConditionsJson() { + return weatherConditionsJson; + } + + public void setWeatherConditionsJson(String weatherConditionsJson) { + this.weatherConditionsJson = weatherConditionsJson; + } + + public Map getWeatherConditions() { + if (weatherConditions == null) { + Gson gson = getGsonForWeatherConditions(); + Type type = new TypeToken>() { + }.getType(); + + weatherConditions = gson.fromJson(weatherConditionsJson, type); + if (weatherConditions == null) { + weatherConditions = new HashMap<>(); + } + } + + return weatherConditions; + } + + public void setWeatherConditions(Map weatherConditions) { + this.weatherConditions = weatherConditions; + Gson gson = getGsonForWeatherConditions(); + Type type = new TypeToken>() { + }.getType(); + + weatherConditionsJson = gson.toJson(weatherConditions, type); + + } + + public YesNoUnknown getHeavyRain() { + return heavyRain; + } + + public void setHeavyRain(YesNoUnknown heavyRain) { + this.heavyRain = heavyRain; + } + + public boolean isDispatched() { + return dispatched; + } + + public void setDispatched(boolean dispatched) { + this.dispatched = dispatched; + } + + public Date getDispatchDate() { + return dispatchDate; + } + + public void setDispatchDate(Date dispatchDate) { + this.dispatchDate = dispatchDate; + } + + public String getDispatchDetails() { + return dispatchDetails; + } + + public void setDispatchDetails(String dispatchDetails) { + this.dispatchDetails = dispatchDetails; + } + + public boolean isReceived() { + return received; + } + + public void setReceived(boolean received) { + this.received = received; + } + + public Date getReceivalDate() { + return receivalDate; + } + + public void setReceivalDate(Date receivalDate) { + this.receivalDate = receivalDate; + } + + public String getLabSampleId() { + return labSampleId; + } + + public void setLabSampleId(String labSampleId) { + this.labSampleId = labSampleId; + } + public SpecimenCondition getSpecimenCondition() { + return specimenCondition; + } + + public void setSpecimenCondition(SpecimenCondition specimenCondition) { + this.specimenCondition = specimenCondition; + } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + + public String getGeneralComment() { + return generalComment; + } + + public void setGeneralComment(String generalComment) { + this.generalComment = generalComment; + } - public Map getWeatherConditions() { - if (weatherConditions == null) { - Gson gson = getGsonForWeatherConditions(); - Type type = new TypeToken>() { - }.getType(); + @Override + public String getI18nPrefix() { + return I18N_PREFIX; + } - weatherConditions = gson.fromJson(weatherConditionsJson, type); - if (weatherConditions == null) { - weatherConditions = new HashMap<>(); - } - } - - return weatherConditions; - } - - public void setWeatherConditions(Map weatherConditions) { - this.weatherConditions = weatherConditions; - Gson gson = getGsonForWeatherConditions(); - Type type = new TypeToken>() { - }.getType(); - - weatherConditionsJson = gson.toJson(weatherConditions, type); - - } - - public YesNoUnknown getHeavyRain() { - return heavyRain; - } - - public void setHeavyRain(YesNoUnknown heavyRain) { - this.heavyRain = heavyRain; - } - - public boolean isDispatched() { - return dispatched; - } - - public void setDispatched(boolean dispatched) { - this.dispatched = dispatched; - } - - public Date getDispatchDate() { - return dispatchDate; - } - - public void setDispatchDate(Date dispatchDate) { - this.dispatchDate = dispatchDate; - } - - public String getDispatchDetails() { - return dispatchDetails; - } - - public void setDispatchDetails(String dispatchDetails) { - this.dispatchDetails = dispatchDetails; - } - - public boolean isReceived() { - return received; - } - - public void setReceived(boolean received) { - this.received = received; - } - - public Date getReceivalDate() { - return receivalDate; - } - - public void setReceivalDate(Date receivalDate) { - this.receivalDate = receivalDate; - } - - public String getLabSampleId() { - return labSampleId; - } - - public void setLabSampleId(String labSampleId) { - this.labSampleId = labSampleId; - } - - public SpecimenCondition getSpecimenCondition() { - return specimenCondition; - } - - public void setSpecimenCondition(SpecimenCondition specimenCondition) { - this.specimenCondition = specimenCondition; - } - - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } - - public String getGeneralComment() { - return generalComment; - } - - public void setGeneralComment(String generalComment) { - this.generalComment = generalComment; - } - - @Override - public String getI18nPrefix() { - return I18N_PREFIX; - } - private static Gson getGsonForWeatherConditions() { - return new GsonBuilder().enableComplexMapKeySerialization().registerTypeAdapter(WeatherCondition.class, new EnumMapKeySerializer<>(WeatherCondition.class)).create(); - } + private static Gson getGsonForWeatherConditions() { + return new GsonBuilder().enableComplexMapKeySerialization() + .registerTypeAdapter(WeatherCondition.class, new EnumMapKeySerializer<>(WeatherCondition.class)) + .create(); + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java index 20a6080a6f0..7ea1e0a79b5 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java @@ -16,102 +16,105 @@ import retrofit2.Call; public class EnvironmentSampleDtoHelper extends AdoDtoHelper { - private EnvironmentDtoHelper environmentHelper; - private LocationDtoHelper locationHelper; - public EnvironmentSampleDtoHelper() { - environmentHelper = new EnvironmentDtoHelper(); - locationHelper = new LocationDtoHelper(); - } + private EnvironmentDtoHelper environmentHelper; + private LocationDtoHelper locationHelper; - @Override - protected Class getAdoClass() { - return EnvironmentSample.class; - } + public EnvironmentSampleDtoHelper() { + environmentHelper = new EnvironmentDtoHelper(); + locationHelper = new LocationDtoHelper(); + } - @Override - protected Class getDtoClass() { - return EnvironmentSampleDto.class; - } + @Override + protected Class getAdoClass() { + return EnvironmentSample.class; + } - @Override - protected Call> pullAllSince(long since, Integer size, String lastSynchronizedUuid) throws NoConnectionException { - return RetroProvider.getEnvironmentSampleFacade().pullAllSince(since, size, lastSynchronizedUuid); - } + @Override + protected Class getDtoClass() { + return EnvironmentSampleDto.class; + } - @Override - protected Call> pullByUuids(List uuids) throws NoConnectionException { - return RetroProvider.getEnvironmentSampleFacade().pullByUuids(uuids); - } + @Override + protected Call> pullAllSince(long since, Integer size, String lastSynchronizedUuid) throws NoConnectionException { + return RetroProvider.getEnvironmentSampleFacade().pullAllSince(since, size, lastSynchronizedUuid); + } - @Override - protected Call> pushAll(List environmentSampleDtos) throws NoConnectionException { - return RetroProvider.getEnvironmentSampleFacade().pushAll(environmentSampleDtos); - } + @Override + protected Call> pullByUuids(List uuids) throws NoConnectionException { + return RetroProvider.getEnvironmentSampleFacade().pullByUuids(uuids); + } - @Override - protected void fillInnerFromDto(EnvironmentSample target, EnvironmentSampleDto source) { - target.setEnvironment(DatabaseHelper.getEnvironmentDao().getByReferenceDto(source.getEnvironment())); - target.setReportingUser(DatabaseHelper.getUserDao().getByReferenceDto(source.getReportingUser())); - target.setSampleDateTime(source.getSampleDateTime()); - target.setSampleMaterial(source.getSampleMaterial()); - target.setOtherSampleMaterial(source.getOtherSampleMaterial()); - target.setSampleVolume(source.getSampleVolume()); - target.setFieldSampleId(source.getFieldSampleId()); - target.setTurbidity(source.getTurbidity()); - target.setPhValue(source.getPhValue()); - target.setSampleTemperature(source.getSampleTemperature()); - target.setChlorineResiduals(source.getChlorineResiduals()); - target.setLaboratory(DatabaseHelper.getFacilityDao().getByReferenceDto(source.getLaboratory())); - target.setLaboratoryDetails(source.getLaboratoryDetails()); - target.setRequestedPathogenTests(source.getRequestedPathogenTests()); - target.setOtherRequestedPathogenTests(source.getOtherRequestedPathogenTests()); - target.setWeatherConditions(source.getWeatherConditions()); - target.setHeavyRain(source.getHeavyRain()); - target.setDispatched(source.isDispatched()); - target.setDispatchDate(source.getDispatchDate()); - target.setDispatchDetails(source.getDispatchDetails()); - target.setReceived(source.isReceived()); - target.setReceivalDate(source.getReceivalDate()); - target.setLabSampleId(source.getLabSampleId()); - target.setSpecimenCondition(source.getSpecimenCondition()); - target.setLocation(locationHelper.fillOrCreateFromDto(target.getLocation(), source.getLocation())); - target.setGeneralComment(source.getGeneralComment()); - } + @Override + protected Call> pushAll(List environmentSampleDtos) throws NoConnectionException { + return RetroProvider.getEnvironmentSampleFacade().pushAll(environmentSampleDtos); + } - @Override - protected void fillInnerFromAdo(EnvironmentSampleDto target, EnvironmentSample source) { - target.setEnvironment(EnvironmentDtoHelper.toReferenceDto(DatabaseHelper.getEnvironmentDao().queryForId(source.getEnvironment().getId()))); - target.setReportingUser(UserDtoHelper.toReferenceDto(DatabaseHelper.getUserDao().queryForId(source.getReportingUser().getId()))); - target.setSampleDateTime(source.getSampleDateTime()); - target.setSampleMaterial(source.getSampleMaterial()); - target.setOtherSampleMaterial(source.getOtherSampleMaterial()); - target.setSampleVolume(source.getSampleVolume()); - target.setFieldSampleId(source.getFieldSampleId()); - target.setTurbidity(source.getTurbidity()); - target.setPhValue(source.getPhValue()); - target.setSampleTemperature(source.getSampleTemperature()); - target.setChlorineResiduals(source.getChlorineResiduals()); - Facility lab = DatabaseHelper.getFacilityDao().queryForId(source.getId()); - target.setLaboratory(lab != null ? FacilityDtoHelper.toReferenceDto(lab) : null); - target.setLaboratoryDetails(source.getLaboratoryDetails()); - target.setRequestedPathogenTests(source.getRequestedPathogenTests()); - target.setOtherRequestedPathogenTests(source.getOtherRequestedPathogenTests()); - target.setWeatherConditions(source.getWeatherConditions()); - target.setHeavyRain(source.getHeavyRain()); - target.setDispatched(source.isDispatched()); - target.setDispatchDate(source.getDispatchDate()); - target.setDispatchDetails(source.getDispatchDetails()); - target.setReceived(source.isReceived()); - target.setReceivalDate(source.getReceivalDate()); - target.setLabSampleId(source.getLabSampleId()); - target.setSpecimenCondition(source.getSpecimenCondition()); - target.setLocation(locationHelper.adoToDto(DatabaseHelper.getLocationDao().queryForId(source.getLocation().getId()))); - target.setGeneralComment(source.getGeneralComment()); - } + @Override + protected void fillInnerFromDto(EnvironmentSample target, EnvironmentSampleDto source) { + target.setEnvironment(DatabaseHelper.getEnvironmentDao().getByReferenceDto(source.getEnvironment())); + target.setReportDate(source.getReportDate()); + target.setReportingUser(DatabaseHelper.getUserDao().getByReferenceDto(source.getReportingUser())); + target.setSampleDateTime(source.getSampleDateTime()); + target.setSampleMaterial(source.getSampleMaterial()); + target.setOtherSampleMaterial(source.getOtherSampleMaterial()); + target.setSampleVolume(source.getSampleVolume()); + target.setFieldSampleId(source.getFieldSampleId()); + target.setTurbidity(source.getTurbidity()); + target.setPhValue(source.getPhValue()); + target.setSampleTemperature(source.getSampleTemperature()); + target.setChlorineResiduals(source.getChlorineResiduals()); + target.setLaboratory(DatabaseHelper.getFacilityDao().getByReferenceDto(source.getLaboratory())); + target.setLaboratoryDetails(source.getLaboratoryDetails()); + target.setRequestedPathogenTests(source.getRequestedPathogenTests()); + target.setOtherRequestedPathogenTests(source.getOtherRequestedPathogenTests()); + target.setWeatherConditions(source.getWeatherConditions()); + target.setHeavyRain(source.getHeavyRain()); + target.setDispatched(source.isDispatched()); + target.setDispatchDate(source.getDispatchDate()); + target.setDispatchDetails(source.getDispatchDetails()); + target.setReceived(source.isReceived()); + target.setReceivalDate(source.getReceivalDate()); + target.setLabSampleId(source.getLabSampleId()); + target.setSpecimenCondition(source.getSpecimenCondition()); + target.setLocation(locationHelper.fillOrCreateFromDto(target.getLocation(), source.getLocation())); + target.setGeneralComment(source.getGeneralComment()); + } - @Override - protected long getApproximateJsonSizeInBytes() { - return EnvironmentSampleDto.APPROXIMATE_JSON_SIZE_IN_BYTES; - } + @Override + protected void fillInnerFromAdo(EnvironmentSampleDto target, EnvironmentSample source) { + target.setEnvironment(EnvironmentDtoHelper.toReferenceDto(DatabaseHelper.getEnvironmentDao().queryForId(source.getEnvironment().getId()))); + target.setReportDate(source.getReportDate()); + target.setReportingUser(UserDtoHelper.toReferenceDto(DatabaseHelper.getUserDao().queryForId(source.getReportingUser().getId()))); + target.setSampleDateTime(source.getSampleDateTime()); + target.setSampleMaterial(source.getSampleMaterial()); + target.setOtherSampleMaterial(source.getOtherSampleMaterial()); + target.setSampleVolume(source.getSampleVolume()); + target.setFieldSampleId(source.getFieldSampleId()); + target.setTurbidity(source.getTurbidity()); + target.setPhValue(source.getPhValue()); + target.setSampleTemperature(source.getSampleTemperature()); + target.setChlorineResiduals(source.getChlorineResiduals()); + Facility lab = DatabaseHelper.getFacilityDao().queryForId(source.getId()); + target.setLaboratory(lab != null ? FacilityDtoHelper.toReferenceDto(lab) : null); + target.setLaboratoryDetails(source.getLaboratoryDetails()); + target.setRequestedPathogenTests(source.getRequestedPathogenTests()); + target.setOtherRequestedPathogenTests(source.getOtherRequestedPathogenTests()); + target.setWeatherConditions(source.getWeatherConditions()); + target.setHeavyRain(source.getHeavyRain()); + target.setDispatched(source.isDispatched()); + target.setDispatchDate(source.getDispatchDate()); + target.setDispatchDetails(source.getDispatchDetails()); + target.setReceived(source.isReceived()); + target.setReceivalDate(source.getReceivalDate()); + target.setLabSampleId(source.getLabSampleId()); + target.setSpecimenCondition(source.getSpecimenCondition()); + target.setLocation(locationHelper.adoToDto(DatabaseHelper.getLocationDao().queryForId(source.getLocation().getId()))); + target.setGeneralComment(source.getGeneralComment()); + } + + @Override + protected long getApproximateJsonSizeInBytes() { + return EnvironmentSampleDto.APPROXIMATE_JSON_SIZE_IN_BYTES; + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java index 6fbac39daf0..c5338290878 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java @@ -57,6 +57,7 @@ public class EnvironmentSample extends DeletableAdo { private static final long serialVersionUID = 7237701234186874155L; private Environment environment; + private Date reportDate; private User reportingUser; private Date sampleDateTime; private EnvironmentSampleMaterial sampleMaterial; @@ -92,6 +93,16 @@ public void setEnvironment(Environment environment) { this.environment = environment; } + @Temporal(TemporalType.TIMESTAMP) + @Column(nullable = false) + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } + @ManyToOne(fetch = FetchType.LAZY, optional = false) public User getReportingUser() { return reportingUser; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java index 824fa2b5b28..c42518a29d2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java @@ -253,6 +253,7 @@ protected EnvironmentSample fillOrBuildEntity(EnvironmentSampleDto source, Envir } target.setEnvironment(environmentService.getByReferenceDto(source.getEnvironment())); + target.setReportDate(source.getReportDate()); target.setReportingUser(userService.getByReferenceDto(source.getReportingUser())); target.setSampleDateTime(source.getSampleDateTime()); target.setSampleMaterial(source.getSampleMaterial()); @@ -291,6 +292,7 @@ protected EnvironmentSampleDto toDto(EnvironmentSample source) { DtoHelper.fillDto(target, source); target.setEnvironment(EnvironmentFacadeEjb.toReferenceDto(source.getEnvironment())); + target.setReportDate(source.getReportDate()); target.setReportingUser(UserFacadeEjb.toReferenceDto(source.getReportingUser())); target.setSampleDateTime(source.getSampleDateTime()); target.setSampleMaterial(source.getSampleMaterial()); diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 03debe0332a..fa078577eb7 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12699,4 +12699,12 @@ ALTER TABLE environmentsamples_history ADD COLUMN requestedpathogentests text; INSERT INTO schema_version (version_number, comment) VALUES (524, 'Change requested pathogen tests column type #11721'); +-- 2023-09-05 Add report date to environment samples #12501 +ALTER TABLE environmentsamples ADD COLUMN reportdate timestamp not null; +ALTER TABLE environmentsamples_history ADD COLUMN reportdate timestamp; +-- Fill report date to avoid not null issues +UPDATE environmentsamples SET reportdate = now(); + +INSERT INTO schema_version (version_number, comment) VALUES (525, 'Add report date to environment samples #12501'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** \ No newline at end of file diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java index f398524834c..7015251fde7 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java @@ -99,6 +99,7 @@ public void testSave() { // returned dto should match the one we sent assertThat(createdDto.getUuid(), is(dto.getUuid())); assertThat(createdDto.getEnvironment(), is(dto.getEnvironment())); + assertThat(createdDto.getReportDate(), is(dto.getReportDate())); assertThat(createdDto.getReportingUser(), is(dto.getReportingUser())); assertThat(createdDto.getSampleDateTime(), is(dto.getSampleDateTime())); assertThat(createdDto.getSampleMaterial(), is(dto.getSampleMaterial())); @@ -120,6 +121,7 @@ public void testSave() { // saved entity should match the dto we sent assertThat(entity.getUuid(), is(dto.getUuid())); assertThat(entity.getEnvironment().getUuid(), is(dto.getEnvironment().getUuid())); + assertThat(entity.getReportDate().getTime(), is(dto.getReportDate().getTime())); assertThat(entity.getReportingUser().getUuid(), is(dto.getReportingUser().getUuid())); assertThat(entity.getSampleDateTime().getTime(), is(dto.getSampleDateTime().getTime())); assertThat(entity.getSampleMaterial(), is(dto.getSampleMaterial())); @@ -168,6 +170,7 @@ public void testGetByUuid() { assertThat(returnedDto.getUuid(), is(returnedDto.getUuid())); assertThat(returnedDto.getEnvironment(), is(returnedDto.getEnvironment())); + assertThat(returnedDto.getReportDate(), is(returnedDto.getReportDate())); assertThat(returnedDto.getReportingUser(), is(returnedDto.getReportingUser())); assertThat(returnedDto.getSampleDateTime(), is(returnedDto.getSampleDateTime())); assertThat(returnedDto.getSampleMaterial(), is(returnedDto.getSampleMaterial())); From b4625ae064031a69ccbb7da9a42db355a46a069c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 5 Sep 2023 09:48:58 +0200 Subject: [PATCH 069/144] WIP --- .../EnvironmentSampleReferenceDto.java | 4 + sormas-app/app/src/main/AndroidManifest.xml | 9 + .../EnvironmentSampleEditAuthorization.java | 33 ++ ...entSampleJurisdictionBooleanValidator.java | 97 ++++++ .../EnvironmentSampleJurisdictionDto.java | 70 ++++ .../controls/ControlTextImageField.java | 41 +++ .../EnvironmentSampleSection.java | 60 ++++ .../list/EnvironmentSampleListFragment.java | 3 +- .../read/EnvironmentSampleReadActivity.java | 115 +++++++ .../read/EnvironmentSampleReadFragment.java | 97 ++++++ .../sormas/app/util/JurisdictionHelper.java | 31 ++ ...ic_drawer_environment_sample_blue_24dp.xml | 23 ++ ...ragment_environment_sample_read_layout.xml | 301 ++++++++++++++++++ .../app/src/main/res/values/strings.xml | 7 + 14 files changed, 890 insertions(+), 1 deletion(-) create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleEditAuthorization.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionBooleanValidator.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionDto.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadFragment.java create mode 100644 sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_24dp.xml create mode 100644 sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java index 4c6a6ce9642..c838832244d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java @@ -26,6 +26,10 @@ public class EnvironmentSampleReferenceDto extends ReferenceDto { private static final long serialVersionUID = -2590392329041969693L; + public EnvironmentSampleReferenceDto(String uuid) { + super(uuid); + } + public EnvironmentSampleReferenceDto(String uuid, EnvironmentSampleMaterial sampleMaterial, String environmentUuid) { super(uuid, buildCaption(sampleMaterial, environmentUuid)); } diff --git a/sormas-app/app/src/main/AndroidManifest.xml b/sormas-app/app/src/main/AndroidManifest.xml index 93972bbdef3..ba797101b94 100644 --- a/sormas-app/app/src/main/AndroidManifest.xml +++ b/sormas-app/app/src/main/AndroidManifest.xml @@ -459,6 +459,15 @@ android:launchMode="singleTop">
+ + + + diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleEditAuthorization.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleEditAuthorization.java new file mode 100644 index 00000000000..b4f43234419 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleEditAuthorization.java @@ -0,0 +1,33 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.backend.environment.environmentsample; + +import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.user.User; +import de.symeda.sormas.app.util.JurisdictionHelper; + +public class EnvironmentSampleEditAuthorization { + + public static boolean isEnvironmentSampleEditAllowed(EnvironmentSample sample) { + + final User user = ConfigProvider.getUser(); + final EnvironmentSampleJurisdictionBooleanValidator environmentSampleJurisdictionBooleanValidator = + EnvironmentSampleJurisdictionBooleanValidator + .of(JurisdictionHelper.createEnvironmentSampleJurisdictionDto(sample), JurisdictionHelper.createUserJurisdiction(user)); + + return environmentSampleJurisdictionBooleanValidator.inJurisdictionOrOwned(); + } +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionBooleanValidator.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionBooleanValidator.java new file mode 100644 index 00000000000..a2fac30eba9 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionBooleanValidator.java @@ -0,0 +1,97 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.backend.environment.environmentsample; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.app.util.BooleanJurisdictionValidator; +import de.symeda.sormas.app.util.UserJurisdiction; + +public class EnvironmentSampleJurisdictionBooleanValidator extends BooleanJurisdictionValidator { + + private final EnvironmentSampleJurisdictionDto environmentSampleJurisdiction; + private final UserJurisdiction userJurisdiction; + + public static EnvironmentSampleJurisdictionBooleanValidator of( + EnvironmentSampleJurisdictionDto environmentSampleJurisdiction, + UserJurisdiction userJurisdiction) { + return new EnvironmentSampleJurisdictionBooleanValidator(environmentSampleJurisdiction, userJurisdiction); + } + + private EnvironmentSampleJurisdictionBooleanValidator( + EnvironmentSampleJurisdictionDto environmentSampleJurisdiction, + UserJurisdiction userJurisdiction) { + super(null, userJurisdiction); + this.environmentSampleJurisdiction = environmentSampleJurisdiction; + this.userJurisdiction = userJurisdiction; + } + + @Override + protected Disease getDisease() { + return null; + } + + @Override + public Boolean isRootInJurisdiction() { + return isInJurisdictionByJurisdictionLevel(userJurisdiction.getJurisdictionLevel()); + } + + @Override + public Boolean isRootInJurisdictionOrOwned() { + return userJurisdiction.getUuid().equals(environmentSampleJurisdiction.getReportingUserUuid()) || inJurisdiction(); + } + + @Override + protected Boolean whenNotAllowed() { + return false; + } + + @Override + protected Boolean whenNationalLevel() { + return true; + } + + @Override + protected Boolean whenRegionalLevel() { + return DataHelper.equal(environmentSampleJurisdiction.getRegionUuid(), userJurisdiction.getRegionUuid()); + } + + @Override + protected Boolean whenDistrictLevel() { + return DataHelper.equal(environmentSampleJurisdiction.getDistrictUuid(), userJurisdiction.getDistrictUuid()); + } + + @Override + protected Boolean whenCommunityLevel() { + return DataHelper.equal(environmentSampleJurisdiction.getCommunityUuid(), userJurisdiction.getCommunityUuid()); + } + + @Override + protected Boolean whenFacilityLevel() { + return false; + } + + @Override + protected Boolean whenPointOfEntryLevel() { + return false; + } + + @Override + protected Boolean whenLaboratoryLevel() { + return false; + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionDto.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionDto.java new file mode 100644 index 00000000000..06cb2d78021 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleJurisdictionDto.java @@ -0,0 +1,70 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.backend.environment.environmentsample; + +import java.io.Serializable; + +public class EnvironmentSampleJurisdictionDto implements Serializable { + + private String reportingUserUuid; + private String regionUuid; + private String districtUuid; + private String communityUuid; + + public EnvironmentSampleJurisdictionDto() { + } + + public EnvironmentSampleJurisdictionDto(String reportingUserUuid, String regionUuid, String districtUuid, String communityUuid) { + + this.reportingUserUuid = reportingUserUuid; + this.regionUuid = regionUuid; + this.districtUuid = districtUuid; + this.communityUuid = communityUuid; + } + + public String getReportingUserUuid() { + return reportingUserUuid; + } + + public void setReportingUserUuid(String reportingUserUuid) { + this.reportingUserUuid = reportingUserUuid; + } + + public String getRegionUuid() { + return regionUuid; + } + + public void setRegionUuid(String regionUuid) { + this.regionUuid = regionUuid; + } + + public String getDistrictUuid() { + return districtUuid; + } + + public void setDistrictUuid(String districtUuid) { + this.districtUuid = districtUuid; + } + + public String getCommunityUuid() { + return communityUuid; + } + + public void setCommunityUuid(String communityUuid) { + this.communityUuid = communityUuid; + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextImageField.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextImageField.java index 6d5d83386ea..7fe38eec95a 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextImageField.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextImageField.java @@ -29,6 +29,7 @@ import de.symeda.sormas.api.task.TaskPriority; import de.symeda.sormas.api.task.TaskStatus; import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.app.backend.sample.Sample; import de.symeda.sormas.app.util.DateFormatHelper; @@ -236,6 +237,26 @@ public static void setShipmentStatus(ControlTextImageField textImageField, Sampl } } + @BindingAdapter(value = { + "shipmentStatus", + "defaultValue" }, requireAll = false) + public static void setShipmentStatus(ControlTextImageField textImageField, EnvironmentSample sample, String defaultValue) { + if (sample == null) { + textImageField.setValue(textImageField.getDefaultValue(defaultValue), false); + textImageField.applyDefaultValueStyle(); + } else { + // TODO reset default style? + + if (sample.isDispatched()) { + textImageField.setValue(DateFormatHelper.formatLocalDate(sample.getDispatchDate()), true); + textImageField.setImageBackground(R.drawable.ic_check_circle_24dp, R.color.green); + } else { + textImageField.setValue(textImageField.getResources().getString(R.string.no), false); + textImageField.setImageBackground(R.drawable.ic_cancel_24dp, R.color.red); + } + } + } + @BindingAdapter(value = { "receivedStatus", "defaultValue" }, requireAll = false) @@ -256,6 +277,26 @@ public static void setReceivedStatus(ControlTextImageField textImageField, Sampl } } + @BindingAdapter(value = { + "receivedStatus", + "defaultValue" }, requireAll = false) + public static void setReceivedStatus(ControlTextImageField textImageField, EnvironmentSample sample, String defaultValue) { + if (sample == null) { + textImageField.setValue(textImageField.getDefaultValue(defaultValue), false); + textImageField.applyDefaultValueStyle(); + } else { + // TODO reset default style? + + if (sample.isReceived()) { + textImageField.setValue(DateFormatHelper.formatLocalDate(sample.getReceivalDate()), true); + textImageField.setImageBackground(R.drawable.ic_check_circle_24dp, R.color.green); + } else { + textImageField.setValue(textImageField.getResources().getString(R.string.no), false); + textImageField.setImageBackground(R.drawable.ic_cancel_24dp, R.color.red); + } + } + } + @BindingAdapter(value = { "value", "valueFormat", diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java new file mode 100644 index 00000000000..4ff9231831a --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java @@ -0,0 +1,60 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample; + +import android.content.Context; + +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.core.enumeration.StatusElaborator; + +public enum EnvironmentSampleSection + implements + StatusElaborator { + + ENVIRONMENT_SAMPLE_INFO(R.string.caption_environment_sample_information, R.drawable.ic_drawer_environment_sample_blue_24dp); + + private final int friendlyNameResourceId; + private final int iconResourceId; + + EnvironmentSampleSection(int friendlyNameResourceId, int iconResourceId) { + this.friendlyNameResourceId = friendlyNameResourceId; + this.iconResourceId = iconResourceId; + } + + public static EnvironmentSampleSection fromOrdinal(int ordinal) { + return EnvironmentSampleSection.values()[ordinal]; + } + + @Override + public String getFriendlyName(Context context) { + return context.getResources().getString(friendlyNameResourceId); + } + + @Override + public int getColorIndicatorResource() { + return 0; + } + + @Override + public Enum getValue() { + return null; + } + + @Override + public int getIconResourceId() { + return iconResourceId; + } +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java index 2c25782e5bd..72033b99809 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/list/EnvironmentSampleListFragment.java @@ -27,6 +27,7 @@ import de.symeda.sormas.app.R; import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.app.core.adapter.databinding.OnListItemClickListener; +import de.symeda.sormas.app.environmentsample.read.EnvironmentSampleReadActivity; import de.symeda.sormas.app.sample.ShipmentStatus; public class EnvironmentSampleListFragment extends PagedBaseListFragment implements OnListItemClickListener { @@ -55,7 +56,7 @@ public EnvironmentSampleListAdapter getNewListAdapter() { @Override public void onListItemClick(View view, int position, Object item) { EnvironmentSample environmentSample = (EnvironmentSample) item; - //EnvironmentSampleReadActivity.startActivity(getContext(), environmentSample.getUuid()); + EnvironmentSampleReadActivity.startActivity(getContext(), environmentSample.getUuid()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java new file mode 100644 index 00000000000..d03b7f629ca --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java @@ -0,0 +1,115 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.read; + +import java.util.List; + +import android.content.Context; +import android.view.Menu; +import android.view.MenuItem; + +import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.app.BaseReadActivity; +import de.symeda.sormas.app.BaseReadFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSampleEditAuthorization; +import de.symeda.sormas.app.component.menu.PageMenuItem; +import de.symeda.sormas.app.environmentsample.EnvironmentSampleSection; +import de.symeda.sormas.app.sample.ShipmentStatus; +import de.symeda.sormas.app.util.Bundler; + +public class EnvironmentSampleReadActivity extends BaseReadActivity { + + public static void startActivity(Context context, String rootUuid) { + BaseReadActivity.startActivity(context, EnvironmentSampleReadActivity.class, buildBundle(rootUuid)); + } + + public static Bundler buildBundle(String rootUuid) { + return BaseReadActivity.buildBundle(rootUuid, 0); + } + + @Override + protected EnvironmentSample queryRootEntity(String recordUuid) { + return DatabaseHelper.getEnvironmentSampleDao().queryUuid(recordUuid); + } + + @Override + public ShipmentStatus getPageStatus() { + EnvironmentSample sample = getStoredRootEntity(); + return sample.isReceived() ? ShipmentStatus.RECEIVED : sample.isDispatched() ? ShipmentStatus.SHIPPED : ShipmentStatus.NOT_SHIPPED; + } + + @Override + public List getPageMenuData() { + return PageMenuItem.fromEnum(EnvironmentSampleSection.values(), getContext()); + } + + @Override + protected BaseReadFragment buildReadFragment(PageMenuItem menuItem, EnvironmentSample activityRootData) { + EnvironmentSampleSection section = EnvironmentSampleSection.fromOrdinal(menuItem.getPosition()); + BaseReadFragment fragment; + switch (section) { + case ENVIRONMENT_SAMPLE_INFO: + fragment = EnvironmentSampleReadFragment.newInstance(activityRootData); + break; + default: + throw new IndexOutOfBoundsException(DataHelper.toStringNullable(section)); + } + return fragment; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + boolean result = super.onCreateOptionsMenu(menu); + getEditMenu().setTitle(R.string.action_edit_environment_sample); + return result; + } + + @Override + protected void processActionbarMenu() { + + super.processActionbarMenu(); + final MenuItem editMenu = getEditMenu(); + final ReferenceDto referenceDto = new EnvironmentSampleReferenceDto(getRootUuid()); + final EnvironmentSample selectedSample = DatabaseHelper.getEnvironmentSampleDao().getByReferenceDto(referenceDto); + + if (editMenu != null) { + if (ConfigProvider.hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT) + && EnvironmentSampleEditAuthorization.isEnvironmentSampleEditAllowed(selectedSample)) { + editMenu.setVisible(true); + } else { + editMenu.setVisible(false); + } + } + } + + @Override + protected int getActivityTitle() { + return R.string.heading_environment_sample_read; + } + + @Override + public void goToEditView() { + EnvironmentSampleSection section = EnvironmentSampleSection.fromOrdinal(getActivePage().getPosition()); + //EnvironmentSampleEditActivity.startActivity(getContext(), getRootUuid(), section); + } +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadFragment.java new file mode 100644 index 00000000000..01515042f4b --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadFragment.java @@ -0,0 +1,97 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.read; + +import static android.view.View.GONE; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +import android.os.Bundle; + +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.Pathogen; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.app.BaseReadFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.databinding.FragmentEnvironmentSampleReadLayoutBinding; + +public class EnvironmentSampleReadFragment + extends BaseReadFragment { + + private EnvironmentSample record; + private final List requestedPathogenTests = new ArrayList<>(); + + public static EnvironmentSampleReadFragment newInstance(EnvironmentSample activityRootData) { + return newInstance(EnvironmentSampleReadFragment.class, null, activityRootData); + } + + @Override + protected void prepareFragmentData(Bundle savedInstanceState) { + + record = getActivityRootData(); + + for (Pathogen pathogen : record.getRequestedPathogenTests()) { + requestedPathogenTests.add(pathogen.getCaption()); + } + } + + @Override + public void onLayoutBinding(FragmentEnvironmentSampleReadLayoutBinding contentBinding) { + contentBinding.setData(record); + } + + @Override + public void onAfterLayoutBinding(FragmentEnvironmentSampleReadLayoutBinding contentBinding) { + + setFieldVisibilitiesAndAccesses(EnvironmentSampleDto.class, contentBinding.mainContent); + + if (!requestedPathogenTests.isEmpty()) { + contentBinding.environmentSampleRequestedPathogenTestsTags.setTags(requestedPathogenTests); + if (StringUtils.isEmpty(record.getOtherRequestedPathogenTests())) { + contentBinding.environmentSampleOtherRequestedPathogenTests.setVisibility(GONE); + } + } else { + contentBinding.environmentSampleRequestedPathogenTestsTags.setVisibility(GONE); + contentBinding.environmentSampleOtherRequestedPathogenTests.setVisibility(GONE); + } + } + + @Override + protected String getSubHeadingTitle() { + return getResources().getString(R.string.caption_environment_sample_information); + } + + @Override + public EnvironmentSample getPrimaryData() { + return record; + } + + @Override + public int getReadLayout() { + return R.layout.fragment_environment_sample_read_layout; + } + + @Override + public boolean showEditAction() { + return ConfigProvider.hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/JurisdictionHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/JurisdictionHelper.java index 0c66daa7c7b..2f416ba53f1 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/JurisdictionHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/JurisdictionHelper.java @@ -11,6 +11,8 @@ import de.symeda.sormas.app.backend.contact.ContactJurisdictionDto; import de.symeda.sormas.app.backend.environment.Environment; import de.symeda.sormas.app.backend.environment.EnvironmentJurisdictionDto; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSampleJurisdictionDto; import de.symeda.sormas.app.backend.event.Event; import de.symeda.sormas.app.backend.event.EventJurisdictionDto; import de.symeda.sormas.app.backend.event.EventParticipant; @@ -233,6 +235,35 @@ public static EnvironmentJurisdictionDto createEnvironmentJurisdictionDto(Enviro return environmentJurisdiction; } + public static EnvironmentSampleJurisdictionDto createEnvironmentSampleJurisdictionDto(EnvironmentSample sample) { + if (sample == null) { + return null; + } + + EnvironmentSampleJurisdictionDto environmentSampleJurisdiction = new EnvironmentSampleJurisdictionDto(); + + if (sample.getReportingUser() != null) { + environmentSampleJurisdiction.setReportingUserUuid(sample.getReportingUser().getUuid()); + } + + Location environmentLocation = sample.getLocation(); + if (environmentLocation != null) { + if (environmentLocation.getRegion() != null) { + environmentSampleJurisdiction.setRegionUuid(environmentLocation.getRegion().getUuid()); + } + + if (environmentLocation.getDistrict() != null) { + environmentSampleJurisdiction.setDistrictUuid(environmentLocation.getDistrict().getUuid()); + } + + if (environmentLocation.getCommunity() != null) { + environmentSampleJurisdiction.setCommunityUuid(environmentLocation.getCommunity().getUuid()); + } + } + + return environmentSampleJurisdiction; + } + public static TaskJurisdictionDto createTaskJurisdictionDto(Task task) { if (task == null) { diff --git a/sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_24dp.xml b/sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_24dp.xml new file mode 100644 index 00000000000..6996e593f65 --- /dev/null +++ b/sormas-app/app/src/main/res/drawable/ic_drawer_environment_sample_blue_24dp.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml b/sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml new file mode 100644 index 00000000000..178265a97f4 --- /dev/null +++ b/sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sormas-app/app/src/main/res/values/strings.xml b/sormas-app/app/src/main/res/values/strings.xml index f471663fe2e..a32308a99c0 100644 --- a/sormas-app/app/src/main/res/values/strings.xml +++ b/sormas-app/app/src/main/res/values/strings.xml @@ -61,6 +61,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -174,6 +175,7 @@ Report Environment Information Environment Tasks + Environment Sample Information Description Location Date of event @@ -395,6 +397,7 @@ Edit Sample New Sample Read Sample + Read Environment Sample Sample Summary Sample Listing Environment Sample Listing @@ -451,6 +454,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the "+" symbol in the top right. Clear From 89b70be8ebd11f6794de7ab7baa9859b0c3a28dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 5 Sep 2023 11:02:53 +0200 Subject: [PATCH 070/144] #12501 - Formatting --- .../de/symeda/sormas/app/backend/common/DatabaseHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java index a60ea564dfd..c58df05e54d 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java @@ -3126,7 +3126,7 @@ public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int + "laboratory_id BIGINT, laboratoryDetails text, requestedPathogenTests text, otherRequestedPathogenTests text, " + "weatherConditions text, heavyRain varchar(255), dispatched boolean, dispatchDate TIMESTAMP, dispatchDetails text, " + "received boolean, receivalDate TIMESTAMP, labSampleId text, specimenCondition varchar(255), location_id BIGINT NOT NULL, generalComment text, " - + "pseudonymized boolean, " + "UNIQUE(snapshot, uuid));"); + + "pseudonymized boolean, UNIQUE(snapshot, uuid));"); case 351: currentVersion = 351; From b9ff6a0eea3d1751648a4e5276dcb4da4bf4007d Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Tue, 5 Sep 2023 12:42:22 +0300 Subject: [PATCH 071/144] =?UTF-8?q?#12355=20-=20Core=20entities=20that=20a?= =?UTF-8?q?re=20obsolete=20(archived/soft=20deleted)=20are=20=E2=80=A6=20(?= =?UTF-8?q?#12489)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #12355 - Core entities that are obsolete (archived/soft deleted) are not removed from the mobile app * #12355 - Core entities that are obsolete (archived/soft deleted) are not removed from the mobile app --- .../sormas/backend/environment/EnvironmentService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java index 034cfc56a30..14cebb133c9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java @@ -8,8 +8,10 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; +import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; +import de.symeda.sormas.backend.event.Event; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.EditPermissionType; @@ -238,11 +240,15 @@ public Predicate createDefaultFilter(CriteriaBuilder cb, From ro return cb.isFalse(root.get(Environment.DELETED)); } + public Predicate createActiveEnvironmentFilter(CriteriaBuilder cb, Path root) { + return cb.and(cb.isFalse(root.get(Environment.ARCHIVED)), cb.isFalse(root.get(Environment.DELETED))); + } + @Override @SuppressWarnings("rawtypes") protected Predicate createRelevantDataFilter(CriteriaBuilder cb, CriteriaQuery cq, From from) { - Predicate filter = createDefaultFilter(cb, from); + Predicate filter = createActiveEnvironmentFilter(cb, from); if (getCurrentUser() != null) { filter = CriteriaBuilderHelper.and(cb, filter, createUserFilterInternal(cb, cq, from)); } From 3e7c678ec0bb0ecf714fcf30e4dac28b7676a862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 5 Sep 2023 11:51:02 +0200 Subject: [PATCH 072/144] #12500 - Formatting after merge --- .../environment/environmentsample/EnvironmentSample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java index c2ee05c6f6f..a2a7fdc4829 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSample.java @@ -260,7 +260,7 @@ public void setRequestedPathogenTests(Set requestedPathogenTests) { Type type = new TypeToken>() { }.getType(); - requestedPathogenTestsJson = + requestedPathogenTestsJson = gson.toJson(requestedPathogenTests.stream().map(CustomizableEnum::getValue).collect(Collectors.toSet()), type); } } From 27e5274518d03f45d3867d41abcb14aa52263d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 5 Sep 2023 11:59:33 +0200 Subject: [PATCH 073/144] #12501 - Update SQL --- sormas-backend/src/main/resources/sql/sormas_schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index fa078577eb7..d37569c65b1 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12700,10 +12700,10 @@ ALTER TABLE environmentsamples_history ADD COLUMN requestedpathogentests text; INSERT INTO schema_version (version_number, comment) VALUES (524, 'Change requested pathogen tests column type #11721'); -- 2023-09-05 Add report date to environment samples #12501 -ALTER TABLE environmentsamples ADD COLUMN reportdate timestamp not null; +ALTER TABLE environmentsamples ADD COLUMN reportdate timestamp not null DEFAULT now(); ALTER TABLE environmentsamples_history ADD COLUMN reportdate timestamp; -- Fill report date to avoid not null issues -UPDATE environmentsamples SET reportdate = now(); +ALTER TABLE environmentsamples ALTER COLUMN reportdate DROP DEFAULT; INSERT INTO schema_version (version_number, comment) VALUES (525, 'Add report date to environment samples #12501'); From 57d795c1b4fb88851f897b50305e9b48e28cfcae Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Tue, 5 Sep 2023 10:17:56 +0000 Subject: [PATCH 074/144] [GitHub Actions] Update openAPI spec files --- sormas-rest/swagger.json | 6 +++++- sormas-rest/swagger.yaml | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index e5898275507..33e7829e380 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -16124,6 +16124,10 @@ "received" : { "type" : "boolean" }, + "reportDate" : { + "type" : "string", + "format" : "date-time" + }, "reportingUser" : { "$ref" : "#/components/schemas/UserReferenceDto" }, @@ -16173,7 +16177,7 @@ } } }, - "required" : [ "environment", "laboratory", "reportingUser", "sampleDateTime", "sampleMaterial" ] + "required" : [ "environment", "laboratory", "reportDate", "reportingUser", "sampleDateTime", "sampleMaterial" ] }, "EpiDataDto" : { "type" : "object", diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index ca69487d566..bf3bb2e61d3 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -14171,6 +14171,9 @@ components: format: date-time received: type: boolean + reportDate: + type: string + format: date-time reportingUser: $ref: '#/components/schemas/UserReferenceDto' requestedPathogenTests: @@ -14217,6 +14220,7 @@ components: required: - environment - laboratory + - reportDate - reportingUser - sampleDateTime - sampleMaterial From 01144a9cd91af2f4e958fc31fe50018934495b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 5 Sep 2023 12:36:18 +0200 Subject: [PATCH 075/144] #12500 - Read fragment updates --- .../src/main/resources/captions.properties | 2 +- .../controls/ControlTextReadField.java | 36 +++++++++++---- .../read/EnvironmentSampleReadActivity.java | 4 +- ...ragment_environment_sample_read_layout.xml | 45 +++++++++---------- 4 files changed, 52 insertions(+), 35 deletions(-) diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 67d61d72d6a..6776c67c705 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1140,7 +1140,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in �C) +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextReadField.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextReadField.java index e6c316fb44f..f21bc37fbb5 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextReadField.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlTextReadField.java @@ -15,6 +15,14 @@ package de.symeda.sormas.app.component.controls; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Date; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; + import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; @@ -30,12 +38,7 @@ import androidx.databinding.BindingMethods; import androidx.databinding.InverseBindingListener; -import org.apache.commons.lang3.StringUtils; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Date; - +import de.symeda.sormas.api.environment.environmentsample.WeatherCondition; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.person.ApproximateAgeType; import de.symeda.sormas.api.symptoms.SymptomsDto; @@ -450,8 +453,13 @@ public static void setTimeValue(ControlTextReadField textField, Date dateValue, "dateTimeValue", "valueFormat", "defaultValue", - "appendValue"}, requireAll = false) - public static void setDateTimeValue(ControlTextReadField textField, Date dateValue, String valueFormat, String defaultValue, Date appendDateValue) { + "appendValue" }, requireAll = false) + public static void setDateTimeValue( + ControlTextReadField textField, + Date dateValue, + String valueFormat, + String defaultValue, + Date appendDateValue) { String appendValue = appendDateValue != null ? DateFormatHelper.formatLocalDateTime(appendDateValue) : null; String stringValue; if (dateValue != null) { @@ -461,7 +469,6 @@ public static void setDateTimeValue(ControlTextReadField textField, Date dateVal appendValue = null; } - setValue(textField, stringValue, appendValue, valueFormat, defaultValue, dateValue); } @@ -514,4 +521,15 @@ public static void setAgeWithDateValue(ControlTextReadField textField, Person pe textField.setValue(ageWithDateBuilder.toString()); } } + + @BindingAdapter(value = { + "weatherConditionsValue", + "defaultValue" }, requireAll = false) + public static void setWeatherConditionsValue(ControlTextReadField textField, Map map, String defaultValue) { + if (map == null || map.isEmpty()) { + textField.setValue(defaultValue); + } else { + textField.setValue(map.keySet().stream().filter(map::get).map(WeatherCondition::toString).collect(Collectors.joining(", "))); + } + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java index d03b7f629ca..c64fa0e442f 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java @@ -55,7 +55,9 @@ protected EnvironmentSample queryRootEntity(String recordUuid) { @Override public ShipmentStatus getPageStatus() { EnvironmentSample sample = getStoredRootEntity(); - return sample.isReceived() ? ShipmentStatus.RECEIVED : sample.isDispatched() ? ShipmentStatus.SHIPPED : ShipmentStatus.NOT_SHIPPED; + return sample != null + ? sample.isReceived() ? ShipmentStatus.RECEIVED : sample.isDispatched() ? ShipmentStatus.SHIPPED : ShipmentStatus.NOT_SHIPPED + : null; } @Override diff --git a/sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml b/sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml index 178265a97f4..64d477ce8cc 100644 --- a/sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml +++ b/sormas-app/app/src/main/res/layout/fragment_environment_sample_read_layout.xml @@ -25,8 +25,6 @@ android:id="@+id/base_layout"> - - @@ -74,10 +72,10 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - - + @@ -161,22 +161,15 @@ - - - - - + - + @@ -212,7 +207,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/fragment_padding" + android:paddingLeft="@dimen/fragment_padding" + android:paddingRight="@dimen/fragment_padding" + android:paddingBottom="@dimen/fragment_padding" android:focusable="true" android:focusableInTouchMode="true" android:id="@+id/sample_management_layout"> From 8610eb96cd418bb4b8dfccb28634f465cb597176 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Wed, 6 Sep 2023 13:09:45 +0200 Subject: [PATCH 076/144] SORQA-1061 "S2S - Actions on Shares directory" - test implemented --- .../application/shares/EditSharesPage.java | 10 ++ .../shares/SharesDirectorySteps.java | 95 +++++++++++++++++++ .../features/sanity/web/SharedCases.feature | 37 +++++++- 3 files changed, 141 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/shares/EditSharesPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/shares/EditSharesPage.java index cc329c04aa8..638aa5fde49 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/shares/EditSharesPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/shares/EditSharesPage.java @@ -26,6 +26,16 @@ public class EditSharesPage { public static final By SHARE_UUID_CASE_TITLE = By.cssSelector(".popupContent [class='v-grid-cell v-grid-cell-focused'] a"); public static final By EXTRA_COMMENT_INPUT_SHARE_POPUP = By.cssSelector(".popupContent #comment"); + public static final By SHARE_REQUEST_POPUP = By.cssSelector(".v-Notification-caption"); + public static final By CLOSE_SHARE_REQUEST_DETAILS = By.cssSelector(".v-window-closebox"); + public static final By STATUS_COMBOBOX = By.cssSelector("#status div"); + public static final By STATUS_HEADER = By.xpath("//tbody/tr[1]/td[8]"); + public static final By SHARE_DIRECTORY_PAGE_APPLY_FILTER_BUTTON = + By.cssSelector("div#actionApplyFilters"); + public static final By OUTGOING_OPTION = + By.xpath("//span[@class= 'v-radiobutton v-select-option']//label[text()='Ausgehend']"); + public static final By INCOMING_OPTION = + By.xpath("//span[@class= 'v-radiobutton v-select-option']//label[text()='Eingehend']"); public static By getActionRejectButtonByContactDescription(String description) { return By.xpath( diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/shares/SharesDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/shares/SharesDirectorySteps.java index c4c530f5409..f0526f754c7 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/shares/SharesDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/shares/SharesDirectorySteps.java @@ -169,6 +169,101 @@ public SharesDirectorySteps( webDriverHelpers.waitForPageLoadingSpinnerToDisappear(30); }); + And( + "^I check that message popup about Request in not yet accepted is appear$", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(SHARE_REQUEST_POPUP); + webDriverHelpers.clickOnWebElementBySelector(SHARE_REQUEST_POPUP); + }); + + And( + "^I close share request details window$", + () -> { + webDriverHelpers.clickOnWebElementBySelector(CLOSE_SHARE_REQUEST_DETAILS); + }); + + When( + "I select German Status Dropdown to ([^\"]*)", + (String status) -> { + switch (status) { + case "Accepted": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(STATUS_COMBOBOX); + webDriverHelpers.selectFromCombobox(STATUS_COMBOBOX, "Ausstehend"); + webDriverHelpers.clickOnWebElementBySelector( + SHARE_DIRECTORY_PAGE_APPLY_FILTER_BUTTON); + break; + case "Pending": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(STATUS_COMBOBOX); + webDriverHelpers.selectFromCombobox(STATUS_COMBOBOX, "\u00DCbernommen"); + webDriverHelpers.clickOnWebElementBySelector( + SHARE_DIRECTORY_PAGE_APPLY_FILTER_BUTTON); + break; + case "Rejected": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(STATUS_COMBOBOX); + webDriverHelpers.selectFromCombobox(STATUS_COMBOBOX, "Abgelehnt"); + webDriverHelpers.clickOnWebElementBySelector( + SHARE_DIRECTORY_PAGE_APPLY_FILTER_BUTTON); + break; + case "Revoked": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(STATUS_COMBOBOX); + webDriverHelpers.selectFromCombobox(STATUS_COMBOBOX, "Widerrufen"); + webDriverHelpers.clickOnWebElementBySelector( + SHARE_DIRECTORY_PAGE_APPLY_FILTER_BUTTON); + break; + } + }); + + When( + "I check that ([^\"]*) status value is corresponding with entities", + (String status) -> { + TimeUnit.SECONDS.sleep(3); // waiting for page loaded + switch (status) { + case "Accepted": + softly.assertEquals( + webDriverHelpers.getTextFromWebElement(STATUS_HEADER), + "Ausstehend", + "The corresponding entity has incorrect status"); + softly.assertAll(); + break; + case "Pending": + softly.assertEquals( + webDriverHelpers.getTextFromWebElement(STATUS_HEADER), + "\u00DCbernommen", + "The corresponding entity has incorrect status"); + softly.assertAll(); + break; + case "Rejected": + softly.assertEquals( + webDriverHelpers.getTextFromWebElement(STATUS_HEADER), + "Abgelehnt", + "The corresponding entity has incorrect status"); + softly.assertAll(); + break; + case "Revoked": + softly.assertEquals( + webDriverHelpers.getTextFromWebElement(STATUS_HEADER), + "Widerrufen", + "The corresponding entity has incorrect status"); + softly.assertAll(); + break; + } + }); + + When( + "I pick ([^\"]*) tab on Share Directory page", + (String status) -> { + switch (status) { + case "OUTGOING": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(OUTGOING_OPTION); + webDriverHelpers.clickOnWebElementBySelector(OUTGOING_OPTION); + break; + case "INCOMING": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(INCOMING_OPTION); + webDriverHelpers.clickOnWebElementBySelector(INCOMING_OPTION); + break; + } + }); + And( "^I check that share associated contacts checkbox is not visible in Share form for DE$", () -> { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature index ce380657982..80be0f2e0f6 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/SharedCases.feature @@ -1223,7 +1223,6 @@ Feature: Sharing cases between environments tests And I select first created case for person from Cases list Then I check that Point Of Entry and Place Of Stay EINRICHTUNG information is correctly display on Edit case page - @tmsLink=SORQA-1061 @env_s2s_1 Scenario: S2S - Actions on Shares directory Given API: I create a new person with "Baden-Württemberg" region and "LK Alb-Donau-Kreis" district @@ -1240,5 +1239,41 @@ Feature: Sharing cases between environments tests Then I navigate to "s2s_2" environment in new driver tab Given I log in as a S2S And I click on the Shares button from navbar + Then I pick INCOMING tab on Share Directory page + And I click on the The Eye Icon located in the Shares Page + And I click on the shortened case/contact ID to open the case + Then I check that message popup about Request in not yet accepted is appear + And I close share request details window + Then I accept first entity from table in Shares Page + And I click on the The Eye Icon located in the Shares Page + And I click on the shortened case/contact ID to open the case + Then I click on the Shares button from navbar + And I click the header UUID of column + Then I check that error not appear + Then I select German Status Dropdown to Accepted + And I check that Accepted status value is corresponding with entities + Then I select German Status Dropdown to Pending + And I check that Pending status value is corresponding with entities + And I pick OUTGOING tab on Share Directory page + Then I select German Status Dropdown to Accepted + And I check that Accepted status value is corresponding with entities + And I click on the The Eye Icon located in the Shares Page + And I click on the shortened case/contact ID to open the case + And I click on the Shares button from navbar + And I pick OUTGOING tab on Share Directory page + Then I select German Status Dropdown to Pending + And I check that Pending status value is corresponding with entities And I click on the The Eye Icon located in the Shares Page And I click on the shortened case/contact ID to open the case + And I click on the Shares button from navbar + And I pick OUTGOING tab on Share Directory page + Then I select German Status Dropdown to Rejected + And I check that Rejected status value is corresponding with entities + And I click on the The Eye Icon located in the Shares Page + And I click on the shortened case/contact ID to open the case + And I click on the Shares button from navbar + And I pick OUTGOING tab on Share Directory page + Then I select German Status Dropdown to Revoked + And I check that Revoked status value is corresponding with entities + And I click on the The Eye Icon located in the Shares Page + And I click on the shortened case/contact ID to open the case \ No newline at end of file From ccc42d85a88f94b83f0e36c7a311c0f605c17475 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Thu, 7 Sep 2023 11:17:53 +0300 Subject: [PATCH 077/144] #11566 Add an environment sample grid to the web app --- .../sormas/api/contact/ContactIndexDto.java | 3 +- .../EnvironmentSampleCriteria.java | 162 ++++++++++ .../EnvironmentSampleIndexDto.java | 152 ++++++++- .../de/symeda/sormas/api/i18n/Captions.java | 13 + .../de/symeda/sormas/api/i18n/Strings.java | 25 ++ .../sormas/api/location/LocationDto.java | 2 +- .../sormas/api/utils/LocationHelper.java | 3 +- .../src/main/resources/captions.properties | 13 + .../src/main/resources/strings.properties | 25 ++ .../environment/EnvironmentService.java | 58 ++-- .../environmentsample/EnvironmentSample.java | 8 + .../EnvironmentSampleFacadeEjb.java | 149 ++++++++- .../EnvironmentSampleJoins.java | 10 + .../EnvironmentSampleService.java | 95 +++++- .../sormas/backend/TestDataCreator.java | 30 +- .../EnvironmentSampleFacadeEjbTest.java | 271 +++++++++++++++- .../symeda/sormas/ui/ControllerProvider.java | 7 + .../sormas/ui/contact/ContactController.java | 5 +- .../samples/EnvironmentSampleController.java | 72 +++++ .../ui/samples/EnvironmentSampleGrid.java | 139 +++++++++ .../EnvironmentSampleGridComponent.java | 294 ++++++++++++++++++ .../EnvironmentSampleGridFilterForm.java | 240 ++++++++++++++ .../{SampleGrid.java => HumanSampleGrid.java} | 11 +- ...ent.java => HumanSampleGridComponent.java} | 25 +- .../sormas/ui/samples/SampleController.java | 10 +- .../sormas/ui/samples/SampleGidComponent.java | 45 +++ .../sormas/ui/samples/SampleViewType.java | 21 ++ .../symeda/sormas/ui/samples/SamplesView.java | 232 ++++++++------ .../ui/samples/SamplesViewConfiguration.java | 31 ++ .../ui/utils/DeleteRestoreController.java | 3 +- .../ui/utils/DeleteRestoreHandlers.java | 7 +- .../ui/utils/DeleteRestoreMessages.java | 19 +- .../sormas/ui/utils/ReloadableGrid.java | 27 ++ 33 files changed, 2049 insertions(+), 158 deletions(-) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGrid.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridFilterForm.java rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{SampleGrid.java => HumanSampleGrid.java} (96%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{SampleGridComponent.java => HumanSampleGridComponent.java} (95%) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGidComponent.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleViewType.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesViewConfiguration.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ReloadableGrid.java diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java index 858a08c356d..75d4a99be5a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java @@ -28,8 +28,9 @@ import de.symeda.sormas.api.person.SymptomJournalStatus; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; +import de.symeda.sormas.api.uuid.HasUuid; -public class ContactIndexDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class ContactIndexDto extends PseudonymizableIndexDto implements HasUuid, Serializable, Cloneable { private static final long serialVersionUID = 7511900591141885152L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java index debe26c579d..0bb468ae04b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java @@ -16,10 +16,172 @@ package de.symeda.sormas.api.environment.environmentsample; import java.io.Serializable; +import java.util.Date; +import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.utils.DateFilterOption; import de.symeda.sormas.api.utils.criteria.BaseCriteria; public class EnvironmentSampleCriteria extends BaseCriteria implements Serializable { private static final long serialVersionUID = 3535818624154194098L; + + public static final String FREE_TEXT = "freeText"; + public static final String REGION = "region"; + public static final String DISTRICT = "district"; + public static final String GPS_LAT_FROM = "gpsLatFrom"; + public static final String GPS_LAT_TO = "gpsLatTo"; + public static final String GPS_LON_FROM = "gpsLonFrom"; + public static final String GPS_LON_TO = "gpsLonTo"; + public static final String LABORATORY = "laboratory"; + public static final String TESTED_PATHOGEN = "testedPathogen"; + + private EntityRelevanceStatus relevanceStatus; + private Boolean dispatched; + private Boolean received; + private String freeText; + private RegionReferenceDto region; + private DistrictReferenceDto district; + private Double gpsLatFrom; + private Double gpsLatTo; + private Double gpsLonFrom; + private Double gpsLonTo; + private FacilityReferenceDto laboratory; + private Pathogen testedPathogen; + private DateFilterOption dateFilterOption = DateFilterOption.DATE; + private Date reportDateFrom; + private Date reportDateTo; + + public EnvironmentSampleCriteria() { + super(); + } + + public EntityRelevanceStatus getRelevanceStatus() { + return relevanceStatus; + } + + public void setRelevanceStatus(EntityRelevanceStatus relevanceStatus) { + this.relevanceStatus = relevanceStatus; + } + + public Boolean getDispatched() { + return dispatched; + } + + public void setDispatched(Boolean dispatched) { + this.dispatched = dispatched; + } + + public Boolean getReceived() { + return received; + } + + public void setReceived(Boolean received) { + this.received = received; + } + + public String getFreeText() { + return freeText; + } + + public void setFreeText(String freeText) { + this.freeText = freeText; + } + + public RegionReferenceDto getRegion() { + return region; + } + + public void setRegion(RegionReferenceDto region) { + this.region = region; + } + + public DistrictReferenceDto getDistrict() { + return district; + } + + public void setDistrict(DistrictReferenceDto district) { + this.district = district; + } + + public Double getGpsLatFrom() { + return gpsLatFrom; + } + + public void setGpsLatFrom(Double gpsLatFrom) { + this.gpsLatFrom = gpsLatFrom; + } + + public Double getGpsLatTo() { + return gpsLatTo; + } + + public void setGpsLatTo(Double gpsLatTo) { + this.gpsLatTo = gpsLatTo; + } + + public Double getGpsLonFrom() { + return gpsLonFrom; + } + + public void setGpsLonFrom(Double gpsLonFrom) { + this.gpsLonFrom = gpsLonFrom; + } + + public Double getGpsLonTo() { + return gpsLonTo; + } + + public void setGpsLonTo(Double gpsLonTo) { + this.gpsLonTo = gpsLonTo; + } + + public FacilityReferenceDto getLaboratory() { + return laboratory; + } + + public void setLaboratory(FacilityReferenceDto laboratory) { + this.laboratory = laboratory; + } + + public Pathogen getTestedPathogen() { + return testedPathogen; + } + + public void setTestedPathogen(Pathogen testedPathogen) { + this.testedPathogen = testedPathogen; + } + + public DateFilterOption getDateFilterOption() { + return dateFilterOption; + } + + public void setDateFilterOption(DateFilterOption dateFilterOption) { + this.dateFilterOption = dateFilterOption; + } + + public Date getReportDateFrom() { + return reportDateFrom; + } + + public void setReportDateFrom(Date reportDateFrom) { + this.reportDateFrom = reportDateFrom; + } + + public Date getReportDateTo() { + return reportDateTo; + } + + public void setReportDateTo(Date reportDateTo) { + this.reportDateTo = reportDateTo; + } + + public void reportDateBetween(Date reportDateFrom, Date reportDateTo, DateFilterOption dateFilterOption) { + this.reportDateFrom = reportDateFrom; + this.reportDateTo = reportDateTo; + this.dateFilterOption = dateFilterOption; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java index ef7a9f25747..4b58b9d77ae 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java @@ -16,8 +16,158 @@ package de.symeda.sormas.api.environment.environmentsample; import java.io.Serializable; +import java.util.Date; -public class EnvironmentSampleIndexDto implements Serializable { +import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.location.LocationDto; +import de.symeda.sormas.api.utils.PersonalData; +import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; +import de.symeda.sormas.api.uuid.HasUuid; + +public class EnvironmentSampleIndexDto extends PseudonymizableIndexDto implements HasUuid, Serializable { private static final long serialVersionUID = -1255140508213117874L; + + public static final String I18N_PREFIX = "EnvironmentSample"; + + public static final String UUID = "uuid"; + public static final String FIELD_SAMPLE_ID = "fieldSampleId"; + public static final String SAMPLE_DATE_TIME = "sampleDateTime"; + public static final String ENVIRONMENT = "environment"; + public static final String LOCATION = "location"; + public static final String DISTRICT = "district"; + public static final String DISPATCHED = "dispatched"; + public static final String DISPATCH_DATE = "dispatchDate"; + public static final String RECEIVED = "received"; + public static final String LABORATORY = "laboratory"; + public static final String SAMPLE_MATERIAL = "sampleMaterial"; + public static final String OTHER_SAMPLE_MATERIAL = "otherSampleMaterial"; + public static final String POSITIVE_PATHOGEN_TESTS = "positivePathogenTests"; + public static final String LATEST_PATHOGEN_TEST = "latestPathogenTest"; + public static final String NUMBER_OF_TESTS = "numberOfTests"; + public static final String DELETION_REASON = "deletionReason"; + + private String fieldSampleId; + private Date sampleDateTime; + @SensitiveData + private String environment; + @PersonalData + @SensitiveData + private String location; + private String district; + private boolean dispatched; + private Date dispatchDate; + private boolean received; + @SensitiveData + private String laboratory; + private EnvironmentSampleMaterial sampleMaterial; + @PersonalData + private String otherSampleMaterial; + private long positivePathogenTests; + private String latestPathogenTest; + private long numberOfTests; + private DeletionReason deletionReason; + @SensitiveData + private String otherDeletionReason; + + public EnvironmentSampleIndexDto( + String uuid, + String fieldSampleId, + Date sampleDateTime, + String environment, + String street, + String houseNumber, + String postalCode, + String city, + String district, + boolean dispatched, + Date dispatchDate, + boolean received, + String laboratory, + EnvironmentSampleMaterial sampleMaterial, + String otherSampleMaterial, + DeletionReason deletionReason, + String otherDeletionReason, + boolean isInJurisdiction) { + super(uuid); + this.fieldSampleId = fieldSampleId; + this.sampleDateTime = sampleDateTime; + this.environment = environment; + this.location = LocationDto.buildAddressCaption(street, houseNumber, postalCode, city); + this.district = district; + this.dispatched = dispatched; + this.dispatchDate = dispatchDate; + this.received = received; + this.laboratory = laboratory; + this.sampleMaterial = sampleMaterial; + this.otherSampleMaterial = otherSampleMaterial; + this.deletionReason = deletionReason; + this.otherDeletionReason = otherDeletionReason; + setInJurisdiction(isInJurisdiction); + } + + public String getFieldSampleId() { + return fieldSampleId; + } + + public Date getSampleDateTime() { + return sampleDateTime; + } + + public String getEnvironment() { + return environment; + } + + public String getLocation() { + return location; + } + + public String getDistrict() { + return district; + } + + public boolean isDispatched() { + return dispatched; + } + + public Date getDispatchDate() { + return dispatchDate; + } + + public boolean isReceived() { + return received; + } + + public String getLaboratory() { + return laboratory; + } + + public EnvironmentSampleMaterial getSampleMaterial() { + return sampleMaterial; + } + + public String getOtherSampleMaterial() { + return otherSampleMaterial; + } + + public long getPositivePathogenTests() { + return positivePathogenTests; + } + + public String getLatestPathogenTest() { + return latestPathogenTest; + } + + public long getNumberOfTests() { + return numberOfTests; + } + + public DeletionReason getDeletionReason() { + return deletionReason; + } + + public String getOtherDeletionReason() { + return otherDeletionReason; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index 0747dbd7d54..f17cb0fd902 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -1077,10 +1077,13 @@ public interface Captions { String EnvironmentSample_laboratory = "EnvironmentSample.laboratory"; String EnvironmentSample_laboratoryDetails = "EnvironmentSample.laboratoryDetails"; String EnvironmentSample_labSampleId = "EnvironmentSample.labSampleId"; + String EnvironmentSample_latestPathogenTest = "EnvironmentSample.latestPathogenTest"; String EnvironmentSample_location = "EnvironmentSample.location"; + String EnvironmentSample_numberOfTests = "EnvironmentSample.numberOfTests"; String EnvironmentSample_otherRequestedPathogenTests = "EnvironmentSample.otherRequestedPathogenTests"; String EnvironmentSample_otherSampleMaterial = "EnvironmentSample.otherSampleMaterial"; String EnvironmentSample_phValue = "EnvironmentSample.phValue"; + String EnvironmentSample_positivePathogenTests = "EnvironmentSample.positivePathogenTests"; String EnvironmentSample_receivalDate = "EnvironmentSample.receivalDate"; String EnvironmentSample_received = "EnvironmentSample.received"; String EnvironmentSample_requestedPathogenTests = "EnvironmentSample.requestedPathogenTests"; @@ -1090,7 +1093,16 @@ public interface Captions { String EnvironmentSample_sampleVolume = "EnvironmentSample.sampleVolume"; String EnvironmentSample_specimenCondition = "EnvironmentSample.specimenCondition"; String EnvironmentSample_turbidity = "EnvironmentSample.turbidity"; + String EnvironmentSample_uuid = "EnvironmentSample.uuid"; String EnvironmentSample_weatherConditions = "EnvironmentSample.weatherConditions"; + String environmentSampleActiveSamples = "environmentSampleActiveSamples"; + String environmentSampleAllActiveAndArchivedSamples = "environmentSampleAllActiveAndArchivedSamples"; + String environmentSampleArchivedSamples = "environmentSampleArchivedSamples"; + String environmentSampleDeletedSamples = "environmentSampleDeletedSamples"; + String environmentSampleNotShipped = "environmentSampleNotShipped"; + String environmentSampleReceived = "environmentSampleReceived"; + String environmentSampleShipped = "environmentSampleShipped"; + String environmentSampleViewType = "environmentSampleViewType"; String EpiData = "EpiData"; String EpiData_activitiesAsCase = "EpiData.activitiesAsCase"; String EpiData_activityAsCaseDetailsKnown = "EpiData.activityAsCaseDetailsKnown"; @@ -2103,6 +2115,7 @@ public interface Captions { String sampleSamplesList = "sampleSamplesList"; String sampleShipped = "sampleShipped"; String sampleSpecimenNotAdequate = "sampleSpecimenNotAdequate"; + String sampleViewType = "sampleViewType"; String selectOtherSample = "selectOtherSample"; String selectSimilarSample = "selectSimilarSample"; String sex = "sex"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index f1cc4ada484..e69c9a3097a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -553,6 +553,9 @@ public interface Strings { String headingEditVisit = "headingEditVisit"; String headingEnvironmentalExposure = "headingEnvironmentalExposure"; String headingEnvironmentJurisdictionUpdated = "headingEnvironmentJurisdictionUpdated"; + String headingEnvironmentSamplesDeleted = "headingEnvironmentSamplesDeleted"; + String headingEnvironmentSamplesRestored = "headingEnvironmentSamplesRestored"; + String headingEnvironmentSomeSamplesNotRestored = "headingEnvironmentSomeSamplesNotRestored"; String headingEpiCurve = "headingEpiCurve"; String headingEpiDataSourceCaseContacts = "headingEpiDataSourceCaseContacts"; String headingErrorReportNotAvailable = "headingErrorReportNotAvailable"; @@ -648,6 +651,7 @@ public interface Strings { String headingNoCasesSelected = "headingNoCasesSelected"; String headingNoClinicalVisitsSelected = "headingNoClinicalVisitsSelected"; String headingNoContactsSelected = "headingNoContactsSelected"; + String headingNoEnvironmentSamplesSelected = "headingNoEnvironmentSamplesSelected"; String headingNoEnvironmentSelected = "headingNoEnvironmentSelected"; String headingNoEventFound = "headingNoEventFound"; String headingNoEventParticipantsSelected = "headingNoEventParticipantsSelected"; @@ -733,6 +737,7 @@ public interface Strings { String headingSomeContactsAlreadyInEvent = "headingSomeContactsAlreadyInEvent"; String headingSomeContactsNotDeleted = "headingSomeContactsNotDeleted"; String headingSomeContactsNotRestored = "headingSomeContactsNotRestored"; + String headingSomeEnvironmentSamplesNotDeleted = "headingSomeEnvironmentSamplesNotDeleted"; String headingSomeEventParticipantsNotDeleted = "headingSomeEventParticipantsNotDeleted"; String headingSomeEventParticipantsNotRestored = "headingSomeEventParticipantsNotRestored"; String headingSomeEventsNotDeleted = "headingSomeEventsNotDeleted"; @@ -1111,6 +1116,7 @@ public interface Strings { String messageCountContactsAlreadyInEvent = "messageCountContactsAlreadyInEvent"; String messageCountContactsNotDeleted = "messageCountContactsNotDeleted"; String messageCountContactsNotRestored = "messageCountContactsNotRestored"; + String messageCountEnvironmentSamplesNotDeleted = "messageCountEnvironmentSamplesNotDeleted"; String messageCountEventParticipantsNotDeleted = "messageCountEventParticipantsNotDeleted"; String messageCountEventParticipantsNotRestored = "messageCountEventParticipantsNotRestored"; String messageCountEventsNotDeleted = "messageCountEventsNotDeleted"; @@ -1148,10 +1154,15 @@ public interface Strings { String messageEntriesEditedExceptArchived = "messageEntriesEditedExceptArchived"; String messageEntryCreated = "messageEntryCreated"; String messageEnvironmentArchived = "messageEnvironmentArchived"; + String messageEnvironmentCountSamplesNotRestored = "messageEnvironmentCountSamplesNotRestored"; String messageEnvironmentCreated = "messageEnvironmentCreated"; String messageEnvironmentDearchived = "messageEnvironmentDearchived"; String messageEnvironmentJurisdictionUpdated = "messageEnvironmentJurisdictionUpdated"; String messageEnvironmentSampleOutsideJurisdictionDeletionDenied = "messageEnvironmentSampleOutsideJurisdictionDeletionDenied"; + String messageEnvironmentSamplesDeleted = "messageEnvironmentSamplesDeleted"; + String messageEnvironmentSamplesNotDeleted = "messageEnvironmentSamplesNotDeleted"; + String messageEnvironmentSamplesNotRestored = "messageEnvironmentSamplesNotRestored"; + String messageEnvironmentSamplesRestored = "messageEnvironmentSamplesRestored"; String messageEnvironmentSaved = "messageEnvironmentSaved"; String messageEpiDataHint = "messageEpiDataHint"; String messageEpidNumberWarning = "messageEpidNumberWarning"; @@ -1262,6 +1273,7 @@ public interface Strings { String messageNoDocumentUploadFile = "messageNoDocumentUploadFile"; String messageNoEligibleEventForDeletionSelected = "messageNoEligibleEventForDeletionSelected"; String messageNoEndDate = "messageNoEndDate"; + String messageNoEnvironmentSamplesSelected = "messageNoEnvironmentSamplesSelected"; String messageNoEnvironmentsSelected = "messageNoEnvironmentsSelected"; String messageNoEventFound = "messageNoEventFound"; String messageNoEventParticipantsSelected = "messageNoEventParticipantsSelected"; @@ -1501,6 +1513,19 @@ public interface Strings { String promptEnvironmentLatTo = "promptEnvironmentLatTo"; String promptEnvironmentLonFrom = "promptEnvironmentLonFrom"; String promptEnvironmentLonTo = "promptEnvironmentLonTo"; + String promptEnvironmentSampleDateFrom = "promptEnvironmentSampleDateFrom"; + String promptEnvironmentSampleDateTo = "promptEnvironmentSampleDateTo"; + String promptEnvironmentSampleDistrict = "promptEnvironmentSampleDistrict"; + String promptEnvironmentSampleEpiWeekFrom = "promptEnvironmentSampleEpiWeekFrom"; + String promptEnvironmentSampleEpiWeekTo = "promptEnvironmentSampleEpiWeekTo"; + String promptEnvironmentSampleFreetext = "promptEnvironmentSampleFreetext"; + String promptEnvironmentSampleLab = "promptEnvironmentSampleLab"; + String promptEnvironmentSampleLatFrom = "promptEnvironmentSampleLatFrom"; + String promptEnvironmentSampleLatTo = "promptEnvironmentSampleLatTo"; + String promptEnvironmentSampleLonFrom = "promptEnvironmentSampleLonFrom"; + String promptEnvironmentSampleLonTo = "promptEnvironmentSampleLonTo"; + String promptEnvironmentSampleRegion = "promptEnvironmentSampleRegion"; + String promptEnvironmentSampleTestedPathogen = "promptEnvironmentSampleTestedPathogen"; String promptEventDateFrom = "promptEventDateFrom"; String promptEventDateTo = "promptEventDateTo"; String promptEventDateType = "promptEventDateType"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/location/LocationDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/location/LocationDto.java index 1e9cc73a1ff..3f4c2fec182 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/location/LocationDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/location/LocationDto.java @@ -405,7 +405,7 @@ public static LocationDto build() { return location; } - public String buildAddressCaption() { + public static String buildAddressCaption(String street, String houseNumber, String postalCode, String city) { String streetAndNumber = DataHelper.toStringNullable(street) + " " + DataHelper.toStringNullable(houseNumber); String postalAndCity = DataHelper.toStringNullable(postalCode) + " " + DataHelper.toStringNullable(city); if (StringUtils.isNotBlank(streetAndNumber)) { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/LocationHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/LocationHelper.java index e2a1b9197f9..e904174098f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/LocationHelper.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/LocationHelper.java @@ -62,7 +62,8 @@ public static String buildLocationString(LocationDto location) { locationFields.add(district); } - String address = DataHelper.toStringNullable(location.buildAddressCaption()); + String address = DataHelper.toStringNullable( + LocationDto.buildAddressCaption(location.getStreet(), location.getHouseNumber(), location.getPostalCode(), location.getCity())); if (!StringUtils.isBlank(address)) { locationFields.add(address); } diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 67d61d72d6a..e5275265f7d 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index b7b3177237b..26b5329cebd 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -813,6 +813,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingSomeEnvironmentSamplesNotDeleted = Some environment samples were not deleted +headingEnvironmentSamplesRestored = Environment samples restored +headingEnvironmentSomeSamplesNotRestored = Some environment samples were not restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection: @@ -1400,6 +1405,13 @@ messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageEnvironmentSamplesNotDeleted = The environment samples mentioned in the above list of UUIDs could not be deleted. +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted. UUIDs of environment samples not deleted: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSamplesNotRestored = The environment samples mentioned in the above list of UUIDs could not be restored. +messageEnvironmentCountSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored: %s # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1585,6 +1597,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java index 14cebb133c9..e619194019c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java @@ -11,7 +11,6 @@ import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; -import de.symeda.sormas.backend.event.Event; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.EditPermissionType; @@ -133,6 +132,31 @@ protected > T addChangeDates(T builder, Environme return builder; } + public static Predicate buildGpsCoordinatesFilter( + Double gpsLatFrom, + Double gpsLatTo, + Double gpsLonFrom, + Double gpsLonTo, + CriteriaBuilder cb, + EnvironmentJoins joins) { + Predicate filter = null; + if (gpsLatFrom != null && gpsLatTo != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.between(joins.getLocation().get(Location.LATITUDE), gpsLatFrom, gpsLatTo)); + } else if (gpsLatFrom != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.greaterThanOrEqualTo(joins.getLocation().get(Location.LATITUDE), gpsLatFrom)); + } else if (gpsLatTo != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(joins.getLocation().get(Location.LATITUDE), gpsLatTo)); + } + if (gpsLonFrom != null && gpsLonTo != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.between(joins.getLocation().get(Location.LONGITUDE), gpsLonFrom, gpsLonTo)); + } else if (gpsLonFrom != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.greaterThanOrEqualTo(joins.getLocation().get(Location.LONGITUDE), gpsLonFrom)); + } else if (gpsLonTo != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(joins.getLocation().get(Location.LONGITUDE), gpsLonTo)); + } + return filter; + } + public Predicate buildCriteriaFilter(EnvironmentCriteria environmentCriteria, EnvironmentQueryContext environmentQueryContext) { CriteriaBuilder cb = environmentQueryContext.getCriteriaBuilder(); @@ -204,30 +228,16 @@ public Predicate buildCriteriaFilter(EnvironmentCriteria environmentCriteria, En filter = CriteriaBuilderHelper .and(cb, filter, cb.equal(joins.getResponsibleUser().get(User.UUID), environmentCriteria.getResponsibleUser().getUuid())); } - if (environmentCriteria.getGpsLatFrom() != null && environmentCriteria.getGpsLatTo() != null) { - filter = CriteriaBuilderHelper.and( + filter = CriteriaBuilderHelper.and( + cb, + filter, + buildGpsCoordinatesFilter( + environmentCriteria.getGpsLatFrom(), + environmentCriteria.getGpsLatTo(), + environmentCriteria.getGpsLonFrom(), + environmentCriteria.getGpsLonTo(), cb, - filter, - cb.between(joins.getLocation().get(Location.LATITUDE), environmentCriteria.getGpsLatFrom(), environmentCriteria.getGpsLatTo())); - } else if (environmentCriteria.getGpsLatFrom() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.greaterThanOrEqualTo(joins.getLocation().get(Location.LATITUDE), environmentCriteria.getGpsLatFrom())); - } else if (environmentCriteria.getGpsLatTo() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.lessThanOrEqualTo(joins.getLocation().get(Location.LATITUDE), environmentCriteria.getGpsLatTo())); - } - if (environmentCriteria.getGpsLonFrom() != null && environmentCriteria.getGpsLonTo() != null) { - filter = CriteriaBuilderHelper.and( - cb, - filter, - cb.between(joins.getLocation().get(Location.LONGITUDE), environmentCriteria.getGpsLonFrom(), environmentCriteria.getGpsLonTo())); - } else if (environmentCriteria.getGpsLonFrom() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.greaterThanOrEqualTo(joins.getLocation().get(Location.LONGITUDE), environmentCriteria.getGpsLonFrom())); - } else if (environmentCriteria.getGpsLonTo() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.lessThanOrEqualTo(joins.getLocation().get(Location.LONGITUDE), environmentCriteria.getGpsLonTo())); - } + joins)); return filter; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java index c5338290878..df179d25a6e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java @@ -50,9 +50,17 @@ public class EnvironmentSample extends DeletableAdo { public static final String ENVIRONMENT = "environment"; + public static final String REPORT_DATE = "reportDate"; public static final String REPORTING_USER = "reportingUser"; + public static final String SAMPLE_DATE_TIME = "sampleDateTime"; public static final String LABORATORY = "laboratory"; public static final String LOCATION = "location"; + public static final String DISPATCHED = "dispatched"; + public static final String DISPATCH_DATE = "dispatchDate"; + public static final String RECEIVED = "received"; + public static final String SAMPLE_MATERIAL = "sampleMaterial"; + public static final String OTHER_SAMPLE_MATERIAL = "otherSampleMaterial"; + public static final String FIELD_SAMPLE_ID = "fieldSampleId"; private static final long serialVersionUID = 7237701234186874155L; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java index c42518a29d2..75b9877a401 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java @@ -20,15 +20,22 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.inject.Inject; +import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import javax.persistence.criteria.Selection; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -42,6 +49,7 @@ import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleFacade; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; +import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.i18n.Validations; @@ -54,16 +62,23 @@ import de.symeda.sormas.backend.FacadeHelper; import de.symeda.sormas.backend.common.AbstractBaseEjb; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; +import de.symeda.sormas.backend.environment.Environment; import de.symeda.sormas.backend.environment.EnvironmentFacadeEjb; import de.symeda.sormas.backend.environment.EnvironmentService; +import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.facility.Facility; import de.symeda.sormas.backend.infrastructure.facility.FacilityFacadeEjb; import de.symeda.sormas.backend.infrastructure.facility.FacilityService; +import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.location.LocationFacadeEjb; import de.symeda.sormas.backend.location.LocationFacadeEjb.LocationFacadeEjbLocal; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.util.DtoHelper; +import de.symeda.sormas.backend.util.IterableHelper; +import de.symeda.sormas.backend.util.JurisdictionHelper; +import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.Pseudonymizer; +import de.symeda.sormas.backend.util.QueryHelper; import de.symeda.sormas.backend.util.RightsAllowed; @Stateless(name = "EnvironmentSampleFacade") @@ -118,9 +133,11 @@ public long count(EnvironmentSampleCriteria criteria) { Root from = cq.from(EnvironmentSample.class); EnvironmentSampleQueryContext queryContext = new EnvironmentSampleQueryContext(cb, cq, from, new EnvironmentSampleJoins(from)); - Predicate filter = CriteriaBuilderHelper.and(cb, service.createUserFilter(cb, cq, from), service.createDefaultFilter(cb, from)); + Predicate filter = service.createUserFilter(cb, cq, from); if (criteria != null) { filter = CriteriaBuilderHelper.and(cb, filter, service.buildCriteriaFilter(criteria, queryContext)); + } else { + filter = CriteriaBuilderHelper.and(cb, filter, service.createDefaultFilter(cb, from)); } if (filter != null) { @@ -137,7 +154,135 @@ public List getIndexList( Integer first, Integer max, List sortProperties) { - throw new UnsupportedOperationException("Not implemented yet"); + List indexListIds = getIndexListIds(criteria, first, max, sortProperties); + + CriteriaBuilder cb = em.getCriteriaBuilder(); + + List indexList = new ArrayList<>(); + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + CriteriaQuery cq = cb.createQuery(EnvironmentSampleIndexDto.class); + Root from = cq.from(EnvironmentSample.class); + EnvironmentSampleJoins joins = new EnvironmentSampleJoins(from); + EnvironmentSampleQueryContext queryContext = new EnvironmentSampleQueryContext(cb, cq, from, joins); + Join location = joins.getLocation(); + + cq.multiselect( + from.get(EnvironmentSampleIndexDto.UUID), + from.get(EnvironmentSampleIndexDto.FIELD_SAMPLE_ID), + from.get(EnvironmentSampleIndexDto.SAMPLE_DATE_TIME), + joins.getEnvironment().get(Environment.ENVIRONMENT_NAME), + location.get(Location.STREET), + location.get(Location.HOUSE_NUMBER), + location.get(Location.POSTAL_CODE), + location.get(Location.CITY), + joins.getLocationJoins().getDistrict().get(District.NAME), + from.get(EnvironmentSample.DISPATCHED), + from.get(EnvironmentSample.DISPATCH_DATE), + from.get(EnvironmentSample.RECEIVED), + joins.getLaboratory().get(Facility.NAME), + from.get(EnvironmentSample.SAMPLE_MATERIAL), + from.get(EnvironmentSample.OTHER_SAMPLE_MATERIAL), + from.get(EnvironmentSample.DELETION_REASON), + from.get(EnvironmentSample.OTHER_DELETION_REASON), + JurisdictionHelper.booleanSelector(cb, service.inJurisdictionOrOwned(queryContext))); + + cq.where(from.get(EnvironmentSample.ID).in(batchedIds)); + + sortBy(sortProperties, queryContext); + + indexList.addAll(QueryHelper.getResultList(em, cq, null, null)); + }); + + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + pseudonymizer.pseudonymizeDtoCollection(EnvironmentSampleIndexDto.class, indexList, EnvironmentSampleIndexDto::isInJurisdiction, null); + + return indexList; + } + + private List getIndexListIds(EnvironmentSampleCriteria criteria, Integer first, Integer max, List sortProperties) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createTupleQuery(); + Root from = cq.from(EnvironmentSample.class); + + EnvironmentSampleQueryContext queryContext = new EnvironmentSampleQueryContext(cb, cq, from, new EnvironmentSampleJoins(from)); + + List> selections = new ArrayList<>(); + selections.add(from.get(EnvironmentSample.ID)); + selections.addAll(sortBy(sortProperties, queryContext)); + + cq.multiselect(selections); + + Predicate filter = service.createUserFilter(cb, cq, from); + if (criteria != null) { + filter = CriteriaBuilderHelper.and(cb, filter, service.buildCriteriaFilter(criteria, queryContext)); + } else { + filter = CriteriaBuilderHelper.and(cb, filter, service.createDefaultFilter(cb, from)); + } + + if (filter != null) { + cq.where(filter); + } + + List samples = QueryHelper.getResultList(em, cq, first, max); + return samples.stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + } + + private List> sortBy(List sortProperties, EnvironmentSampleQueryContext queryContext) { + + List> selections = new ArrayList<>(); + CriteriaBuilder cb = queryContext.getCriteriaBuilder(); + CriteriaQuery cq = queryContext.getQuery(); + + if (sortProperties != null && !sortProperties.isEmpty()) { + List order = new ArrayList<>(sortProperties.size()); + for (SortProperty sortProperty : sortProperties) { + Expression expression; + + /* + * joins.getLocationJoins().getDistrict().get(District.NAME), + * joins.getLaboratory().get(Facility.NAME), + */ + + switch (sortProperty.propertyName) { + case EnvironmentSampleIndexDto.UUID: + case EnvironmentSampleIndexDto.FIELD_SAMPLE_ID: + case EnvironmentSampleIndexDto.SAMPLE_DATE_TIME: + case EnvironmentSampleIndexDto.DISPATCHED: + case EnvironmentSampleIndexDto.DISPATCH_DATE: + case EnvironmentSampleIndexDto.RECEIVED: + case EnvironmentSampleIndexDto.SAMPLE_MATERIAL: + expression = queryContext.getRoot().get(sortProperty.propertyName); + break; + case EnvironmentSampleIndexDto.ENVIRONMENT: + expression = queryContext.getJoins().getEnvironment().get(Environment.ENVIRONMENT_NAME); + break; + case EnvironmentSampleIndexDto.LOCATION: + Join location = queryContext.getJoins().getLocation(); + expression = cb.concat( + cb.concat(cb.concat(location.get(Location.STREET), location.get(Location.HOUSE_NUMBER)), location.get(Location.POSTAL_CODE)), + location.get(Location.CITY)); + break; + case EnvironmentSampleIndexDto.DISTRICT: + expression = queryContext.getJoins().getLocationJoins().getDistrict().get(District.NAME); + break; + case EnvironmentSampleIndexDto.LABORATORY: + expression = queryContext.getJoins().getLaboratory().get(Facility.NAME); + break; + default: + throw new IllegalArgumentException(sortProperty.propertyName); + } + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + selections.add(expression); + } + cq.orderBy(order); + } else { + Path changeDate = queryContext.getRoot().get(EnvironmentSample.CHANGE_DATE); + cq.orderBy(cb.desc(changeDate)); + selections.add(changeDate); + } + + return selections; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleJoins.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleJoins.java index b39f53f86a4..c8f92b58421 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleJoins.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleJoins.java @@ -24,10 +24,12 @@ import de.symeda.sormas.backend.environment.EnvironmentJoins; import de.symeda.sormas.backend.infrastructure.facility.Facility; import de.symeda.sormas.backend.location.Location; +import de.symeda.sormas.backend.location.LocationJoins; public class EnvironmentSampleJoins extends QueryJoins { private Join location; + private LocationJoins locationJoins; private Join environment; private EnvironmentJoins environmentJoins; private Join laboratory; @@ -44,6 +46,14 @@ private void setLocation(Join location) { this.location = location; } + public LocationJoins getLocationJoins() { + return getOrCreate(locationJoins, () -> new LocationJoins(getRoot().join(EnvironmentSample.LOCATION)), this::setLocationJoins); + } + + private void setLocationJoins(LocationJoins locationJoins) { + this.locationJoins = locationJoins; + } + public Join getEnvironment() { return getOrCreate(environment, EnvironmentSample.ENVIRONMENT, JoinType.LEFT, this::setEnvironment); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java index da207ca6927..2d0ab19c8c6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java @@ -23,11 +23,19 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; +import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; +import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; +import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractDeletableAdoService; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; +import de.symeda.sormas.backend.environment.Environment; +import de.symeda.sormas.backend.environment.EnvironmentService; +import de.symeda.sormas.backend.infrastructure.district.District; +import de.symeda.sormas.backend.infrastructure.facility.Facility; +import de.symeda.sormas.backend.infrastructure.region.Region; import de.symeda.sormas.backend.user.UserService; @Stateless @@ -64,13 +72,98 @@ public boolean inJurisdictionOrOwned(EnvironmentSample sample) { return fulfillsCondition(sample, this::inJurisdictionOrOwned); } + public Predicate inJurisdictionOrOwned(EnvironmentSampleQueryContext queryContext) { + return EnvironmentSampleJurisdictionValidator.of(queryContext, getCurrentUser()).inJurisdictionOrOwned(); + } + @Override public List getInJurisdictionIds(List samples) { return getIdList(samples, this::inJurisdictionOrOwned); } public Predicate buildCriteriaFilter(EnvironmentSampleCriteria criteria, EnvironmentSampleQueryContext queryContext) { - return null; + From sampleRoot = queryContext.getRoot(); + CriteriaBuilder cb = queryContext.getCriteriaBuilder(); + EnvironmentSampleJoins joins = queryContext.getJoins(); + + Predicate filter = null; + if (criteria.getRelevanceStatus() != null) { + Path environmentArchived = joins.getEnvironment().get(Environment.ARCHIVED); + + if (criteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.or(cb.isNull(environmentArchived), cb.isFalse(environmentArchived))); + } else if (criteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(environmentArchived)); + } else if (criteria.getRelevanceStatus() == EntityRelevanceStatus.DELETED) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sampleRoot.get(EnvironmentSample.DELETED), true)); + } + } + if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(sampleRoot.get(EnvironmentSample.DELETED))); + } + if (criteria.getDispatched() != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sampleRoot.get(EnvironmentSample.DISPATCHED), criteria.getDispatched())); + } + if (criteria.getReceived() != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sampleRoot.get(EnvironmentSample.RECEIVED), criteria.getReceived())); + } + if (criteria.getFreeText() != null) { + String[] textFilters = criteria.getFreeText().split("\\s+"); + for (String textFilter : textFilters) { + if (DataHelper.isNullOrEmpty(textFilter)) { + continue; + } + + Predicate likeFilters = cb.or( + CriteriaBuilderHelper.ilike(cb, sampleRoot.get(EnvironmentSample.UUID), textFilter), + CriteriaBuilderHelper.unaccentedIlike(cb, sampleRoot.get(EnvironmentSample.FIELD_SAMPLE_ID), textFilter), + CriteriaBuilderHelper.ilike(cb, joins.getEnvironment().get(Environment.UUID), textFilter), + CriteriaBuilderHelper.unaccentedIlike(cb, joins.getEnvironment().get(Environment.ENVIRONMENT_NAME), textFilter)); + + filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); + } + } + if (criteria.getRegion() != null) { + filter = CriteriaBuilderHelper.and( + cb, + filter, + cb.equal(joins.getEnvironmentJoins().getLocationJoins().getRegion().get(Region.UUID), criteria.getRegion().getUuid())); + } + if (criteria.getDistrict() != null) { + filter = CriteriaBuilderHelper.and( + cb, + filter, + cb.equal(joins.getEnvironmentJoins().getLocationJoins().getDistrict().get(District.UUID), criteria.getDistrict().getUuid())); + } + if (criteria.getLaboratory() != null) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getLaboratory().get(Facility.UUID), criteria.getLaboratory().getUuid())); + } + if (criteria.getTestedPathogen() != null) { + throw new UnsupportedOperationException("Tested pathogen is not supported yet"); + } + if (criteria.getReportDateFrom() != null && criteria.getReportDateTo() != null) { + filter = CriteriaBuilderHelper + .and(cb, filter, cb.between(sampleRoot.get(EnvironmentSample.REPORT_DATE), criteria.getReportDateFrom(), criteria.getReportDateTo())); + } else if (criteria.getReportDateFrom() != null) { + filter = CriteriaBuilderHelper + .and(cb, filter, cb.greaterThanOrEqualTo(sampleRoot.get(EnvironmentSample.REPORT_DATE), criteria.getReportDateFrom())); + } else if (criteria.getReportDateTo() != null) { + filter = CriteriaBuilderHelper + .and(cb, filter, cb.lessThanOrEqualTo(sampleRoot.get(EnvironmentSample.REPORT_DATE), criteria.getReportDateTo())); + } + + filter = CriteriaBuilderHelper.and( + cb, + filter, + EnvironmentService.buildGpsCoordinatesFilter( + criteria.getGpsLatFrom(), + criteria.getGpsLatTo(), + criteria.getGpsLonFrom(), + criteria.getGpsLonTo(), + cb, + joins.getEnvironmentJoins())); + + return filter; } private Predicate inJurisdictionOrOwned(CriteriaBuilder cb, CriteriaQuery cq, From from) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java index cd5d0b97fe5..17cc41c0f98 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java @@ -70,6 +70,7 @@ import de.symeda.sormas.api.environment.EnvironmentReferenceDto; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleMaterial; +import de.symeda.sormas.api.environment.environmentsample.Pathogen; import de.symeda.sormas.api.epidata.EpiDataDto; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventInvestigationStatus; @@ -2105,6 +2106,18 @@ public DiseaseVariant createDiseaseVariant(String name, Disease disease) { return beanTest.getCustomizableEnumFacade().getEnumValue(CustomizableEnumType.DISEASE_VARIANT, name); } + public Pathogen createPathogen(String value, String caption) { + + CustomizableEnumValue pathogen = new CustomizableEnumValue(); + pathogen.setDataType(CustomizableEnumType.PATHOGEN); + pathogen.setValue(value); + pathogen.setCaption(caption); + + beanTest.getCustomizableEnumValueService().ensurePersisted(pathogen); + + return beanTest.getCustomizableEnumFacade().getEnumValue(CustomizableEnumType.PATHOGEN, value); + } + public ExternalShareInfo createExternalShareInfo( CaseReferenceDto caze, UserReferenceDto sender, @@ -2249,8 +2262,12 @@ public ShareRequestInfo createShareRequestInfo( return requestInfo; } - public EnvironmentDto createEnvironment(String name, EnvironmentMedia environmentMedia, UserReferenceDto reportingUser, RDCF rdcf) { - + public EnvironmentDto createEnvironment( + String name, + EnvironmentMedia environmentMedia, + UserReferenceDto reportingUser, + RDCF rdcf, + Consumer extraConfig) { EnvironmentDto environment = EnvironmentDto.build(); environment.setEnvironmentName(name); environment.setEnvironmentMedia(environmentMedia); @@ -2264,9 +2281,18 @@ public EnvironmentDto createEnvironment(String name, EnvironmentMedia environmen location.setCommunity(rdcf.community); } + if (extraConfig != null) { + extraConfig.accept(environment); + } + environment = beanTest.getEnvironmentFacade().save(environment); return environment; + + } + + public EnvironmentDto createEnvironment(String name, EnvironmentMedia environmentMedia, UserReferenceDto reportingUser, RDCF rdcf) { + return createEnvironment(name, environmentMedia, reportingUser, rdcf, null); } public EnvironmentSampleDto createEnvironmentSample( diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java index 7015251fde7..792010ca23f 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjbTest.java @@ -22,25 +22,32 @@ import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.time.LocalDate; +import java.time.ZoneId; import java.util.Arrays; import java.util.Date; import java.util.List; import org.junit.jupiter.api.Test; +import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.environment.EnvironmentDto; import de.symeda.sormas.api.environment.EnvironmentMedia; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleMaterial; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; +import de.symeda.sormas.api.environment.environmentsample.Pathogen; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityType; +import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.person.PersonAddressType; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.JurisdictionLevel; @@ -390,10 +397,268 @@ public void testUpdateWithUserOutsideJurisdiction() { public void testCount() { creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), null); creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), null); + FacilityDto lab2 = creator.createFacility("Lab2", rdcf2.region, rdcf2.district, rdcf2.community, FacilityType.LABORATORY); + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab2.toReference(), (s) -> { + s.getLocation().setRegion(rdcf2.region); + s.getLocation().setDistrict(rdcf2.district); + }); + + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab2.toReference(), (s) -> { + s.setDispatched(true); + s.getLocation().setRegion(rdcf2.region); + s.getLocation().setDistrict(rdcf2.district); + }); + + assertThat(getEnvironmentSampleFacade().count(null), is(4L)); + assertThat(getEnvironmentSampleFacade().count(new EnvironmentSampleCriteria()), is(4L)); + EnvironmentSampleCriteria criteria = new EnvironmentSampleCriteria(); + criteria.setLaboratory(lab.toReference()); + assertThat(getEnvironmentSampleFacade().count(criteria), is(2L)); + + loginWith(userInDifferentJurisdiction); + EnvironmentSampleCriteria criteria2 = new EnvironmentSampleCriteria(); + criteria2.setDispatched(true); + assertThat(getEnvironmentSampleFacade().count(criteria2), is(1L)); + } + + @Test + public void testGetIndexList() { + EnvironmentSampleDto sample1InLab1 = + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), s -> { + s.setFieldSampleId("field_sample-1"); + s.getLocation().setRegion(rdcf.region); + s.getLocation().setDistrict(rdcf.district); + s.getLocation().setStreet("street"); + s.getLocation().setHouseNumber("1"); + s.getLocation().setPostalCode("12345"); + s.getLocation().setCity("city"); + s.setDispatched(true); + s.setDispatchDate(new Date()); + s.setReceived(false); + s.setSampleMaterial(EnvironmentSampleMaterial.OTHER); + s.setOtherSampleMaterial("Other sample material"); + }); creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), null); + FacilityDto lab2 = creator.createFacility("Lab2", rdcf2.region, rdcf2.district, rdcf2.community, FacilityType.LABORATORY); + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab2.toReference(), (s) -> { + s.getLocation().setRegion(rdcf2.region); + s.getLocation().setDistrict(rdcf2.district); + }); - assertThat(getEnvironmentSampleFacade().count(null), is(3L)); - assertThat(getEnvironmentSampleFacade().count(new EnvironmentSampleCriteria()), is(3L)); + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab2.toReference(), (s) -> { + s.setDispatched(true); + s.getLocation().setRegion(rdcf2.region); + s.getLocation().setDistrict(rdcf2.district); + }); + + assertThat(getEnvironmentSampleFacade().getIndexList(null, null, null, null), hasSize(4)); + assertThat(getEnvironmentSampleFacade().getIndexList(new EnvironmentSampleCriteria(), 0, 100, null), hasSize(4)); + assertThat(getEnvironmentSampleFacade().getIndexList(new EnvironmentSampleCriteria(), 0, 2, null), hasSize(2)); + + EnvironmentSampleCriteria criteria = new EnvironmentSampleCriteria(); + criteria.setLaboratory(lab.toReference()); + List samplesInLab1 = getEnvironmentSampleFacade().getIndexList(criteria, null, null, null); + + assertThat(samplesInLab1, hasSize(2)); + + EnvironmentSampleIndexDto sample1Index = samplesInLab1.stream().filter(s -> s.getUuid().equals(sample1InLab1.getUuid())).findFirst().get(); + assertThat(sample1Index.getFieldSampleId(), is(sample1InLab1.getFieldSampleId())); + assertThat(sample1Index.getSampleDateTime().getTime(), is(sample1InLab1.getSampleDateTime().getTime())); + assertThat(sample1Index.getEnvironment(), is(environment.getEnvironmentName())); + LocationDto location = sample1InLab1.getLocation(); + assertThat( + sample1Index.getLocation(), + is(LocationDto.buildAddressCaption(location.getStreet(), location.getHouseNumber(), location.getPostalCode(), location.getCity()))); + assertThat(sample1Index.getDistrict(), is(sample1InLab1.getLocation().getDistrict().getCaption())); + assertThat(sample1Index.isDispatched(), is(sample1InLab1.isDispatched())); + assertThat(sample1Index.getDispatchDate().getTime(), is(sample1InLab1.getDispatchDate().getTime())); + assertThat(sample1Index.isReceived(), is(sample1InLab1.isReceived())); + assertThat(sample1Index.getLaboratory(), is(lab.getName())); + assertThat(sample1Index.getSampleMaterial(), is(sample1InLab1.getSampleMaterial())); + assertThat(sample1Index.getOtherSampleMaterial(), is(sample1InLab1.getOtherSampleMaterial())); + assertThat(sample1Index.getPositivePathogenTests(), is(0L)); + assertThat(sample1Index.getLatestPathogenTest(), is(nullValue())); + assertThat(sample1Index.getNumberOfTests(), is(0L)); + assertThat(sample1Index.getDeletionReason(), is(nullValue())); + assertThat(sample1Index.getOtherDeletionReason(), is(nullValue())); + + EnvironmentSampleCriteria freetextCriteria = new EnvironmentSampleCriteria(); + freetextCriteria.setFreeText(DataHelper.getShortUuid(sample1InLab1)); + assertThat(getEnvironmentSampleFacade().getIndexList(freetextCriteria, null, null, null), hasSize(1)); + + // region and district refers to the location of environment + EnvironmentSampleCriteria regionDistrictCriteria = new EnvironmentSampleCriteria(); + regionDistrictCriteria.setRegion(rdcf.region); + regionDistrictCriteria.setDistrict(rdcf.district); + + // all samples are linked to the same environment + assertThat(getEnvironmentSampleFacade().getIndexList(regionDistrictCriteria, null, null, null), hasSize(4)); + + loginWith(userInDifferentJurisdiction); + EnvironmentSampleCriteria criteria2 = new EnvironmentSampleCriteria(); + criteria2.setDispatched(true); + assertThat(getEnvironmentSampleFacade().getIndexList(criteria2, null, null, null), hasSize(1)); + EnvironmentSampleCriteria criteria3 = new EnvironmentSampleCriteria(); + criteria2.setReceived(false); + assertThat(getEnvironmentSampleFacade().getIndexList(criteria3, null, null, null), hasSize(2)); + } + + @Test + public void testRelevanceStatusFilter() { + EnvironmentDto environment1 = creator.createEnvironment("Env1", EnvironmentMedia.WATER, reportingUser.toReference(), rdcf); + EnvironmentSampleDto sample1 = + creator.createEnvironmentSample(environment1.toReference(), reportingUser.toReference(), lab.toReference(), null); + + EnvironmentDto environment2 = creator.createEnvironment("Env1", EnvironmentMedia.WATER, reportingUser.toReference(), rdcf); + EnvironmentSampleDto sample2 = + creator.createEnvironmentSample(environment2.toReference(), reportingUser.toReference(), lab.toReference(), null); + getEnvironmentFacade().archive(environment1.getUuid(), new Date()); + + EnvironmentDto environment3 = creator.createEnvironment("Env1", EnvironmentMedia.WATER, reportingUser.toReference(), rdcf); + EnvironmentSampleDto sample3 = + creator.createEnvironmentSample(environment3.toReference(), reportingUser.toReference(), lab.toReference(), null); + getEnvironmentSampleFacade().delete(sample3.getUuid(), new DeletionDetails(DeletionReason.OTHER_REASON, "Test reason")); + + EnvironmentSampleCriteria noRelevanceCriteria = new EnvironmentSampleCriteria(); + assertThat(getEnvironmentSampleFacade().count(noRelevanceCriteria), is(2L)); + assertThat(getEnvironmentSampleFacade().getIndexList(noRelevanceCriteria, null, null, null), hasSize(2)); + + EnvironmentSampleCriteria activeCriteria = new EnvironmentSampleCriteria(); + activeCriteria.setRelevanceStatus(EntityRelevanceStatus.ACTIVE); + assertThat(getEnvironmentSampleFacade().count(activeCriteria), is(1L)); + assertThat(getEnvironmentSampleFacade().getIndexList(activeCriteria, null, null, null), hasSize(1)); + + EnvironmentSampleCriteria archivedCriteria = new EnvironmentSampleCriteria(); + archivedCriteria.setRelevanceStatus(EntityRelevanceStatus.ARCHIVED); + assertThat(getEnvironmentSampleFacade().count(archivedCriteria), is(1L)); + assertThat(getEnvironmentSampleFacade().getIndexList(archivedCriteria, null, null, null), hasSize(1)); + + EnvironmentSampleCriteria deletedCriteria = new EnvironmentSampleCriteria(); + deletedCriteria.setRelevanceStatus(EntityRelevanceStatus.DELETED); + assertThat(getEnvironmentSampleFacade().count(deletedCriteria), is(1L)); + assertThat(getEnvironmentSampleFacade().getIndexList(deletedCriteria, null, null, null), hasSize(1)); + } + + @Test + public void testSampleDateFilter() { + EnvironmentSampleDto sample1 = + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), s -> { + s.setReportDate(Date.from(LocalDate.of(2023, 9, 4).atStartOfDay(ZoneId.systemDefault()).toInstant())); + }); + + EnvironmentSampleDto sample2 = + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), s -> { + s.setReportDate(Date.from(LocalDate.of(2023, 9, 6).atStartOfDay(ZoneId.systemDefault()).toInstant())); + }); + + EnvironmentSampleDto sample3 = + creator.createEnvironmentSample(environment.toReference(), reportingUser.toReference(), lab.toReference(), s -> { + s.setReportDate(Date.from(LocalDate.of(2023, 9, 7).atStartOfDay(ZoneId.systemDefault()).toInstant())); + }); + + EnvironmentSampleCriteria sampleDateFromCriteria = new EnvironmentSampleCriteria(); + sampleDateFromCriteria.setReportDateFrom(Date.from(LocalDate.of(2023, 9, 5).atStartOfDay(ZoneId.systemDefault()).toInstant())); + List samplesFrom = getEnvironmentSampleFacade().getIndexList(sampleDateFromCriteria, null, null, null); + assertThat(samplesFrom, hasSize(2)); + assertThat(samplesFrom.stream().filter(s -> s.getUuid().equals(sample2.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria sampleDateToCriteria = new EnvironmentSampleCriteria(); + sampleDateToCriteria.setReportDateTo(Date.from(LocalDate.of(2023, 9, 5).atStartOfDay(ZoneId.systemDefault()).toInstant())); + List samplesTo = getEnvironmentSampleFacade().getIndexList(sampleDateToCriteria, null, null, null); + assertThat(samplesTo, hasSize(1)); + assertThat(samplesTo.stream().filter(s -> s.getUuid().equals(sample1.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria sampleDateRangeCriteria = new EnvironmentSampleCriteria(); + sampleDateRangeCriteria.setReportDateFrom(Date.from(LocalDate.of(2023, 9, 5).atStartOfDay(ZoneId.systemDefault()).toInstant())); + sampleDateRangeCriteria.setReportDateTo(Date.from(LocalDate.of(2023, 9, 7).atStartOfDay(ZoneId.systemDefault()).toInstant())); + List samplesInRange = getEnvironmentSampleFacade().getIndexList(sampleDateRangeCriteria, null, null, null); + assertThat(samplesInRange, hasSize(2)); + assertThat(samplesInRange.stream().filter(s -> s.getUuid().equals(sample2.getUuid())).findFirst().orElse(null), is(notNullValue())); + assertThat(samplesInRange.stream().filter(s -> s.getUuid().equals(sample3.getUuid())).findFirst().orElse(null), is(notNullValue())); + } + + @Test + public void testGpsCoordinatesFilter() { + EnvironmentDto environment1 = creator.createEnvironment("Env1", EnvironmentMedia.WATER, reportingUser.toReference(), rdcf, e -> { + e.getLocation().setLatitude(20.0); + e.getLocation().setLongitude(36.0); + }); + EnvironmentSampleDto sample1 = + creator.createEnvironmentSample(environment1.toReference(), reportingUser.toReference(), lab.toReference(), null); + + EnvironmentDto environment2 = creator.createEnvironment("Env1", EnvironmentMedia.WATER, reportingUser.toReference(), rdcf, e -> { + e.getLocation().setLatitude(23.0); + e.getLocation().setLongitude(38.0); + }); + EnvironmentSampleDto sample2 = + creator.createEnvironmentSample(environment2.toReference(), reportingUser.toReference(), lab.toReference(), null); + + EnvironmentDto environment3 = creator.createEnvironment("Env1", EnvironmentMedia.WATER, reportingUser.toReference(), rdcf, e -> { + e.getLocation().setLatitude(24.0); + e.getLocation().setLongitude(39.0); + }); + EnvironmentSampleDto sample3 = + creator.createEnvironmentSample(environment3.toReference(), reportingUser.toReference(), lab.toReference(), null); + + EnvironmentSampleCriteria gpsLatFromCriteria = new EnvironmentSampleCriteria(); + gpsLatFromCriteria.setGpsLatFrom(22.0); + List samplesLatFrom = getEnvironmentSampleFacade().getIndexList(gpsLatFromCriteria, null, null, null); + assertThat(samplesLatFrom, hasSize(2)); + assertThat(samplesLatFrom.stream().filter(s -> s.getUuid().equals(sample2.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria gpsLatToCriteria = new EnvironmentSampleCriteria(); + gpsLatToCriteria.setGpsLatTo(22.0); + List samplesLatTo = getEnvironmentSampleFacade().getIndexList(gpsLatToCriteria, null, null, null); + assertThat(samplesLatTo, hasSize(1)); + assertThat(samplesLatTo.stream().filter(s -> s.getUuid().equals(sample1.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria gpsLatRangeCriteria = new EnvironmentSampleCriteria(); + gpsLatRangeCriteria.setGpsLatFrom(22.0); + gpsLatRangeCriteria.setGpsLatTo(24.0); + List samplesLatInRange = getEnvironmentSampleFacade().getIndexList(gpsLatRangeCriteria, null, null, null); + assertThat(samplesLatInRange, hasSize(2)); + assertThat(samplesLatInRange.stream().filter(s -> s.getUuid().equals(sample2.getUuid())).findFirst().orElse(null), is(notNullValue())); + assertThat(samplesLatInRange.stream().filter(s -> s.getUuid().equals(sample3.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria gpsLonFromCriteria = new EnvironmentSampleCriteria(); + gpsLonFromCriteria.setGpsLonFrom(37.0); + List samplesLonFrom = getEnvironmentSampleFacade().getIndexList(gpsLonFromCriteria, null, null, null); + assertThat(samplesLonFrom, hasSize(2)); + assertThat(samplesLonFrom.stream().filter(s -> s.getUuid().equals(sample2.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria gpsLonToCriteria = new EnvironmentSampleCriteria(); + gpsLonToCriteria.setGpsLonTo(37.0); + List samplesLonTo = getEnvironmentSampleFacade().getIndexList(gpsLonToCriteria, null, null, null); + assertThat(samplesLonTo, hasSize(1)); + assertThat(samplesLonTo.stream().filter(s -> s.getUuid().equals(sample1.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria gpsLonRangeCriteria = new EnvironmentSampleCriteria(); + gpsLonRangeCriteria.setGpsLonFrom(37.0); + gpsLonRangeCriteria.setGpsLonTo(39.0); + List samplesLonInRange = getEnvironmentSampleFacade().getIndexList(gpsLonRangeCriteria, null, null, null); + assertThat(samplesLonInRange, hasSize(2)); + assertThat(samplesLonInRange.stream().filter(s -> s.getUuid().equals(sample2.getUuid())).findFirst().orElse(null), is(notNullValue())); + assertThat(samplesLonInRange.stream().filter(s -> s.getUuid().equals(sample3.getUuid())).findFirst().orElse(null), is(notNullValue())); + + EnvironmentSampleCriteria gpsLatLonRangeCriteria = new EnvironmentSampleCriteria(); + gpsLatRangeCriteria.setGpsLatFrom(22.0); + gpsLatRangeCriteria.setGpsLatTo(24.0); + gpsLatLonRangeCriteria.setGpsLonFrom(37.0); + gpsLatLonRangeCriteria.setGpsLonTo(39.0); + List samplesLatLonInRange = getEnvironmentSampleFacade().getIndexList(gpsLatLonRangeCriteria, null, null, null); + assertThat(samplesLatLonInRange, hasSize(2)); + assertThat(samplesLatLonInRange.stream().filter(s -> s.getUuid().equals(sample2.getUuid())).findFirst().orElse(null), is(notNullValue())); + assertThat(samplesLatLonInRange.stream().filter(s -> s.getUuid().equals(sample3.getUuid())).findFirst().orElse(null), is(notNullValue())); + } + + @Test + public void testTestedPathogenFilter() { + Pathogen pathogen = creator.createPathogen("TEST_PATHOGEN", "test pathogen"); + + EnvironmentSampleCriteria criteria = new EnvironmentSampleCriteria(); + criteria.setTestedPathogen(pathogen); + + assertThrows(UnsupportedOperationException.class, () -> getEnvironmentSampleFacade().getIndexList(criteria, null, null, null)); } @Test @@ -423,7 +688,7 @@ public void testDelete() { assertThat(deletedUuids, not(containsInAnyOrder(deletedSample.getUuid()))); assertThat(deletedUuids, containsInAnyOrder(sample1.getUuid(), sample2.getUuid())); - assertThat(getEnvironmentSampleFacade().count(null), is(0L)); + assertThat(getEnvironmentSampleFacade().count(new EnvironmentSampleCriteria()), is(0L)); } @Test diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java index f36f51e1590..477199033c8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java @@ -37,6 +37,7 @@ import de.symeda.sormas.ui.person.PersonController; import de.symeda.sormas.ui.reports.aggregate.AggregateReportController; import de.symeda.sormas.ui.samples.AdditionalTestController; +import de.symeda.sormas.ui.samples.EnvironmentSampleController; import de.symeda.sormas.ui.samples.PathogenTestController; import de.symeda.sormas.ui.samples.SampleController; import de.symeda.sormas.ui.sormastosormas.SormasToSormasController; @@ -89,6 +90,7 @@ public class ControllerProvider extends BaseControllerProvider { private final DeleteRestoreController deleteRestoreController; private final EnvironmentController environmentController; private final PermanentDeleteController permanentDeleteController; + private final EnvironmentSampleController environmentSampleController; public ControllerProvider() { super(); @@ -127,6 +129,7 @@ public ControllerProvider() { deleteRestoreController = new DeleteRestoreController(); environmentController = new EnvironmentController(); permanentDeleteController = new PermanentDeleteController(); + environmentSampleController = new EnvironmentSampleController(); } protected static ControllerProvider get() { @@ -267,4 +270,8 @@ public static EnvironmentController getEnvironmentController() { public static PermanentDeleteController getPermanentDeleteController() { return get().permanentDeleteController; } + + public static EnvironmentSampleController getEnvironmentSampleController() { + return get().environmentSampleController; + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index 3dedd5e9a25..fdee38df702 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -779,7 +779,10 @@ BulkOperationHandler. forBulkEdit() editView.addDiscardListener(popupWindow::close); } - private Consumer> bulkOperationCallback(String caseUuid, AbstractContactGrid contactGrid, Window popupWindow) { + private Consumer> bulkOperationCallback( + String caseUuid, + AbstractContactGrid contactGrid, + Window popupWindow) { return remainingContacts -> { if (popupWindow != null) { popupWindow.close(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java new file mode 100644 index 00000000000..11c72d8d4f9 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java @@ -0,0 +1,72 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples; + +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; + +import org.apache.commons.collections.CollectionUtils; + +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; +import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.utils.DeleteRestoreHandlers; + +public class EnvironmentSampleController { + + public EnvironmentSampleController() { + // do nothing + } + + public void deleteAllSelectedItems( + Collection selectedRows, + EnvironmentSampleGrid sampleGrid, + Runnable noEntriesRemainingCallback) { + + ControllerProvider.getDeleteRestoreController() + .deleteAllSelectedItems( + selectedRows, + null, + null, + DeleteRestoreHandlers.forEnvironmentSample(), + bulkOperationCallback(sampleGrid, noEntriesRemainingCallback)); + + } + + public void restoreSelectedSamples( + Collection selectedRows, + EnvironmentSampleGrid sampleGrid, + Runnable noEntriesRemainingCallback) { + + ControllerProvider.getDeleteRestoreController() + .restoreSelectedItems( + selectedRows, + DeleteRestoreHandlers.forEnvironmentSample(), + bulkOperationCallback(sampleGrid, noEntriesRemainingCallback)); + } + + private Consumer> bulkOperationCallback(EnvironmentSampleGrid sampleGrid, Runnable noEntriesRemainingCallback) { + return remainingSamples -> { + sampleGrid.reload(); + if (CollectionUtils.isNotEmpty(remainingSamples)) { + sampleGrid.asMultiSelect().selectItems(remainingSamples.toArray(new EnvironmentSampleIndexDto[0])); + } else { + noEntriesRemainingCallback.run(); + } + }; + } + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGrid.java new file mode 100644 index 00000000000..28209295e52 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGrid.java @@ -0,0 +1,139 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples; + +import java.util.Date; + +import com.vaadin.ui.renderers.DateRenderer; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.Language; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleMaterial; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.location.LocationDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.utils.BooleanRenderer; +import de.symeda.sormas.ui.utils.DateFormatHelper; +import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; +import de.symeda.sormas.ui.utils.ReloadableGrid; +import de.symeda.sormas.ui.utils.UuidRenderer; + +public class EnvironmentSampleGrid extends ReloadableGrid { + + private static final long serialVersionUID = -8118341883217832133L; + + public EnvironmentSampleGrid(EnvironmentSampleCriteria criteria) { + super(EnvironmentSampleIndexDto.class); + + setSizeFull(); + + SamplesViewConfiguration viewConfiguration = ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class); + setInEagerMode(viewConfiguration.isInEagerMode()); + + removeColumn(EnvironmentSampleIndexDto.SAMPLE_MATERIAL); + Column sampleMaterialColumn = addColumn(entry -> { + EnvironmentSampleMaterial sampleMaterial = entry.getSampleMaterial(); + if (sampleMaterial == EnvironmentSampleMaterial.OTHER) { + return entry.getOtherSampleMaterial() != null ? entry.getOtherSampleMaterial() : sampleMaterial.toString(); + } else { + return sampleMaterial != null ? sampleMaterial.toString() : ""; + } + }); + sampleMaterialColumn.setId(EnvironmentSampleIndexDto.SAMPLE_MATERIAL); + + Column deleteColumn = addColumn(entry -> { + if (entry.getDeletionReason() != null) { + return entry.getDeletionReason() + (entry.getOtherDeletionReason() != null ? ": " + entry.getOtherDeletionReason() : ""); + } else { + return "-"; + } + }); + deleteColumn.setId(DELETE_REASON_COLUMN); + deleteColumn.setSortable(false); + deleteColumn.setCaption(I18nProperties.getCaption(Captions.deletionReason)); + + setColumns( + EnvironmentSampleIndexDto.UUID, + EnvironmentSampleIndexDto.FIELD_SAMPLE_ID, + EnvironmentSampleIndexDto.SAMPLE_DATE_TIME, + EnvironmentSampleIndexDto.ENVIRONMENT, + EnvironmentSampleIndexDto.LOCATION, + EnvironmentSampleIndexDto.DISTRICT, + EnvironmentSampleIndexDto.DISPATCHED, + EnvironmentSampleIndexDto.DISPATCH_DATE, + EnvironmentSampleIndexDto.RECEIVED, + EnvironmentSampleIndexDto.LABORATORY, + EnvironmentSampleIndexDto.SAMPLE_MATERIAL, + EnvironmentSampleIndexDto.POSITIVE_PATHOGEN_TESTS, + EnvironmentSampleIndexDto.LATEST_PATHOGEN_TEST, + EnvironmentSampleIndexDto.NUMBER_OF_TESTS, + DELETE_REASON_COLUMN); + + Language userLanguage = I18nProperties.getUserLanguage(); + ((Column) getColumn(EnvironmentSampleIndexDto.UUID)).setRenderer(new UuidRenderer()); + ((Column) getColumn(EnvironmentSampleIndexDto.SAMPLE_DATE_TIME)) + .setRenderer(new DateRenderer(DateHelper.getLocalDateTimeFormat(userLanguage))); + ((Column) getColumn(EnvironmentSampleIndexDto.DISPATCHED)).setRenderer(new BooleanRenderer()); + ((Column) getColumn(EnvironmentSampleIndexDto.DISPATCH_DATE)) + .setRenderer(new DateRenderer(DateFormatHelper.getDateFormat())); + ((Column) getColumn(EnvironmentSampleIndexDto.RECEIVED)).setRenderer(new BooleanRenderer()); + ((Column) getColumn(EnvironmentSampleIndexDto.LABORATORY)).setMaximumWidth(200); + + for (Column column : getColumns()) { + if (!DELETE_REASON_COLUMN.equals(column.getId())) { + column.setCaption(I18nProperties.findPrefixCaption(column.getId(), EnvironmentSampleIndexDto.I18N_PREFIX, LocationDto.I18N_PREFIX)); + column.setStyleGenerator(FieldAccessColumnStyleGenerator.getDefault(getBeanType(), column.getId())); + } + } + + if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { + setCriteria(criteria); + setEagerDataProvider(); + } else { + setLazyDataProvider(); + setCriteria(criteria); + } + } + + @Override + public void reload() { + if (getSelectionModel().isUserSelectionAllowed()) { + deselectAll(); + } + + if (ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } + + getDataProvider().refreshAll(); + } + + public void setLazyDataProvider() { + + setLazyDataProvider(FacadeProvider.getEnvironmentSampleFacade()::getIndexList, FacadeProvider.getEnvironmentSampleFacade()::count); + } + + public void setEagerDataProvider() { + + setEagerDataProvider(FacadeProvider.getEnvironmentSampleFacade()::getIndexList); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java new file mode 100644 index 00000000000..cb93f84722b --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java @@ -0,0 +1,294 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples; + +import java.util.HashMap; + +import com.vaadin.icons.VaadinIcons; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.MenuBar; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; +import com.vaadin.v7.ui.ComboBox; + +import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.utils.ButtonHelper; +import de.symeda.sormas.ui.utils.ComboBoxHelper; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.LayoutUtil; +import de.symeda.sormas.ui.utils.MenuBarHelper; + +public class EnvironmentSampleGridComponent extends SampleGidComponent { + + private static final long serialVersionUID = 4302760792255154403L; + + private static final String NOT_SHIPPED = "notShipped"; + private static final String SHIPPED = "shipped"; + private static final String RECEIVED = "received"; + + private final SamplesView samplesView; + + private final EnvironmentSampleGrid grid; + + private final EnvironmentSampleCriteria criteria; + + private HashMap statusButtons; + private Button activeStatusButton; + + private MenuBar bulkOperationsDropdown; + + private ComboBox relevanceStatusFilter; + + private EnvironmentSampleGridFilterForm filterForm; + + public EnvironmentSampleGridComponent(SamplesView samplesView) { + setSizeFull(); + setMargin(false); + + this.samplesView = samplesView; + + criteria = ViewModelProviders.of(SamplesView.class).get(EnvironmentSampleCriteria.class); + if (criteria.getRelevanceStatus() == null) { + criteria.setRelevanceStatus(EntityRelevanceStatus.ACTIVE); + } + + grid = new EnvironmentSampleGrid(criteria); + VerticalLayout gridLayout = new VerticalLayout(); + gridLayout.addComponent(createFilterBar()); + gridLayout.addComponent(createShipmentFilterBar()); + gridLayout.addComponent(grid); + grid.addDataSizeChangeListener(e -> updateStatusButtons()); + + styleGridLayout(gridLayout); + gridLayout.setMargin(true); + + addComponent(gridLayout); + } + + @Override + public EnvironmentSampleGrid getGrid() { + return grid; + } + + @Override + public MenuBar getBulkOperationsDropdown() { + return bulkOperationsDropdown; + } + + @Override + public EnvironmentSampleCriteria getCriteria() { + return criteria; + } + + @Override + public void updateFilterComponents() { + // TODO replace with Vaadin 8 databinding + samplesView.setApplyingCriteria(true); + + updateStatusButtons(); + + if (relevanceStatusFilter != null) { + relevanceStatusFilter.setValue(criteria.getRelevanceStatus()); + } + + filterForm.setValue(criteria); + + samplesView.setApplyingCriteria(false); + } + + public HorizontalLayout createFilterBar() { + HorizontalLayout filterLayout = new HorizontalLayout(); + filterLayout.setMargin(false); + filterLayout.setSpacing(true); + filterLayout.setSizeUndefined(); + filterLayout.addStyleName("wrap"); + + filterForm = new EnvironmentSampleGridFilterForm(); + filterForm.addValueChangeListener(e -> { + if (!filterForm.hasFilter()) { + samplesView.navigateTo(null); + } + }); + filterForm.addResetHandler(e -> { + ViewModelProviders.of(SamplesView.class).remove(EnvironmentSampleCriteria.class); + samplesView.navigateTo(null, true); + }); + filterForm.addApplyHandler(e -> grid.reload()); + filterLayout.addComponent(filterForm); + + return filterLayout; + } + + public HorizontalLayout createShipmentFilterBar() { + HorizontalLayout shipmentFilterLayout = new HorizontalLayout(); + shipmentFilterLayout.setMargin(false); + shipmentFilterLayout.setSpacing(true); + shipmentFilterLayout.setWidth(100, Unit.PERCENTAGE); + shipmentFilterLayout.addStyleName(CssStyles.VSPACE_3); + + statusButtons = new HashMap<>(); + + HorizontalLayout buttonFilterLayout = new HorizontalLayout(); + buttonFilterLayout.setSpacing(true); + { + Button statusAll = + ButtonHelper.createButton(Captions.all, e -> processStatusChange(null), ValoTheme.BUTTON_BORDERLESS, CssStyles.BUTTON_FILTER); + statusAll.setCaptionAsHtml(true); + + buttonFilterLayout.addComponent(statusAll); + + statusButtons.put(statusAll, I18nProperties.getCaption(Captions.all)); + activeStatusButton = statusAll; + + createAndAddStatusButton(Captions.environmentSampleNotShipped, NOT_SHIPPED, buttonFilterLayout); + createAndAddStatusButton(Captions.environmentSampleShipped, SHIPPED, buttonFilterLayout); + createAndAddStatusButton(Captions.environmentSampleReceived, RECEIVED, buttonFilterLayout); + } + + shipmentFilterLayout.addComponent(buttonFilterLayout); + + HorizontalLayout actionButtonsLayout = new HorizontalLayout(); + actionButtonsLayout.setSpacing(true); + { + // Show active/archived/all dropdown + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_VIEW)) { + relevanceStatusFilter = ComboBoxHelper.createComboBoxV7(); + relevanceStatusFilter.setId("relevanceStatusFilter"); + relevanceStatusFilter.setWidth(220, Unit.PIXELS); + relevanceStatusFilter.setNullSelectionAllowed(false); + relevanceStatusFilter.addItems((Object[]) EntityRelevanceStatus.values()); + relevanceStatusFilter + .setItemCaption(EntityRelevanceStatus.ACTIVE, I18nProperties.getCaption(Captions.environmentSampleActiveSamples)); + relevanceStatusFilter + .setItemCaption(EntityRelevanceStatus.ARCHIVED, I18nProperties.getCaption(Captions.environmentSampleArchivedSamples)); + relevanceStatusFilter.setItemCaption( + EntityRelevanceStatus.ACTIVE_AND_ARCHIVED, + I18nProperties.getCaption(Captions.environmentSampleAllActiveAndArchivedSamples)); + + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_DELETE)) { + relevanceStatusFilter + .setItemCaption(EntityRelevanceStatus.DELETED, I18nProperties.getCaption(Captions.environmentSampleDeletedSamples)); + } else { + relevanceStatusFilter.removeItem(EntityRelevanceStatus.DELETED); + } + + relevanceStatusFilter.addValueChangeListener(e -> { + criteria.setRelevanceStatus((EntityRelevanceStatus) e.getProperty().getValue()); + samplesView.navigateTo(criteria); + }); + actionButtonsLayout.addComponent(relevanceStatusFilter); + } + + // Bulk operation dropdown + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { + shipmentFilterLayout.setWidth(100, Unit.PERCENTAGE); + + if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + bulkOperationsDropdown = MenuBarHelper.createDropDown( + Captions.bulkActions, + new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, selectedItem -> { + ControllerProvider.getEnvironmentSampleController() + .deleteAllSelectedItems(grid.asMultiSelect().getSelectedItems(), grid, () -> samplesView.navigateTo(criteria)); + })); + } else { + bulkOperationsDropdown = MenuBarHelper.createDropDown( + Captions.bulkActions, + new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, selectedItem -> { + ControllerProvider.getEnvironmentSampleController() + .restoreSelectedSamples(grid.asMultiSelect().getSelectedItems(), grid, () -> samplesView.navigateTo(criteria)); + })); + } + + bulkOperationsDropdown.setVisible(samplesView.getViewConfiguration().isInEagerMode()); + + actionButtonsLayout.addComponent(bulkOperationsDropdown); + } + } + shipmentFilterLayout.addComponent(actionButtonsLayout); + shipmentFilterLayout.setComponentAlignment(actionButtonsLayout, Alignment.TOP_RIGHT); + shipmentFilterLayout.setExpandRatio(actionButtonsLayout, 1); + + return shipmentFilterLayout; + } + + private void createAndAddStatusButton(String captionKey, String status, HorizontalLayout filterLayout) { + Button button = ButtonHelper.createButton( + captionKey, + e -> processStatusChange(status), + ValoTheme.BUTTON_BORDERLESS, + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); + + button.setData(status); + button.setCaptionAsHtml(true); + + filterLayout.addComponent(button); + + statusButtons.put(button, button.getCaption()); + } + + private void processStatusChange(String status) { + if (NOT_SHIPPED.equals(status)) { + criteria.setDispatched(false); + criteria.setReceived(null); + } else if (SHIPPED.equals(status)) { + criteria.setDispatched(true); + criteria.setReceived(null); + } else if (RECEIVED.equals(status)) { + criteria.setDispatched(null); + criteria.setReceived(true); + } else { + criteria.setDispatched(null); + criteria.setReceived(null); + } + + samplesView.navigateTo(criteria); + } + + private void updateStatusButtons() { + statusButtons.keySet().forEach(b -> { + CssStyles.style(b, CssStyles.BUTTON_FILTER_LIGHT); + b.setCaption(statusButtons.get(b)); + if ((NOT_SHIPPED.equals(b.getData()) && criteria.getDispatched() == Boolean.FALSE) + || (SHIPPED.equals(b.getData()) && criteria.getDispatched() == Boolean.TRUE) + || (RECEIVED.equals(b.getData()) && criteria.getReceived() == Boolean.TRUE)) { + activeStatusButton = b; + } + }); + CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); + if (activeStatusButton != null) { + activeStatusButton + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); + } + } + + private void styleGridLayout(VerticalLayout gridLayout) { + gridLayout.setSpacing(false); + gridLayout.setSizeFull(); + gridLayout.setExpandRatio(grid, 1); + gridLayout.setStyleName("crud-main-layout"); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridFilterForm.java new file mode 100644 index 00000000000..1ad069e055d --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridFilterForm.java @@ -0,0 +1,240 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples; + +import static de.symeda.sormas.ui.utils.LayoutUtil.filterLocs; +import static de.symeda.sormas.ui.utils.LayoutUtil.loc; + +import java.util.Date; +import java.util.stream.Stream; + +import com.vaadin.ui.CustomLayout; +import com.vaadin.v7.data.Property; +import com.vaadin.v7.ui.ComboBox; +import com.vaadin.v7.ui.Field; +import com.vaadin.v7.ui.TextField; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.customizableenum.CustomizableEnumType; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; +import de.symeda.sormas.api.i18n.Descriptions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.user.JurisdictionLevel; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.utils.DateFilterOption; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.EpiWeek; +import de.symeda.sormas.ui.utils.AbstractFilterForm; +import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; +import de.symeda.sormas.ui.utils.FieldConfiguration; + +public class EnvironmentSampleGridFilterForm extends AbstractFilterForm { + + private static final String EPI_WEEK_AND_DATE_FILTER = "weekAndDateFilter"; + private static final String MORE_FILTERS_HTML_LAYOUT = loc(EPI_WEEK_AND_DATE_FILTER) + + filterLocs( + EnvironmentSampleCriteria.GPS_LAT_FROM, + EnvironmentSampleCriteria.GPS_LAT_TO, + EnvironmentSampleCriteria.GPS_LON_FROM, + EnvironmentSampleCriteria.GPS_LON_TO); + + protected EnvironmentSampleGridFilterForm() { + super(EnvironmentSampleCriteria.class, EnvironmentSampleIndexDto.I18N_PREFIX); + } + + @Override + protected String[] getMainFilterLocators() { + return new String[] { + EnvironmentSampleCriteria.FREE_TEXT, + EnvironmentSampleCriteria.REGION, + EnvironmentSampleCriteria.DISTRICT, + EnvironmentSampleCriteria.LABORATORY, + EnvironmentSampleCriteria.TESTED_PATHOGEN }; + } + + @Override + protected String createMoreFiltersHtmlLayout() { + return MORE_FILTERS_HTML_LAYOUT; + } + + @Override + protected void addFields() { + UserDto user = currentUserDto(); + + TextField freeTextField = addField( + FieldConfiguration.withCaptionAndPixelSized( + EnvironmentSampleCriteria.FREE_TEXT, + I18nProperties.getString(Strings.promptEnvironmentSampleFreetext), + 140)); + freeTextField.setDescription(I18nProperties.getString(Strings.promptEnvironmentSampleFreetext)); + + if (user.getRegion() == null) { + ComboBox regionField = addField( + FieldConfiguration.withCaptionAndPixelSized( + EnvironmentSampleCriteria.REGION, + I18nProperties.getString(Strings.promptEnvironmentSampleRegion), + 140)); + regionField.addItems(FacadeProvider.getRegionFacade().getAllActiveByServerCountry()); + } + + if (user.getDistrict() == null) { + ComboBox districtField = addField( + FieldConfiguration.withCaptionAndPixelSized( + EnvironmentSampleCriteria.DISTRICT, + I18nProperties.getString(Strings.promptEnvironmentSampleDistrict), + 140)); + districtField.setDescription(I18nProperties.getDescription(Descriptions.descDistrictFilter)); + districtField.setEnabled(false); + } + + if (user.getJurisdictionLevel() != JurisdictionLevel.LABORATORY) { + ComboBox laboratory = addField( + FieldConfiguration.withCaptionAndPixelSized( + EnvironmentSampleCriteria.LABORATORY, + I18nProperties.getString(Strings.promptEnvironmentSampleLab), + 140)); + laboratory.addItems(FacadeProvider.getFacilityFacade().getAllActiveLaboratories(true)); + } + + ComboBox testedPathogen = addField( + FieldConfiguration.withCaptionAndPixelSized( + EnvironmentSampleCriteria.TESTED_PATHOGEN, + I18nProperties.getString(Strings.promptEnvironmentSampleTestedPathogen), + 140), + ComboBox.class); + testedPathogen.addItems(FacadeProvider.getCustomizableEnumFacade().getEnumValues(CustomizableEnumType.PATHOGEN, null)); + } + + @Override + public void addMoreFilters(CustomLayout moreFiltersContainer) { + moreFiltersContainer.addComponent(buildEpiWeekAndDateFilter(), EPI_WEEK_AND_DATE_FILTER); + + addField( + moreFiltersContainer, + FieldConfiguration.withCaptionAndPixelSized( + EnvironmentSampleCriteria.GPS_LAT_FROM, + I18nProperties.getString(Strings.promptEnvironmentSampleLatFrom), + 200)); + addField( + moreFiltersContainer, + FieldConfiguration + .withCaptionAndPixelSized(EnvironmentSampleCriteria.GPS_LAT_TO, I18nProperties.getString(Strings.promptEnvironmentSampleLatTo), 200)); + addField( + moreFiltersContainer, + FieldConfiguration.withCaptionAndPixelSized( + EnvironmentSampleCriteria.GPS_LON_FROM, + I18nProperties.getString(Strings.promptEnvironmentSampleLonFrom), + 200)); + addField( + moreFiltersContainer, + FieldConfiguration + .withCaptionAndPixelSized(EnvironmentSampleCriteria.GPS_LON_TO, I18nProperties.getString(Strings.promptEnvironmentSampleLonTo), 200)); + } + + @Override + protected void applyDependenciesOnFieldChange(String propertyId, Property.ValueChangeEvent event) { + switch (propertyId) { + case EnvironmentSampleCriteria.REGION: + RegionReferenceDto region = (RegionReferenceDto) event.getProperty().getValue(); + if (region != null) { + applyRegionFilterDependency(region, EnvironmentSampleCriteria.DISTRICT); + } else { + clearAndDisableFields(EnvironmentSampleCriteria.DISTRICT); + } + + break; + default: + break; + } + } + + @Override + protected void applyDependenciesOnNewValue(EnvironmentSampleCriteria criteria) { + super.applyDependenciesOnNewValue(criteria); + + UserDto user = currentUserDto(); + + RegionReferenceDto region = user.getRegion() != null ? user.getRegion() : criteria.getRegion(); + if (region != null && user.getDistrict() == null) { + applyRegionFilterDependency(region, EnvironmentSampleCriteria.DISTRICT); + } + + EpiWeekAndDateFilterComponent weekAndDateFilter = + (EpiWeekAndDateFilterComponent) getMoreFiltersContainer().getComponent(EPI_WEEK_AND_DATE_FILTER); + + weekAndDateFilter.getDateFilterOptionFilter().setValue(criteria.getDateFilterOption()); + Date sampleDateFrom = criteria.getReportDateFrom(); + Date sampleDateTo = criteria.getReportDateTo(); + + if (DateFilterOption.EPI_WEEK.equals(criteria.getDateFilterOption())) { + weekAndDateFilter.getWeekFromFilter().setValue(sampleDateFrom == null ? null : DateHelper.getEpiWeek(sampleDateFrom)); + weekAndDateFilter.getWeekToFilter().setValue(sampleDateTo == null ? null : DateHelper.getEpiWeek(sampleDateTo)); + } else { + weekAndDateFilter.getDateFromFilter().setValue(sampleDateFrom); + weekAndDateFilter.getDateToFilter().setValue(sampleDateTo); + } + } + + @Override + protected Stream streamFieldsForEmptyCheck(CustomLayout layout) { + + @SuppressWarnings("unchecked") + EpiWeekAndDateFilterComponent weekAndDateFilter = + (EpiWeekAndDateFilterComponent) getMoreFiltersContainer().getComponent(EPI_WEEK_AND_DATE_FILTER); + + return super.streamFieldsForEmptyCheck(layout).filter(f -> f != weekAndDateFilter.getDateFilterOptionFilter()); + } + + private EpiWeekAndDateFilterComponent buildEpiWeekAndDateFilter() { + EpiWeekAndDateFilterComponent epiWeekAndDateFilter = new EpiWeekAndDateFilterComponent<>(false, false, null, this); + + epiWeekAndDateFilter.getWeekFromFilter().setInputPrompt(I18nProperties.getString(Strings.promptEnvironmentSampleEpiWeekFrom)); + epiWeekAndDateFilter.getWeekToFilter().setInputPrompt(I18nProperties.getString(Strings.promptEnvironmentSampleEpiWeekTo)); + epiWeekAndDateFilter.getDateFromFilter().setInputPrompt(I18nProperties.getString(Strings.promptEnvironmentSampleDateFrom)); + epiWeekAndDateFilter.getDateToFilter().setInputPrompt(I18nProperties.getString(Strings.promptEnvironmentSampleDateTo)); + + addApplyHandler(e -> onApplyClick(epiWeekAndDateFilter)); + + return epiWeekAndDateFilter; + } + + private void onApplyClick(EpiWeekAndDateFilterComponent weekAndDateFilter) { + EnvironmentSampleCriteria criteria = getValue(); + + DateFilterOption dateFilterOption = (DateFilterOption) weekAndDateFilter.getDateFilterOptionFilter().getValue(); + final Date fromDate; + final Date toDate; + if (dateFilterOption == DateFilterOption.DATE) { + Date dateFrom = weekAndDateFilter.getDateFromFilter().getValue(); + fromDate = dateFrom != null ? DateHelper.getStartOfDay(dateFrom) : null; + Date dateTo = weekAndDateFilter.getDateToFilter().getValue(); + toDate = dateFrom != null ? DateHelper.getEndOfDay(dateTo) : null; + } else { + fromDate = DateHelper.getEpiWeekStart((EpiWeek) weekAndDateFilter.getWeekFromFilter().getValue()); + toDate = DateHelper.getEpiWeekEnd((EpiWeek) weekAndDateFilter.getWeekToFilter().getValue()); + } + + if ((fromDate != null && toDate != null) || (fromDate == null && toDate == null)) { + criteria.reportDateBetween(fromDate, toDate, dateFilterOption); + } else { + weekAndDateFilter.setNotificationsForMissingFilters(); + } + } + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGrid.java similarity index 96% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGrid.java index a16f7ec82e1..c45a8ddcd88 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGrid.java @@ -42,24 +42,24 @@ import de.symeda.sormas.ui.utils.BooleanRenderer; import de.symeda.sormas.ui.utils.DateFormatHelper; import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; -import de.symeda.sormas.ui.utils.FilteredGrid; +import de.symeda.sormas.ui.utils.ReloadableGrid; import de.symeda.sormas.ui.utils.ShowDetailsListener; import de.symeda.sormas.ui.utils.UuidRenderer; import de.symeda.sormas.ui.utils.ViewConfiguration; @SuppressWarnings("serial") -public class SampleGrid extends FilteredGrid { +public class HumanSampleGrid extends ReloadableGrid { private static final String PATHOGEN_TEST_RESULT = Captions.Sample_pathogenTestResult; private static final String DISEASE_SHORT = Captions.columnDiseaseShort; private static final String LAST_PATHOGEN_TEST = Captions.columnLastPathogenTest; @SuppressWarnings("unchecked") - public SampleGrid(SampleCriteria criteria) { + public HumanSampleGrid(SampleCriteria criteria) { super(SampleIndexDto.class); setSizeFull(); - ViewConfiguration viewConfiguration = ViewModelProviders.of(SamplesView.class).get(ViewConfiguration.class); + ViewConfiguration viewConfiguration = ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class); setInEagerMode(viewConfiguration.isInEagerMode()); if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { @@ -219,12 +219,13 @@ private boolean shouldShowEpidNumber() { && !configFacade.isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND); } + @Override public void reload() { if (getSelectionModel().isUserSelectionAllowed()) { deselectAll(); } - if (ViewModelProviders.of(SamplesView.class).get(ViewConfiguration.class).isInEagerMode()) { + if (ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class).isInEagerMode()) { setEagerDataProvider(); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java similarity index 95% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java index 30cab037805..2bb17025b2c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java @@ -21,7 +21,6 @@ import java.util.HashMap; import com.vaadin.icons.VaadinIcons; -import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalLayout; @@ -47,7 +46,7 @@ import de.symeda.sormas.ui.utils.MenuBarHelper; @SuppressWarnings("serial") -public class SampleGridComponent extends VerticalLayout { +public class HumanSampleGridComponent extends SampleGidComponent { private static final String NOT_SHIPPED = "notShipped"; private static final String SHIPPED = "shipped"; @@ -56,7 +55,7 @@ public class SampleGridComponent extends VerticalLayout { private SampleCriteria criteria; - private SampleGrid grid; + private HumanSampleGrid grid; private SamplesView samplesView; private HashMap statusButtons; private Button activeStatusButton; @@ -70,7 +69,7 @@ public class SampleGridComponent extends VerticalLayout { private Label viewTitleLabel; private String originalViewTitle; - public SampleGridComponent(Label viewTitleLabel, SamplesView samplesView) { + public HumanSampleGridComponent(Label viewTitleLabel, SamplesView samplesView) { setSizeFull(); setMargin(false); @@ -85,7 +84,7 @@ public SampleGridComponent(Label viewTitleLabel, SamplesView samplesView) { if (criteria.getSampleAssociationType() == null) { criteria.sampleAssociationType(SampleAssociationType.ALL); } - grid = new SampleGrid(criteria); + grid = new HumanSampleGrid(criteria); VerticalLayout gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); gridLayout.addComponent(createShipmentFilterBar()); @@ -238,16 +237,6 @@ public HorizontalLayout createShipmentFilterBar() { return shipmentFilterLayout; } - public void reload(ViewChangeEvent event) { - String params = event.getParameters().trim(); - if (params.startsWith("?")) { - params = params.substring(1); - criteria.fromUrlParams(params); - } - updateFilterComponents(); - grid.reload(); - } - private void styleGridLayout(VerticalLayout gridLayout) { gridLayout.setSpacing(false); gridLayout.setSizeFull(); @@ -255,10 +244,12 @@ private void styleGridLayout(VerticalLayout gridLayout) { gridLayout.setStyleName("crud-main-layout"); } - public SampleGrid getGrid() { + @Override + public HumanSampleGrid getGrid() { return grid; } + @Override public void updateFilterComponents() { // TODO replace with Vaadin 8 databinding samplesView.setApplyingCriteria(true); @@ -338,10 +329,12 @@ private void updateStatusButtons() { } } + @Override public MenuBar getBulkOperationsDropdown() { return bulkOperationsDropdown; } + @Override public SampleCriteria getCriteria() { return criteria; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java index 96a16d89aa1..ab87aed2e08 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java @@ -108,6 +108,7 @@ public void navigateToData(String sampleUuid) { public void navigateTo(SampleCriteria sampleCriteria) { ViewModelProviders.of(SamplesView.class).remove(SampleCriteria.class); ViewModelProviders.of(SamplesView.class).get(SampleCriteria.class, sampleCriteria); + ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class).setViewType(SampleViewType.HUMAN); SormasUI.get().getNavigator().navigateTo(SamplesView.VIEW_NAME); } @@ -615,7 +616,7 @@ public void buttonClick(ClickEvent event) { }); } - public void deleteAllSelectedItems(Collection selectedRows, SampleGrid sampleGrid, Runnable noEntriesRemainingCallback) { + public void deleteAllSelectedItems(Collection selectedRows, HumanSampleGrid sampleGrid, Runnable noEntriesRemainingCallback) { ControllerProvider.getDeleteRestoreController() .deleteAllSelectedItems( @@ -627,7 +628,7 @@ public void deleteAllSelectedItems(Collection selectedRows, Samp } - public void restoreSelectedSamples(Collection selectedRows, SampleGrid sampleGrid, Runnable noEntriesRemainingCallback) { + public void restoreSelectedSamples(Collection selectedRows, HumanSampleGrid sampleGrid, Runnable noEntriesRemainingCallback) { ControllerProvider.getDeleteRestoreController() .restoreSelectedItems( @@ -683,7 +684,10 @@ public Disease getDiseaseOf(SampleDto sample) { return null; } - private Consumer> bulkOperationCallback(SampleGrid sampleGrid, Runnable noEntriesRemainingCallback, Window popupWindow) { + private Consumer> bulkOperationCallback( + HumanSampleGrid sampleGrid, + Runnable noEntriesRemainingCallback, + Window popupWindow) { return remainingSamples -> { if (popupWindow != null) { popupWindow.close(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGidComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGidComponent.java new file mode 100644 index 00000000000..a362039ccb7 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGidComponent.java @@ -0,0 +1,45 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples; + +import com.vaadin.navigator.ViewChangeListener; +import com.vaadin.ui.MenuBar; +import com.vaadin.ui.VerticalLayout; + +import de.symeda.sormas.api.utils.criteria.BaseCriteria; +import de.symeda.sormas.ui.utils.ReloadableGrid; + +public abstract class SampleGidComponent extends VerticalLayout { + + abstract ReloadableGrid getGrid(); + + abstract MenuBar getBulkOperationsDropdown(); + + abstract C getCriteria(); + + public void reload(ViewChangeListener.ViewChangeEvent event) { + String params = event.getParameters().trim(); + if (params.startsWith("?")) { + params = params.substring(1); + getCriteria().fromUrlParams(params); + } + updateFilterComponents(); + getGrid().reload(); + } + + abstract void updateFilterComponents(); + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleViewType.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleViewType.java new file mode 100644 index 00000000000..aa484f870d0 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleViewType.java @@ -0,0 +1,21 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples; + +public enum SampleViewType { + HUMAN, + ENVIRONMENT +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java index a0f67d70cf1..a4eea698295 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java @@ -31,10 +31,12 @@ import com.vaadin.ui.Button; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; +import com.vaadin.v7.ui.OptionGroup; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.contact.ContactDto; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -44,6 +46,7 @@ import de.symeda.sormas.api.sample.SampleExportDto; import de.symeda.sormas.api.sample.SampleIndexDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; import de.symeda.sormas.ui.utils.AbstractView; @@ -60,115 +63,160 @@ public class SamplesView extends AbstractView { public static final String VIEW_NAME = "samples"; - private final SampleGridComponent sampleListComponent; - private ViewConfiguration viewConfiguration; + private final SampleGidComponent sampleListComponent; + private SamplesViewConfiguration viewConfiguration; private Button btnEnterBulkEditMode; public SamplesView() { super(VIEW_NAME); - viewConfiguration = ViewModelProviders.of(getClass()).get(ViewConfiguration.class); - sampleListComponent = new SampleGridComponent(getViewTitleLabel(), this); + viewConfiguration = ViewModelProviders.of(getClass()).get(SamplesViewConfiguration.class); + if (viewConfiguration.getViewType() == null) { + viewConfiguration.setViewType(SampleViewType.HUMAN); + } + + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.ENVIRONMENT_MANAGEMENT) + && UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_VIEW)) { + addViewSwitch(); + } + + sampleListComponent = + isHumanSampleView() ? new HumanSampleGridComponent(getViewTitleLabel(), this) : new EnvironmentSampleGridComponent(this); setSizeFull(); addComponent(sampleListComponent); - if (UserProvider.getCurrent().hasUserRight(UserRight.SAMPLE_EXPORT)) { - VerticalLayout exportLayout = new VerticalLayout(); - exportLayout.setSpacing(true); - exportLayout.setMargin(true); - exportLayout.addStyleName(CssStyles.LAYOUT_MINIMAL); - exportLayout.setWidth(200, Unit.PIXELS); - - PopupButton exportButton = ButtonHelper.createIconPopupButton(Captions.export, VaadinIcons.DOWNLOAD, exportLayout); - addHeaderComponent(exportButton); - - Button basicExportButton = ButtonHelper.createIconButton(Captions.exportBasic, VaadinIcons.TABLE, null, ValoTheme.BUTTON_PRIMARY); - basicExportButton.setDescription(I18nProperties.getString(Strings.infoBasicExport)); - basicExportButton.setWidth(100, Unit.PERCENTAGE); - - exportLayout.addComponent(basicExportButton); - StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( - sampleListComponent.getGrid(), - () -> viewConfiguration.isInEagerMode() - ? this.sampleListComponent.getGrid().asMultiSelect().getSelectedItems() - : Collections.emptySet(), - ExportEntityName.SAMPLES, - SampleGrid.ACTION_BTN_ID); - FileDownloader fileDownloader = new FileDownloader(streamResource); - fileDownloader.extend(basicExportButton); - - StreamResource extendedExportStreamResource = DownloadUtil.createCsvExportStreamResource( - SampleExportDto.class, - null, - (Integer start, Integer max) -> FacadeProvider.getSampleFacade() - .getExportList(sampleListComponent.getGrid().getCriteria(), this.getSelectedRows(), start, max), - (propertyId, type) -> { - String caption = I18nProperties.getPrefixCaption( - SampleExportDto.I18N_PREFIX, + if (isHumanSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.SAMPLE_EXPORT)) { + addHumanSampleExportButton(); + } + + if ((isHumanSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) + || (isEnvironmentSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS))) { + addBulkModeButtons(); + } + } + + private void addViewSwitch() { + OptionGroup viewViewSwitch = new OptionGroup(); + viewViewSwitch.setId("viewViewSwitch"); + CssStyles.style( + viewViewSwitch, + CssStyles.FORCE_CAPTION, + ValoTheme.OPTIONGROUP_HORIZONTAL, + CssStyles.OPTIONGROUP_HORIZONTAL_PRIMARY, + CssStyles.VSPACE_TOP_3); + viewViewSwitch.addItem(SampleViewType.HUMAN); + viewViewSwitch.setItemCaption(SampleViewType.HUMAN, I18nProperties.getCaption(Captions.sampleViewType)); + + viewViewSwitch.addItem(SampleViewType.ENVIRONMENT); + viewViewSwitch.setItemCaption(SampleViewType.ENVIRONMENT, I18nProperties.getCaption(Captions.environmentSampleViewType)); + + viewViewSwitch.setValue(viewConfiguration.getViewType()); + viewViewSwitch.addValueChangeListener(e -> { + SampleViewType viewType = (SampleViewType) e.getProperty().getValue(); + + viewConfiguration.setViewType(viewType); + SormasUI.get().getNavigator().navigateTo(SamplesView.VIEW_NAME); + }); + addHeaderComponent(viewViewSwitch); + } + + private boolean isHumanSampleView() { + return viewConfiguration.getViewType() == SampleViewType.HUMAN; + } + + private boolean isEnvironmentSampleView() { + return viewConfiguration.getViewType() == SampleViewType.ENVIRONMENT; + } + + private void addHumanSampleExportButton() { + VerticalLayout exportLayout = new VerticalLayout(); + exportLayout.setSpacing(true); + exportLayout.setMargin(true); + exportLayout.addStyleName(CssStyles.LAYOUT_MINIMAL); + exportLayout.setWidth(200, Unit.PIXELS); + + PopupButton exportButton = ButtonHelper.createIconPopupButton(Captions.export, VaadinIcons.DOWNLOAD, exportLayout); + addHeaderComponent(exportButton); + + Button basicExportButton = ButtonHelper.createIconButton(Captions.exportBasic, VaadinIcons.TABLE, null, ValoTheme.BUTTON_PRIMARY); + basicExportButton.setDescription(I18nProperties.getString(Strings.infoBasicExport)); + basicExportButton.setWidth(100, Unit.PERCENTAGE); + + exportLayout.addComponent(basicExportButton); + + HumanSampleGrid grid = ((HumanSampleGridComponent) sampleListComponent).getGrid(); + StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( + grid, + () -> viewConfiguration.isInEagerMode() ? grid.asMultiSelect().getSelectedItems() : Collections.emptySet(), + ExportEntityName.SAMPLES, + HumanSampleGrid.ACTION_BTN_ID); + FileDownloader fileDownloader = new FileDownloader(streamResource); + fileDownloader.extend(basicExportButton); + + StreamResource extendedExportStreamResource = + DownloadUtil.createCsvExportStreamResource(SampleExportDto.class, null, (Integer start, Integer max) -> { + Set selectedRowUuids = viewConfiguration.isInEagerMode() + ? grid.asMultiSelect().getSelectedItems().stream().map(SampleIndexDto::getUuid).collect(Collectors.toSet()) + : Collections.emptySet(); + return FacadeProvider.getSampleFacade().getExportList(grid.getCriteria(), selectedRowUuids, start, max); + }, (propertyId, type) -> { + String caption = I18nProperties.getPrefixCaption( + SampleExportDto.I18N_PREFIX, + propertyId, + I18nProperties.getPrefixCaption( + SampleDto.I18N_PREFIX, propertyId, I18nProperties.getPrefixCaption( - SampleDto.I18N_PREFIX, + CaseDataDto.I18N_PREFIX, propertyId, I18nProperties.getPrefixCaption( - CaseDataDto.I18N_PREFIX, + ContactDto.I18N_PREFIX, propertyId, I18nProperties.getPrefixCaption( - ContactDto.I18N_PREFIX, + PersonDto.I18N_PREFIX, propertyId, - I18nProperties.getPrefixCaption( - PersonDto.I18N_PREFIX, - propertyId, - I18nProperties.getPrefixCaption(AdditionalTestDto.I18N_PREFIX, propertyId)))))); - if (Date.class.isAssignableFrom(type)) { - caption += " (" + DateFormatHelper.getDateFormatPattern() + ")"; - } - return caption; - }, - ExportEntityName.SAMPLES, - null); - - addExportButton( - extendedExportStreamResource, - exportButton, - exportLayout, - VaadinIcons.FILE_TEXT, - Captions.exportDetailed, - Strings.infoDetailedExport); - } - - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { - btnEnterBulkEditMode = ButtonHelper.createIconButton(Captions.actionEnterBulkEditMode, VaadinIcons.CHECK_SQUARE_O, null); - btnEnterBulkEditMode.setVisible(!viewConfiguration.isInEagerMode()); - - addHeaderComponent(btnEnterBulkEditMode); - - Button btnLeaveBulkEditMode = - ButtonHelper.createIconButton(Captions.actionLeaveBulkEditMode, VaadinIcons.CLOSE, null, ValoTheme.BUTTON_PRIMARY); - btnLeaveBulkEditMode.setVisible(viewConfiguration.isInEagerMode()); - - addHeaderComponent(btnLeaveBulkEditMode); - - btnEnterBulkEditMode.addClickListener(e -> { - sampleListComponent.getBulkOperationsDropdown().setVisible(true); - ViewModelProviders.of(SamplesView.class).get(ViewConfiguration.class).setInEagerMode(true); - btnEnterBulkEditMode.setVisible(false); - btnLeaveBulkEditMode.setVisible(true); - sampleListComponent.getGrid().reload(); - }); - btnLeaveBulkEditMode.addClickListener(e -> { - sampleListComponent.getBulkOperationsDropdown().setVisible(false); - ViewModelProviders.of(SamplesView.class).get(ViewConfiguration.class).setInEagerMode(false); - btnLeaveBulkEditMode.setVisible(false); - btnEnterBulkEditMode.setVisible(true); - navigateTo(sampleListComponent.getCriteria()); - }); - } + I18nProperties.getPrefixCaption(AdditionalTestDto.I18N_PREFIX, propertyId)))))); + if (Date.class.isAssignableFrom(type)) { + caption += " (" + DateFormatHelper.getDateFormatPattern() + ")"; + } + return caption; + }, ExportEntityName.SAMPLES, null); + + addExportButton( + extendedExportStreamResource, + exportButton, + exportLayout, + VaadinIcons.FILE_TEXT, + Captions.exportDetailed, + Strings.infoDetailedExport); } - private Set getSelectedRows() { - return viewConfiguration.isInEagerMode() - ? this.sampleListComponent.getGrid().asMultiSelect().getSelectedItems().stream().map(SampleIndexDto::getUuid).collect(Collectors.toSet()) - : Collections.emptySet(); + private void addBulkModeButtons() { + btnEnterBulkEditMode = ButtonHelper.createIconButton(Captions.actionEnterBulkEditMode, VaadinIcons.CHECK_SQUARE_O, null); + btnEnterBulkEditMode.setVisible(!viewConfiguration.isInEagerMode()); + + addHeaderComponent(btnEnterBulkEditMode); + + Button btnLeaveBulkEditMode = + ButtonHelper.createIconButton(Captions.actionLeaveBulkEditMode, VaadinIcons.CLOSE, null, ValoTheme.BUTTON_PRIMARY); + btnLeaveBulkEditMode.setVisible(viewConfiguration.isInEagerMode()); + + addHeaderComponent(btnLeaveBulkEditMode); + + btnEnterBulkEditMode.addClickListener(e -> { + sampleListComponent.getBulkOperationsDropdown().setVisible(true); + ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class).setInEagerMode(true); + btnEnterBulkEditMode.setVisible(false); + btnLeaveBulkEditMode.setVisible(true); + sampleListComponent.getGrid().reload(); + }); + btnLeaveBulkEditMode.addClickListener(e -> { + sampleListComponent.getBulkOperationsDropdown().setVisible(false); + ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class).setInEagerMode(false); + btnLeaveBulkEditMode.setVisible(false); + btnEnterBulkEditMode.setVisible(true); + navigateTo(sampleListComponent.getCriteria()); + }); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesViewConfiguration.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesViewConfiguration.java new file mode 100644 index 00000000000..307c6d03630 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesViewConfiguration.java @@ -0,0 +1,31 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples; + +import de.symeda.sormas.ui.utils.ViewConfiguration; + +public class SamplesViewConfiguration extends ViewConfiguration { + + private SampleViewType viewType; + + public SampleViewType getViewType() { + return viewType; + } + + public void setViewType(SampleViewType viewType) { + this.viewType = viewType; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java index 7035d5efba2..d735a02d342 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreController.java @@ -14,7 +14,6 @@ import com.vaadin.ui.TextArea; import com.vaadin.ui.VerticalLayout; -import de.symeda.sormas.api.DeletableFacade; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; @@ -22,7 +21,7 @@ import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.uuid.HasUuid; -public class DeleteRestoreController { +public class DeleteRestoreController { public void restoreSelectedItems( Collection entities, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java index 67f0de0563c..3a28e0933d3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreHandlers.java @@ -11,7 +11,6 @@ import com.vaadin.ui.TextArea; import com.vaadin.ui.VerticalLayout; -import de.symeda.sormas.api.CoreFacade; import de.symeda.sormas.api.DeletableFacade; import de.symeda.sormas.api.EntityDto; import de.symeda.sormas.api.FacadeProvider; @@ -67,6 +66,10 @@ public static PermanentDeleteHandler forExternalMessage() { return new PermanentDeleteHandler(FacadeProvider.getExternalMessageFacade(), DeleteRestoreMessages.EXTERNAL_MESSAGE); } + public static CoreEntityDeleteRestoreHandler forEnvironmentSample() { + return new CoreEntityDeleteRestoreHandler(FacadeProvider.getEnvironmentSampleFacade(), DeleteRestoreMessages.ENVIRONMENT_SAMPLE); + } + public static class DeleteRestoreHandler implements DeleteRestoreController.IDeleteRestoreHandler { @@ -171,7 +174,7 @@ public void clearOtherReason() { } } - public static class CoreEntityDeleteRestoreHandler> extends DeleteRestoreHandler + public static class CoreEntityDeleteRestoreHandler extends DeleteRestoreHandler implements DeleteRestoreController.IDeleteRestoreHandler { protected CoreEntityDeleteRestoreHandler(F entityFacade, DeleteRestoreMessages deleteRestoreMessages) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java index 30745f21255..80eb4ca05c4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DeleteRestoreMessages.java @@ -182,7 +182,24 @@ public enum DeleteRestoreMessages { Strings.messageImmunizationsRestored, Strings.messageImmunizationsNotRestored, Strings.headingSomeImmunizationsNotRestored, - Strings.messageCountImmunizationsNotRestored); + Strings.messageCountImmunizationsNotRestored), + ENVIRONMENT_SAMPLE(Strings.entityEnvironmentSamples, + Strings.headingNoEnvironmentSamplesSelected, + Strings.messageNoEnvironmentSamplesSelected, + null, + null, + Strings.headingEnvironmentSamplesDeleted, + Strings.messageEnvironmentSamplesDeleted, + Strings.messageEnvironmentSamplesNotDeleted, + null, + null, + Strings.headingSomeEnvironmentSamplesNotDeleted, + Strings.messageCountEnvironmentSamplesNotDeleted, + Strings.headingEnvironmentSamplesRestored, + Strings.messageEnvironmentSamplesRestored, + Strings.messageEnvironmentSamplesNotRestored, + Strings.headingEnvironmentSomeSamplesNotRestored, + Strings.messageEnvironmentCountSamplesNotRestored); private final String entities; private final String headingNoSelection; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ReloadableGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ReloadableGrid.java new file mode 100644 index 00000000000..0aef484e957 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ReloadableGrid.java @@ -0,0 +1,27 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.utils; + +import de.symeda.sormas.api.utils.criteria.BaseCriteria; + +public abstract class ReloadableGrid extends FilteredGrid { + + public ReloadableGrid(Class beanType) { + super(beanType); + } + + public abstract void reload(); +} From 0498eaa0e4dd5e9d614cb03efa4880cc27ce6e31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 7 Sep 2023 10:41:27 +0200 Subject: [PATCH 078/144] #12366 - Add facility to external messages (#12482) * #12366 - Add facility to external messages * #12366 - Change relation type --- .../externalmessage/ExternalMessageDto.java | 12 +++++++ .../facility/FacilityFacade.java | 2 ++ .../externalmessage/ExternalMessage.java | 14 +++++++- .../ExternalMessageFacadeEjb.java | 6 ++++ .../facility/FacilityFacadeEjb.java | 6 ++++ .../facility/FacilityService.java | 36 +++++++++++++++---- .../src/main/resources/sql/sormas_schema.sql | 7 ++++ .../sormas/backend/TestDataCreator.java | 20 +++++++++++ .../ExternalMessageFacadeEjbMappingTest.java | 11 ++++++ .../ExternalMessageFacadeEjbUnitTest.java | 4 +++ .../facility/FacilityFacadeEjbTest.java | 33 +++++++++++++++++ .../ExternalMessageMapper.java | 21 ++++++++++- 12 files changed, 164 insertions(+), 8 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java index 5aa8dd6b1c8..37101f2e898 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto; +import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.person.PhoneNumberType; import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.person.Sex; @@ -73,6 +74,7 @@ public class ExternalMessageDto extends SormasToSormasShareableDto { public static final String PERSON_STREET = "personStreet"; public static final String PERSON_HOUSE_NUMBER = "personHouseNumber"; public static final String PERSON_COUNTRY = "personCountry"; + public static final String PERSON_FACILITY = "personFacility"; public static final String EXTERNAL_MESSAGE_DETAILS = "externalMessageDetails"; public static final String PROCESSED = "processed"; public static final String REPORT_ID = "reportId"; @@ -124,6 +126,8 @@ public class ExternalMessageDto extends SormasToSormasShareableDto { private String personHouseNumber; @HideForCountriesExcept(countries = CountryHelper.COUNTRY_CODE_LUXEMBOURG) private CountryReferenceDto personCountry; + @HideForCountriesExcept(countries = CountryHelper.COUNTRY_CODE_LUXEMBOURG) + private FacilityReferenceDto personFacility; @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong) private String personPhone; @HideForCountriesExcept(countries = CountryHelper.COUNTRY_CODE_LUXEMBOURG) @@ -343,6 +347,14 @@ public void setPersonCountry(CountryReferenceDto personCountry) { this.personCountry = personCountry; } + public FacilityReferenceDto getPersonFacility() { + return personFacility; + } + + public void setPersonFacility(FacilityReferenceDto personFacility) { + this.personFacility = personFacility; + } + public String getPersonPhone() { return personPhone; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityFacade.java index 71167a79741..72e2a7c09f0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityFacade.java @@ -64,6 +64,8 @@ List getByNameAndType( FacilityType type, boolean includeArchivedEntities); + FacilityReferenceDto getByAddress(String street, String postalCode, String city); + List getLaboratoriesByName(String name, boolean includeArchivedEntities); boolean hasArchivedParentInfrastructure(Collection facilityUuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java index 62b520b6542..af2b277d849 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java @@ -36,6 +36,7 @@ import de.symeda.sormas.backend.disease.DiseaseVariantConverter; import de.symeda.sormas.backend.externalmessage.labmessage.SampleReport; import de.symeda.sormas.backend.infrastructure.country.Country; +import de.symeda.sormas.backend.infrastructure.facility.Facility; import de.symeda.sormas.backend.user.User; @Entity(name = ExternalMessage.TABLE_NAME) @@ -69,6 +70,7 @@ public class ExternalMessage extends AbstractDomainObject { public static final String PERSON_STREET = "personStreet"; public static final String PERSON_HOUSE_NUMBER = "personHouseNumber"; public static final String PERSON_COUNTRY = "personCountry"; + public static final String PERSON_FACILITY = "personFacility"; public static final String PERSON_PHONE = "personPhone"; public static final String PERSON_PHONE_NUMBER_TYPE = "personPhoneNumberType"; public static final String PERSON_EMAIL = "personEmail"; @@ -105,6 +107,7 @@ public class ExternalMessage extends AbstractDomainObject { private String personCity; private String personStreet; private Country personCountry; + private Facility personFacility; private String personHouseNumber; private String personPhone; private PhoneNumberType personPhoneNumberType; @@ -328,7 +331,7 @@ public void setPersonHouseNumber(String personHouseNumber) { this.personHouseNumber = personHouseNumber; } - @OneToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY) public Country getPersonCountry() { return personCountry; } @@ -337,6 +340,15 @@ public void setPersonCountry(Country personCountry) { this.personCountry = personCountry; } + @ManyToOne(fetch = FetchType.LAZY) + public Facility getPersonFacility() { + return personFacility; + } + + public void setPersonFacility(Facility personFacility) { + this.personFacility = personFacility; + } + @Column(length = CHARACTER_LIMIT_DEFAULT) public String getPersonPhone() { return personPhone; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java index b1ad8c5012c..d43051f501a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java @@ -82,6 +82,8 @@ import de.symeda.sormas.backend.externalmessage.labmessage.TestReport; import de.symeda.sormas.backend.infrastructure.country.CountryFacadeEjb; import de.symeda.sormas.backend.infrastructure.country.CountryService; +import de.symeda.sormas.backend.infrastructure.facility.FacilityFacadeEjb; +import de.symeda.sormas.backend.infrastructure.facility.FacilityService; import de.symeda.sormas.backend.sample.SampleService; import de.symeda.sormas.backend.systemevent.sync.SyncFacadeEjb; import de.symeda.sormas.backend.user.User; @@ -133,6 +135,8 @@ public class ExternalMessageFacadeEjb implements ExternalMessageFacade { private UserService userService; @EJB private CountryService countryService; + @EJB + private FacilityService facilityService; @EJB private CustomizableEnumFacadeEjb.CustomizableEnumFacadeEjbLocal customizableEnumFacade; @@ -159,6 +163,7 @@ ExternalMessage fillOrBuildEntity(@NotNull ExternalMessageDto source, ExternalMe target.setPersonLastName(source.getPersonLastName()); target.setPersonPostalCode(source.getPersonPostalCode()); target.setPersonCountry(countryService.getByReferenceDto(source.getPersonCountry())); + target.setPersonFacility(facilityService.getByReferenceDto(source.getPersonFacility())); target.setPersonSex(source.getPersonSex()); target.setPersonPresentCondition(source.getPersonPresentCondition()); target.setPersonStreet(source.getPersonStreet()); @@ -308,6 +313,7 @@ public ExternalMessageDto toDto(ExternalMessage source) { target.setPersonLastName(source.getPersonLastName()); target.setPersonPostalCode(source.getPersonPostalCode()); target.setPersonCountry(CountryFacadeEjb.toReferenceDto(source.getPersonCountry())); + target.setPersonFacility(FacilityFacadeEjb.toReferenceDto(source.getPersonFacility())); target.setPersonSex(source.getPersonSex()); target.setPersonPresentCondition(source.getPersonPresentCondition()); target.setPersonStreet(source.getPersonStreet()); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjb.java index 5ed0074a6ba..8a107a55be5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjb.java @@ -332,6 +332,12 @@ public List getByNameAndType( .collect(Collectors.toList()); } + @Override + public FacilityReferenceDto getByAddress(String street, String postalCode, String city) { + + return toReferenceDto(service.getByAddress(street, postalCode, city)); + } + @Override @PermitAll public List getLaboratoriesByName(String name, boolean includeArchivedEntities) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java index c33b0182b68..f249fab972b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java @@ -1,20 +1,17 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -*/ + */ package de.symeda.sormas.backend.infrastructure.facility; @@ -24,6 +21,8 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.persistence.NoResultException; +import javax.persistence.NonUniqueResultException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; @@ -199,6 +198,31 @@ public List getFacilitiesByNameAndType( return em.createQuery(cq).getResultList(); } + public Facility getByAddress(String street, String postalCode, String city) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(getElementClass()); + Root from = cq.from(getElementClass()); + + Predicate filter = cb.and( + createBasicFilter(cb, from), + cb.equal(cb.lower(cb.trim(from.get(Facility.STREET))), street.trim().toLowerCase()), + cb.equal(cb.lower(cb.trim(from.get(Facility.POSTAL_CODE))), postalCode.trim().toLowerCase()), + cb.equal(cb.lower(cb.trim(from.get(Facility.CITY))), city.trim().toLowerCase())); + + cq.where(filter); + + try { + return em.createQuery(cq).getSingleResult(); + } catch (NonUniqueResultException e) { + logger.warn("getByAddress returned more than one result for the specified street, postal code, and city"); + return null; + } catch (NoResultException e) { + logger.warn("getByAddress returned no result for the specified street, postal code, and city"); + return null; + } + } + public List getFacilitiesByExternalIdAndType(@NotNull String externalId, FacilityType type, boolean includeArchivedEntities) { CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -232,8 +256,8 @@ public Predicate buildCriteriaFilter(FacilityCriteria facilityCriteria, Criteria // these two facilities are constant and created on startup by createConstantFacilities() Predicate excludeConstantFacilities = cb.and( - cb.notEqual(root.get(Facility.UUID), FacilityDto.OTHER_FACILITY_UUID), - cb.notEqual(root.get(Facility.UUID), FacilityDto.NONE_FACILITY_UUID)); + cb.notEqual(root.get(Facility.UUID), FacilityDto.OTHER_FACILITY_UUID), + cb.notEqual(root.get(Facility.UUID), FacilityDto.NONE_FACILITY_UUID)); if (facilityCriteria == null) { return excludeConstantFacilities; diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index d37569c65b1..98e5e0f5887 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12707,4 +12707,11 @@ ALTER TABLE environmentsamples ALTER COLUMN reportdate DROP DEFAULT; INSERT INTO schema_version (version_number, comment) VALUES (525, 'Add report date to environment samples #12501'); +-- 2023-09-01 Add person facility to external messages #12366 +ALTER TABLE externalmessage ADD COLUMN personfacility_id bigint; +ALTER TABLE externalmessage_history ADD COLUMN personfacility_id bigint; +ALTER TABLE externalmessage ADD CONSTRAINT fk_externalmessage_personfacility_id FOREIGN KEY (personfacility_id) REFERENCES facility(id); + +INSERT INTO schema_version (version_number, comment) VALUES (526, 'Add person facility to external messages #12366'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** \ No newline at end of file diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java index cd5d0b97fe5..d724ce03c0a 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java @@ -1905,6 +1905,26 @@ public FacilityDto createFacility( return facility; } + public FacilityDto createFacility( + String facilityName, + RegionReferenceDto region, + DistrictReferenceDto district, + Consumer extraConfig) { + + FacilityDto facility = FacilityDto.build(); + facility.setName(facilityName); + facility.setRegion(region); + facility.setDistrict(district); + facility.setType(FacilityType.HOSPITAL); + + if (extraConfig != null) { + extraConfig.accept(facility); + } + + beanTest.getFacilityFacade().save(facility); + return facility; + } + public PointOfEntry createPointOfEntry(String pointOfEntryName, Region region, District district) { return createPointOfEntry(pointOfEntryName, region, district, null); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbMappingTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbMappingTest.java index 45a3154b9c3..d1721a610e9 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbMappingTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbMappingTest.java @@ -24,6 +24,7 @@ import de.symeda.sormas.api.externalmessage.ExternalMessageType; import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto; import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto; +import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.person.PhoneNumberType; import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.person.Sex; @@ -32,6 +33,8 @@ import de.symeda.sormas.backend.externalmessage.labmessage.SampleReportFacadeEjb; import de.symeda.sormas.backend.infrastructure.country.Country; import de.symeda.sormas.backend.infrastructure.country.CountryService; +import de.symeda.sormas.backend.infrastructure.facility.Facility; +import de.symeda.sormas.backend.infrastructure.facility.FacilityService; import de.symeda.sormas.backend.sample.Sample; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserService; @@ -47,6 +50,8 @@ public class ExternalMessageFacadeEjbMappingTest { private SurveillanceReportService surveillanceReportService; @Mock private CountryService countryService; + @Mock + private FacilityService facilityService; @InjectMocks private ExternalMessageFacadeEjb sut; @@ -64,6 +69,9 @@ public void testFromDto() { country.setUuid("23456"); country.setIsoCode("ISO"); + Facility facility = new Facility(); + facility.setUuid("34567"); + when(sampleReportFacade.fromDto(eq(sampleReportDto), any(ExternalMessage.class), eq(false))).thenReturn(sampleReport); when(userservice.getByReferenceDto(assignee.toReference())).thenReturn(assignee); @@ -98,8 +106,10 @@ public void testFromDto() { source.setPersonNationalHealthId("22222"); source.setCaseReportDate(new Date()); source.setPersonCountry(new CountryReferenceDto(country.getUuid(), country.getIsoCode())); + source.setPersonFacility(new FacilityReferenceDto(facility.getUuid())); when(countryService.getByReferenceDto(source.getPersonCountry())).thenReturn(country); + when(facilityService.getByReferenceDto(source.getPersonFacility())).thenReturn(facility); ExternalMessage result = sut.fillOrBuildEntity(source, null, true); @@ -132,6 +142,7 @@ public void testFromDto() { assertEquals(source.getPersonNationalHealthId(), result.getPersonNationalHealthId()); assertEquals(source.getCaseReportDate(), result.getCaseReportDate()); assertEquals(source.getPersonCountry().getUuid(), result.getPersonCountry().getUuid()); + assertEquals(source.getPersonFacility().getUuid(), result.getPersonFacility().getUuid()); } @Test diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbUnitTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbUnitTest.java index 208bf9f1ac2..9b3f1aec8a0 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbUnitTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbUnitTest.java @@ -41,6 +41,7 @@ import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.backend.caze.surveillancereport.SurveillanceReportService; import de.symeda.sormas.backend.infrastructure.country.CountryService; +import de.symeda.sormas.backend.infrastructure.facility.FacilityService; import de.symeda.sormas.backend.systemevent.SystemEventFacadeEjb; import de.symeda.sormas.backend.systemevent.sync.SyncFacadeEjb; @@ -56,6 +57,8 @@ public class ExternalMessageFacadeEjbUnitTest { @Mock private CountryService countryService; @Mock + private FacilityService facilityService; + @Mock private SystemEventFacadeEjb.SystemEventFacadeEjbLocal systemEventFacade; @InjectMocks @@ -148,6 +151,7 @@ public void testSave() { when(externalMessageService.getByUuid(testUuid)).thenReturn(externalMessage); when(countryService.getByReferenceDto(null)).thenReturn(null); + when(facilityService.getByReferenceDto(null)).thenReturn(null); sut.save(externalMessageDto); verify(externalMessageService).ensurePersisted(externalMessage); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjbTest.java index e3c065939fe..d679d76b5ac 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/infrastructure/facility/FacilityFacadeEjbTest.java @@ -5,6 +5,7 @@ import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; import java.util.ArrayList; import java.util.Collections; @@ -220,4 +221,36 @@ void testConstantFacilitiesAreNeverExported() { 1, facilityFacade.getExportList(null, Collections.singletonList(getFacilityFacade().getByUuid(lab.getUuid()).getUuid()), 0, 100).size()); } + + @Test + public void testGetByAddress() { + + RDCF rdcf = creator.createRDCF(); + FacilityDto fac1 = creator.createFacility("Fac1", rdcf.region, rdcf.district, facility -> { + facility.setStreet("Street1"); + facility.setPostalCode("PostalCode1"); + facility.setCity("City1"); + }); + FacilityDto fac2 = creator.createFacility("Fac2", rdcf.region, rdcf.district, facility -> { + facility.setStreet("Street2"); + facility.setPostalCode("PostalCode2"); + facility.setCity("City2"); + }); + FacilityDto fac3 = creator.createFacility("Fac3", rdcf.region, rdcf.district, facility -> { + facility.setStreet("Street3"); + facility.setPostalCode("PostalCode2"); + facility.setCity("City2"); + }); + FacilityDto fac4 = creator.createFacility("Fac4", rdcf.region, rdcf.district, facility -> { + facility.setStreet("Street2"); + facility.setPostalCode("PostalCode2"); + facility.setCity("City2"); + }); + + FacilityFacade facade = getFacilityFacade(); + assertEquals(fac1.getUuid(), facade.getByAddress("Street1", "PostalCode1", "City1").getUuid()); + assertEquals(fac3.getUuid(), facade.getByAddress("Street3", "PostalCode2", "City2").getUuid()); + assertNull(facade.getByAddress("Street5", "PostalCode5", "City5")); + assertNull(facade.getByAddress("Street2", "PostalCode2", "City2")); + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java index 0e2f4c94771..3811abe9705 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java @@ -36,10 +36,12 @@ import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto; import de.symeda.sormas.api.externalmessage.labmessage.TestReportDto; import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityFacade; import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.infrastructure.facility.FacilityType; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.person.ApproximateAgeType; import de.symeda.sormas.api.person.PersonDto; @@ -108,6 +110,15 @@ public List mapToPerson(PersonDto person) { } public List mapToLocation(LocationDto location) { + + RegionReferenceDto region = null; + DistrictReferenceDto district = null; + if (externalMessage.getPersonFacility() != null) { + FacilityDto facility = FacadeProvider.getFacilityFacade().getByUuid(externalMessage.getPersonFacility().getUuid()); + region = facility.getRegion(); + district = facility.getDistrict(); + } + return map( Stream.of( Mapping.of(location::setStreet, location.getStreet(), externalMessage.getPersonStreet(), PersonDto.ADDRESS, LocationDto.STREET), @@ -124,7 +135,15 @@ public List mapToLocation(LocationDto location) { PersonDto.ADDRESS, LocationDto.POSTAL_CODE), Mapping.of(location::setCity, location.getCity(), externalMessage.getPersonCity(), PersonDto.ADDRESS, LocationDto.CITY), - Mapping.of(location::setCountry, location.getCountry(), externalMessage.getPersonCountry(), PersonDto.ADDRESS, LocationDto.COUNTRY))); + Mapping.of(location::setCountry, location.getCountry(), externalMessage.getPersonCountry(), PersonDto.ADDRESS, LocationDto.COUNTRY), + Mapping.of(location::setRegion, location.getRegion(), region, PersonDto.ADDRESS, LocationDto.REGION), + Mapping.of(location::setDistrict, location.getDistrict(), district, PersonDto.ADDRESS, LocationDto.DISTRICT), + Mapping.of( + location::setFacility, + location.getFacility(), + externalMessage.getPersonFacility(), + PersonDto.ADDRESS, + LocationDto.FACILITY))); } public List mapFirstSampleReportToSample(SampleDto sample) { From ee8390c4021de2ac203f91023c67811c9985cdf8 Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Thu, 7 Sep 2023 09:13:33 +0000 Subject: [PATCH 079/144] [GitHub Actions] Update openAPI spec files --- sormas-rest/swagger.json | 3 +++ sormas-rest/swagger.yaml | 2 ++ 2 files changed, 5 insertions(+) diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index 33e7829e380..0744f8cbae9 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -17751,6 +17751,9 @@ "maxLength" : 512, "minLength" : 0 }, + "personFacility" : { + "$ref" : "#/components/schemas/FacilityReferenceDto" + }, "personFirstName" : { "type" : "string", "maxLength" : 255, diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index bf3bb2e61d3..c351f9209b4 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -16307,6 +16307,8 @@ components: type: string maxLength: 512 minLength: 0 + personFacility: + $ref: '#/components/schemas/FacilityReferenceDto' personFirstName: type: string maxLength: 255 From 3116a6b92f03d05e53445e5ad92a312ba47bdaa0 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 7 Sep 2023 17:51:29 +0300 Subject: [PATCH 080/144] #12257 - Refactorings and fixes --- .../java/de/symeda/sormas/api/CoreFacade.java | 2 +- .../de/symeda/sormas/api/caze/CaseFacade.java | 2 + .../api/common/progress/ProcessedEntity.java | 16 ++++ .../symeda/sormas/api/event/EventFacade.java | 2 + .../sormas/api/event/EventGroupFacade.java | 6 +- .../de/symeda/sormas/api/i18n/Strings.java | 1 + .../src/main/resources/strings.properties | 1 + .../backend/campaign/CampaignFacadeEjb.java | 4 +- .../sormas/backend/caze/CaseFacadeEjb.java | 20 ++++- .../sormas/backend/caze/CaseService.java | 37 ++++----- .../common/AbstractCoreAdoService.java | 16 ++-- .../backend/common/AbstractCoreFacadeEjb.java | 4 +- .../sormas/backend/common/BaseAdoService.java | 28 ++++++- .../backend/contact/ContactFacadeEjb.java | 4 +- .../environment/EnvironmentFacadeEjb.java | 4 +- .../sormas/backend/event/EventFacadeEjb.java | 31 ++++++-- .../backend/event/EventGroupFacadeEjb.java | 55 ++++++++----- .../event/EventParticipantFacadeEjb.java | 4 +- .../sormas/backend/event/EventService.java | 20 ++--- ...ernalSurveillanceToolGatewayFacadeEjb.java | 41 ++++------ .../immunization/ImmunizationFacadeEjb.java | 4 +- .../sormas/backend/sample/SampleService.java | 3 +- .../sormas/backend/task/TaskService.java | 2 +- .../travelentry/TravelEntryFacadeEjb.java | 4 +- ...lSurveillanceToolGatewayFacadeEjbTest.java | 79 ++++--------------- .../ui/events/EventGroupController.java | 37 +++------ .../sormas/ui/utils/ArchiveHandlers.java | 52 ++++++++++-- 27 files changed, 259 insertions(+), 220 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java index 849e8837ac0..188ac374843 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java @@ -34,7 +34,7 @@ public interface CoreFacade archive(List entityUuid); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java index 9b870d2074d..04ab13b92f4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java @@ -220,6 +220,8 @@ List saveBulkEditWithFacilities( List archive(List entityUuids, boolean includeContacts); + ProcessedEntity dearchive(String entityUuid, String dearchiveReason, boolean includeContacts); + List dearchive(List entityUuids, String dearchiveReason, boolean includeContacts); void setResultingCase(EventParticipantReferenceDto eventParticipantReferenceDto, CaseReferenceDto caseReferenceDto); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java index daa35d6b31e..0e9e718a04c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java @@ -28,4 +28,20 @@ public ProcessedEntityStatus getProcessedEntityStatus() { public void setProcessedEntityStatus(ProcessedEntityStatus processedEntityStatus) { this.processedEntityStatus = processedEntityStatus; } + + public static ProcessedEntity withSucess(String entityUuid) { + return new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS); + } + + public static ProcessedEntity withExternalSurveillanceFailure(String entityUuid) { + return new ProcessedEntity(entityUuid, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + } + + public static ProcessedEntity withAccessDeniedFailure(String entityUuid) { + return new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + } + + public static ProcessedEntity withInternalFailure(String entityUuid) { + return new ProcessedEntity(entityUuid, ProcessedEntityStatus.INTERNAL_FAILURE); + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java index 5fafcd51826..7fa14d47f05 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java @@ -54,6 +54,8 @@ public interface EventFacade extends CoreFacade getIndexPage( void linkEventsToGroup(List eventReferences, EventGroupReferenceDto eventGroupReference); - List linkEventsToGroups(List eventUuids, List eventGroupReferences); + List linkEventsToGroups(List eventUuids, List eventGroupReferences, List alreadyLinkedEventUuidsToGroup); void unlinkEventGroup(EventReferenceDto eventReference, EventGroupReferenceDto eventGroupReference); @@ -78,7 +78,5 @@ Page getIndexPage( void notifyEventRemovedFromEventGroup(EventGroupReferenceDto eventGroupReference, List eventReferences); - List getEligibleEventUuidsToBeLinkedToGroup(List eventUuids, List ineligibleEventUuids); - - List getIneligibleEventUuidsToBeLinkedToGroup(List eventUuids, List eventGroupUuids); + List getAlreadyLinkedEventUuidsToGroup(List eventUuids, List eventGroupUuids); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index fbd6217884f..f0914626f31 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -384,6 +384,7 @@ public interface Strings { String ExternalSurveillanceToolGateway_notificationEntryNotDeleted = "ExternalSurveillanceToolGateway.notificationEntryNotDeleted"; String ExternalSurveillanceToolGateway_notificationEntryNotSent = "ExternalSurveillanceToolGateway.notificationEntryNotSent"; String ExternalSurveillanceToolGateway_notificationEntrySent = "ExternalSurveillanceToolGateway.notificationEntrySent"; + String ExternalSurveillanceToolGateway_notificationErrorArchiving = "ExternalSurveillanceToolGateway.notificationErrorArchiving"; String ExternalSurveillanceToolGateway_notificationErrorDeleting = "ExternalSurveillanceToolGateway.notificationErrorDeleting"; String ExternalSurveillanceToolGateway_notificationErrorSending = "ExternalSurveillanceToolGateway.notificationErrorSending"; String ExternalSurveillanceToolGateway_sharedAt = "ExternalSurveillanceToolGateway.sharedAt"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 0822bd43ab4..72b6eacec5d 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1650,6 +1650,7 @@ ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to t ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java index 18bc80017fb..5b802c3dbcd 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java @@ -415,8 +415,8 @@ public DeletionInfoDto getAutomaticDeletionInfo(String uuid) { @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) - public void archive(String entityUuid, Date endOfProcessingDate) { - super.archive(entityUuid, endOfProcessingDate); + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return super.archive(entityUuid, endOfProcessingDate); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 043dd7cfb09..0c342fbe1e2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2820,11 +2820,16 @@ public void deleteCaseInExternalSurveillanceTool(Case caze) throws ExternalSurve @Override @RightsAllowed(UserRight._CASE_ARCHIVE) public void archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts) { - super.archive(entityUuid, endOfProcessingDate); + ProcessedEntity processedEntity = super.archive(entityUuid, endOfProcessingDate); if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(Collections.singletonList(entityUuid)); contactService.archive(caseContacts); } + + if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + throw new ExternalSurveillanceToolRuntimeException( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); + } } @Override @@ -2839,6 +2844,19 @@ public List archive(List entityUuids, boolean includeCo return processedEntities; } + @Override + @RightsAllowed(UserRight._CASE_ARCHIVE) + public ProcessedEntity dearchive(String entityUuid, String dearchiveReason, boolean includeContacts) { + ProcessedEntity processedEntity = dearchive(Collections.singletonList(entityUuid), dearchiveReason, includeContacts).get(0); + + if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + throw new ExternalSurveillanceToolRuntimeException( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); + } + + return processedEntity; + } + @Override @RightsAllowed(UserRight._CASE_ARCHIVE) public List dearchive(List entityUuids, String dearchiveReason, boolean includeContacts) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index cdeb4e5a095..8250bb07704 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -83,7 +83,6 @@ import de.symeda.sormas.api.clinicalcourse.ClinicalVisitCriteria; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.progress.ProcessedEntity; -import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.contact.ContactStatus; import de.symeda.sormas.api.contact.FollowUpStatus; import de.symeda.sormas.api.document.DocumentRelatedEntityType; @@ -1111,14 +1110,8 @@ private void initVisitSubqueryForDeletion(CriteriaBuilder cb, Root visitR } @Override - public void archive(String entityUuid, Date endOfProcessingDate) { - List processedCases = updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(entityUuid), true); - List remainingUuidsToBeProcessed = getEntitiesToBeProcessed(Collections.singletonList(entityUuid), processedCases).stream() - .map(caze -> caze.getUuid()) - .collect(Collectors.toList()); - if (remainingUuidsToBeProcessed.size() > 0) { - super.archive(entityUuid, endOfProcessingDate); - } + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return archive(Collections.singletonList(entityUuid)).get(0); } @Override @@ -1129,8 +1122,7 @@ public List archive(List entityUuids) { getEntitiesToBeProcessed(entityUuids, processedCases).stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); if (remainingUuidsToBeProcessed.size() > 0) { - super.archive(remainingUuidsToBeProcessed); - processedCases.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + processedCases.addAll(super.archive(remainingUuidsToBeProcessed)); } return processedCases; @@ -1144,23 +1136,12 @@ public List dearchive(List entityUuids, String dearchiv getEntitiesToBeProcessed(entityUuids, processedCases).stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); if (remainingUuidsToBeProcessed.size() > 0) { - super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); - processedCases.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + processedCases.addAll(super.dearchive(remainingUuidsToBeProcessed, dearchiveReason)); } return processedCases; } - public List getEligibleUuidsForSharingWithExternalSurveillanceTool(List entityUuids) { - List sharedCaseUuids = new ArrayList<>(); - List uuidsAllowedToBeShared = getEntityUuidsAllowedToBeShared(entityUuids); - if (!uuidsAllowedToBeShared.isEmpty()) { - sharedCaseUuids = getSharedCaseUuids(uuidsAllowedToBeShared); - } - - return sharedCaseUuids; - } - private List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { List processedEntities = new ArrayList<>(); @@ -1172,6 +1153,16 @@ private List updateArchiveFlagInExternalSurveillanceTool(List getEligibleUuidsForSharingWithExternalSurveillanceTool(List entityUuids) { + List sharedCaseUuids = new ArrayList<>(); + List uuidsAllowedToBeShared = getEntityUuidsAllowedToBeShared(entityUuids); + if (!uuidsAllowedToBeShared.isEmpty()) { + sharedCaseUuids = getSharedCaseUuids(uuidsAllowedToBeShared); + } + + return sharedCaseUuids; + } + public List getSharedCaseUuids(List entityUuids) { List caseIds = getCaseIds(entityUuids); List sharedCaseUuids = new ArrayList<>(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 07babe5006e..64866b0ee12 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -115,7 +115,7 @@ public Map calculateEndOfProcessingDate(List entityuuids) } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) - public void archive(String entityUuid, Date endOfProcessingDate) { + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { if (endOfProcessingDate == null) { endOfProcessingDate = calculateEndOfProcessingDate(Collections.singletonList(entityUuid)).get(entityUuid); @@ -132,6 +132,8 @@ public void archive(String entityUuid, Date endOfProcessingDate) { cu.where(cb.equal(root.get(AbstractDomainObject.UUID), entityUuid)); em.createQuery(cu).executeUpdate(); + + return new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) @@ -154,7 +156,7 @@ public List archive(List entityUuids) { em.createQuery(cu).executeUpdate(); })); - entityUuids.forEach(uuid -> processedEntities.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + processedEntities.addAll(buildProcessedEntities(entityUuids, ProcessedEntityStatus.SUCCESS)); return processedEntities; } @@ -176,7 +178,8 @@ public List dearchive(List entityUuids, String dearchiv em.createQuery(cu).executeUpdate(); }); - entityUuids.forEach(uuid -> processedEntities.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + + processedEntities.addAll(buildProcessedEntities(entityUuids, ProcessedEntityStatus.SUCCESS)); return processedEntities; } @@ -217,13 +220,6 @@ public List getEntitiesToBeProcessed(List entityUuids, List !failedUuids.contains(entity.getUuid())).collect(Collectors.toList()); } - public List buildProcessedEntities(List entityUuids, ProcessedEntityStatus processedEntityStatus) { - List processedEntities = new ArrayList<>(); - entityUuids.forEach(entityUuid -> processedEntities.add(new ProcessedEntity(entityUuid, processedEntityStatus))); - - return processedEntities; - } - /** * Used to fetch * {@link AdoServiceWithUserFilterAndJurisdiction#getInJurisdictionIds(List)}/{@link AdoServiceWithUserFilterAndJurisdiction#inJurisdictionOrOwned(AbstractDomainObject)} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index c83c203400e..4844f846fcc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -217,8 +217,8 @@ private Date getDeletionReferenceDate(String uuid, DeletionConfiguration entityC protected abstract CoreEntityType getCoreEntityType(); @DenyAll - public void archive(String entityUuid, Date endOfProcessingDate) { - service.archive(entityUuid, endOfProcessingDate); + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return service.archive(entityUuid, endOfProcessingDate); } @DenyAll diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java index 23656435a68..2777da6a00c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java @@ -61,6 +61,8 @@ import de.symeda.sormas.api.EntityDto; import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.user.CurrentUserService; @@ -177,7 +179,8 @@ public List getList(FilterProvider filterProvider, Integer batchSize) cq.distinct(true); List attributes = getBatchedAttributesQueryResults(cb, cq, from, batchSize); - List ids = attributes.stream().map(AdoAttributes::getId).limit(batchSize == null ? Long.MAX_VALUE : batchSize).collect(Collectors.toList()); + List ids = + attributes.stream().map(AdoAttributes::getId).limit(batchSize == null ? Long.MAX_VALUE : batchSize).collect(Collectors.toList()); logger.trace( "getList: Unique ids identified. batchSize:{}, attributes:{}, ids:{}, {} ms", batchSize, @@ -363,9 +366,9 @@ public List getByIds(List ids) { * Override this method to eagerly fetch entity references in {@link #getByIds(List)}. */ protected void fetchReferences(From from) { - referencesToBeFetched().forEach( s -> from.fetch(s)); + referencesToBeFetched().forEach(s -> from.fetch(s)); } - + protected List referencesToBeFetched() { return Collections.EMPTY_LIST; } @@ -573,6 +576,25 @@ public List getIdsByReferenceDtos(List references) return em.createQuery(cq).getResultList(); } + public List buildProcessedEntities(List entityUuids, ProcessedEntityStatus processedEntityStatus) { + return entityUuids.stream().map(uuid -> buildEntityByStatus(uuid, processedEntityStatus)).collect(Collectors.toList()); + } + + public ProcessedEntity buildEntityByStatus(String uuid, ProcessedEntityStatus status) { + switch (status) { + case SUCCESS: + return ProcessedEntity.withSucess(uuid); + case EXTERNAL_SURVEILLANCE_FAILURE: + return ProcessedEntity.withExternalSurveillanceFailure(uuid); + case ACCESS_DENIED_FAILURE: + return ProcessedEntity.withAccessDeniedFailure(uuid); + case INTERNAL_FAILURE: + return ProcessedEntity.withInternalFailure(uuid); + default: + return null; + } + } + protected TypedQuery createQuery(CriteriaQuery cq, Integer first, Integer max) { final TypedQuery query = em.createQuery(cq); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index f853ca6ddd4..021ec30114b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -645,8 +645,8 @@ private void deleteContact(Contact contact, DeletionDetails deletionDetails) { @Override @RightsAllowed(UserRight._CONTACT_ARCHIVE) - public void archive(String entityUuid, Date endOfProcessingDate) { - super.archive(entityUuid, endOfProcessingDate); + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return super.archive(entityUuid, endOfProcessingDate); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java index ae14e20fc9f..971343b57b7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java @@ -325,8 +325,8 @@ public static EnvironmentReferenceDto toReferenceDto(Environment entity) { @Override @RightsAllowed(UserRight._ENVIRONMENT_ARCHIVE) - public void archive(String entityUuid, Date endOfProcessingDate) { - super.archive(entityUuid, endOfProcessingDate); + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return super.archive(entityUuid, endOfProcessingDate); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index c41ba100cdb..388cc2ab6d2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -328,9 +328,8 @@ public void delete(String eventUuid, DeletionDetails deletionDetails) deleteEvent(event, deletionDetails); } - private boolean isEligibleEvent(Event event) { - return eventParticipantFacade.getAllActiveEventParticipantsByEvent(event.getUuid()).size() == 0; - + private boolean isEventWithoutParticipants(Event event) { + return eventParticipantService.getAllActiveByEvent(event).stream().count() == 0; } private void deleteEvent(Event event, DeletionDetails deletionDetails) @@ -357,7 +356,7 @@ public List delete(List uuids, DeletionDetails deletion List eventsToBeDeleted = service.getByUuids(uuids); if (eventsToBeDeleted != null) { eventsToBeDeleted.forEach(eventToBeDeleted -> { - if (!eventToBeDeleted.isDeleted() && isEligibleEvent(eventToBeDeleted)) { + if (!eventToBeDeleted.isDeleted() && isEventWithoutParticipants(eventToBeDeleted)) { try { deleteEvent(eventToBeDeleted, deletionDetails); processedEvents.add(new ProcessedEntity(eventToBeDeleted.getUuid(), ProcessedEntityStatus.SUCCESS)); @@ -1050,10 +1049,17 @@ public List getArchivedUuidsSince(Date since) { @Override @RightsAllowed(UserRight._EVENT_ARCHIVE) - public void archive(String eventUuid, Date endOfProcessingDate) { - super.archive(eventUuid, endOfProcessingDate); + public ProcessedEntity archive(String eventUuid, Date endOfProcessingDate) { + ProcessedEntity processedEntity = super.archive(eventUuid, endOfProcessingDate); List eventParticipantList = eventParticipantService.getAllUuidsByEventUuids(Collections.singletonList(eventUuid)); eventParticipantService.archive(eventParticipantList); + + if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + throw new ExternalSurveillanceToolRuntimeException( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); + } + + return processedEntity; } @Override @@ -1066,6 +1072,19 @@ public List archive(List eventUuids) { return processedEntities; } + @Override + @RightsAllowed(UserRight._EVENT_ARCHIVE) + public ProcessedEntity dearchive(String entityUuid, String dearchiveReason) { + ProcessedEntity processedEntity = dearchive(Collections.singletonList(entityUuid), dearchiveReason).get(0); + + if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + throw new ExternalSurveillanceToolRuntimeException( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); + } + + return processedEntity; + } + @Override @RightsAllowed(UserRight._EVENT_ARCHIVE) public List dearchive(List eventUuids, String dearchiveReason) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java index 598158abaed..8377a2a6a56 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroupFacadeEjb.java @@ -354,22 +354,33 @@ public void linkEventToGroup(EventReferenceDto eventReference, EventGroupReferen @Override @RightsAllowed(UserRight._EVENTGROUP_LINK) public void linkEventsToGroup(List eventReferences, EventGroupReferenceDto eventGroupReference) { + List eventUuids = eventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); + linkEventsToGroups( - eventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()), - Collections.singletonList(eventGroupReference.getUuid())); + eventUuids, + Collections.singletonList(eventGroupReference.getUuid()), + getAlreadyLinkedEventUuidsToGroup(eventUuids, Collections.singletonList(eventGroupReference.getUuid()))); } @Override @RightsAllowed(UserRight._EVENTGROUP_LINK) public void linkEventToGroups(EventReferenceDto eventReference, List eventGroupReferences) { + linkEventsToGroups( Collections.singletonList(eventReference.getUuid()), - eventGroupReferences.stream().map(EventGroupReferenceDto::getUuid).collect(Collectors.toList())); + eventGroupReferences.stream().map(EventGroupReferenceDto::getUuid).collect(Collectors.toList()), + getAlreadyLinkedEventUuidsToGroup( + Collections.singletonList(eventReference.getUuid()), + eventGroupReferences.stream().map(EventGroupReferenceDto::getUuid).collect(Collectors.toList()))); } @Override @RightsAllowed(UserRight._EVENTGROUP_LINK) - public List linkEventsToGroups(List eventUuids, List eventGroupUuids) { + public List linkEventsToGroups( + List eventUuids, + List eventGroupUuids, + List alreadyLinkedEventUuidsToGroup) { + if (CollectionUtils.isEmpty(eventGroupUuids) || CollectionUtils.isEmpty(eventUuids)) { return new ArrayList<>(); } @@ -382,8 +393,13 @@ public List linkEventsToGroups(List eventUuids, List processedEvents = new ArrayList<>(); for (Event event : events) { try { - linkEventToGroup(event, currentUser, eventGroups); - processedEvents.add(new ProcessedEntity(event.getUuid(), ProcessedEntityStatus.SUCCESS)); + if (!alreadyLinkedEventUuidsToGroup.contains(event.getUuid())) { + linkEventToGroup(event, currentUser, eventGroups); + processedEvents.add(new ProcessedEntity(event.getUuid(), ProcessedEntityStatus.SUCCESS)); + } else { + processedEvents.add(new ProcessedEntity(event.getUuid(), ProcessedEntityStatus.NOT_ELIGIBLE)); + } + } catch (AccessDeniedException e) { processedEvents.add(new ProcessedEntity(event.getUuid(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); logger.error("The event with uuid {} could not be linked due to an AccessDeniedException", event.getUuid(), e); @@ -392,6 +408,14 @@ public List linkEventsToGroups(List eventUuids, List linkedEventUuids = processedEvents.stream() + .filter(event -> event.getProcessedEntityStatus().equals(ProcessedEntityStatus.SUCCESS)) + .map(ProcessedEntity::getEntityUuid) + .collect(Collectors.toSet()); + + notifyEventAddedToEventGroup(eventGroupUuids.get(0), linkedEventUuids); + return processedEvents; } @@ -418,30 +442,19 @@ public void linkEventToGroup(Event event, User currentUser, List eve } } - public List getEligibleEventUuidsToBeLinkedToGroup(List eventUuids, List ineligibleEventUuids) { - List eligibleEventUuids = ineligibleEventUuids.size() > 0 - ? eventUuids.stream().filter(uuid -> !ineligibleEventUuids.contains(uuid)).collect(Collectors.toCollection(ArrayList::new)) - : eventUuids; - - List eligibleEventReferences = new ArrayList<>(); - eligibleEventUuids.forEach(uuid -> eligibleEventReferences.add(new EventReferenceDto(uuid))); - - return eligibleEventReferences; - } - - public List getIneligibleEventUuidsToBeLinkedToGroup(List eventUuids, List eventGroupUuids) { + public List getAlreadyLinkedEventUuidsToGroup(List eventUuids, List eventGroupUuids) { List events = eventService.getByUuids(eventUuids); List eventGroups = eventGroupService.getByUuids(eventGroupUuids); List filteredEventGroups; - List inEligibleEventReferences = new ArrayList<>(); + List alreadyLinkedEventUuids = new ArrayList<>(); for (Event event : events) { filteredEventGroups = getFilteredEventGroups(event, eventGroups); if (filteredEventGroups.isEmpty()) { - inEligibleEventReferences.add(new EventReferenceDto(event.getUuid())); + alreadyLinkedEventUuids.add(event.getUuid()); } } - return inEligibleEventReferences; + return alreadyLinkedEventUuids; } public List getFilteredEventGroups(Event event, List eventGroups) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index a62780eea94..c1a92d82aa0 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -1296,8 +1296,8 @@ public List getByEventAndPersons(String eventUuid, List processedEvents = updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(entityUuid), true); - List remainingUuidsToBeProcessed = getEntitiesToBeProcessed(Collections.singletonList(entityUuid), processedEvents).stream() - .map(event -> event.getUuid()) - .collect(Collectors.toList()); - - if (remainingUuidsToBeProcessed.size() > 0) { - super.archive(entityUuid, endOfProcessingDate); - } + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return archive(Collections.singletonList(entityUuid)).get(0); } @Override @@ -314,8 +306,7 @@ public List archive(List entityUuids) { getEntitiesToBeProcessed(entityUuids, processedEvents).stream().map(event -> event.getUuid()).collect(Collectors.toList()); if (remainingUuidsToBeProcessed.size() > 0) { - super.archive(remainingUuidsToBeProcessed); - processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + processedEvents.addAll(super.archive(remainingUuidsToBeProcessed)); } return processedEvents; @@ -329,14 +320,13 @@ public List dearchive(List entityUuids, String dearchiv getEntitiesToBeProcessed(entityUuids, processedEvents).stream().map(event -> event.getUuid()).collect(Collectors.toList()); if (remainingUuidsToBeProcessed.size() > 0) { - super.dearchive(remainingUuidsToBeProcessed, dearchiveReason); - processedEvents.addAll(buildProcessedEntities(remainingUuidsToBeProcessed, ProcessedEntityStatus.SUCCESS)); + processedEvents.addAll(super.dearchive(remainingUuidsToBeProcessed, dearchiveReason)); } return processedEvents; } - public List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { + private List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { List processedEntities = new ArrayList<>(); List sharedEventUuids = getSharedEventUuids(entityUuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java index e661fa45c85..7dd882887d4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjb.java @@ -85,13 +85,13 @@ public List sendCases(List caseUuids) { List processedCases = new ArrayList<>(); try { doSendCases(caseUuids, false); - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.SUCCESS)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.SUCCESS)); } catch (AccessDeniedException e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } catch (ExternalSurveillanceToolException e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } catch (Exception e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.INTERNAL_FAILURE)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.INTERNAL_FAILURE)); } return processedCases; } @@ -103,14 +103,14 @@ public List sendCasesInternal(List caseUuids, boolean a if (isFeatureEnabled()) { try { doSendCases(caseUuids, archived); - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.SUCCESS)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.SUCCESS)); } catch (ExternalSurveillanceToolException e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } catch (AccessDeniedException e) { - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } } else { - processedCases.addAll(buildProcessedEntitiesListByStatus(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedCases.addAll(shareInfoService.buildProcessedEntities(caseUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } return processedCases; @@ -134,13 +134,13 @@ public List sendEvents(List eventUuids) { List processedEvents = new ArrayList<>(); try { doSendEvents(eventUuids, false); - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.SUCCESS)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.SUCCESS)); } catch (AccessDeniedException e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } catch (ExternalSurveillanceToolException e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } catch (Exception e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.INTERNAL_FAILURE)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.INTERNAL_FAILURE)); } return processedEvents; } @@ -152,28 +152,19 @@ public List sendEventsInternal(List eventUuids, boolean if (isFeatureEnabled()) { try { doSendEvents(eventUuids, archived); - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.SUCCESS)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.SUCCESS)); } catch (ExternalSurveillanceToolException e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } catch (AccessDeniedException e) { - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } } else { - processedEvents.addAll(buildProcessedEntitiesListByStatus(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); + processedEvents.addAll(shareInfoService.buildProcessedEntities(eventUuids, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)); } return processedEvents; } - private List buildProcessedEntitiesListByStatus(List uuids, ProcessedEntityStatus processedEntityStatus) { - List processedEntities = new ArrayList<>(); - - //if for one entity occurs a type of exception (AccessDenied or ExternalSurveillanceTool) that exception will occur for the whole batch - uuids.forEach(uuid -> processedEntities.add(new ProcessedEntity(uuid, processedEntityStatus))); - - return processedEntities; - } - private void doSendEvents(List eventUuids, boolean archived) throws ExternalSurveillanceToolException { if (!userService.hasRight(UserRight.EVENT_EDIT)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorForbidden)); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java index 09a03b88811..362912db594 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java @@ -754,8 +754,8 @@ public void copyImmunizationToLeadPerson(ImmunizationDto immunizationDto, Person @Override @RightsAllowed(UserRight._IMMUNIZATION_ARCHIVE) - public void archive(String entityUuid, Date endOfProcessingDate) { - super.archive(entityUuid, endOfProcessingDate); + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return super.archive(entityUuid, endOfProcessingDate); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java index 7f765985c16..1d20045a4fc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java @@ -1168,7 +1168,8 @@ public List deleteAll(List sampleUuids, DeletionDetails caseFacade.onCaseSampleChanged(associatedCase); } - sampleUuids.forEach(uuid -> processedSamples.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + processedSamples.addAll(buildProcessedEntities(sampleUuids, ProcessedEntityStatus.SUCCESS)); + return processedSamples; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java index 6e614259361..fe11650cbd6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java @@ -777,7 +777,7 @@ public List updateArchived(List taskUuids, boolean arch em.createQuery(cu).executeUpdate(); - taskUuids.forEach(uuid -> processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS))); + processedTasks.addAll(buildProcessedEntities(taskUuids, ProcessedEntityStatus.SUCCESS)); return processedTasks; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index 1b2ac303df9..b769a021eaf 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -465,8 +465,8 @@ protected String getDeleteReferenceField(DeletionReference deletionReference) { @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) - public void archive(String entityUuid, Date endOfProcessingDate) { - super.archive(entityUuid, endOfProcessingDate); + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { + return super.archive(entityUuid, endOfProcessingDate); } @Override diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java index d94292c09fc..3c6ecf8828f 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java @@ -15,7 +15,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; @@ -128,7 +127,7 @@ public void testFeatureIsDisabledWhenExternalSurvToolUrlIsEmpty() { } @Test - public void testSendingCasesOneCaseOk() throws ExternalSurveillanceToolException { + public void testSendingCasesOneCaseOk() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createSurveillanceOfficer(rdcf).toReference(); CaseDataDto case1 = creator.createCase(user, rdcf, null); @@ -145,7 +144,7 @@ public void testSendingCasesOneCaseOk() throws ExternalSurveillanceToolException } @Test - public void testSendingCasesOk() throws ExternalSurveillanceToolException { + public void testSendingCasesOk() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createSurveillanceOfficer(rdcf).toReference(); CaseDataDto case1 = creator.createCase(user, rdcf, null); @@ -251,8 +250,7 @@ public void testDeleteCases() throws ExternalSurveillanceToolException { } @Test - public void testUpdateArchiveFlagInExternalSurveillanceToolForForCase_WithProperEntity_WithCaseAllowedToShare( - WireMockRuntimeInfo wireMockRuntime) { + public void testUpdateArchiveFlagInExternalSurveillanceToolForForCase_WithProperEntity_WithCaseAllowedToShare() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); PersonReferenceDto person = creator.createPerson("Walter", "Schuster").toReference(); @@ -266,16 +264,12 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForForCase_WithProper .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - //getCaseService().updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(caze.getUuid()), true); - - getCaseService().archive(caze.getUuid(), new Date()); - - wireMockRuntime.getWireMock().verify(exactly(1), postRequestedFor(urlEqualTo("/export"))); + List processedEntities = getCaseService().archive(Collections.singletonList(caze.getUuid())); + assertEquals(processedEntities.get(0).getProcessedEntityStatus(), ProcessedEntityStatus.SUCCESS); } @Test - public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithProperEntity_WithoutCaseAllowedToShare( - WireMockRuntimeInfo wireMockRuntime) { + public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithProperEntity_WithoutCaseAllowedToShare() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); PersonReferenceDto person = creator.createPerson("Walter", "Schuster").toReference(); @@ -290,35 +284,8 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithProperEnt .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - List sharedCaseUuids = caseService.getEligibleUuidsForSharingWithExternalSurveillanceTool(Collections.singletonList(caze.getUuid())); - //caseService.updateArchiveFlagInExternalSurveillanceTool(sharedCaseUuids, true); - - caseService.archive(caze.getUuid(), new Date()); - - wireMockRuntime.getWireMock().verify(exactly(0), postRequestedFor(urlEqualTo("/export"))); - } - - @Test - public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_WithoutProperEntity(WireMockRuntimeInfo wireMockRuntime) { - TestDataCreator.RDCF rdcf = creator.createRDCF(); - UserReferenceDto user = creator.createUser(rdcf).toReference(); - PersonReferenceDto person = creator.createPerson("Walter", "Schuster").toReference(); - CaseService caseService = getCaseService(); - - CaseDataDto caze = creator.createCase(user, person, rdcf); - - stubFor( - post(urlEqualTo("/export")).withRequestBody(containing(caze.getUuid())) - .withRequestBody(containing("caseUuids")) - .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - - //the case does not have an externalId set and after the filtering the sendCases will not be called - List sharedCaseUuids = caseService.getEligibleUuidsForSharingWithExternalSurveillanceTool(Collections.singletonList(caze.getUuid())); - //getCaseService().updateArchiveFlagInExternalSurveillanceTool(sharedCaseUuids, true); - - getCaseService().archive(caze.getUuid(), new Date()); - - wireMockRuntime.getWireMock().verify(exactly(0), postRequestedFor(urlEqualTo("/export"))); + List processedEntities = caseService.archive(Collections.singletonList(caze.getUuid())); + assertEquals(processedEntities.get(0).getProcessedEntityStatus(), ProcessedEntityStatus.SUCCESS); } @Test @@ -336,21 +303,14 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForCase_Exception() { .withRequestBody(containing("caseUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_BAD_REQUEST))); - /* - * assertThrows( - * ExternalSurveillanceToolRuntimeException.class, - * () -> getCaseService().updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(caze.getUuid()), true)); - */ - - assertThrows(ExternalSurveillanceToolRuntimeException.class, () -> getCaseService().archive(caze.getUuid(), new Date())); - + List processedEntities = getCaseService().archive(Collections.singletonList(caze.getUuid())); + assertEquals(processedEntities.get(0).getProcessedEntityStatus(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); } @Test - public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_WithProperEntity(WireMockRuntimeInfo wireMockRuntime) { + public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_WithProperEntity() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); - EventDto eventDto = creator.createEvent( EventStatus.SIGNAL, EventInvestigationStatus.PENDING, @@ -366,7 +326,6 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_WithProperEn user, Disease.DENGUE, rdcf); - Event event = getEventService().getByUuid(eventDto.getUuid()); getExternalShareInfoService().createAndPersistShareInfo(event, ExternalShareStatus.SHARED); EventService eventService = getBean(EventService.class); @@ -376,17 +335,14 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_WithProperEn .withRequestBody(containing("eventUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); - List sharedEventUuids = eventService.getSharedEventUuids(Collections.singletonList(event.getUuid())); - eventService.updateArchiveFlagInExternalSurveillanceTool(sharedEventUuids, false); - - wireMockRuntime.getWireMock().verify(exactly(1), postRequestedFor(urlEqualTo("/export"))); + List processedEntities = eventService.archive(Collections.singletonList(event.getUuid())); + assertEquals(processedEntities.get(0).getProcessedEntityStatus(), ProcessedEntityStatus.SUCCESS); } @Test public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_Exception() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto user = creator.createUser(rdcf).toReference(); - EventDto eventDto = creator.createEvent( EventStatus.SIGNAL, EventInvestigationStatus.PENDING, @@ -402,7 +358,6 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_Exception() user, Disease.DENGUE, rdcf); - EventService eventService = getBean(EventService.class); Event event = eventService.getByUuid(eventDto.getUuid()); getExternalShareInfoService().createAndPersistShareInfo(event, ExternalShareStatus.SHARED); @@ -412,9 +367,9 @@ public void testUpdateArchiveFlagInExternalSurveillanceToolForEvent_Exception() .withRequestBody(containing("eventUuids")) .willReturn(aResponse().withStatus(HttpStatus.SC_BAD_REQUEST))); - assertThrows( - ExternalSurveillanceToolRuntimeException.class, - () -> eventService.updateArchiveFlagInExternalSurveillanceTool(Collections.singletonList(eventDto.getUuid()), true)); + List processedEntities = eventService.archive(Collections.singletonList(event.getUuid())); + assertEquals(processedEntities.get(0).getProcessedEntityStatus(), ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); + } @Test @@ -450,7 +405,7 @@ public void testIsSharedCase() throws ExternalSurveillanceToolException { } @Test - public void testIsSharedEvent() throws ExternalSurveillanceToolException { + public void testIsSharedEvent() { TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java index 2390c0b29bf..bee9c2eefe5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupController.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -39,7 +38,6 @@ import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventGroupCriteria; import de.symeda.sormas.api.event.EventGroupDto; @@ -77,15 +75,8 @@ private void linkEventsToGroup( List eventUuids = eventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); List eventGroupUuids = Collections.singletonList(eventGroupReference.getUuid()); - List alreadyLinkedEventsToGroup = - FacadeProvider.getEventGroupFacade().getIneligibleEventUuidsToBeLinkedToGroup(eventUuids, eventGroupUuids); - - List eligibleEventReferences = FacadeProvider.getEventGroupFacade() - .getEligibleEventUuidsToBeLinkedToGroup( - eventUuids, - alreadyLinkedEventsToGroup.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList())); - - List eligibleEventUuids = eligibleEventReferences.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()); + List alreadyLinkedEventUuidsToGroup = + FacadeProvider.getEventGroupFacade().getAlreadyLinkedEventUuidsToGroup(eventUuids, eventGroupUuids); String messageEventsLinkedToGroup = eventReferences.size() > 1 ? Strings.messageEventsLinkedToGroup : Strings.messageEventLinkedToGroup; new BulkOperationHandler( @@ -99,21 +90,15 @@ private void linkEventsToGroup( Strings.messageCountEventsNotLinkedAccessDeniedReason, Strings.messageAllEventsAlreadyLinkedToGroup, Strings.infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible, - Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { - - List eligibleEventUuidsFromBatch = batch.stream() - .filter(eventReference -> eligibleEventUuids.contains(eventReference.getUuid())) - .map(EventReferenceDto::getUuid) - .collect(Collectors.toList()); - - List processedEvents = - FacadeProvider.getEventGroupFacade().linkEventsToGroups(eligibleEventUuidsFromBatch, eventGroupUuids); - - FacadeProvider.getEventGroupFacade() - .notifyEventAddedToEventGroup(eventGroupReference.getUuid(), new HashSet<>(eligibleEventUuidsFromBatch)); - - return processedEvents; - }, new ArrayList<>(eventReferences), callback); + Strings.infoBulkProcessFinishedWithoutSuccess) + .doBulkOperation( + batch -> FacadeProvider.getEventGroupFacade() + .linkEventsToGroups( + batch.stream().map(EventReferenceDto::getUuid).collect(Collectors.toList()), + eventGroupUuids, + alreadyLinkedEventUuidsToGroup), + new ArrayList<>(eventReferences), + callback); } public void create(EventReferenceDto eventReference) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index 3a87609df79..ef2d7165f9a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -45,6 +45,7 @@ import de.symeda.sormas.api.event.EventFacade; import de.symeda.sormas.api.event.EventParticipantDto; import de.symeda.sormas.api.event.EventParticipantFacade; +import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolRuntimeException; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -69,6 +70,10 @@ public static CaseArchiveHandler forCase() { return new CaseArchiveHandler(); } + public static EventArchiveHandler forEvent() { + return new EventArchiveHandler(); + } + public static CoreEntityArchiveHandler forContact() { return new CoreEntityArchiveHandler<>(FacadeProvider.getContactFacade(), ArchiveMessages.CONTACT); } @@ -77,10 +82,6 @@ public static CoreEntityArchiveHandler forEnv return new CoreEntityArchiveHandler<>(FacadeProvider.getEnvironmentFacade(), ArchiveMessages.ENVIRONMENT); } - public static CoreEntityArchiveHandler forEvent() { - return new CoreEntityArchiveHandler<>(FacadeProvider.getEventFacade(), ArchiveMessages.EVENT); - } - public static CoreEntityArchiveHandler forEventParticipant() { return new CoreEntityArchiveHandler<>(FacadeProvider.getEventParticipantFacade(), ArchiveMessages.EVENT_PARTICIPANT); } @@ -179,7 +180,11 @@ public ArchiveMessages getArchiveMessages() { @Override public void archive(String entityUuid) { - entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue())); + try { + entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue())); + } catch (ExternalSurveillanceToolRuntimeException e) { + Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + } } @Override @@ -236,6 +241,27 @@ public String getArchiveButtonCaptionProperty(boolean archived) { } } + private static final class EventArchiveHandler extends CoreEntityArchiveHandler { + + private EventArchiveHandler() { + super(FacadeProvider.getEventFacade(), ArchiveMessages.EVENT); + } + + @Override + public List dearchive(String entityUuid) { + List processedEntities = new ArrayList<>(); + try { + processedEntities = Collections.singletonList(entityFacade.dearchive(entityUuid, dearchiveReasonField.getValue())); + } catch (ExternalSurveillanceToolRuntimeException e) { + Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + } + + return processedEntities; + + } + + } + private static final class CaseArchiveHandler extends CoreEntityArchiveHandler { private CheckBox archiveWithContacts; @@ -246,12 +272,24 @@ private CaseArchiveHandler() { @Override public void archive(String entityUuid) { - entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue()), archiveWithContacts.getValue()); + try { + entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue()), archiveWithContacts.getValue()); + } catch (ExternalSurveillanceToolRuntimeException e) { + Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + } } @Override public List dearchive(String entityUuid) { - return entityFacade.dearchive(Collections.singletonList(entityUuid), dearchiveReasonField.getValue(), archiveWithContacts.getValue()); + List processedEntities = new ArrayList<>(); + try { + processedEntities = + Collections.singletonList(entityFacade.dearchive(entityUuid, dearchiveReasonField.getValue(), archiveWithContacts.getValue())); + } catch (ExternalSurveillanceToolRuntimeException e) { + Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + } + + return processedEntities; } @Override From 186bc9ce395425697bbda6a541b8ad323a1b490a Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 7 Sep 2023 23:06:40 +0300 Subject: [PATCH 081/144] #12257 - Refactorings --- .../de/symeda/sormas/api/ArchivableFacade.java | 2 +- .../AbstractInfrastructureFacadeEjb.java | 14 +++++--------- .../symeda/sormas/backend/task/TaskFacadeEjb.java | 8 ++------ .../de/symeda/sormas/ui/utils/ArchiveHandlers.java | 2 +- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java index 940531ddf24..0ccb807cb7f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java @@ -23,7 +23,7 @@ public interface ArchivableFacade { void archive(String uuid); - List dearchive(String uuid); + ProcessedEntity dearchive(String uuid); List archive(List entityUuid); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java index 8d31235ac0f..799ee491645 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java @@ -200,21 +200,17 @@ public void archive(String uuid) { } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) - public List dearchive(String uuid) { - List processedEntity = new ArrayList<>(); + public ProcessedEntity dearchive(String uuid) { checkInfraDataLocked(); if (hasArchivedParentInfrastructure(Collections.singletonList(uuid))) { throw new AccessDeniedException(I18nProperties.getString(dearchivingNotPossibleMessageProperty)); } - ADO ado = service.getByUuid(uuid); if (ado != null) { ado.setArchived(false); service.ensurePersisted(ado); } - - processedEntity.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS)); - return processedEntity; + return new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS); } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) @@ -222,8 +218,8 @@ public List archive(List entityUuids) { List processedEntities = new ArrayList<>(); entityUuids.forEach(entityUuid -> { if (!isUsedInOtherInfrastructureData(Collections.singletonList(entityUuid))) { - archive(entityUuid); - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); + archive(entityUuid); + processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS)); } else { processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } @@ -237,7 +233,7 @@ public List dearchive(List entityUuids) { entityUuids.forEach(entityUuid -> { if (!hasArchivedParentInfrastructure(Arrays.asList(entityUuid))) { - processedEntities.addAll(dearchive(entityUuid)); + processedEntities.add(dearchive(entityUuid)); } else { processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index 825f0d73571..0b104831024 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -1066,12 +1066,8 @@ public void archive(String uuid) { @Override @RightsAllowed(UserRight._TASK_ARCHIVE) - public List dearchive(String uuid) { - List processedTasks = new ArrayList<>(); - dearchive(Collections.singletonList(uuid)); - processedTasks.add(new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS)); - - return processedTasks; + public ProcessedEntity dearchive(String uuid) { + return dearchive(Collections.singletonList(uuid)).get(0); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index ef2d7165f9a..e67d1e27e23 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -131,7 +131,7 @@ public List archive(List entityUuids) { @Override public List dearchive(String entityUuid) { - return entityFacade.dearchive(entityUuid); + return Collections.singletonList(entityFacade.dearchive(entityUuid)); } public List dearchive(List entityUuids) { From da28720f8ac6fa22f998c2a4d51fcc5023d79965 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 7 Sep 2023 23:16:04 +0300 Subject: [PATCH 082/144] #12257 - Add @AuditedClass annotation to ProcessedEntity --- .../de/symeda/sormas/api/common/progress/ProcessedEntity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java index 0e9e718a04c..38f4343dd55 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java @@ -2,6 +2,9 @@ import java.io.Serializable; +import de.symeda.sormas.api.audit.AuditedClass; + +@AuditedClass public class ProcessedEntity implements Serializable { String entityUuid; From 399039b0640f3fd73dbfa210320d2fa1dec45987 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Fri, 8 Sep 2023 09:50:33 +0300 Subject: [PATCH 083/144] #11566 Add an environment sample grid to the web app - fix typo --- .../sormas/ui/samples/EnvironmentSampleGridComponent.java | 2 +- .../de/symeda/sormas/ui/samples/HumanSampleGridComponent.java | 2 +- .../{SampleGidComponent.java => SampleGridComponent.java} | 2 +- .../src/main/java/de/symeda/sormas/ui/samples/SamplesView.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{SampleGidComponent.java => SampleGridComponent.java} (94%) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java index cb93f84722b..b53beb9bc05 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java @@ -41,7 +41,7 @@ import de.symeda.sormas.ui.utils.LayoutUtil; import de.symeda.sormas.ui.utils.MenuBarHelper; -public class EnvironmentSampleGridComponent extends SampleGidComponent { +public class EnvironmentSampleGridComponent extends SampleGridComponent { private static final long serialVersionUID = 4302760792255154403L; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java index 2bb17025b2c..d6b544c105a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java @@ -46,7 +46,7 @@ import de.symeda.sormas.ui.utils.MenuBarHelper; @SuppressWarnings("serial") -public class HumanSampleGridComponent extends SampleGidComponent { +public class HumanSampleGridComponent extends SampleGridComponent { private static final String NOT_SHIPPED = "notShipped"; private static final String SHIPPED = "shipped"; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGidComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java similarity index 94% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGidComponent.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java index a362039ccb7..f62508f770a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGidComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java @@ -22,7 +22,7 @@ import de.symeda.sormas.api.utils.criteria.BaseCriteria; import de.symeda.sormas.ui.utils.ReloadableGrid; -public abstract class SampleGidComponent extends VerticalLayout { +public abstract class SampleGridComponent extends VerticalLayout { abstract ReloadableGrid getGrid(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java index a4eea698295..08a0e3cf201 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java @@ -63,7 +63,7 @@ public class SamplesView extends AbstractView { public static final String VIEW_NAME = "samples"; - private final SampleGidComponent sampleListComponent; + private final SampleGridComponent sampleListComponent; private SamplesViewConfiguration viewConfiguration; private Button btnEnterBulkEditMode; From 4d75a792361f379b102f6e2a579b8e249994b872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 8 Sep 2023 09:05:43 +0200 Subject: [PATCH 084/144] [GITFLOW]Updating development poms to hotfix version to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-serverlibs/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index d8c6a1cf9e4..1cc518919b6 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 24ee76cc1e0..4764e003b58 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index b65a3a4ed62..d8bf89ba140 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 5240cd89452..cb3fa811056 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.89.0-SNAPSHOT + 1.88.1 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 1c7c5505f5a..4584e5533a2 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 1472d34945e..053ab0c94b0 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 85d50aff6b2..2167937bab0 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 030ef6bb665..2a9272765bd 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index c0904a45e42..5dc9ad74b0d 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index d5033a43e5e..3fc9b6b6279 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 88bc5a439c9..61597fc8d2a 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.88.1 ../sormas-base 4.0.0 From 51ef388d39a39fdf5d558a210ccec50dcb7f57ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 8 Sep 2023 09:06:00 +0200 Subject: [PATCH 085/144] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-serverlibs/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 1cc518919b6..d8c6a1cf9e4 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 4764e003b58..24ee76cc1e0 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 7c56ffeacf8..176828ed37f 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8da860de8c8..8cda7a43557 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.88.1 + 1.89.0-SNAPSHOT 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 4584e5533a2..1c7c5505f5a 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 053ab0c94b0..1472d34945e 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 2167937bab0..85d50aff6b2 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2a9272765bd..030ef6bb665 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index 0c3196c9a86..ef2c2dc06c3 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 3fc9b6b6279..d5033a43e5e 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 61597fc8d2a..88bc5a439c9 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.88.1 + 1.89.0-SNAPSHOT ../sormas-base 4.0.0 From 94faf0a732f9c7cd3af8e1cad29e404b4ba6af76 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Fri, 8 Sep 2023 12:56:03 +0300 Subject: [PATCH 086/144] #11571 Add an import mechanism to the environment directory - validate environment media and water field relations --- .../de/symeda/sormas/api/i18n/Validations.java | 1 + .../src/main/resources/validations.properties | 1 + .../environment/EnvironmentFacadeEjb.java | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java index a963bf6c348..a7b6a659eca 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java @@ -47,6 +47,7 @@ public interface Validations { String duplicateEpidNumber = "duplicateEpidNumber"; String duplicateExternalToken = "duplicateExternalToken"; String emptyOverwrittenFollowUpUntilDate = "emptyOverwrittenFollowUpUntilDate"; + String environmentWaterFieldsSetWithNotWaterMedia = "environmentWaterFieldsSetWithNotWaterMedia"; String errorsInForm = "errorsInForm"; String eventSubordinateEventFromDateFilterValidation = "eventSubordinateEventFromDateFilterValidation"; String eventSuperordinateEventToDateFilterValidation = "eventSuperordinateEventToDateFilterValidation"; diff --git a/sormas-api/src/main/resources/validations.properties b/sormas-api/src/main/resources/validations.properties index 74c626dc7ef..f0a25b54e20 100644 --- a/sormas-api/src/main/resources/validations.properties +++ b/sormas-api/src/main/resources/validations.properties @@ -273,3 +273,4 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is not water: %s \ No newline at end of file diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java index b5576e0e636..7b4de72e6f6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java @@ -23,6 +23,7 @@ import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.NotImplementedException; import de.symeda.sormas.api.common.CoreEntityType; @@ -31,11 +32,13 @@ import de.symeda.sormas.api.environment.EnvironmentDto; import de.symeda.sormas.api.environment.EnvironmentFacade; import de.symeda.sormas.api.environment.EnvironmentIndexDto; +import de.symeda.sormas.api.environment.EnvironmentMedia; import de.symeda.sormas.api.environment.EnvironmentReferenceDto; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolRuntimeException; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.SortProperty; @@ -242,7 +245,18 @@ private List> sortBy(List sortProperties, Environment @Override public void validate(EnvironmentDto dto) throws ValidationRuntimeException { - // no validations yet + if (dto.getEnvironmentMedia() != EnvironmentMedia.WATER && dto.getWaterType() != null + || dto.getInfrastructureDetails() != null + || MapUtils.isNotEmpty(dto.getWaterUse())) { + throw new ValidationRuntimeException( + I18nProperties.getValidationError( + Validations.environmentWaterFieldsSetWithNotWaterMedia, + String.join( + ", ", + I18nProperties.getPrefixCaption(EnvironmentDto.I18N_PREFIX, EnvironmentDto.WATER_TYPE), + I18nProperties.getPrefixCaption(EnvironmentDto.I18N_PREFIX, EnvironmentDto.INFRASTUCTURE_DETAILS), + I18nProperties.getPrefixCaption(EnvironmentDto.I18N_PREFIX, EnvironmentDto.WATER_USE)))); + } } @Override From 250e9b0cb9018cd43982945eb37c7a02aadb8363 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Fri, 8 Sep 2023 13:31:17 +0300 Subject: [PATCH 087/144] #11571 Add an import mechanism to the environment directory - validate environment media and water field relations --- .../sormas/backend/environment/EnvironmentFacadeEjb.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java index 7b4de72e6f6..37a8fd633d5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java @@ -245,9 +245,8 @@ private List> sortBy(List sortProperties, Environment @Override public void validate(EnvironmentDto dto) throws ValidationRuntimeException { - if (dto.getEnvironmentMedia() != EnvironmentMedia.WATER && dto.getWaterType() != null - || dto.getInfrastructureDetails() != null - || MapUtils.isNotEmpty(dto.getWaterUse())) { + if (dto.getEnvironmentMedia() != EnvironmentMedia.WATER + && (dto.getWaterType() != null || dto.getInfrastructureDetails() != null || MapUtils.isNotEmpty(dto.getWaterUse()))) { throw new ValidationRuntimeException( I18nProperties.getValidationError( Validations.environmentWaterFieldsSetWithNotWaterMedia, From fee9b107486c427bc54cef8996a190edf8663a29 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 11 Sep 2023 14:19:44 +0300 Subject: [PATCH 088/144] #12257 - refactorings after review --- .../de/symeda/sormas/api/caze/CaseFacade.java | 2 +- .../api/common/progress/ProcessedEntity.java | 16 ------- .../sormas/backend/caze/CaseFacadeEjb.java | 12 +---- .../sormas/backend/common/BaseAdoService.java | 17 +------ .../sormas/backend/event/EventFacadeEjb.java | 12 +---- .../sormas/ui/utils/ArchiveHandlers.java | 46 ++++++++++--------- 6 files changed, 30 insertions(+), 75 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java index 04ab13b92f4..7ac6a0e8d9a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java @@ -216,7 +216,7 @@ List saveBulkEditWithFacilities( PreviousCaseDto getMostRecentPreviousCase(PersonReferenceDto person, Disease disease, Date startDate); - void archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts); + ProcessedEntity archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts); List archive(List entityUuids, boolean includeContacts); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java index 38f4343dd55..177fd1c7c26 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/progress/ProcessedEntity.java @@ -31,20 +31,4 @@ public ProcessedEntityStatus getProcessedEntityStatus() { public void setProcessedEntityStatus(ProcessedEntityStatus processedEntityStatus) { this.processedEntityStatus = processedEntityStatus; } - - public static ProcessedEntity withSucess(String entityUuid) { - return new ProcessedEntity(entityUuid, ProcessedEntityStatus.SUCCESS); - } - - public static ProcessedEntity withExternalSurveillanceFailure(String entityUuid) { - return new ProcessedEntity(entityUuid, ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE); - } - - public static ProcessedEntity withAccessDeniedFailure(String entityUuid) { - return new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); - } - - public static ProcessedEntity withInternalFailure(String entityUuid) { - return new ProcessedEntity(entityUuid, ProcessedEntityStatus.INTERNAL_FAILURE); - } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 0c342fbe1e2..2f1c3277075 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -2819,17 +2819,14 @@ public void deleteCaseInExternalSurveillanceTool(Case caze) throws ExternalSurve @Override @RightsAllowed(UserRight._CASE_ARCHIVE) - public void archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts) { + public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate, boolean includeContacts) { ProcessedEntity processedEntity = super.archive(entityUuid, endOfProcessingDate); if (includeContacts) { List caseContacts = contactService.getAllUuidsByCaseUuids(Collections.singletonList(entityUuid)); contactService.archive(caseContacts); } - if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { - throw new ExternalSurveillanceToolRuntimeException( - I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); - } + return processedEntity; } @Override @@ -2849,11 +2846,6 @@ public List archive(List entityUuids, boolean includeCo public ProcessedEntity dearchive(String entityUuid, String dearchiveReason, boolean includeContacts) { ProcessedEntity processedEntity = dearchive(Collections.singletonList(entityUuid), dearchiveReason, includeContacts).get(0); - if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { - throw new ExternalSurveillanceToolRuntimeException( - I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); - } - return processedEntity; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java index 2777da6a00c..30972b000ae 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java @@ -577,22 +577,7 @@ public List getIdsByReferenceDtos(List references) } public List buildProcessedEntities(List entityUuids, ProcessedEntityStatus processedEntityStatus) { - return entityUuids.stream().map(uuid -> buildEntityByStatus(uuid, processedEntityStatus)).collect(Collectors.toList()); - } - - public ProcessedEntity buildEntityByStatus(String uuid, ProcessedEntityStatus status) { - switch (status) { - case SUCCESS: - return ProcessedEntity.withSucess(uuid); - case EXTERNAL_SURVEILLANCE_FAILURE: - return ProcessedEntity.withExternalSurveillanceFailure(uuid); - case ACCESS_DENIED_FAILURE: - return ProcessedEntity.withAccessDeniedFailure(uuid); - case INTERNAL_FAILURE: - return ProcessedEntity.withInternalFailure(uuid); - default: - return null; - } + return entityUuids.stream().map(uuid -> new ProcessedEntity(uuid, processedEntityStatus)).collect(Collectors.toList()); } protected TypedQuery createQuery(CriteriaQuery cq, Integer first, Integer max) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 388cc2ab6d2..4fe037aa9a3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -329,7 +329,7 @@ public void delete(String eventUuid, DeletionDetails deletionDetails) } private boolean isEventWithoutParticipants(Event event) { - return eventParticipantService.getAllActiveByEvent(event).stream().count() == 0; + return eventParticipantService.getAllActiveByEvent(event).size() == 0; } private void deleteEvent(Event event, DeletionDetails deletionDetails) @@ -1054,11 +1054,6 @@ public ProcessedEntity archive(String eventUuid, Date endOfProcessingDate) { List eventParticipantList = eventParticipantService.getAllUuidsByEventUuids(Collections.singletonList(eventUuid)); eventParticipantService.archive(eventParticipantList); - if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { - throw new ExternalSurveillanceToolRuntimeException( - I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); - } - return processedEntity; } @@ -1077,11 +1072,6 @@ public List archive(List eventUuids) { public ProcessedEntity dearchive(String entityUuid, String dearchiveReason) { ProcessedEntity processedEntity = dearchive(Collections.singletonList(entityUuid), dearchiveReason).get(0); - if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { - throw new ExternalSurveillanceToolRuntimeException( - I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving)); - } - return processedEntity; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index e67d1e27e23..6b218625646 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -45,7 +45,6 @@ import de.symeda.sormas.api.event.EventFacade; import de.symeda.sormas.api.event.EventParticipantDto; import de.symeda.sormas.api.event.EventParticipantFacade; -import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolRuntimeException; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -180,10 +179,12 @@ public ArchiveMessages getArchiveMessages() { @Override public void archive(String entityUuid) { - try { - entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue())); - } catch (ExternalSurveillanceToolRuntimeException e) { - Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + ProcessedEntity processedEntity = entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue())); + + if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + Notification.show( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving), + Notification.Type.WARNING_MESSAGE); } } @@ -249,17 +250,16 @@ private EventArchiveHandler() { @Override public List dearchive(String entityUuid) { - List processedEntities = new ArrayList<>(); - try { - processedEntities = Collections.singletonList(entityFacade.dearchive(entityUuid, dearchiveReasonField.getValue())); - } catch (ExternalSurveillanceToolRuntimeException e) { - Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + List processedEntities = Collections.singletonList(entityFacade.dearchive(entityUuid, dearchiveReasonField.getValue())); + + if (processedEntities.get(0).getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + Notification.show( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving), + Notification.Type.WARNING_MESSAGE); } return processedEntities; - } - } private static final class CaseArchiveHandler extends CoreEntityArchiveHandler { @@ -272,21 +272,25 @@ private CaseArchiveHandler() { @Override public void archive(String entityUuid) { - try { + ProcessedEntity processedEntity = entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue()), archiveWithContacts.getValue()); - } catch (ExternalSurveillanceToolRuntimeException e) { - Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + + if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + Notification.show( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving), + Notification.Type.WARNING_MESSAGE); } } @Override public List dearchive(String entityUuid) { - List processedEntities = new ArrayList<>(); - try { - processedEntities = - Collections.singletonList(entityFacade.dearchive(entityUuid, dearchiveReasonField.getValue(), archiveWithContacts.getValue())); - } catch (ExternalSurveillanceToolRuntimeException e) { - Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + List processedEntities = + Collections.singletonList(entityFacade.dearchive(entityUuid, dearchiveReasonField.getValue(), archiveWithContacts.getValue())); + + if (processedEntities.get(0).getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { + Notification.show( + I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving), + Notification.Type.WARNING_MESSAGE); } return processedEntities; From d233ad0d3cf9b1e017a1028c20446d123214c0d6 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Mon, 11 Sep 2023 19:43:25 +0300 Subject: [PATCH 089/144] #12257 - refactorings after review, part2 --- .../symeda/sormas/api/ArchivableFacade.java | 2 +- .../sormas/backend/event/EventFacadeEjb.java | 3 +- .../AbstractInfrastructureFacadeEjb.java | 10 ++- .../sormas/backend/task/TaskFacadeEjb.java | 4 +- .../sormas/ui/utils/ArchiveHandlers.java | 38 +++++----- .../sormas/ui/utils/ArchiveMessages.java | 70 ++++++++++++++++--- .../sormas/ui/utils/ArchivingController.java | 2 +- 7 files changed, 95 insertions(+), 34 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java index 0ccb807cb7f..1bf42ae6b54 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/ArchivableFacade.java @@ -21,7 +21,7 @@ public interface ArchivableFacade { - void archive(String uuid); + ProcessedEntity archive(String uuid); ProcessedEntity dearchive(String uuid); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 4fe037aa9a3..8f9f77e561d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -78,6 +78,7 @@ import de.symeda.sormas.api.event.EventGroupReferenceDto; import de.symeda.sormas.api.event.EventGroupsIndexDto; import de.symeda.sormas.api.event.EventIndexDto; +import de.symeda.sormas.api.event.EventParticipantCriteria; import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.externaldata.ExternalDataDto; @@ -329,7 +330,7 @@ public void delete(String eventUuid, DeletionDetails deletionDetails) } private boolean isEventWithoutParticipants(Event event) { - return eventParticipantService.getAllActiveByEvent(event).size() == 0; + return eventParticipantFacade.count(new EventParticipantCriteria().withEvent(new EventReferenceDto(event.getUuid()))) == 0; } private void deleteEvent(Event event, DeletionDetails deletionDetails) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java index 799ee491645..302b2ffd01c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java @@ -185,11 +185,15 @@ protected ADO fillOrBuildEntity(DTO source, ADO target, boolean checkChangeDate) @Override @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) - public void archive(String uuid) { + public ProcessedEntity archive(String uuid) { + ProcessedEntity processedEntity; + // todo this should be really in the parent but right now there the setter for archived is not available there checkInfraDataLocked(); if (isUsedInOtherInfrastructureData(Collections.singletonList(uuid))) { - throw new AccessDeniedException(I18nProperties.getString(archivingNotPossibleMessageProperty)); + processedEntity = new ProcessedEntity(uuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + } else { + processedEntity = new ProcessedEntity(uuid, ProcessedEntityStatus.SUCCESS); } ADO ado = service.getByUuid(uuid); @@ -197,6 +201,8 @@ public void archive(String uuid) { ado.setArchived(true); service.ensurePersisted(ado); } + + return processedEntity; } @RightsAllowed(UserRight._INFRASTRUCTURE_ARCHIVE) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index 0b104831024..69060833c2d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -1060,8 +1060,8 @@ private void validate(TaskDto task) throws ValidationRuntimeException { @Override @RightsAllowed(UserRight._TASK_ARCHIVE) - public void archive(String uuid) { - archive(Collections.singletonList(uuid)); + public ProcessedEntity archive(String uuid) { + return archive(Collections.singletonList(uuid)).get(0); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java index 6b218625646..45e362df8a5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveHandlers.java @@ -15,7 +15,6 @@ package de.symeda.sormas.ui.utils; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -56,7 +55,6 @@ import de.symeda.sormas.api.task.TaskFacade; import de.symeda.sormas.api.travelentry.TravelEntryDto; import de.symeda.sormas.api.travelentry.TravelEntryFacade; -import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.UtilDate; import de.symeda.sormas.ui.utils.ArchivingController.IArchiveHandler; @@ -119,8 +117,8 @@ protected ArchiveHandler(F entityFacade, ArchiveMessages archiveMessages) { } @Override - public void archive(String entityUuid) { - entityFacade.archive(entityUuid); + public ProcessedEntity archive(String entityUuid) { + return entityFacade.archive(entityUuid); } @Override @@ -178,7 +176,7 @@ public ArchiveMessages getArchiveMessages() { } @Override - public void archive(String entityUuid) { + public ProcessedEntity archive(String entityUuid) { ProcessedEntity processedEntity = entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue())); if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) { @@ -186,6 +184,8 @@ public void archive(String entityUuid) { I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving), Notification.Type.WARNING_MESSAGE); } + + return processedEntity; } @Override @@ -271,7 +271,7 @@ private CaseArchiveHandler() { } @Override - public void archive(String entityUuid) { + public ProcessedEntity archive(String entityUuid) { ProcessedEntity processedEntity = entityFacade.archive(entityUuid, UtilDate.from(endOfProcessingDateField.getValue()), archiveWithContacts.getValue()); @@ -280,6 +280,8 @@ public void archive(String entityUuid) { I18nProperties.getString(Strings.ExternalSurveillanceToolGateway_notificationErrorArchiving), Notification.Type.WARNING_MESSAGE); } + + return processedEntity; } @Override @@ -347,24 +349,26 @@ protected InfrastructureArchiveHandler(F entityFacade, ArchiveMessages archiveMe } @Override - public void archive(String entityUuid) { - try { - super.archive(entityUuid); - } catch (AccessDeniedException e) { - Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + public ProcessedEntity archive(String entityUuid) { + ProcessedEntity processedEntity = super.archive(entityUuid); + + if (processedEntity.getProcessedEntityStatus().equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE)) { + Notification + .show(I18nProperties.getString(getArchiveMessages().getMessageEntityArchivingNotPossible()), Notification.Type.WARNING_MESSAGE); } + + return processedEntity; } @Override public List dearchive(String entityUuid) { - List processedEntities = new ArrayList<>(); + List processedEntities = super.dearchive(entityUuid); - try { - processedEntities = super.dearchive(entityUuid); - } catch (AccessDeniedException e) { - processedEntities.add(new ProcessedEntity(entityUuid, ProcessedEntityStatus.ACCESS_DENIED_FAILURE)); - Notification.show(e.getMessage(), Notification.Type.WARNING_MESSAGE); + if (processedEntities.get(0).getProcessedEntityStatus().equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE)) { + Notification + .show(I18nProperties.getString(getArchiveMessages().getMessageEntityArchivingNotPossible()), Notification.Type.WARNING_MESSAGE); } + return processedEntities; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java index c7c64150bb8..f07ab6d0d92 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchiveMessages.java @@ -17,6 +17,8 @@ public enum ArchiveMessages { Strings.messageCountCasesNotArchivedExternalReason, Strings.messageCountCasesNotDearchivedExternalReason, null, + null, + null, null), CONTACT(Strings.headingArchiveContact, @@ -32,6 +34,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), ENVIRONMENT(Strings.headingArchiveEnvironment, @@ -47,6 +51,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), EVENT(Strings.headingArchiveEvent, @@ -62,6 +68,8 @@ public enum ArchiveMessages { Strings.messageCountEventsNotArchivedExternalReason, Strings.messageCountEventsNotDearchivedExternalReason, null, + null, + null, null), EVENT_PARTICIPANT(Strings.headingArchiveEventParticipant, @@ -77,6 +85,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), IMMUNIZATION(Strings.headingArchiveImmunization, @@ -92,6 +102,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), TRAVEL_ENTRY(Strings.headingArchiveTravelEntry, @@ -107,6 +119,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), CAMPAIGN(Strings.headingArchiveCampaign, @@ -122,6 +136,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), TASK(Strings.headingConfirmArchiving, @@ -137,6 +153,8 @@ public enum ArchiveMessages { null, null, null, + null, + null, null), CONTINENT(Strings.headingConfirmArchiving, @@ -152,7 +170,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + Strings.messageContinentArchivingNotPossible, + null), SUBCONTINENT(Strings.headingConfirmArchiving, Strings.confirmationArchiveSubcontinent, @@ -167,7 +187,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + Strings.messageSubcontinentArchivingNotPossible, + Strings.messageSubcontinentDearchivingNotPossible), AREA(Strings.headingConfirmArchiving, Strings.confirmationArchiveArea, @@ -182,7 +204,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + Strings.messageAreaArchivingNotPossible, + null), COUNTRY(Strings.headingConfirmArchiving, Strings.confirmationArchiveCountry, @@ -197,7 +221,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + null, + Strings.messageCountryDearchivingNotPossible), REGION(Strings.headingConfirmArchiving, Strings.confirmationArchiveRegion, @@ -212,7 +238,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + Strings.messageRegionArchivingNotPossible, + null), DISTRICT(Strings.headingConfirmArchiving, Strings.confirmationArchiveDistrict, @@ -227,7 +255,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + Strings.messageDistrictArchivingNotPossible, + Strings.messageDistrictDearchivingNotPossible), COMMUNITY(Strings.headingConfirmArchiving, Strings.confirmationArchiveCommunity, @@ -242,7 +272,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + Strings.messageCommunityArchivingNotPossible, + Strings.messageCommunityDearchivingNotPossible), FACILITY(Strings.headingConfirmArchiving, Strings.confirmationArchiveFacility, @@ -257,7 +289,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason), + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + null, + Strings.messageFacilityDearchivingNotPossible), POINT_OF_ENTRY(Strings.headingConfirmArchiving, Strings.confirmationArchivePointOfEntry, @@ -272,7 +306,9 @@ public enum ArchiveMessages { null, null, Strings.messageCountEntitiesNotArchivedAccessDeniedReason, - Strings.messageCountEntitiesNotDearchivedAccessDeniedReason); + Strings.messageCountEntitiesNotDearchivedAccessDeniedReason, + null, + Strings.messagePointOfEntryDearchivingNotPossible); private final String headingArchiveEntity; private final String confirmationArchiveEntity; @@ -289,6 +325,8 @@ public enum ArchiveMessages { private final String messageCountEntitiesNotDearchivedExternalReason; private final String messageCountEntitiesNotArchivedAccessDeniedReason; private final String messageCountEntitiesNotDearchivedAccessDeniedReason; + private final String messageEntityArchivingNotPossible; + private final String messageEntityDearchivingNotPossible; private final String headingConfirmationArchiving = Strings.headingConfirmArchiving; private final String headingConfirmationDearchiving = Strings.headingConfirmDearchiving; @@ -315,7 +353,9 @@ public enum ArchiveMessages { String messageCountEntitiesNotArchivedExternalReason, String messageCountEntitiesNotDearchivedExternalReason, String messageCountEntitiesNotArchivedAccessDeniedReason, - String messageCountEntitiesNotDearchivedAccessDeniedReason) { + String messageCountEntitiesNotDearchivedAccessDeniedReason, + String messageEntityArchivingNotPossible, + String messageEntityDearchivingNotPossible) { this.headingArchiveEntity = headingArchiveEntity; this.confirmationArchiveEntity = confirmationArchiveEntity; this.confirmationArchiveEntities = confirmationArchiveEntities; @@ -330,6 +370,8 @@ public enum ArchiveMessages { this.messageCountEntitiesNotDearchivedExternalReason = messageCountEntitiesNotDearchivedExternalReason; this.messageCountEntitiesNotArchivedAccessDeniedReason = messageCountEntitiesNotArchivedAccessDeniedReason; this.messageCountEntitiesNotDearchivedAccessDeniedReason = messageCountEntitiesNotDearchivedAccessDeniedReason; + this.messageEntityArchivingNotPossible = messageEntityArchivingNotPossible; + this.messageEntityDearchivingNotPossible = messageEntityDearchivingNotPossible; } public String getHeadingArchiveEntity() { @@ -388,6 +430,14 @@ public String getMessageCountEntitiesNotDearchivedAccessDeniedReason() { return messageCountEntitiesNotDearchivedAccessDeniedReason; } + public String getMessageEntityArchivingNotPossible() { + return messageEntityArchivingNotPossible; + } + + public String getMessageEntityDearchivingNotPossible() { + return messageEntityDearchivingNotPossible; + } + public String getMessageCountEntitiesNotArchived() { return messageCountEntitiesNotArchived; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java index 5456fe62897..24d1433fe48 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ArchivingController.java @@ -282,7 +282,7 @@ this. createBulkOperationHandler(archiveHandler, false) public interface IArchiveHandler { - void archive(String entityUuid); + ProcessedEntity archive(String entityUuid); List archive(List entityUuids); From ae0ed10e4239187733fc3d2df0a1a464ad4c60aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 7 Sep 2023 10:36:15 +0200 Subject: [PATCH 090/144] #12500 - Add edit fragment and activity --- .../app/EnvironmentSampleBackendTest.java | 64 ++++ .../symeda/sormas/app/TestEntityCreator.java | 30 ++ sormas-app/app/src/main/AndroidManifest.xml | 17 +- .../app/backend/common/AbstractAdoDao.java | 54 +-- .../EnvironmentSampleDao.java | 17 + .../EnvironmentSampleDtoHelper.java | 2 +- .../sormas/app/backend/location/Location.java | 24 +- .../controls/ControlCheckBoxGroupField.java | 19 + .../app/environment/EnvironmentSection.java | 2 +- .../edit/EnvironmentEditActivity.java | 7 + .../EnvironmentEditSampleListFragment.java | 124 +++++++ .../read/EnvironmentReadActivity.java | 3 + .../EnvironmentReadSampleListFragment.java | 111 ++++++ .../edit/EnvironmentSampleEditActivity.java | 169 +++++++++ .../edit/EnvironmentSampleEditFragment.java | 190 ++++++++++ .../edit/EnvironmentSampleNewActivity.java | 165 +++++++++ .../edit/EnvironmentSampleValidator.java | 115 ++++++ .../read/EnvironmentSampleReadActivity.java | 3 +- ...ragment_environment_sample_edit_layout.xml | 342 ++++++++++++++++++ .../app/src/main/res/values/strings.xml | 4 + 20 files changed, 1427 insertions(+), 35 deletions(-) create mode 100644 sormas-app/app/src/androidTest/java/de/symeda/sormas/app/EnvironmentSampleBackendTest.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditSampleListFragment.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadSampleListFragment.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleNewActivity.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java create mode 100644 sormas-app/app/src/main/res/layout/fragment_environment_sample_edit_layout.xml diff --git a/sormas-app/app/src/androidTest/java/de/symeda/sormas/app/EnvironmentSampleBackendTest.java b/sormas-app/app/src/androidTest/java/de/symeda/sormas/app/EnvironmentSampleBackendTest.java new file mode 100644 index 00000000000..18a71b0f266 --- /dev/null +++ b/sormas-app/app/src/androidTest/java/de/symeda/sormas/app/EnvironmentSampleBackendTest.java @@ -0,0 +1,64 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + +import de.symeda.sormas.app.backend.common.DaoException; +import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; + +@RunWith(AndroidJUnit4.class) +public class EnvironmentSampleBackendTest { + + @Rule + public final ActivityTestRule testActivityRule = new ActivityTestRule<>(TestBackendActivity.class, false, true); + + @Before + public void initTest() { + TestHelper.initTestEnvironment(false); + } + + @Test + public void shouldAcceptAsExpected() throws DaoException { + EnvironmentSample sample = TestEntityCreator.createEnvironmentSample(); + assertThat(sample.isModified(), is(false)); + + sample.setFieldSampleId("123"); + sample.setPhValue(5); + DatabaseHelper.getEnvironmentSampleDao().saveAndSnapshot(sample); + sample = DatabaseHelper.getEnvironmentSampleDao().queryUuid(sample.getUuid()); + assertThat(sample.isModified(), is(true)); + assertNotNull(DatabaseHelper.getEnvironmentSampleDao().querySnapshotByUuid(sample.getUuid())); + + DatabaseHelper.getEnvironmentSampleDao().accept(sample); + sample = DatabaseHelper.getEnvironmentSampleDao().queryUuid(sample.getUuid()); + assertNull(DatabaseHelper.getEnvironmentSampleDao().querySnapshotByUuid(sample.getUuid())); + assertThat(sample.isModified(), is(false)); + } + +} diff --git a/sormas-app/app/src/androidTest/java/de/symeda/sormas/app/TestEntityCreator.java b/sormas-app/app/src/androidTest/java/de/symeda/sormas/app/TestEntityCreator.java index ecfc1f12bde..84ea517f6a7 100644 --- a/sormas-app/app/src/androidTest/java/de/symeda/sormas/app/TestEntityCreator.java +++ b/sormas-app/app/src/androidTest/java/de/symeda/sormas/app/TestEntityCreator.java @@ -42,6 +42,8 @@ import de.symeda.sormas.app.backend.common.DatabaseHelper; import de.symeda.sormas.app.backend.config.ConfigProvider; import de.symeda.sormas.app.backend.contact.Contact; +import de.symeda.sormas.app.backend.environment.Environment; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.app.backend.event.Event; import de.symeda.sormas.app.backend.event.EventParticipant; import de.symeda.sormas.app.backend.exposure.Exposure; @@ -333,6 +335,34 @@ public static WeeklyReport createWeeklyReport(EpiWeek epiWeek) { return DatabaseHelper.getWeeklyReportDao().queryForIdWithEmbedded(weeklyReport.getId()); } + public static Environment createEnvironment() { + Environment environment; + + try { + environment = DatabaseHelper.getEnvironmentDao().build(); + DatabaseHelper.getEnvironmentDao().saveAndSnapshot(environment); + DatabaseHelper.getEnvironmentDao().accept(environment); + } catch (DaoException e) { + throw new RuntimeException(); + } + + return DatabaseHelper.getEnvironmentDao().queryForIdWithEmbedded(environment.getId()); + } + + public static EnvironmentSample createEnvironmentSample() { + EnvironmentSample environmentSample; + + try { + environmentSample = DatabaseHelper.getEnvironmentSampleDao().build(createEnvironment()); + DatabaseHelper.getEnvironmentSampleDao().saveAndSnapshot(environmentSample); + DatabaseHelper.getEnvironmentSampleDao().accept(environmentSample); + } catch (DaoException e) { + throw new RuntimeException(); + } + + return DatabaseHelper.getEnvironmentSampleDao().queryForIdWithEmbedded(environmentSample.getId()); + } + public static User createUser(String username, Region region, District district, UserRole userRole) { User user = DatabaseHelper.getUserDao().build(); diff --git a/sormas-app/app/src/main/AndroidManifest.xml b/sormas-app/app/src/main/AndroidManifest.xml index ba797101b94..18d3de04c70 100644 --- a/sormas-app/app/src/main/AndroidManifest.xml +++ b/sormas-app/app/src/main/AndroidManifest.xml @@ -459,7 +459,6 @@ android:launchMode="singleTop"> - + + + + + + diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractAdoDao.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractAdoDao.java index 8ef8993ab41..314c5277fbe 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractAdoDao.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractAdoDao.java @@ -15,19 +15,6 @@ package de.symeda.sormas.app.backend.common; -import android.util.Log; - -import com.fasterxml.jackson.annotation.JsonRawValue; -import com.googlecode.openbeans.PropertyDescriptor; -import com.j256.ormlite.dao.Dao; -import com.j256.ormlite.dao.GenericRawResults; -import com.j256.ormlite.field.DataType; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; - -import org.apache.commons.lang3.StringUtils; - import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.SQLException; @@ -42,6 +29,19 @@ import javax.persistence.NonUniqueResultException; +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonRawValue; +import com.googlecode.openbeans.PropertyDescriptor; +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.GenericRawResults; +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.stmt.Where; +import com.j256.ormlite.support.ConnectionSource; + +import android.util.Log; + import de.symeda.sormas.api.ReferenceDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; @@ -936,20 +936,24 @@ public void accept(ADO ado) throws DaoException { continue; } - // accept all collection elements - Collection sourceCollection = (Collection) property.getReadMethod().invoke(ado); - for (AbstractDomainObject sourceElement : sourceCollection) { - DatabaseHelper.getAdoDao(sourceElement.getClass()).acceptWithCast(sourceElement); - } + try { + // accept all collection elements + Collection sourceCollection = (Collection) property.getReadMethod().invoke(ado); + for (AbstractDomainObject sourceElement : sourceCollection) { + DatabaseHelper.getAdoDao(sourceElement.getClass()).acceptWithCast(sourceElement); + } - if (snapshot != null) { - // delete remaining snapshots - Collection snapshotCollection = - (Collection) property.getReadMethod().invoke(snapshot); - snapshotCollection.removeAll(sourceCollection); - for (AbstractDomainObject snapshotElement : snapshotCollection) { - DatabaseHelper.getAdoDao(snapshotElement.getClass()).deleteCascadeWithCast(snapshotElement); + if (snapshot != null) { + // delete remaining snapshots + Collection snapshotCollection = + (Collection) property.getReadMethod().invoke(snapshot); + snapshotCollection.removeAll(sourceCollection); + for (AbstractDomainObject snapshotElement : snapshotCollection) { + DatabaseHelper.getAdoDao(snapshotElement.getClass()).deleteCascadeWithCast(snapshotElement); + } } + } catch (ClassCastException e) { + // Collection does not contain ADOs and doesn't have to be handled } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java index 99f39ad8867..7728fa81e46 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java @@ -12,6 +12,8 @@ import de.symeda.sormas.app.backend.common.AbstractAdoDao; import de.symeda.sormas.app.backend.common.AbstractDomainObject; +import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.environment.Environment; import de.symeda.sormas.app.backend.location.Location; public class EnvironmentSampleDao extends AbstractAdoDao { @@ -25,6 +27,21 @@ protected Class getAdoClass() { return EnvironmentSample.class; } + @Override + public EnvironmentSample build() { + throw new UnsupportedOperationException(); + } + + public EnvironmentSample build(Environment associatedEnvironment) { + + EnvironmentSample sample = super.build(); + sample.setEnvironment(associatedEnvironment); + sample.setReportDate(new Date()); + sample.setReportingUser(ConfigProvider.getUser()); + sample.setSampleDateTime(new Date()); + return sample; + } + @Override public String getTableName() { return EnvironmentSample.TABLE_NAME; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java index 7ea1e0a79b5..7397e3abf1a 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java @@ -95,7 +95,7 @@ protected void fillInnerFromAdo(EnvironmentSampleDto target, EnvironmentSample s target.setPhValue(source.getPhValue()); target.setSampleTemperature(source.getSampleTemperature()); target.setChlorineResiduals(source.getChlorineResiduals()); - Facility lab = DatabaseHelper.getFacilityDao().queryForId(source.getId()); + Facility lab = DatabaseHelper.getFacilityDao().queryForId(source.getLaboratory().getId()); target.setLaboratory(lab != null ? FacilityDtoHelper.toReferenceDto(lab) : null); target.setLaboratoryDetails(source.getLaboratoryDetails()); target.setRequestedPathogenTests(source.getRequestedPathogenTests()); diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java index 0b5e79487b8..30992fe7da8 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java @@ -18,17 +18,18 @@ import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_BIG; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_DEFAULT; -import androidx.databinding.Bindable; +import java.text.DecimalFormat; +import java.util.Date; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; +import javax.persistence.Column; +import javax.persistence.Entity; import org.apache.commons.lang3.StringUtils; -import java.text.DecimalFormat; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; -import javax.persistence.Column; -import javax.persistence.Entity; +import androidx.databinding.Bindable; import de.symeda.sormas.api.infrastructure.area.AreaType; import de.symeda.sormas.api.infrastructure.facility.FacilityType; @@ -472,6 +473,17 @@ public String getGpsLocation() { } } + public Location cloneLocation() { + + Location location = this; + location.setId(null); + location.setUuid(DataHelper.createUuid()); + location.setChangeDate(new Date(0)); + location.setLocalChangeDate(new Date()); + location.setCreationDate(new Date()); + return location; + } + @Override public String getI18nPrefix() { return I18N_PREFIX; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlCheckBoxGroupField.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlCheckBoxGroupField.java index 0f2433d6651..9803a92b400 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlCheckBoxGroupField.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlCheckBoxGroupField.java @@ -78,6 +78,21 @@ public void setEnumClass(Class c) { } } + public void setItems(List itemObjects) { + suppressListeners = true; + removeAllItems(); + + List items = DataUtils.toItems(itemObjects, false); + + int itemTotal = items.size(); + for (int i = 0; i < items.size(); i++) { + addItem(i, itemTotal - 1, items.get(i)); + } + + enumClass = null; + suppressListeners = false; + } + private void addItem(int index, int lastIndex, Item item) { final CheckBox checkBox = createCheckBox(index, lastIndex, item); checkBoxesFrame.addView(checkBox); @@ -113,6 +128,10 @@ public void removeItem(Object itemId) { checkBoxes.remove(itemId); } + public CheckBox getCheckBox(Object key) { + return checkBoxes.get(key); + } + @Override protected void initialize(Context context, AttributeSet attrs, int defStyle) { // Nothing to initialize diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/EnvironmentSection.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/EnvironmentSection.java index 911495f35e3..c43d7fbc3ea 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/EnvironmentSection.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/EnvironmentSection.java @@ -10,7 +10,7 @@ public enum EnvironmentSection StatusElaborator { ENVIRONMENT_INFO(R.string.caption_environment_information, R.drawable.ic_drawer_environment_blue_24dp), - + ENVIRONMENT_SAMPLES(R.string.caption_environment_samples, R.drawable.ic_drawer_environment_sample_blue_24dp), TASKS(R.string.caption_environment_tasks, R.drawable.ic_drawer_user_task_blue_24dp); private int friendlyNameResourceId; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditActivity.java index e27730adae8..134e9766895 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditActivity.java @@ -31,6 +31,7 @@ import de.symeda.sormas.app.core.async.TaskResultHolder; import de.symeda.sormas.app.core.notification.NotificationHelper; import de.symeda.sormas.app.environment.EnvironmentSection; +import de.symeda.sormas.app.environmentsample.edit.EnvironmentSampleNewActivity; import de.symeda.sormas.app.task.edit.TaskNewActivity; import de.symeda.sormas.app.util.Consumer; import de.symeda.sormas.app.util.NavigationHelper; @@ -90,6 +91,9 @@ protected BaseEditFragment buildEditFragment(PageMenuItem menuItem, Environment case ENVIRONMENT_INFO: fragment = EnvironmentEditFragment.newInstance(activityRootData); break; + case ENVIRONMENT_SAMPLES: + fragment = EnvironmentEditSampleListFragment.newInstance(activityRootData); + break; case TASKS: fragment = EnvironmentEditTaskListFragment.newInstance(activityRootData); break; @@ -105,6 +109,9 @@ public void goToNewView() { EnvironmentSection section = EnvironmentSection.fromOrdinal(getActivePage().getPosition()); switch (section) { + case ENVIRONMENT_SAMPLES: + EnvironmentSampleNewActivity.startActivity(getContext(), getRootUuid()); + break; case TASKS: TaskNewActivity.startActivityFromEnvironment(getContext(), getRootUuid()); break; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditSampleListFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditSampleListFragment.java new file mode 100644 index 00000000000..904e83387e7 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditSampleListFragment.java @@ -0,0 +1,124 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environment.edit; + +import java.util.List; + +import android.content.res.Resources; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.app.BaseActivity; +import de.symeda.sormas.app.BaseEditFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.environment.Environment; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.core.adapter.databinding.OnListItemClickListener; +import de.symeda.sormas.app.databinding.FragmentFormListLayoutBinding; +import de.symeda.sormas.app.environmentsample.edit.EnvironmentSampleEditActivity; +import de.symeda.sormas.app.environmentsample.list.EnvironmentSampleListAdapter; +import de.symeda.sormas.app.environmentsample.list.EnvironmentSampleListViewModel; + +public class EnvironmentEditSampleListFragment extends BaseEditFragment, Environment> + implements OnListItemClickListener { + + private EnvironmentSampleListAdapter adapter; + + public static EnvironmentEditSampleListFragment newInstance(Environment activityRootData) { + return newInstance(EnvironmentEditSampleListFragment.class, null, activityRootData); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ((BaseActivity) getActivity()).showPreloader(); + adapter = new EnvironmentSampleListAdapter(); + EnvironmentSampleListViewModel model = new ViewModelProvider(this).get(EnvironmentSampleListViewModel.class); + model.initializeViewModel(getActivityRootData()); + model.getEnvironmentSamples().observe(this, samples -> { + ((EnvironmentEditActivity) getActivity()).hidePreloader(); + adapter.submitList(samples); + updateEmptyListHint(samples); + }); + } + + @Override + public final View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { + adapter.setOnListItemClickListener(this); + + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + protected String getSubHeadingTitle() { + Resources r = getResources(); + return r.getString(R.string.caption_environment_samples); + } + + @Override + public List getPrimaryData() { + throw new UnsupportedOperationException("Sub list fragments don't hold their data"); + } + + @Override + protected void prepareFragmentData() { + + } + + @Override + public void onLayoutBinding(FragmentFormListLayoutBinding contentBinding) { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false); + contentBinding.recyclerViewForList.setLayoutManager(linearLayoutManager); + contentBinding.recyclerViewForList.setAdapter(adapter); + } + + @Override + public int getRootEditLayout() { + return R.layout.fragment_root_list_form_layout; + } + + @Override + public int getEditLayout() { + return R.layout.fragment_form_list_layout; + } + + @Override + public void onListItemClick(View view, int position, Object item) { + EnvironmentSample sample = (EnvironmentSample) item; + EnvironmentSampleEditActivity.startActivity(getActivity(), sample.getUuid()); + } + + @Override + public boolean isShowSaveAction() { + return false; + } + + @Override + public boolean isShowNewAction() { + return ConfigProvider.hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadActivity.java index e727c302191..881b5b58302 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadActivity.java @@ -62,6 +62,9 @@ protected BaseReadFragment buildReadFragment(PageMenuItem menuItem, Environment case ENVIRONMENT_INFO: fragment = EnvironmentReadFragment.newInstance(activityRootData); break; + case ENVIRONMENT_SAMPLES: + fragment = EnvironmentReadSampleListFragment.newInstance(activityRootData); + break; case TASKS: fragment = EnvironmentReadTaskListFragment.newInstance(activityRootData); break; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadSampleListFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadSampleListFragment.java new file mode 100644 index 00000000000..1d820502030 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadSampleListFragment.java @@ -0,0 +1,111 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environment.read; + +import java.util.List; + +import android.content.res.Resources; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import de.symeda.sormas.app.BaseReadFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.environment.Environment; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.core.adapter.databinding.OnListItemClickListener; +import de.symeda.sormas.app.databinding.FragmentFormListLayoutBinding; +import de.symeda.sormas.app.environmentsample.list.EnvironmentSampleListAdapter; +import de.symeda.sormas.app.environmentsample.list.EnvironmentSampleListViewModel; +import de.symeda.sormas.app.environmentsample.read.EnvironmentSampleReadActivity; + +public class EnvironmentReadSampleListFragment extends BaseReadFragment, Environment> + implements OnListItemClickListener { + + private EnvironmentSampleListAdapter adapter; + + public static EnvironmentReadSampleListFragment newInstance(Environment activityRootData) { + return newInstance(EnvironmentReadSampleListFragment.class, null, activityRootData); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ((EnvironmentReadActivity) getActivity()).showPreloader(); + adapter = new EnvironmentSampleListAdapter(); + EnvironmentSampleListViewModel model = new ViewModelProvider(this).get(EnvironmentSampleListViewModel.class); + model.initializeViewModel(getActivityRootData()); + model.getEnvironmentSamples().observe(this, samples -> { + adapter.submitList(samples); + ((EnvironmentReadActivity) getActivity()).hidePreloader(); + updateEmptyListHint(samples); + }); + } + + @Override + public final View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { + adapter.setOnListItemClickListener(this); + + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + protected void prepareFragmentData(Bundle savedInstanceState) { + + } + + @Override + public void onLayoutBinding(FragmentFormListLayoutBinding contentBinding) { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false); + contentBinding.recyclerViewForList.setLayoutManager(linearLayoutManager); + contentBinding.recyclerViewForList.setAdapter(adapter); + } + + @Override + protected String getSubHeadingTitle() { + Resources r = getResources(); + return r.getString(R.string.caption_environment_samples); + } + + @Override + public List getPrimaryData() { + throw new UnsupportedOperationException("Sub list fragments don't hold their data"); + } + + @Override + public int getRootReadLayout() { + return R.layout.fragment_root_list_form_layout; + } + + @Override + public int getReadLayout() { + return R.layout.fragment_form_list_layout; + } + + @Override + public void onListItemClick(View view, int position, Object item) { + EnvironmentSample sample = (EnvironmentSample) item; + EnvironmentSampleReadActivity.startActivity(getActivity(), sample.getUuid()); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java new file mode 100644 index 00000000000..bcf3d31cd91 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java @@ -0,0 +1,169 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.edit; + +import static de.symeda.sormas.app.core.notification.NotificationType.ERROR; +import static de.symeda.sormas.app.core.notification.NotificationType.WARNING; + +import java.util.List; + +import android.content.Context; +import android.os.AsyncTask; +import android.view.Menu; + +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.ValidationException; +import de.symeda.sormas.app.BaseEditActivity; +import de.symeda.sormas.app.BaseEditFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.component.menu.PageMenuItem; +import de.symeda.sormas.app.component.validation.FragmentValidator; +import de.symeda.sormas.app.core.async.AsyncTaskResult; +import de.symeda.sormas.app.core.async.SavingAsyncTask; +import de.symeda.sormas.app.core.async.TaskResultHolder; +import de.symeda.sormas.app.core.notification.NotificationHelper; +import de.symeda.sormas.app.environmentsample.EnvironmentSampleSection; +import de.symeda.sormas.app.sample.ShipmentStatus; + +public class EnvironmentSampleEditActivity extends BaseEditActivity { + + private AsyncTask saveTask; + + public static void startActivity(Context context, String rootUuid) { + BaseEditActivity.startActivity(context, EnvironmentSampleEditActivity.class, buildBundle(rootUuid)); + } + + public static void startActivity(Context context, String recordUuid, EnvironmentSampleSection section) { + BaseEditActivity.startActivity(context, EnvironmentSampleEditActivity.class, buildBundle(recordUuid, section)); + } + + @Override + protected EnvironmentSample queryRootEntity(String recordUuid) { + return DatabaseHelper.getEnvironmentSampleDao().queryUuid(recordUuid); + } + + @Override + protected EnvironmentSample buildRootEntity() { + throw new UnsupportedOperationException(); + } + + @Override + public List getPageMenuData() { + return PageMenuItem.fromEnum(EnvironmentSampleSection.values(), getContext()); + } + + @Override + protected BaseEditFragment buildEditFragment(PageMenuItem menuItem, EnvironmentSample activityRootData) { + int menuKey = 0; + if (menuItem != null) + menuKey = menuItem.getPosition(); + EnvironmentSampleSection section = EnvironmentSampleSection.fromOrdinal(menuKey); + BaseEditFragment fragment; + switch (section) { + case ENVIRONMENT_SAMPLE_INFO: + fragment = EnvironmentSampleEditFragment.newInstance(activityRootData); + break; + default: + throw new IndexOutOfBoundsException(DataHelper.toStringNullable(section)); + } + return fragment; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + boolean result = super.onCreateOptionsMenu(menu); + getSaveMenu().setTitle(R.string.action_save_environment_sample); + return result; + } + + @Override + public ShipmentStatus getPageStatus() { + EnvironmentSample sample = getStoredRootEntity(); + return sample != null + ? sample.isReceived() ? ShipmentStatus.RECEIVED : sample.isDispatched() ? ShipmentStatus.SHIPPED : ShipmentStatus.NOT_SHIPPED + : null; + } + + @Override + protected int getActivityTitle() { + return R.string.heading_environment_sample_edit; + } + + @Override + public void saveData() { + + if (saveTask != null) { + NotificationHelper.showNotification(this, WARNING, getString(R.string.message_already_saving)); + return; // don't save multiple times + } + + final EnvironmentSample sampleToSave = getStoredRootEntity(); + EnvironmentSampleEditFragment fragment = (EnvironmentSampleEditFragment) getActiveFragment(); + + try { + FragmentValidator.validate(getContext(), fragment.getContentBinding()); + } catch (ValidationException e) { + NotificationHelper.showNotification(this, ERROR, e.getMessage()); + return; + } + + saveTask = new SavingAsyncTask(getRootView(), sampleToSave) { + + @Override + protected void onPreExecute() { + showPreloader(); + } + + @Override + public void doInBackground(TaskResultHolder resultHolder) throws Exception, ValidationException { + DatabaseHelper.getEnvironmentSampleDao().saveAndSnapshot(sampleToSave); + } + + @Override + protected void onPostExecute(AsyncTaskResult taskResult) { + hidePreloader(); + super.onPostExecute(taskResult); + + if (taskResult.getResultStatus().isSuccess()) { + finish(); + } else { + onResume(); // reload data + } + saveTask = null; + } + }.executeOnThreadPool(); + } + + @Override + public void goToNewView() { + EnvironmentSampleSection activeSection = EnvironmentSampleSection.fromOrdinal(getActivePage().getPosition()); + +// if (activeSection == SampleSection.PATHOGEN_TESTS) { +// PathogenTestNewActivity.startActivity(getContext(), getRootUuid()); +// } + } + + @Override + public void onDestroy() { + super.onDestroy(); + + if (saveTask != null && !saveTask.isCancelled()) + saveTask.cancel(true); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java new file mode 100644 index 00000000000..2342c001ea5 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java @@ -0,0 +1,190 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.edit; + +import static android.view.View.GONE; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +import android.view.View; + +import de.symeda.sormas.api.customizableenum.CustomizableEnum; +import de.symeda.sormas.api.customizableenum.CustomizableEnumType; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleMaterial; +import de.symeda.sormas.api.environment.environmentsample.Pathogen; +import de.symeda.sormas.api.environment.environmentsample.WeatherCondition; +import de.symeda.sormas.api.infrastructure.facility.FacilityDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; +import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; +import de.symeda.sormas.app.BaseActivity; +import de.symeda.sormas.app.BaseEditFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.backend.facility.Facility; +import de.symeda.sormas.app.backend.location.Location; +import de.symeda.sormas.app.component.Item; +import de.symeda.sormas.app.component.dialog.LocationDialog; +import de.symeda.sormas.app.databinding.FragmentEnvironmentSampleEditLayoutBinding; +import de.symeda.sormas.app.util.DataUtils; + +public class EnvironmentSampleEditFragment + extends BaseEditFragment { + + private EnvironmentSample record; + + // Enum lists + + private List sampleMaterialList; + private List laboratoryList; + private List requestedPathogenTests = new ArrayList<>(); + + public static EnvironmentSampleEditFragment newInstance(EnvironmentSample activityRootData) { + return newInstanceWithFieldCheckers( + EnvironmentSampleEditFragment.class, + null, + activityRootData, + FieldVisibilityCheckers.withCountry(ConfigProvider.getServerCountryCode()), + UiFieldAccessCheckers.forSensitiveData(activityRootData.isPseudonymized()), + UserRight.ENVIRONMENT_SAMPLE_EDIT); + } + + private void setUpControlListeners(FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + getContentBinding().environmentSampleLocation.setOnClickListener(v -> openAddressPopup(contentBinding)); + } + + @Override + protected String getSubHeadingTitle() { + return getResources().getString(R.string.caption_environment_sample_information); + } + + @Override + public EnvironmentSample getPrimaryData() { + return record; + } + + @Override + protected void prepareFragmentData() { + + record = getActivityRootData(); + + sampleMaterialList = DataUtils.getEnumItems(EnvironmentSampleMaterial.class, true, getFieldVisibilityCheckers()); + laboratoryList = DatabaseHelper.getFacilityDao().getActiveLaboratories(true); + + requestedPathogenTests.clear(); + for (Pathogen pathogen : record.getRequestedPathogenTests()) { + requestedPathogenTests.add(pathogen.getCaption()); + } + } + + @Override + public void onLayoutBinding(FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + + setUpControlListeners(contentBinding); + contentBinding.setData(record); + EnvironmentSampleValidator.initializeEnvironmentSampleValidation(contentBinding); + contentBinding.setWeatherConditionClass(WeatherCondition.class); + List pathogens = DatabaseHelper.getCustomizableEnumValueDao().getEnumValues(CustomizableEnumType.PATHOGEN, null); + // Remove default "OTHER" pathogen because it's covered by a separate field + pathogens.remove(DatabaseHelper.getCustomizableEnumValueDao().getEnumValue(CustomizableEnumType.PATHOGEN, "OTHER")); + contentBinding.environmentSampleRequestedPathogenTests.setItems(pathogens); + } + + @Override + public void onAfterLayoutBinding(final FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + + super.onAfterLayoutBinding(contentBinding); + setFieldVisibilitiesAndAccesses(EnvironmentSampleDto.class, contentBinding.mainContent); + + // Initialize ControlSpinnerFields + contentBinding.environmentSampleSampleMaterial.initializeSpinner(sampleMaterialList); + contentBinding.environmentSampleLaboratory.initializeSpinner(DataUtils.toItems(laboratoryList), field -> { + Facility laboratory = (Facility) field.getValue(); + if (laboratory != null && laboratory.getUuid().equals(FacilityDto.OTHER_FACILITY_UUID)) { + contentBinding.environmentSampleLaboratoryDetails.setVisibility(View.VISIBLE); + } else { + contentBinding.environmentSampleLaboratoryDetails.hideField(true); + } + }); + + // Initialize ControlDateFields and ControlDateTimeFields + contentBinding.environmentSampleSampleDateTime.initializeDateTimeField(getFragmentManager()); + contentBinding.environmentSampleDispatchDate.initializeDateField(getFragmentManager()); + + // Disable fields the user doesn't have access to - this involves almost all fields when + // the user is not the one that originally reported the sample + if (!ConfigProvider.getUser().equals(record.getReportingUser()) || !ConfigProvider.hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH)) { + contentBinding.environmentSampleSampleDateTime.setEnabled(false); + contentBinding.environmentSampleFieldSampleId.setEnabled(false); + contentBinding.environmentSampleSampleMaterial.setEnabled(false); + contentBinding.environmentSampleOtherSampleMaterial.setEnabled(false); + contentBinding.environmentSampleSampleVolume.setEnabled(false); + contentBinding.environmentSampleTurbidity.setEnabled(false); + contentBinding.environmentSampleSampleTemperature.setEnabled(false); + contentBinding.environmentSampleChlorineResiduals.setEnabled(false); + contentBinding.environmentSamplePhValue.setEnabled(false); + contentBinding.environmentSampleWeatherConditions.setEnabled(false); + contentBinding.environmentSampleHeavyRain.setEnabled(false); + contentBinding.environmentSampleLocation.setEnabled(false); + contentBinding.environmentSampleLaboratory.setEnabled(false); + contentBinding.environmentSampleLaboratoryDetails.setEnabled(false); + contentBinding.environmentSampleRequestedPathogenTests.setVisibility(GONE); + contentBinding.environmentSampleDispatched.setEnabled(false); + contentBinding.environmentSampleDispatchDate.setEnabled(false); + contentBinding.environmentSampleDispatchDetails.setEnabled(false); + + if (!requestedPathogenTests.isEmpty()) { + contentBinding.environmentSampleRequestedPathogenTestsTags.setTags(requestedPathogenTests); + if (StringUtils.isEmpty(record.getOtherRequestedPathogenTests())) { + contentBinding.environmentSampleOtherRequestedPathogenTests.setVisibility(GONE); + } + } else { + contentBinding.environmentSampleRequestedPathogenTestsTags.setVisibility(GONE); + contentBinding.environmentSampleOtherRequestedPathogenTests.setVisibility(GONE); + } + } else { + contentBinding.environmentSampleRequestedPathogenTestsTags.setVisibility(GONE); + } + } + + private void openAddressPopup(FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + final Location location = record.getLocation(); + final Location locationClone = (Location) location.clone(); + final LocationDialog locationDialog = new LocationDialog(BaseActivity.getActiveActivity(), locationClone, getFieldAccessCheckers()); + locationDialog.show(); + + locationDialog.setPositiveCallback(() -> { + contentBinding.environmentSampleLocation.setValue(locationClone); + record.setLocation(locationClone); + }); + } + + @Override + public int getEditLayout() { + return R.layout.fragment_environment_sample_edit_layout; + } + + @Override + public boolean isShowSaveAction() { + return ConfigProvider.hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT); + } +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleNewActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleNewActivity.java new file mode 100644 index 00000000000..560093fd920 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleNewActivity.java @@ -0,0 +1,165 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.edit; + +import static de.symeda.sormas.app.core.notification.NotificationType.ERROR; +import static de.symeda.sormas.app.core.notification.NotificationType.WARNING; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.Menu; + +import androidx.annotation.NonNull; + +import de.symeda.sormas.api.utils.ValidationException; +import de.symeda.sormas.app.BaseEditActivity; +import de.symeda.sormas.app.BaseEditFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.common.DaoException; +import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.Environment; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.component.menu.PageMenuItem; +import de.symeda.sormas.app.component.validation.FragmentValidator; +import de.symeda.sormas.app.core.async.AsyncTaskResult; +import de.symeda.sormas.app.core.async.SavingAsyncTask; +import de.symeda.sormas.app.core.async.TaskResultHolder; +import de.symeda.sormas.app.core.notification.NotificationHelper; +import de.symeda.sormas.app.sample.ShipmentStatus; +import de.symeda.sormas.app.util.Bundler; + +public class EnvironmentSampleNewActivity extends BaseEditActivity { + + public static final String TAG = EnvironmentSampleNewActivity.class.getSimpleName(); + + private String environmentUuid = null; + + private AsyncTask saveTask; + + public static void startActivity(Context context, String environmentUuid) { + BaseEditActivity.startActivity(context, EnvironmentSampleNewActivity.class, buildBundle(environmentUuid)); + } + + public static Bundler buildBundle(String environmentUuid) { + return buildBundle(null, 0).setEnvironmentUuid(environmentUuid); + } + + @Override + public ShipmentStatus getPageStatus() { + return null; + } + + @Override + protected void onCreateInner(Bundle savedInstanceState) { + super.onCreateInner(savedInstanceState); + environmentUuid = new Bundler(savedInstanceState).getEnvironmentUuid(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + new Bundler(outState).setEnvironmentUuid(environmentUuid); + } + + @Override + protected EnvironmentSample queryRootEntity(String recordUuid) { + throw new UnsupportedOperationException(); + } + + @Override + protected EnvironmentSample buildRootEntity() { + Environment associatedEnvironment = DatabaseHelper.getEnvironmentDao().queryUuid(environmentUuid); + return DatabaseHelper.getEnvironmentSampleDao().build(associatedEnvironment); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + boolean result = super.onCreateOptionsMenu(menu); + getSaveMenu().setTitle(R.string.action_save_environment_sample); + return result; + } + + @Override + protected BaseEditFragment buildEditFragment(PageMenuItem menuItem, EnvironmentSample activityRootData) { + BaseEditFragment fragment = EnvironmentSampleEditFragment.newInstance(activityRootData); + fragment.setLiveValidationDisabled(true); + return fragment; + } + + @Override + protected int getActivityTitle() { + return R.string.heading_environment_sample_new; + } + + @Override + public void replaceFragment(BaseEditFragment f, boolean allowBackNavigation) { + super.replaceFragment(f, allowBackNavigation); + } + + @Override + public void saveData() { + + if (saveTask != null) { + NotificationHelper.showNotification(this, WARNING, getString(R.string.message_already_saving)); + return; // don't save multiple times + } + + final EnvironmentSample sampleToSave = getStoredRootEntity(); + EnvironmentSampleEditFragment fragment = (EnvironmentSampleEditFragment) getActiveFragment(); + + fragment.setLiveValidationDisabled(false); + + try { + FragmentValidator.validate(getContext(), fragment.getContentBinding()); + } catch (ValidationException e) { + NotificationHelper.showNotification(this, ERROR, e.getMessage()); + return; + } + + saveTask = new SavingAsyncTask(getRootView(), sampleToSave) { + + @Override + protected void onPreExecute() { + showPreloader(); + } + + @Override + public void doInBackground(TaskResultHolder resultHolder) throws DaoException, ValidationException { + DatabaseHelper.getEnvironmentSampleDao().saveAndSnapshot(sampleToSave); + } + + @Override + protected void onPostExecute(AsyncTaskResult taskResult) { + hidePreloader(); + super.onPostExecute(taskResult); + if (taskResult.getResultStatus().isSuccess()) { + finish(); + } + saveTask = null; + } + }.executeOnThreadPool(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + + if (saveTask != null && !saveTask.isCancelled()) + saveTask.cancel(true); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java new file mode 100644 index 00000000000..01c453e3f50 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java @@ -0,0 +1,115 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.app.environmentsample.edit; + +import org.apache.commons.lang3.StringUtils; + +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.app.databinding.FragmentEnvironmentSampleEditLayoutBinding; +import de.symeda.sormas.app.util.ResultCallback; + +public class EnvironmentSampleValidator { + + static void initializeEnvironmentSampleValidation(final FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + + initializeSampleAndDispatchDateValidation(contentBinding); + initializeMeasurementValidations(contentBinding); + } + + private static void initializeSampleAndDispatchDateValidation(final FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + + ResultCallback sampleDateCallback = () -> { + // Must not be after date of shipment + if (DateHelper + .isDateAfter(contentBinding.environmentSampleSampleDateTime.getValue(), contentBinding.environmentSampleDispatchDate.getValue())) { + contentBinding.environmentSampleSampleDateTime.enableErrorState( + I18nProperties.getValidationError( + Validations.beforeDate, + contentBinding.environmentSampleSampleDateTime.getCaption(), + contentBinding.environmentSampleDispatchDate.getCaption())); + return true; + } + + return false; + }; + + ResultCallback dispatchDateCallback = () -> { + // Must not be before sample date + if (DateHelper + .isDateBefore(contentBinding.environmentSampleDispatchDate.getValue(), contentBinding.environmentSampleSampleDateTime.getValue())) { + contentBinding.environmentSampleDispatchDate.enableErrorState( + I18nProperties.getValidationError( + Validations.afterDate, + contentBinding.environmentSampleDispatchDate.getCaption(), + contentBinding.environmentSampleSampleDateTime.getCaption())); + return true; + } + + return false; + }; + + contentBinding.environmentSampleSampleDateTime.setValidationCallback(sampleDateCallback); + contentBinding.environmentSampleDispatchDate.setValidationCallback(dispatchDateCallback); + } + + private static void initializeMeasurementValidations(final FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + + ResultCallback sampleVolumeCallback = () -> { + if (StringUtils.isNotBlank(contentBinding.environmentSampleSampleVolume.getValue()) + && Float.parseFloat(contentBinding.environmentSampleSampleVolume.getValue()) < 0) { + contentBinding.environmentSampleSampleVolume.enableErrorState(I18nProperties.getValidationError(Validations.numberTooSmall, 0)); + return true; + } + return false; + }; + + ResultCallback turbidityCallback = () -> { + if (StringUtils.isNotBlank(contentBinding.environmentSampleTurbidity.getValue()) + && Float.parseFloat(contentBinding.environmentSampleTurbidity.getValue()) < 0) { + contentBinding.environmentSampleTurbidity.enableErrorState(I18nProperties.getValidationError(Validations.numberTooSmall, 0)); + return true; + } + return false; + }; + + ResultCallback chlorineResidualsCallback = () -> { + if (StringUtils.isNotBlank(contentBinding.environmentSampleChlorineResiduals.getValue()) + && Float.parseFloat(contentBinding.environmentSampleChlorineResiduals.getValue()) < 0) { + contentBinding.environmentSampleChlorineResiduals.enableErrorState(I18nProperties.getValidationError(Validations.numberTooSmall, 0)); + return true; + } + return false; + }; + + ResultCallback phValueCallback = () -> { + if (StringUtils.isNotBlank(contentBinding.environmentSamplePhValue.getValue()) + && (Float.parseFloat(contentBinding.environmentSamplePhValue.getValue()) < 0 + || Float.parseFloat(contentBinding.environmentSamplePhValue.getValue()) > 14)) { + contentBinding.environmentSamplePhValue.enableErrorState(I18nProperties.getValidationError(Validations.numberNotInRange, 0, 14)); + return true; + } + return false; + }; + + contentBinding.environmentSampleSampleVolume.setValidationCallback(sampleVolumeCallback); + contentBinding.environmentSampleTurbidity.setValidationCallback(turbidityCallback); + contentBinding.environmentSampleChlorineResiduals.setValidationCallback(chlorineResidualsCallback); + contentBinding.environmentSamplePhValue.setValidationCallback(phValueCallback); + } + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java index c64fa0e442f..850b3a5f7ce 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java @@ -34,6 +34,7 @@ import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSampleEditAuthorization; import de.symeda.sormas.app.component.menu.PageMenuItem; import de.symeda.sormas.app.environmentsample.EnvironmentSampleSection; +import de.symeda.sormas.app.environmentsample.edit.EnvironmentSampleEditActivity; import de.symeda.sormas.app.sample.ShipmentStatus; import de.symeda.sormas.app.util.Bundler; @@ -112,6 +113,6 @@ protected int getActivityTitle() { @Override public void goToEditView() { EnvironmentSampleSection section = EnvironmentSampleSection.fromOrdinal(getActivePage().getPosition()); - //EnvironmentSampleEditActivity.startActivity(getContext(), getRootUuid(), section); + EnvironmentSampleEditActivity.startActivity(getContext(), getRootUuid(), section); } } diff --git a/sormas-app/app/src/main/res/layout/fragment_environment_sample_edit_layout.xml b/sormas-app/app/src/main/res/layout/fragment_environment_sample_edit_layout.xml new file mode 100644 index 00000000000..501fef4e0ef --- /dev/null +++ b/sormas-app/app/src/main/res/layout/fragment_environment_sample_edit_layout.xml @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sormas-app/app/src/main/res/values/strings.xml b/sormas-app/app/src/main/res/values/strings.xml index a32308a99c0..718848f39e5 100644 --- a/sormas-app/app/src/main/res/values/strings.xml +++ b/sormas-app/app/src/main/res/values/strings.xml @@ -107,6 +107,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -174,6 +175,7 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks Environment Sample Information Description @@ -398,6 +400,8 @@ New Sample Read Sample Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing Environment Sample Listing From eaac894dfe991fad0ea825c37e3945cfe729c6c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 12 Sep 2023 15:38:19 +0200 Subject: [PATCH 091/144] #12500 - Copy over environment location --- .../environment/environmentsample/EnvironmentSampleDao.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java index 7728fa81e46..fc917800468 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java @@ -39,6 +39,7 @@ public EnvironmentSample build(Environment associatedEnvironment) { sample.setReportDate(new Date()); sample.setReportingUser(ConfigProvider.getUser()); sample.setSampleDateTime(new Date()); + sample.setLocation(associatedEnvironment.getLocation().cloneLocation()); return sample; } From 13d7ba6a3fcde6b490497dd30fe0a41ccc18ad61 Mon Sep 17 00:00:00 2001 From: Razvan Date: Wed, 13 Sep 2023 14:59:05 +0300 Subject: [PATCH 092/144] SORQA-1053 : fixes --- .../e2etests/helpers/parsers/XMLParser.java | 5 --- .../web/application/survnet/SurvNetSteps.java | 32 +++++++++++++------ .../features/sanity/web/Survnet.feature | 2 +- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java index d9c5c990ede..10b05630880 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/parsers/XMLParser.java @@ -31,9 +31,4 @@ public static Document findDocumentByName( SAXBuilder saxBuilder = new SAXBuilder(); return saxBuilder.build(file); } - - @SneakyThrows - public static void printDocumentContent(Document document) { - System.out.println(document.getDocument().getContent().get(0).getValue()); - } } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index f37b20e5c44..c28ae28e936 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -23,7 +23,6 @@ import static org.sormas.e2etests.steps.web.application.vaccination.CreateNewVaccinationSteps.vaccination; import cucumber.api.java8.En; - import java.io.File; import java.time.LocalDate; import java.time.Period; @@ -302,6 +301,23 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { softly.assertAll(); }); + And( + "I check that Patientrole is change in SORMAS generated single XML file is {string}", + (String expectedValue) -> { + String xmlValue = singleXmlFile + .getRootElement() + .getChildren() + .get(0) + .getChildren() + .get(1) + .getChildren() + .get(0) + .getAttribute("Value") + .getValue(); + softly.assertEquals(xmlValue, expectedValue, "Patientrole value is wrong"); + softly.assertAll(); + }); + And( "I check if Reinfection \"([^\"]*)\" checkbox value in SORMAS generated single XML file is correct", (String reinfectionCheckbox) -> { @@ -781,14 +797,12 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "/srv/dockerdata/jenkins_new/sormas-files/case_" + externalUUID.get(0).substring(1, 37) + ".xml"); - System.out.println("Copy XML file to project !"); - FileUtils.copyFile(new File("/srv/dockerdata/jenkins_new/sormas-files/case_" - + externalUUID.get(0).substring(1, 37) - + ".xml"), - new File("sormas-e2e-tests/target")); - System.out.println("Printing files from dockerdata"); - log.info("Print Opened XML"); - XMLParser.printDocumentContent(singleXmlFile); + FileUtils.copyFile( + new File( + "/srv/dockerdata/jenkins_new/sormas-files/case_" + + externalUUID.get(0).substring(1, 37) + + ".xml"), + new File("sormas-e2e-tests/target")); }); And( diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index a2a2f0c4fbf..9429dc86f2d 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -453,4 +453,4 @@ Feature: Survnet tests And I collect case external UUID from Edit Case page Then I wait 50 seconds for system reaction And I open SORMAS generated XML file for single case message - Then I check if the exposure settings are correctly mapped in SORMAS generated single XML file \ No newline at end of file + And I check that Patientrole is change in SORMAS generated single XML file is "-1" \ No newline at end of file From 7347dce1f6f2ad6cd643f680069cbcd99927c158 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Wed, 13 Sep 2023 15:46:15 +0200 Subject: [PATCH 093/144] HSP-6177 Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" --- .../messages/MessagesDirectoryPage.java | 5 + .../messages/MessagesDirectorySteps.java | 57 ++++++++++ .../web/application/survnet/SurvNetSteps.java | 106 ++++++++++++++++-- .../features/sanity/web/Survnet.feature | 30 ++++- 4 files changed, 190 insertions(+), 8 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/messages/MessagesDirectoryPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/messages/MessagesDirectoryPage.java index df788367a41..5585c701ef1 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/messages/MessagesDirectoryPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/messages/MessagesDirectoryPage.java @@ -39,6 +39,11 @@ public class MessagesDirectoryPage { public static final By NO_NEW_REPORTS_POPUP = By.xpath("//*[contains(text(),'Keine neuen Meldungen verf\u00FCgbar')]"); public static final By CLOSE_POPUP = By.xpath("//div[@class='v-window-closebox']"); + public static final By DIAGNOSED_AT_DATE = + By.xpath("//section[@class=\"summary test-positive\"]//li[6]//span[@class=\"propValue\"]\n"); + public static final By SPECIMEN_COLLECTED_AT_DATE = + By.xpath("//section[@class=\"summary test-positive\"]//li[7]//span[@class=\"propValue\"]\n"); + public static final By NOTIFICATION_AT_DATE = By.cssSelector("[id='messageDateTime'] input"); public static final By GET_NEW_MESSAGES_POPUP = By.xpath("//*[contains(text(),'Neue Meldungen abrufen')]"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java index f0db0970647..26782bf0167 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java @@ -9,10 +9,12 @@ import static org.sormas.e2etests.pages.application.tasks.TaskManagementPage.getCheckboxByIndex; import cucumber.api.java8.En; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -31,6 +33,10 @@ public class MessagesDirectorySteps implements En { public static List uuids = new ArrayList<>(); public static List shortenedUUIDS = new ArrayList<>(); + public static LocalDate diagnosedAt; + public static LocalDate specimenCollectedAt; + public static LocalDate notifiedAt; + public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @Inject public MessagesDirectorySteps( @@ -529,6 +535,42 @@ public MessagesDirectorySteps( webDriverHelpers.waitForPageLoaded(); }); + Then( + "I collect {string} Date from Message", + (String dateOption) -> { + switch (dateOption) { + case "DiagnosedAt": + String localDiagnosedAt = + String.format( + webDriverHelpers + .getTextFromWebElement(DIAGNOSED_AT_DATE) + .substring(0, 10) + .replace(".", "-")); + + diagnosedAt = + convertStringToChosenFormatDate("dd-MM-yyyy", "yyyy-MM-dd", localDiagnosedAt); + break; + case "SpecimenCollectedAt": + String localSpecimenCollectedAt = + webDriverHelpers + .getTextFromWebElement(SPECIMEN_COLLECTED_AT_DATE) + .substring(0, 10) + .replace(".", "-"); + + specimenCollectedAt = + convertStringToChosenFormatDate( + "dd-MM-yyyy", "yyyy-MM-dd", localSpecimenCollectedAt); + break; + case "NotifiedAt": + String localNotifiedAt = + webDriverHelpers.getValueFromWebElement(NOTIFICATION_AT_DATE).replace(".", "-"); + + notifiedAt = + convertStringToChosenFormatDate("dd-MM-yyyy", "yyyy-MM-dd", localNotifiedAt); + break; + } + }); + Then( "^I check if there are any buttons from processed message in HTML message file$", () -> { @@ -551,4 +593,19 @@ public MessagesDirectorySteps( softly.assertAll(); }); } + + private LocalDate convertStringToChosenFormatDate( + String inputFormatDate, String outputFormatDate, String localDate) { + String output = null; + try { + SimpleDateFormat currentDateFormat = new SimpleDateFormat(inputFormatDate); + Date date = currentDateFormat.parse(localDate); + SimpleDateFormat chosenDateFormat = new SimpleDateFormat(outputFormatDate); + output = chosenDateFormat.format(date); + + } catch (java.text.ParseException e) { + e.printStackTrace(); + } + return LocalDate.parse(output, DATE_FORMATTER); + } } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 7c343e562f0..88e4987dde5 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -20,11 +20,13 @@ import static org.sormas.e2etests.steps.web.application.cases.PreviousHospitalizationSteps.previousHospitalization; import static org.sormas.e2etests.steps.web.application.cases.PreviousHospitalizationSteps.reasonForPreviousHospitalization; import static org.sormas.e2etests.steps.web.application.cases.SymptomsTabSteps.symptoms; +import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.diagnosedAt; +import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.notifiedAt; +import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.specimenCollectedAt; import static org.sormas.e2etests.steps.web.application.vaccination.CreateNewVaccinationSteps.randomVaccinationName; import static org.sormas.e2etests.steps.web.application.vaccination.CreateNewVaccinationSteps.vaccination; import cucumber.api.java8.En; - import java.io.File; import java.time.LocalDate; import java.time.Period; @@ -64,7 +66,6 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "I check if {string} in SORMAS generated XML file is correct", (String typeOfDate) -> { LocalDate expectedDate = LocalDate.now(); - switch (typeOfDate) { case "date of report": LocalDate dateOfReport = getReportingDate(singleXmlFile, 0); @@ -101,6 +102,30 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "Date of Death is incorrect!"); softly.assertAll(); break; + case "diagnose at date": + softly.assertEquals( + getValueFromNotificationDateChildrenSpecificFieldByName( + singleXmlFile, "DiagnosedAt"), + diagnosedAt, + "Diagnose at date is incorrect!"); + softly.assertAll(); + break; + case "specimen collected At date": + softly.assertEquals( + getValueFromNotificationDateChildrenSpecificFieldByName( + singleXmlFile, "SpecimenCollectedAt"), + specimenCollectedAt, + "Specimen collected at date is incorrect!"); + softly.assertAll(); + break; + case "notified at date": + softly.assertEquals( + getValueFromNotificationDateChildrenSpecificFieldByName( + singleXmlFile, "NotifiedAt"), + notifiedAt, + "Notified at date is incorrect!"); + softly.assertAll(); + break; } }); @@ -668,6 +693,16 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { } }); + And( + "I check if NotificationViaDEMIS has {string} value in SORMAS generated bulk XML file is correct", + (String notificationValue) -> { + softly.assertEquals( + getValueFromSpecificNotificationFieldByName(singleXmlFile, "NotificationViaDEMIS"), + notificationValue, + "Sex is incorrect!"); + softly.assertAll(); + }); + And( "^I compare the SORMAS generated XML file with the example one$", () -> { @@ -790,13 +825,15 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { + externalUUID.get(0).substring(1, 37) + ".xml"); System.out.println("Copy XML file to project !"); - FileUtils.copyFile(new File("/srv/dockerdata/jenkins_new/sormas-files/case_" - + externalUUID.get(0).substring(1, 37) - + ".xml"), - new File("sormas-e2e-tests/target")); + FileUtils.copyFile( + new File( + "/srv/dockerdata/jenkins_new/sormas-files/case_" + + externalUUID.get(0).substring(1, 37) + + ".xml"), + new File("sormas-e2e-tests/target")); System.out.println("Printing files from dockerdata"); log.info("Print Opened XML"); - XMLParser.printDocumentContent(singleXmlFile); + XMLParser.printDocumentContent(singleXmlFile); }); And( @@ -1339,4 +1376,59 @@ private LocalDate getDateValueFromSpecificChildNodeFieldByName(Document xmlFile, } return LocalDate.parse(value, DATE_FORMATTER); } + + private LocalDate getValueFromNotificationDateChildrenSpecificFieldByName( + Document xmlFile, String name) { + Element rootElement = xmlFile.getRootElement(); + Namespace ns = rootElement.getNamespace(); + String value = null; + + Element field = + xmlFile + .getRootElement() + .getChildren() + .get(0) + .getChildren("Group", ns) + .get(1) + .getChildren("Field", ns) + .stream() + .filter(e -> e.getAttributeValue("Name").equals(name)) + .findFirst() + .orElse(null); + + if (field != null) { + Attribute valueAttribute = field.getAttribute("Value"); + if (valueAttribute != null) { + value = valueAttribute.getValue().substring(0, 10); + } + } + return LocalDate.parse(value, DATE_FORMATTER); + } + + private String getValueFromSpecificNotificationFieldByName(Document xmlFile, String name) { + Element rootElement = xmlFile.getRootElement(); + Namespace ns = rootElement.getNamespace(); + String value = null; + + Element field = + xmlFile + .getRootElement() + .getChildren() + .get(0) + .getChildren("Group", ns) + .get(1) + .getChildren("Field", ns) + .stream() + .filter(e -> e.getAttributeValue("Name").equals(name)) + .findFirst() + .orElse(null); + + if (field != null) { + Attribute valueAttribute = field.getAttribute("Value"); + if (valueAttribute != null) { + value = valueAttribute.getValue(); + } + } + return value; + } } diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index f6f8171e1cc..95d13c95291 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -488,4 +488,32 @@ Feature: Survnet tests And I open SORMAS generated XML file for single case message Then I check if the present condition status "Verstorben" is correctly mapped in SORMAS generated single XML file And I check if "date of death" in SORMAS generated XML file is correct - And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct \ No newline at end of file + And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct + + @tmsLink=HSP-6177 + Scenario: Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" + Given API : Login to DEMIS server + Then I create and send Laboratory Notification + Given I log in as a Survnet + Then I click on the Messages button from navbar + And I click on fetch messages button + Then I filter by last created person via API in Messages Directory + And I click on Verarbeiten button in Messages Directory + Then I create a new person and a new case from received message + And I click on the eye icon next for the first fetched message + And I collect message uuid + Then I collect "DiagnosedAt" Date from Message + Then I collect "SpecimenCollectedAt" Date from Message + Then I collect "NotifiedAt" Date from Message + And I close HTML message + Then I click on the Cases button from navbar + And I search the case by last created person via Demis message + Then I click on the first Case ID from Case Directory + And I click on Send to reporting tool button on Edit Case page + And I collect case external UUID from Edit Case page + Then I wait 50 seconds for system reaction + And I open SORMAS generated XML file for single case message + And I check if "diagnose at date" in SORMAS generated XML file is correct + And I check if "specimen collected At date" in SORMAS generated XML file is correct + And I check if "notified at date" in SORMAS generated XML file is correct + Then I check if NotificationViaDEMIS has "true" value in SORMAS generated bulk XML file is correct \ No newline at end of file From 6b6b5b416347571ddfa9bf67b12606416977197f Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 14 Sep 2023 08:54:02 +0200 Subject: [PATCH 094/144] HSP-6177 Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - changed tag name --- .../src/test/resources/features/sanity/web/Survnet.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index d3711cb43cb..9fad49a69b5 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -490,7 +490,7 @@ Feature: Survnet tests And I check if "date of death" in SORMAS generated XML file is correct And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct - @tmsLink=HSP-6177 + @tmsLink=SORQA-6177 Scenario: Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" Given API : Login to DEMIS server Then I create and send Laboratory Notification From 3ddca2ccb90b486eb639ea66646cbd55a9fb505f Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Thu, 14 Sep 2023 10:15:38 +0300 Subject: [PATCH 095/144] Feature 10249 increase postgre sql to min 12 and default 14 (#12521) * #10249 - Increase PostgreSQL minimum version to 12 and default to 14 * Update SERVER_SETUP.md * Update SERVER_UPDATE.md * #10249 - Increase PostgreSQL minimum version to 12 and default to 14 * Update SERVER_UPDATE.md * Update SERVER_UPDATE.md * Update SERVER_UPDATE.md * #10249 - Increase PostgreSQL minimum version to 12 and default to 14 * #10249 - Increase PostgreSQL minimum version to 12 and default to 14 * #10249 - Increase PostgreSQL minimum version to 12 and default to 14 * #10249 - Increase PostgreSQL minimum version to 12 and default to 14 --- docs/SERVER_SETUP.md | 4 +-- docs/SERVER_UPDATE.md | 5 +++- .../common/StartupShutdownService.java | 2 +- .../common/StartupShutdownServiceTest.java | 25 ++++++++++++++----- sormas-base/setup/server-setup.sh | 15 ++++++++++- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/docs/SERVER_SETUP.md b/docs/SERVER_SETUP.md index 846ac11348a..4be22bb61a3 100644 --- a/docs/SERVER_SETUP.md +++ b/docs/SERVER_SETUP.md @@ -61,8 +61,8 @@ You can check your Java version from the shell/command-line using: ``java -versi ### Postgres Database -* Install PostgreSQL (currently 9.5, 9.6 or 10 to 15) on your system (manuals for all OS can be found here: ) -* Set **max_connections = 288** and **max_prepared_transactions = 256** (at least, sum of all connection pools) in ``postgresql.conf`` (e.g. ``/etc/postgresql/10.0/main/postgresql.conf``; ``C:/Program Files/PostgreSQL/10.0/data``) - make sure the property is uncommented and restart the service to apply the changes. +* Install PostgreSQL (currently 14 to 15) on your system (manuals for all OS can be found here: ) +* Set **max_connections = 288** and **max_prepared_transactions = 256** (at least, sum of all connection pools) in ``postgresql.conf`` (e.g. ``/etc/postgresql/14.0/main/postgresql.conf``; ``C:/Program Files/PostgreSQL/14.0/data``) - make sure the property is uncommented and restart the service to apply the changes. * Install the "temporal tables" extension for Postgres () * **Windows**: Download the latest version for your Postgres version: * , then copy the DLL from the project into the PostgreSQL's lib directory and the .sql and .control files into the directory share\extension. diff --git a/docs/SERVER_UPDATE.md b/docs/SERVER_UPDATE.md index 432ca66900e..f9193fa5251 100644 --- a/docs/SERVER_UPDATE.md +++ b/docs/SERVER_UPDATE.md @@ -57,6 +57,9 @@ DROP EXTENSION IF EXISTS temporal_tables; Payara is updated from 5.2021.10 to 5.2022.5. If you are **not** using [SORMAS-Docker](https://github.com/SORMAS-Foundation/SORMAS-Docker), please follow the [Payara migration guide](SERVER_UPDATE.md#how-to-migrate-to-new-payara-server). +### 1.89.0 +When installing this version on new systems or upgrading postgres version on Ubuntu make sure you have at least Ubuntu LTS 20 with postgres 14 (or 18 with postgres 12 from APT). + ## Automatic Server Update * Navigate to the folder containing the unzipped deploy files: ``cd /root/deploy/sormas/$(date +%F)`` @@ -155,4 +158,4 @@ For minor updates of the payara version, you will most often be able to keep the 2. Undeploy all sormas modules from the payara domain and stop the domain. 3. Replace your payara server in ``/opt/payara5`` (default path) with the downloaded one. Remove the default domain in ``opt/payara5/glassfish/domains`` as it is not needed. 4. Replace the application server in your IDE with the new server. See [IDE setup guide](DEVELOPMENT_ENVIRONMENT.md#step-5-install-and-configure-your-ide) -5. If you are facing any problems, restart your IDE and clean all generated files from the sormas domain. \ No newline at end of file +5. If you are facing any problems, restart your IDE and clean all generated files from the sormas domain. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java index 4d2ed0ab404..4d069ff1092 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java @@ -678,7 +678,7 @@ private void checkDatabaseConfig(EntityManager entityManager) { static boolean isSupportedDatabaseVersion(String versionString) { String versionBegin = versionString.split(" ")[0]; - String versionRegexp = Stream.of("9\\.5", "9\\.5\\.\\d+", "9\\.6", "9\\.6\\.\\d+", "10\\.\\d+").collect(Collectors.joining(")|(", "(", ")")); + String versionRegexp = Stream.of("14\\.\\d+", "15\\.\\d+").collect(Collectors.joining(")|(", "(", ")")); return versionBegin.matches(versionRegexp); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/common/StartupShutdownServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/common/StartupShutdownServiceTest.java index 4c8496347c3..aaedc4e7d4a 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/common/StartupShutdownServiceTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/common/StartupShutdownServiceTest.java @@ -21,17 +21,30 @@ public class StartupShutdownServiceTest { private final String[] SUPPORTED_DATABASE_VERSIONS = new String[] { - "9.5", - "9.5.25", - "9.6.5", - "9.6", - "10.1", - "10.14 (Ubuntu 10.14-1.pgdg20.04+1)" }; + "14.1", + "14.2", + "14.3", + "14.4", + "14.5", + "14.6", + "14.7", + "14.8", + "14.9", + "15.1", + "15.2", + "15.3", + "15.4" }; private final String[] UNSUPPORTED_DATABASE_VERSIONS = new String[] { "8.4", "8.4.22", "9.1", + "9.5", + "9.5.25", + "9.6.5", + "9.6", + "10.1", + "10.14 (Ubuntu 10.14-1.pgdg20.04+1)", "11.0" }; @Test diff --git a/sormas-base/setup/server-setup.sh b/sormas-base/setup/server-setup.sh index a116188fc60..9c941522d3b 100755 --- a/sormas-base/setup/server-setup.sh +++ b/sormas-base/setup/server-setup.sh @@ -301,19 +301,32 @@ CREATE EXTENSION IF NOT EXISTS unaccent; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO $DB_USER; EOF +PostgreSQL_VERSION = psql --version 2>&1 | sed 's/psql (PostgreSQL) / /;s/\..*$//' if [[ ${LINUX} = true ]]; then # no host is specified as by default the postgres user has only local access + if [ PostgreSQL_VERSION < 12]; then + echo "ERROR: Found database server ${PostgreSQL_VERSION} At least PostgreSQL 12 is required." + exit 1 + fi su postgres -c "psql -p ${DB_PORT} < setup.sql" elif [[ ${MAC} = true ]]; then + if [ PostgreSQL_VERSION < 12]; then + echo "ERROR: Found database server ${PostgreSQL_VERSION} At least PostgreSQL 12 is required." + exit 1 + fi psql -p ${DB_PORT} -U postgres < setup.sql else - PSQL_DEFAULT="${PROGRAMFILES//\\/\/}/PostgreSQL/10/" + PSQL_DEFAULT="${PROGRAMFILES//\\/\/}/PostgreSQL/14/" echo "--- Enter the name install path of Postgres on your system (default: \"${PSQL_DEFAULT}\":" read -r PSQL_DIR if [[ -z "${PSQL_DIR}" ]]; then PSQL_DIR="${PSQL_DEFAULT}" fi PSQL="${PSQL_DIR}/bin/psql.exe" + if [ PostgreSQL_VERSION < 12]; then + echo "ERROR: Found database server ${PostgreSQL_VERSION} At least PostgreSQL 12 is required." + exit 1 + fi while [[ -z "${DB_PG_PW}" ]]; do read -r -p "--- Enter the password for the 'postgres' user of your database: " DB_PG_PW done From ee4ff767eebe61ef305db3b1c0fff5b8672b7fbe Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 14 Sep 2023 09:41:42 +0200 Subject: [PATCH 096/144] HSP-6177 Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - changed tag name 2 --- .../src/test/resources/features/sanity/web/Survnet.feature | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index 9fad49a69b5..869fa8e131e 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -490,11 +490,12 @@ Feature: Survnet tests And I check if "date of death" in SORMAS generated XML file is correct And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct - @tmsLink=SORQA-6177 + @tmsLink=HSP-6177 @env_d2s @LoginKeycloak Scenario: Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" Given API : Login to DEMIS server Then I create and send Laboratory Notification - Given I log in as a Survnet + And I navigate to "survnet" environment + And I log in as a Survnet Then I click on the Messages button from navbar And I click on fetch messages button Then I filter by last created person via API in Messages Directory From a60f5d6986cc23ece8ce88dda53d2f0be4cb248a Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 14 Sep 2023 10:03:08 +0200 Subject: [PATCH 097/144] HSP-6177 Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - move test from Survnet.feature to DemisWeb.feature --- .../features/sanity/web/DemisWeb.feature | 31 +++++++++++++++++- .../features/sanity/web/Survnet.feature | 32 +------------------ 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature index bc08a3cf59d..6b24fc91b3f 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature @@ -751,4 +751,33 @@ Scenario: Create and send laboratory request via Demis And I check that all displayed messages have "Arztmeldung" in grid Message Directory Type column And I select "Labormeldung" type of message in Message Directory page And I click on the APPLY FILTERS button - And I check that all displayed messages have "Labormeldung" in grid Message Directory Type column \ No newline at end of file + And I check that all displayed messages have "Labormeldung" in grid Message Directory Type column + + @tmsLink=HSP-6177 + Scenario: Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" + Given API : Login to DEMIS server + Then I create and send Laboratory Notification + And I navigate to "survnet" environment + And I log in as a Survnet + Then I click on the Messages button from navbar + And I click on fetch messages button + Then I filter by last created person via API in Messages Directory + And I click on Verarbeiten button in Messages Directory + Then I create a new person and a new case from received message + And I click on the eye icon next for the first fetched message + And I collect message uuid + Then I collect "DiagnosedAt" Date from Message + Then I collect "SpecimenCollectedAt" Date from Message + Then I collect "NotifiedAt" Date from Message + And I close HTML message + Then I click on the Cases button from navbar + And I search the case by last created person via Demis message + Then I click on the first Case ID from Case Directory + And I click on Send to reporting tool button on Edit Case page + And I collect case external UUID from Edit Case page + Then I wait 50 seconds for system reaction + And I open SORMAS generated XML file for single case message + And I check if "diagnose at date" in SORMAS generated XML file is correct + And I check if "specimen collected At date" in SORMAS generated XML file is correct + And I check if "notified at date" in SORMAS generated XML file is correct + Then I check if NotificationViaDEMIS has "true" value in SORMAS generated bulk XML file is correct \ No newline at end of file diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index 869fa8e131e..22907e73452 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -488,34 +488,4 @@ Feature: Survnet tests And I open SORMAS generated XML file for single case message Then I check if the present condition status "Verstorben" is correctly mapped in SORMAS generated single XML file And I check if "date of death" in SORMAS generated XML file is correct - And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct - - @tmsLink=HSP-6177 @env_d2s @LoginKeycloak - Scenario: Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - Given API : Login to DEMIS server - Then I create and send Laboratory Notification - And I navigate to "survnet" environment - And I log in as a Survnet - Then I click on the Messages button from navbar - And I click on fetch messages button - Then I filter by last created person via API in Messages Directory - And I click on Verarbeiten button in Messages Directory - Then I create a new person and a new case from received message - And I click on the eye icon next for the first fetched message - And I collect message uuid - Then I collect "DiagnosedAt" Date from Message - Then I collect "SpecimenCollectedAt" Date from Message - Then I collect "NotifiedAt" Date from Message - And I close HTML message - Then I click on the Cases button from navbar - And I search the case by last created person via Demis message - Then I click on the first Case ID from Case Directory - And I click on Send to reporting tool button on Edit Case page - And I collect case external UUID from Edit Case page - Then I wait 50 seconds for system reaction - And I open SORMAS generated XML file for single case message - And I check if "diagnose at date" in SORMAS generated XML file is correct - And I check if "specimen collected At date" in SORMAS generated XML file is correct - And I check if "notified at date" in SORMAS generated XML file is correct - Then I check if NotificationViaDEMIS has "true" value in SORMAS generated bulk XML file is correct - And I check that Patientrole is change in SORMAS generated single XML file is "-1" \ No newline at end of file + And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct \ No newline at end of file From 4d5f0df10879048ff0b5fb7f350eb1331b2b1554 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 14 Sep 2023 10:35:32 +0200 Subject: [PATCH 098/144] HSP-6177 Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - tags changed --- .../src/test/resources/features/sanity/web/DemisWeb.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature index 6b24fc91b3f..ec6d57cd119 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature @@ -753,7 +753,7 @@ Scenario: Create and send laboratory request via Demis And I click on the APPLY FILTERS button And I check that all displayed messages have "Labormeldung" in grid Message Directory Type column - @tmsLink=HSP-6177 + @tmsLink=HSP-6177 @env_d2s @LoginKeycloak Scenario: Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" Given API : Login to DEMIS server Then I create and send Laboratory Notification From cfff3e5d8f5b9d6bc755bd77d65b2996e76a9231 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 14 Sep 2023 14:06:33 +0300 Subject: [PATCH 099/144] #12257 - fix compilation error --- .../symeda/sormas/ui/samples/EnvironmentSampleController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java index 11c72d8d4f9..43e37b21ec2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java @@ -39,8 +39,6 @@ public void deleteAllSelectedItems( ControllerProvider.getDeleteRestoreController() .deleteAllSelectedItems( selectedRows, - null, - null, DeleteRestoreHandlers.forEnvironmentSample(), bulkOperationCallback(sampleGrid, noEntriesRemainingCallback)); From 37c9cb2f39f14456f85477208411d1cd975f0970 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 14 Sep 2023 15:54:46 +0300 Subject: [PATCH 100/144] #12257 - change a unit test --- .../sormas/backend/contact/ContactFacadeEjbTest.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java index 789c4dbe697..19bc75a1a97 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java @@ -335,7 +335,6 @@ public void testContactFollowUpStatusCanceledWhenContactConvertedToCase() { @Test public void testDeleteContactsOutsideJurisdiction() { - RDCF rdcf = creator.createRDCF(); UserDto creatorUser = creator.createNationalUser(); Region region = creator.createRegion("Region"); @@ -350,15 +349,12 @@ public void testDeleteContactsOutsideJurisdiction() { TestDataCreator.RDCF rdcf1 = new RDCF(new TestDataCreator.RDCFEntities(region, district1, community1, facility1)); TestDataCreator.RDCF rdcf2 = new RDCF(new TestDataCreator.RDCFEntities(region, district2, community2, facility2)); - PersonDto person1 = creator.createPerson(); PersonDto person2 = creator.createPerson(); - ContactDto contact1 = creator.createContact(rdcf1, creatorUser.toReference(), person1.toReference()); ContactDto contact2 = creator.createContact(rdcf2, creatorUser.toReference(), person2.toReference()); - assertEquals(2, getContactFacade().getAllActiveUuids().size()); + assertEquals(1, getContactFacade().getAllActiveUuids().size()); List contactUuidList = new ArrayList<>(); - contactUuidList.add(contact1.getUuid()); contactUuidList.add(contact2.getUuid()); UserDto user = creator.createSurveillanceOfficer(rdcf1); @@ -370,8 +366,8 @@ public void testDeleteContactsOutsideJurisdiction() { .map(ProcessedEntity::getEntityUuid) .collect(Collectors.toList()); - assertEquals(1, deletedUuids.size()); - assertEquals(contact1.getUuid(), deletedUuids.get(0)); + assertEquals(processedEntities.get(0).getProcessedEntityStatus(), ProcessedEntityStatus.ACCESS_DENIED_FAILURE); + assertEquals(0, deletedUuids.size()); loginWith(creatorUser); getContactFacade().delete(contactUuidList, new DeletionDetails(DeletionReason.OTHER_REASON, "test reason")); From d800547967eda9071ebc26774a55be6a9aae1b8d Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Thu, 14 Sep 2023 16:05:06 +0300 Subject: [PATCH 101/144] #11571 Add an import mechanism to the environment directory - update validation message --- sormas-api/src/main/resources/validations.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/resources/validations.properties b/sormas-api/src/main/resources/validations.properties index f0a25b54e20..e2ff7039878 100644 --- a/sormas-api/src/main/resources/validations.properties +++ b/sormas-api/src/main/resources/validations.properties @@ -273,4 +273,4 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) -environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is not water: %s \ No newline at end of file +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water: %s \ No newline at end of file From 15d96d917b713902c658aca69d6779c2ac63b073 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 14 Sep 2023 15:20:41 +0200 Subject: [PATCH 102/144] HSP-6177 Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - code refactore --- .../samples/CreateNewSamplePage.java | 1 + .../messages/MessagesDirectorySteps.java | 27 +------------- .../samples/CreateNewSampleSteps.java | 33 +++++++++++++++++ .../application/samples/EditSampleSteps.java | 12 ++++++ .../web/application/survnet/SurvNetSteps.java | 37 ++++++++++--------- .../features/sanity/web/DemisWeb.feature | 17 ++++++--- 6 files changed, 77 insertions(+), 50 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/CreateNewSamplePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/CreateNewSamplePage.java index 5ac4120ae9e..03d49c26c71 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/CreateNewSamplePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/CreateNewSamplePage.java @@ -80,6 +80,7 @@ public class CreateNewSamplePage { public static final By PATHOGEN_TEST_RESULT_COMBOBOX = By.cssSelector("[id='testResult'] [class='v-filterselect-button']"); public static final By PATHOGEN_TEST_RESULT_INPUT = By.cssSelector("[id='testResult'] input"); + public static final By VIA_DEMIS_CHECKBOX = By.cssSelector("#viaLims > input"); public static final By PATHOGEN_LABORATORY_COMBOBOX = By.cssSelector("[class='v-panel v-widget'] [location='lab'] [class='v-filterselect-button']"); public static final By PATHOGEN_LABORATORY_INPUT = diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java index 26782bf0167..270bf415a54 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java @@ -34,8 +34,6 @@ public class MessagesDirectorySteps implements En { public static List uuids = new ArrayList<>(); public static List shortenedUUIDS = new ArrayList<>(); public static LocalDate diagnosedAt; - public static LocalDate specimenCollectedAt; - public static LocalDate notifiedAt; public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @Inject @@ -538,37 +536,14 @@ public MessagesDirectorySteps( Then( "I collect {string} Date from Message", (String dateOption) -> { - switch (dateOption) { - case "DiagnosedAt": String localDiagnosedAt = String.format( webDriverHelpers .getTextFromWebElement(DIAGNOSED_AT_DATE) .substring(0, 10) .replace(".", "-")); - diagnosedAt = convertStringToChosenFormatDate("dd-MM-yyyy", "yyyy-MM-dd", localDiagnosedAt); - break; - case "SpecimenCollectedAt": - String localSpecimenCollectedAt = - webDriverHelpers - .getTextFromWebElement(SPECIMEN_COLLECTED_AT_DATE) - .substring(0, 10) - .replace(".", "-"); - - specimenCollectedAt = - convertStringToChosenFormatDate( - "dd-MM-yyyy", "yyyy-MM-dd", localSpecimenCollectedAt); - break; - case "NotifiedAt": - String localNotifiedAt = - webDriverHelpers.getValueFromWebElement(NOTIFICATION_AT_DATE).replace(".", "-"); - - notifiedAt = - convertStringToChosenFormatDate("dd-MM-yyyy", "yyyy-MM-dd", localNotifiedAt); - break; - } }); Then( @@ -594,7 +569,7 @@ public MessagesDirectorySteps( }); } - private LocalDate convertStringToChosenFormatDate( + public static LocalDate convertStringToChosenFormatDate( String inputFormatDate, String outputFormatDate, String localDate) { String output = null; try { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java index 0c360484e5e..64f24466a7d 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java @@ -105,6 +105,7 @@ import static org.sormas.e2etests.pages.application.samples.CreateNewSamplePage.TYPE_OF_TEST_INPUT; import static org.sormas.e2etests.pages.application.samples.CreateNewSamplePage.UPDATE_CASE_DISEASE_VARIANT; import static org.sormas.e2etests.pages.application.samples.CreateNewSamplePage.UREA_INPUT; +import static org.sormas.e2etests.pages.application.samples.CreateNewSamplePage.VIA_DEMIS_CHECKBOX; import static org.sormas.e2etests.pages.application.samples.CreateNewSamplePage.WBC_INPUT; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.EDIT_PATHOGEN_TEST; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.PCR_TEST_SPECIFICATION_COMBOBOX_DIV; @@ -118,6 +119,7 @@ import static org.sormas.e2etests.pages.application.samples.SamplesDirectoryPage.SAMPLE_EDIT_PURPOSE_OPTIONS; import static org.sormas.e2etests.pages.application.samples.SamplesDirectoryPage.SAMPLE_RECEIVED_CHECKBOX; import static org.sormas.e2etests.pages.application.samples.SamplesDirectoryPage.SAMPLE_SHIPPED_CHECKBOX; +import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.convertStringToChosenFormatDate; import com.github.javafaker.Faker; import cucumber.api.java8.En; @@ -158,6 +160,8 @@ public class CreateNewSampleSteps implements En { private final Faker faker; private final BaseSteps baseSteps; public static LocalDate sampleCollectionDateForFollowUpDate; + public static LocalDate reportDate; + public static String CheckboxViaDemis; @Inject public CreateNewSampleSteps( @@ -368,6 +372,13 @@ public CreateNewSampleSteps( softly.assertAll(); }); + When( + "I click on edit pathogen test", + () -> { + webDriverHelpers.clickOnWebElementBySelector(EDIT_PATHOGEN_TEST); + TimeUnit.SECONDS.sleep(5); + }); + When( "I select the German words for Antigen Detection Test as Type of Test in the Create New Sample popup", () -> { @@ -823,6 +834,28 @@ public CreateNewSampleSteps( webDriverHelpers.checkWebElementContainsText(GENERIC_ERROR_POPUP, str); }); + When( + "I collect date of Report from Pathogen test result sample", + () -> { + String LocalDateOfReport = webDriverHelpers.getValueFromWebElement(DATE_TEST_REPORT); + reportDate = + convertStringToChosenFormatDate("dd.MM.yyyy", "yyyy-MM-dd", LocalDateOfReport); + }); + + When( + "I collect via Demis checkbox value Pathogen test result sample", + () -> { + String localCheckboxViaDemis = + webDriverHelpers.getTextFromLabelIfCheckboxIsChecked(VIA_DEMIS_CHECKBOX); + if (localCheckboxViaDemis.equals("Via DEMIS")) CheckboxViaDemis = "true"; + }); + + When( + "I click on save button in Edit pathogen test result", + () -> { + webDriverHelpers.clickOnWebElementBySelector(SAVE_SAMPLE_BUTTON); + }); + When( "I confirm update case result", () -> webDriverHelpers.clickOnWebElementBySelector(ACTION_CONFIRM_POPUP_BUTTON)); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/EditSampleSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/EditSampleSteps.java index 27a810a484c..5629fe96b5e 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/EditSampleSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/EditSampleSteps.java @@ -56,6 +56,7 @@ import static org.sormas.e2etests.pages.application.samples.SamplesDirectoryPage.SAMPLE_EDIT_PURPOSE_OPTIONS; import static org.sormas.e2etests.pages.application.samples.SamplesDirectoryPage.SAMPLE_SEARCH_INPUT; import static org.sormas.e2etests.steps.BaseSteps.locale; +import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.convertStringToChosenFormatDate; import cucumber.api.java8.En; import java.time.LocalDate; @@ -76,6 +77,7 @@ public class EditSampleSteps implements En { public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("M/d/yyyy"); public static final DateTimeFormatter DATE_FORMATTER_DE = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + public static LocalDate dateOfSampleCollected; public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); public static Sample editedSample; @@ -292,6 +294,16 @@ public EditSampleSteps( softly.assertAll(); }); + When( + "I collect date of sample from on Edit Sample page for DE version", + () -> { + String localDateOfSampleCollected = + webDriverHelpers.getValueFromWebElement(DATE_SAMPLE_COLLECTED); + dateOfSampleCollected = + convertStringToChosenFormatDate( + "dd.MM.yyyy", "yyyy-MM-dd", localDateOfSampleCollected); + }); + Then( "^I check that laboratory is set to \"([^\"]*)\" on Edit Sample page$", (String labor) -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 043d28b42be..27b35bbbe49 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -21,8 +21,8 @@ import static org.sormas.e2etests.steps.web.application.cases.PreviousHospitalizationSteps.reasonForPreviousHospitalization; import static org.sormas.e2etests.steps.web.application.cases.SymptomsTabSteps.symptoms; import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.diagnosedAt; -import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.notifiedAt; -import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.specimenCollectedAt; +import static org.sormas.e2etests.steps.web.application.samples.CreateNewSampleSteps.reportDate; +import static org.sormas.e2etests.steps.web.application.samples.EditSampleSteps.dateOfSampleCollected; import static org.sormas.e2etests.steps.web.application.vaccination.CreateNewVaccinationSteps.randomVaccinationName; import static org.sormas.e2etests.steps.web.application.vaccination.CreateNewVaccinationSteps.vaccination; @@ -110,19 +110,19 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "Diagnose at date is incorrect!"); softly.assertAll(); break; - case "specimen collected At date": + case "date of sample collected": softly.assertEquals( getValueFromNotificationDateChildrenSpecificFieldByName( singleXmlFile, "SpecimenCollectedAt"), - specimenCollectedAt, - "Specimen collected at date is incorrect!"); + dateOfSampleCollected, + "Date of sample collected is incorrect!"); softly.assertAll(); break; - case "notified at date": + case "date of report for pathogen": softly.assertEquals( getValueFromNotificationDateChildrenSpecificFieldByName( singleXmlFile, "NotifiedAt"), - notifiedAt, + reportDate, "Notified at date is incorrect!"); softly.assertAll(); break; @@ -338,16 +338,17 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { And( "I check that Patientrole is change in SORMAS generated single XML file is {string}", (String expectedValue) -> { - String xmlValue = singleXmlFile - .getRootElement() - .getChildren() - .get(0) - .getChildren() - .get(1) - .getChildren() - .get(0) - .getAttribute("Value") - .getValue(); + String xmlValue = + singleXmlFile + .getRootElement() + .getChildren() + .get(0) + .getChildren() + .get(1) + .getChildren() + .get(0) + .getAttribute("Value") + .getValue(); softly.assertEquals(xmlValue, expectedValue, "Patientrole value is wrong"); softly.assertAll(); }); @@ -711,7 +712,7 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { }); And( - "I check if NotificationViaDEMIS has {string} value in SORMAS generated bulk XML file is correct", + "I check if Notification Via DEMIS checkbox value has correctly mapped in SORMAS generated singleXmlFile XML file", (String notificationValue) -> { softly.assertEquals( getValueFromSpecificNotificationFieldByName(singleXmlFile, "NotificationViaDEMIS"), diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature index ec6d57cd119..575bfbff6df 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature @@ -755,7 +755,7 @@ Scenario: Create and send laboratory request via Demis @tmsLink=HSP-6177 @env_d2s @LoginKeycloak Scenario: Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - Given API : Login to DEMIS server + Given API : Login to DEMIS server Then I create and send Laboratory Notification And I navigate to "survnet" environment And I log in as a Survnet @@ -767,17 +767,22 @@ Scenario: Create and send laboratory request via Demis And I click on the eye icon next for the first fetched message And I collect message uuid Then I collect "DiagnosedAt" Date from Message - Then I collect "SpecimenCollectedAt" Date from Message - Then I collect "NotifiedAt" Date from Message And I close HTML message Then I click on the Cases button from navbar And I search the case by last created person via Demis message Then I click on the first Case ID from Case Directory + And I click on edit Sample + Then I collect date of sample from on Edit Sample page for DE version + And I click on edit pathogen test + Then I collect date of Report from Pathogen test result sample + And I collect via Demis checkbox value Pathogen test result sample + Then I click on save button in Edit pathogen test result + And I navigate to case tab And I click on Send to reporting tool button on Edit Case page And I collect case external UUID from Edit Case page Then I wait 50 seconds for system reaction And I open SORMAS generated XML file for single case message And I check if "diagnose at date" in SORMAS generated XML file is correct - And I check if "specimen collected At date" in SORMAS generated XML file is correct - And I check if "notified at date" in SORMAS generated XML file is correct - Then I check if NotificationViaDEMIS has "true" value in SORMAS generated bulk XML file is correct \ No newline at end of file + And I check if "date of sample collected" in SORMAS generated XML file is correct + And I check if "date of report for pathogen at date" in SORMAS generated XML file is correct + Then I check if Notification Via DEMIS checkbox value has correctly mapped in SORMAS generated singleXmlFile XML file \ No newline at end of file From 3aa4b56efd42c908a7b76ab9ce1308176f765b76 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 14 Sep 2023 15:38:00 +0200 Subject: [PATCH 103/144] HSP-6177 Implement "Check Laboratory messages of case when sending from SORMAS to Meldesoftware" - code refactore2 --- .../web/application/samples/CreateNewSampleSteps.java | 4 ++-- .../steps/web/application/survnet/SurvNetSteps.java | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java index 64f24466a7d..085d8136eb5 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java @@ -161,7 +161,7 @@ public class CreateNewSampleSteps implements En { private final BaseSteps baseSteps; public static LocalDate sampleCollectionDateForFollowUpDate; public static LocalDate reportDate; - public static String CheckboxViaDemis; + public static String CheckboxViaDemisValue; @Inject public CreateNewSampleSteps( @@ -847,7 +847,7 @@ public CreateNewSampleSteps( () -> { String localCheckboxViaDemis = webDriverHelpers.getTextFromLabelIfCheckboxIsChecked(VIA_DEMIS_CHECKBOX); - if (localCheckboxViaDemis.equals("Via DEMIS")) CheckboxViaDemis = "true"; + if (localCheckboxViaDemis.equals("Via DEMIS")) CheckboxViaDemisValue = "true"; }); When( diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 27b35bbbe49..30b41e0869f 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -21,6 +21,7 @@ import static org.sormas.e2etests.steps.web.application.cases.PreviousHospitalizationSteps.reasonForPreviousHospitalization; import static org.sormas.e2etests.steps.web.application.cases.SymptomsTabSteps.symptoms; import static org.sormas.e2etests.steps.web.application.messages.MessagesDirectorySteps.diagnosedAt; +import static org.sormas.e2etests.steps.web.application.samples.CreateNewSampleSteps.CheckboxViaDemisValue; import static org.sormas.e2etests.steps.web.application.samples.CreateNewSampleSteps.reportDate; import static org.sormas.e2etests.steps.web.application.samples.EditSampleSteps.dateOfSampleCollected; import static org.sormas.e2etests.steps.web.application.vaccination.CreateNewVaccinationSteps.randomVaccinationName; @@ -713,11 +714,11 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { And( "I check if Notification Via DEMIS checkbox value has correctly mapped in SORMAS generated singleXmlFile XML file", - (String notificationValue) -> { + () -> { softly.assertEquals( getValueFromSpecificNotificationFieldByName(singleXmlFile, "NotificationViaDEMIS"), - notificationValue, - "Sex is incorrect!"); + CheckboxViaDemisValue, + "checkbox has incorrect value!"); softly.assertAll(); }); From a753fafab765de3ff5218e0fff4d6d56d67c3857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 15 Sep 2023 09:50:13 +0200 Subject: [PATCH 104/144] #12468 - Reload user rights on change --- .../app/backend/common/AdoDtoHelper.java | 5 ++++ .../app/backend/config/ConfigProvider.java | 24 +++++++++++-------- .../app/backend/user/UserRoleDtoHelper.java | 10 ++++++++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java index e70909f39b8..66966249d88 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java @@ -258,6 +258,7 @@ public int handlePulledList(AbstractAdoDao dao, List result, Optional< lastSyncedEntityDate = dto.getChangeDate(); } } + executeHandlePulledListAddition(result.size()); return null; }); @@ -497,4 +498,8 @@ public boolean isEditAllowed() { return true; } } + + protected void executeHandlePulledListAddition(int resultSize) { + // Not implemented by default + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java index 468931fde16..ca3d83e329f 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java @@ -15,15 +15,6 @@ package de.symeda.sormas.app.backend.config; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Build; -import android.security.KeyPairGeneratorSpec; -import android.util.Base64; -import android.util.Log; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -56,6 +47,15 @@ import javax.crypto.NoSuchPaddingException; import javax.security.auth.x500.X500Principal; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Build; +import android.security.KeyPairGeneratorSpec; +import android.util.Base64; +import android.util.Log; + import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.app.R; @@ -175,7 +175,7 @@ public void onClick(DialogInterface dialog, int which) { public static User getUser() { synchronized (ConfigProvider.class) { - if (instance.user == null) { + if (instance.user == null || instance.userRights == null) { String username = getUsername(); String password = getPassword(); // needed to not automatically "login" again on logout with missing server connection if (username != null && password != null) { @@ -209,6 +209,10 @@ public static boolean hasUserRight(UserRight userRight) { return userRights != null && userRights.contains(userRight); } + public static void clearUserRights() { + instance.userRights = null; + } + public static String getUsername() { synchronized (ConfigProvider.class) { if (instance.username == null) { diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/user/UserRoleDtoHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/user/UserRoleDtoHelper.java index 5b2d12fa195..951f76d4489 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/user/UserRoleDtoHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/user/UserRoleDtoHelper.java @@ -20,6 +20,7 @@ import de.symeda.sormas.api.PostResponse; import de.symeda.sormas.api.user.UserRoleDto; import de.symeda.sormas.app.backend.common.AdoDtoHelper; +import de.symeda.sormas.app.backend.config.ConfigProvider; import de.symeda.sormas.app.rest.NoConnectionException; import de.symeda.sormas.app.rest.RetroProvider; import retrofit2.Call; @@ -81,4 +82,13 @@ public void fillInnerFromAdo(UserRoleDto target, UserRole source) { protected long getApproximateJsonSizeInBytes() { return 0; } + + @Override + protected void executeHandlePulledListAddition(int listSize) { + if (listSize > 0) { + // Clear the user rights cache if user roles have changed because user rights + // of the current user might have been updated + ConfigProvider.clearUserRights(); + } + } } From 06acecd0f3fa01d47244f71da53e170c13b6c660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 15 Sep 2023 09:51:30 +0200 Subject: [PATCH 105/144] #12500 - Method renaming --- .../environment/environmentsample/EnvironmentSampleDao.java | 2 +- .../java/de/symeda/sormas/app/backend/location/Location.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java index fc917800468..6a8ef420cdb 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java @@ -39,7 +39,7 @@ public EnvironmentSample build(Environment associatedEnvironment) { sample.setReportDate(new Date()); sample.setReportingUser(ConfigProvider.getUser()); sample.setSampleDateTime(new Date()); - sample.setLocation(associatedEnvironment.getLocation().cloneLocation()); + sample.setLocation(associatedEnvironment.getLocation().asNewLocation()); return sample; } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java index 30992fe7da8..d5f46e15df3 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/location/Location.java @@ -473,7 +473,7 @@ public String getGpsLocation() { } } - public Location cloneLocation() { + public Location asNewLocation() { Location location = this; location.setId(null); From a885f24fcfda600880dcaf940466e9aca23e3cbd Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Fri, 15 Sep 2023 13:41:59 +0300 Subject: [PATCH 106/144] #11566 Add an environment sample grid to the web app - allow access to sample directory for users with only env sample rights --- sormas-api/src/main/resources/enum.properties | 2 +- .../src/main/java/de/symeda/sormas/ui/MainScreen.java | 3 ++- .../java/de/symeda/sormas/ui/samples/SamplesView.java | 10 +++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 538f1878c0c..ce4f6ade6ff 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java index b9dd0adf4c2..290b15e92b9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java @@ -270,7 +270,8 @@ public View getView(String viewName) { menu.addView(EventsView.class, EventsView.VIEW_NAME, I18nProperties.getCaption(Captions.mainMenuEvents), VaadinIcons.PHONE); } - if (permitted(FeatureType.SAMPLES_LAB, UserRight.SAMPLE_VIEW)) { + if (permitted(FeatureType.SAMPLES_LAB, UserRight.SAMPLE_VIEW) + || permitted(FeatureType.ENVIRONMENT_MANAGEMENT, UserRight.ENVIRONMENT_SAMPLE_VIEW)) { ControllerProvider.getSampleController().registerViews(navigator); menu.addView(SamplesView.class, SamplesView.VIEW_NAME, I18nProperties.getCaption(Captions.mainMenuSamples), VaadinIcons.DATABASE); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java index 08a0e3cf201..5fb7f8aac97 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java @@ -47,6 +47,7 @@ import de.symeda.sormas.api.sample.SampleIndexDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.SormasUI; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; import de.symeda.sormas.ui.utils.AbstractView; @@ -70,13 +71,16 @@ public class SamplesView extends AbstractView { public SamplesView() { super(VIEW_NAME); + boolean isHumanSamplePermitted = UiUtil.permitted(FeatureType.SAMPLES_LAB, UserRight.SAMPLE_VIEW); + boolean isEnvironmentSamplePerimtted = + isHumanSamplePermitted && UiUtil.permitted(FeatureType.ENVIRONMENT_MANAGEMENT, UserRight.ENVIRONMENT_SAMPLE_VIEW); + viewConfiguration = ViewModelProviders.of(getClass()).get(SamplesViewConfiguration.class); if (viewConfiguration.getViewType() == null) { - viewConfiguration.setViewType(SampleViewType.HUMAN); + viewConfiguration.setViewType(isHumanSamplePermitted ? SampleViewType.HUMAN : SampleViewType.ENVIRONMENT); } - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.ENVIRONMENT_MANAGEMENT) - && UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_VIEW)) { + if (isEnvironmentSamplePerimtted && isHumanSamplePermitted) { addViewSwitch(); } From 1de3c69daeec989f0055e0b2924d854e53db3b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 15 Sep 2023 15:28:38 +0200 Subject: [PATCH 107/144] #12500 - Make location fields required --- .../symeda/sormas/api/i18n/Validations.java | 1 + .../src/main/resources/validations.properties | 1 + .../EnvironmentSampleDao.java | 11 ++++++ .../edit/EnvironmentSampleEditFragment.java | 20 +++++++++-- .../edit/EnvironmentSampleValidator.java | 34 ++++++++++++++++++- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java index 63265621591..2b16ce9878f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java @@ -79,6 +79,7 @@ public interface Validations { String fileTooBig = "fileTooBig"; String futureDate = "futureDate"; String futureDateStrict = "futureDateStrict"; + String gpsCoordinatesRequired = "gpsCoordinatesRequired"; String importAreaAlreadyExists = "importAreaAlreadyExists"; String importAreaNotUnique = "importAreaNotUnique"; String importCasesPropertyTypeNotAllowed = "importCasesPropertyTypeNotAllowed"; diff --git a/sormas-api/src/main/resources/validations.properties b/sormas-api/src/main/resources/validations.properties index e840ee0ed67..86c06738236 100644 --- a/sormas-api/src/main/resources/validations.properties +++ b/sormas-api/src/main/resources/validations.properties @@ -270,3 +270,4 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java index 6a8ef420cdb..2e06bcccb55 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDao.java @@ -15,6 +15,7 @@ import de.symeda.sormas.app.backend.config.ConfigProvider; import de.symeda.sormas.app.backend.environment.Environment; import de.symeda.sormas.app.backend.location.Location; +import de.symeda.sormas.app.util.LocationService; public class EnvironmentSampleDao extends AbstractAdoDao { @@ -40,6 +41,16 @@ public EnvironmentSample build(Environment associatedEnvironment) { sample.setReportingUser(ConfigProvider.getUser()); sample.setSampleDateTime(new Date()); sample.setLocation(associatedEnvironment.getLocation().asNewLocation()); + if (sample.getLocation().getDistrict() == null) { + sample.getLocation().setRegion(ConfigProvider.getUser().getRegion()); + sample.getLocation().setDistrict(ConfigProvider.getUser().getDistrict()); + } + android.location.Location location = LocationService.instance().getLocation(); + if (location != null) { + sample.getLocation().setLatitude(location.getLatitude()); + sample.getLocation().setLongitude(location.getLongitude()); + sample.getLocation().setLatLonAccuracy(location.getAccuracy()); + } return sample; } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java index 2342c001ea5..341ac554bed 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditFragment.java @@ -16,6 +16,7 @@ package de.symeda.sormas.app.environmentsample.edit; import static android.view.View.GONE; +import static de.symeda.sormas.app.core.notification.NotificationType.ERROR; import java.util.ArrayList; import java.util.List; @@ -32,6 +33,7 @@ import de.symeda.sormas.api.environment.environmentsample.WeatherCondition; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.ValidationException; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; import de.symeda.sormas.app.BaseActivity; @@ -44,6 +46,8 @@ import de.symeda.sormas.app.backend.location.Location; import de.symeda.sormas.app.component.Item; import de.symeda.sormas.app.component.dialog.LocationDialog; +import de.symeda.sormas.app.component.validation.FragmentValidator; +import de.symeda.sormas.app.core.notification.NotificationHelper; import de.symeda.sormas.app.databinding.FragmentEnvironmentSampleEditLayoutBinding; import de.symeda.sormas.app.util.DataUtils; @@ -101,7 +105,7 @@ public void onLayoutBinding(FragmentEnvironmentSampleEditLayoutBinding contentBi setUpControlListeners(contentBinding); contentBinding.setData(record); - EnvironmentSampleValidator.initializeEnvironmentSampleValidation(contentBinding); + EnvironmentSampleValidator.initializeEnvironmentSampleValidation(contentBinding, () -> record.getLocation()); contentBinding.setWeatherConditionClass(WeatherCondition.class); List pathogens = DatabaseHelper.getCustomizableEnumValueDao().getEnumValues(CustomizableEnumType.PATHOGEN, null); // Remove default "OTHER" pathogen because it's covered by a separate field @@ -171,10 +175,20 @@ private void openAddressPopup(FragmentEnvironmentSampleEditLayoutBinding content final Location locationClone = (Location) location.clone(); final LocationDialog locationDialog = new LocationDialog(BaseActivity.getActiveActivity(), locationClone, getFieldAccessCheckers()); locationDialog.show(); + locationDialog.getContentBinding().locationRegion.setRequired(true); + locationDialog.getContentBinding().locationDistrict.setRequired(true); + locationDialog.getContentBinding().locationLatitude.setRequired(true); + locationDialog.getContentBinding().locationLongitude.setRequired(true); + locationDialog.setFacilityFieldsVisible(false, true); locationDialog.setPositiveCallback(() -> { - contentBinding.environmentSampleLocation.setValue(locationClone); - record.setLocation(locationClone); + try { + FragmentValidator.validate(getContext(), locationDialog.getContentBinding()); + contentBinding.environmentSampleLocation.setValue(locationClone); + record.setLocation(locationClone); + } catch (ValidationException e) { + NotificationHelper.showDialogNotification(locationDialog, ERROR, e.getMessage()); + } }); } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java index 01c453e3f50..227d8198e12 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleValidator.java @@ -15,20 +15,26 @@ package de.symeda.sormas.app.environmentsample.edit; +import java.util.concurrent.Callable; + import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.app.backend.location.Location; import de.symeda.sormas.app.databinding.FragmentEnvironmentSampleEditLayoutBinding; import de.symeda.sormas.app.util.ResultCallback; public class EnvironmentSampleValidator { - static void initializeEnvironmentSampleValidation(final FragmentEnvironmentSampleEditLayoutBinding contentBinding) { + static void initializeEnvironmentSampleValidation( + final FragmentEnvironmentSampleEditLayoutBinding contentBinding, + Callable locationCallback) { initializeSampleAndDispatchDateValidation(contentBinding); initializeMeasurementValidations(contentBinding); + initializeLocationValidations(contentBinding, locationCallback); } private static void initializeSampleAndDispatchDateValidation(final FragmentEnvironmentSampleEditLayoutBinding contentBinding) { @@ -112,4 +118,30 @@ private static void initializeMeasurementValidations(final FragmentEnvironmentSa contentBinding.environmentSamplePhValue.setValidationCallback(phValueCallback); } + private static void initializeLocationValidations( + final FragmentEnvironmentSampleEditLayoutBinding contentBinding, + Callable locationCallback) { + + contentBinding.environmentSampleLocation.setValidationCallback(() -> { + try { + Location location = locationCallback.call(); + if (location.getRegion() == null) { + contentBinding.environmentSampleLocation.enableErrorState(I18nProperties.getValidationError(Validations.validRegion)); + return true; + } + if (location.getDistrict() == null) { + contentBinding.environmentSampleLocation.enableErrorState(I18nProperties.getValidationError(Validations.validDistrict)); + return true; + } + if (location.getLatitude() == null || location.getLongitude() == null) { + contentBinding.environmentSampleLocation.enableErrorState(I18nProperties.getValidationError(Validations.gpsCoordinatesRequired)); + return true; + } + return false; + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + } From 267604bc2a2d72727688b12f0be5edc29eda3cce Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Mon, 18 Sep 2023 09:38:52 +0300 Subject: [PATCH 108/144] #11570 Add a basic export to the environment and environment sample directories --- .../environment/EnvironmentGridComponent.java | 10 ++++++++ .../ui/environment/EnvironmentsView.java | 24 +++++++++++++++++++ .../ui/samples/SampleGridComponent.java | 1 - .../symeda/sormas/ui/samples/SamplesView.java | 21 ++++++++++++++++ .../sormas/ui/utils/ExportEntityName.java | 4 +++- 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentGridComponent.java index c88e1b6903b..10cec3a888b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentGridComponent.java @@ -16,6 +16,7 @@ package de.symeda.sormas.ui.environment; import java.util.HashMap; +import java.util.Set; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; @@ -25,6 +26,7 @@ import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.environment.EnvironmentCriteria; +import de.symeda.sormas.api.environment.EnvironmentIndexDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.user.UserRight; @@ -143,4 +145,12 @@ private void updateStatusButtons(EnvironmentCriteria criteria) { .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } + + public EnvironmentGrid getGrid() { + return grid; + } + + public Set getSelectedItems() { + return grid.asMultiSelect().getSelectedItems(); + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java index aac3259570f..1c77be6f9e0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentsView.java @@ -15,15 +15,22 @@ package de.symeda.sormas.ui.environment; +import java.util.Collections; +import java.util.Set; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; +import com.vaadin.server.FileDownloader; +import com.vaadin.server.StreamResource; import com.vaadin.ui.Button; import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.environment.EnvironmentCriteria; +import de.symeda.sormas.api.environment.EnvironmentIndexDto; import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.Descriptions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.user.UserRight; @@ -33,6 +40,8 @@ import de.symeda.sormas.ui.environment.importer.EnvironmentImportLayout; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.ButtonHelper; +import de.symeda.sormas.ui.utils.ExportEntityName; +import de.symeda.sormas.ui.utils.GridExportStreamResource; import de.symeda.sormas.ui.utils.VaadinUiUtil; import de.symeda.sormas.ui.utils.ViewConfiguration; @@ -70,6 +79,17 @@ public EnvironmentsView() { addHeaderComponent(importButton); } + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_EXPORT)) { + Button exportButton = ButtonHelper.createIconButton(Captions.export, VaadinIcons.TABLE, null, ValoTheme.BUTTON_PRIMARY); + exportButton.setDescription(I18nProperties.getDescription(Descriptions.descExportButton)); + addHeaderComponent(exportButton); + + StreamResource streamResource = GridExportStreamResource + .createStreamResourceWithSelectedItems(gridComponent.getGrid(), this::getSelectedRows, ExportEntityName.ENVIRONMENTS); + FileDownloader fileDownloader = new FileDownloader(streamResource); + fileDownloader.extend(exportButton); + } + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_CREATE)) { final Button btnNewContact = ButtonHelper.createIconButton( Captions.environmentNewEnvironment, @@ -95,4 +115,8 @@ public void enter(ViewChangeListener.ViewChangeEvent event) { gridComponent.reload(); } + + private Set getSelectedRows() { + return this.viewConfiguration.isInEagerMode() ? gridComponent.getSelectedItems() : Collections.emptySet(); + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java index f62508f770a..171cb06f4c0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java @@ -41,5 +41,4 @@ public void reload(ViewChangeListener.ViewChangeEvent event) { } abstract void updateFilterComponents(); - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java index 08a0e3cf201..3e8db2f6b81 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java @@ -36,8 +36,10 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.contact.ContactDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.Descriptions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.person.PersonDto; @@ -89,6 +91,19 @@ public SamplesView() { addHumanSampleExportButton(); } + if (isEnvironmentSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EXPORT)) { + Button exportButton = ButtonHelper.createIconButton(Captions.export, VaadinIcons.TABLE, null, ValoTheme.BUTTON_PRIMARY); + exportButton.setDescription(I18nProperties.getDescription(Descriptions.descExportButton)); + addHeaderComponent(exportButton); + + StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( + sampleListComponent.getGrid(), + this::getSelectedEnvironmentSamples, + ExportEntityName.ENVIRONMeNT_SAMPLES); + FileDownloader fileDownloader = new FileDownloader(streamResource); + fileDownloader.extend(exportButton); + } + if ((isHumanSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) || (isEnvironmentSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS))) { addBulkModeButtons(); @@ -227,4 +242,10 @@ public void enter(ViewChangeEvent event) { public ViewConfiguration getViewConfiguration() { return viewConfiguration; } + + private Set getSelectedEnvironmentSamples() { + return this.viewConfiguration.isInEagerMode() + ? ((EnvironmentSampleGridComponent) sampleListComponent).getGrid().asMultiSelect().getSelectedItems() + : Collections.emptySet(); + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java index 43d90105c1c..b463e3f897e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java @@ -39,7 +39,9 @@ public enum ExportEntityName { DOCUMENTS("entityDocuments", "documents"), DATA_DICTIONARY("entityDataDictionary", "data dictionary"), DATA_PROTECTION_DICTIONARY("entityDataProtectionDictionary", "data protection dictionary"), - PERSONS("entityPersons", "persons"); + PERSONS("entityPersons", "persons"), + ENVIRONMENTS("entityEnvironments", "environments"), + ENVIRONMeNT_SAMPLES("entityEnvironmentSamples", "environment samples"),; private final String languageKey; private final String defaultName; From 17ef41500ad98b2342e1e71a88d6e9e1b416776d Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 18 Sep 2023 10:42:11 +0200 Subject: [PATCH 109/144] HSP-5526 Stabilize "User permissions check for users" - updated json user rights files --- .../AutomationAdminUserRights.json | 182 ++++++++++++++++- .../AutomationAdminUserRightsDE.json | 181 ++++++++++++++++- .../NationalUserRights.json | 137 ++++++++++++- .../NationalUserRightsDE.json | 137 ++++++++++++- .../SormasToSormasUserRights.json | 185 +++++++++++++++++- .../SurvnetUserRights.json | 185 +++++++++++++++++- .../web/application/survnet/SurvNetSteps.java | 21 +- 7 files changed, 1011 insertions(+), 17 deletions(-) diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json index 908f75e64ea..b01b1f406a5 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json @@ -1,2 +1,180 @@ - -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file +[ + "ACTION_CREATE", + "ACTION_DELETE", + "ACTION_EDIT", + "ADDITIONAL_TEST_CREATE", + "ADDITIONAL_TEST_DELETE", + "ADDITIONAL_TEST_EDIT", + "ADDITIONAL_TEST_VIEW", + "AGGREGATE_REPORT_EDIT", + "AGGREGATE_REPORT_EXPORT", + "AGGREGATE_REPORT_VIEW", + "CAMPAIGN_ARCHIVE", + "CAMPAIGN_DELETE", + "CAMPAIGN_EDIT", + "CAMPAIGN_FORM_DATA_ARCHIVE", + "CAMPAIGN_FORM_DATA_DELETE", + "CAMPAIGN_FORM_DATA_EDIT", + "CAMPAIGN_FORM_DATA_EXPORT", + "CAMPAIGN_FORM_DATA_VIEW", + "CAMPAIGN_VIEW", + "CASE_ARCHIVE", + "CASE_CHANGE_DISEASE", + "CASE_CHANGE_EPID_NUMBER", + "CASE_CLASSIFY", + "CASE_CLINICIAN_VIEW", + "CASE_CREATE", + "CASE_DELETE", + "CASE_EDIT", + "CASE_EXPORT", + "CASE_IMPORT", + "CASE_INVESTIGATE", + "CASE_MERGE", + "CASE_REFER_FROM_POE", + "CASE_SHARE", + "CASE_TRANSFER", + "CASE_VIEW", + "CLINICAL_COURSE_EDIT", + "CLINICAL_COURSE_VIEW", + "CLINICAL_VISIT_CREATE", + "CLINICAL_VISIT_DELETE", + "CLINICAL_VISIT_EDIT", + "CONTACT_ARCHIVE", + "CONTACT_CONVERT", + "CONTACT_CREATE", + "CONTACT_DELETE", + "CONTACT_EDIT", + "CONTACT_EXPORT", + "CONTACT_IMPORT", + "CONTACT_MERGE", + "CONTACT_REASSIGN_CASE", + "CONTACT_VIEW", + "DASHBOARD_CAMPAIGNS_VIEW", + "DASHBOARD_CONTACT_VIEW", + "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", + "DASHBOARD_SAMPLES_VIEW", + "DASHBOARD_SURVEILLANCE_VIEW", + "DATABASE_EXPORT_ACCESS", + "DEV_MODE", + "DOCUMENT_DELETE", + "DOCUMENT_TEMPLATE_MANAGEMENT", + "DOCUMENT_UPLOAD", + "DOCUMENT_VIEW", + "ENVIRONMENT_ARCHIVE", + "ENVIRONMENT_CREATE", + "ENVIRONMENT_DELETE", + "ENVIRONMENT_EDIT", + "ENVIRONMENT_EXPORT", + "ENVIRONMENT_IMPORT", + "ENVIRONMENT_SAMPLE_CREATE", + "ENVIRONMENT_SAMPLE_DELETE", + "ENVIRONMENT_SAMPLE_EDIT", + "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", + "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", + "ENVIRONMENT_SAMPLE_EXPORT", + "ENVIRONMENT_SAMPLE_IMPORT", + "ENVIRONMENT_SAMPLE_VIEW", + "ENVIRONMENT_VIEW", + "EVENTGROUP_ARCHIVE", + "EVENTGROUP_CREATE", + "EVENTGROUP_DELETE", + "EVENTGROUP_EDIT", + "EVENTGROUP_LINK", + "EVENTPARTICIPANT_ARCHIVE", + "EVENTPARTICIPANT_CREATE", + "EVENTPARTICIPANT_DELETE", + "EVENTPARTICIPANT_EDIT", + "EVENTPARTICIPANT_IMPORT", + "EVENTPARTICIPANT_VIEW", + "EVENT_ARCHIVE", + "EVENT_CREATE", + "EVENT_DELETE", + "EVENT_EDIT", + "EVENT_EXPORT", + "EVENT_IMPORT", + "EVENT_VIEW", + "EXPORT_DATA_PROTECTION_DATA", + "EXTERNAL_MESSAGE_DELETE", + "EXTERNAL_MESSAGE_PROCESS", + "EXTERNAL_MESSAGE_VIEW", + "IMMUNIZATION_ARCHIVE", + "IMMUNIZATION_CREATE", + "IMMUNIZATION_DELETE", + "IMMUNIZATION_EDIT", + "IMMUNIZATION_VIEW", + "INFRASTRUCTURE_ARCHIVE", + "INFRASTRUCTURE_CREATE", + "INFRASTRUCTURE_EDIT", + "INFRASTRUCTURE_EXPORT", + "INFRASTRUCTURE_IMPORT", + "INFRASTRUCTURE_VIEW", + "LINE_LISTING_CONFIGURE", + "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", + "MANAGE_PUBLIC_EXPORT_CONFIGURATION", + "OUTBREAK_EDIT", + "OUTBREAK_VIEW", + "PATHOGEN_TEST_CREATE", + "PATHOGEN_TEST_DELETE", + "PATHOGEN_TEST_EDIT", + "PERFORM_BULK_OPERATIONS", + "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", + "PERFORM_BULK_OPERATIONS_EVENT", + "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", + "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", + "PERFORM_BULK_OPERATIONS_PSEUDONYM", + "PERSON_CONTACT_DETAILS_DELETE", + "PERSON_DELETE", + "PERSON_EDIT", + "PERSON_EXPORT", + "PERSON_MERGE", + "PERSON_VIEW", + "POPULATION_MANAGE", + "PORT_HEALTH_INFO_EDIT", + "PORT_HEALTH_INFO_VIEW", + "PRESCRIPTION_CREATE", + "PRESCRIPTION_DELETE", + "PRESCRIPTION_EDIT", + "QUARANTINE_ORDER_CREATE", + "SAMPLE_CREATE", + "SAMPLE_DELETE", + "SAMPLE_EDIT", + "SAMPLE_EDIT_NOT_OWNED", + "SAMPLE_EXPORT", + "SAMPLE_TRANSFER", + "SAMPLE_VIEW", + "SEE_PERSONAL_DATA_IN_JURISDICTION", + "SEE_SENSITIVE_DATA_IN_JURISDICTION", + "SEND_MANUAL_EXTERNAL_MESSAGES", + "SORMAS_REST", + "SORMAS_UI", + "STATISTICS_ACCESS", + "STATISTICS_EXPORT", + "TASK_ARCHIVE", + "TASK_ASSIGN", + "TASK_CREATE", + "TASK_DELETE", + "TASK_EDIT", + "TASK_EXPORT", + "TASK_VIEW", + "THERAPY_VIEW", + "TRAVEL_ENTRY_ARCHIVE", + "TRAVEL_ENTRY_CREATE", + "TRAVEL_ENTRY_DELETE", + "TRAVEL_ENTRY_EDIT", + "TRAVEL_ENTRY_MANAGEMENT_ACCESS", + "TRAVEL_ENTRY_VIEW", + "TREATMENT_CREATE", + "TREATMENT_DELETE", + "TREATMENT_EDIT", + "USER_CREATE", + "USER_EDIT", + "USER_ROLE_DELETE", + "USER_ROLE_EDIT", + "USER_ROLE_VIEW", + "USER_VIEW", + "VISIT_CREATE", + "VISIT_DELETE", + "VISIT_EDIT", + "VISIT_EXPORT", + "WEEKLYREPORT_VIEW" +] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json index d6c3748c3cb..b01b1f406a5 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json @@ -1 +1,180 @@ -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_CREATE","WEEKLYREPORT_VIEW"] \ No newline at end of file +[ + "ACTION_CREATE", + "ACTION_DELETE", + "ACTION_EDIT", + "ADDITIONAL_TEST_CREATE", + "ADDITIONAL_TEST_DELETE", + "ADDITIONAL_TEST_EDIT", + "ADDITIONAL_TEST_VIEW", + "AGGREGATE_REPORT_EDIT", + "AGGREGATE_REPORT_EXPORT", + "AGGREGATE_REPORT_VIEW", + "CAMPAIGN_ARCHIVE", + "CAMPAIGN_DELETE", + "CAMPAIGN_EDIT", + "CAMPAIGN_FORM_DATA_ARCHIVE", + "CAMPAIGN_FORM_DATA_DELETE", + "CAMPAIGN_FORM_DATA_EDIT", + "CAMPAIGN_FORM_DATA_EXPORT", + "CAMPAIGN_FORM_DATA_VIEW", + "CAMPAIGN_VIEW", + "CASE_ARCHIVE", + "CASE_CHANGE_DISEASE", + "CASE_CHANGE_EPID_NUMBER", + "CASE_CLASSIFY", + "CASE_CLINICIAN_VIEW", + "CASE_CREATE", + "CASE_DELETE", + "CASE_EDIT", + "CASE_EXPORT", + "CASE_IMPORT", + "CASE_INVESTIGATE", + "CASE_MERGE", + "CASE_REFER_FROM_POE", + "CASE_SHARE", + "CASE_TRANSFER", + "CASE_VIEW", + "CLINICAL_COURSE_EDIT", + "CLINICAL_COURSE_VIEW", + "CLINICAL_VISIT_CREATE", + "CLINICAL_VISIT_DELETE", + "CLINICAL_VISIT_EDIT", + "CONTACT_ARCHIVE", + "CONTACT_CONVERT", + "CONTACT_CREATE", + "CONTACT_DELETE", + "CONTACT_EDIT", + "CONTACT_EXPORT", + "CONTACT_IMPORT", + "CONTACT_MERGE", + "CONTACT_REASSIGN_CASE", + "CONTACT_VIEW", + "DASHBOARD_CAMPAIGNS_VIEW", + "DASHBOARD_CONTACT_VIEW", + "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", + "DASHBOARD_SAMPLES_VIEW", + "DASHBOARD_SURVEILLANCE_VIEW", + "DATABASE_EXPORT_ACCESS", + "DEV_MODE", + "DOCUMENT_DELETE", + "DOCUMENT_TEMPLATE_MANAGEMENT", + "DOCUMENT_UPLOAD", + "DOCUMENT_VIEW", + "ENVIRONMENT_ARCHIVE", + "ENVIRONMENT_CREATE", + "ENVIRONMENT_DELETE", + "ENVIRONMENT_EDIT", + "ENVIRONMENT_EXPORT", + "ENVIRONMENT_IMPORT", + "ENVIRONMENT_SAMPLE_CREATE", + "ENVIRONMENT_SAMPLE_DELETE", + "ENVIRONMENT_SAMPLE_EDIT", + "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", + "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", + "ENVIRONMENT_SAMPLE_EXPORT", + "ENVIRONMENT_SAMPLE_IMPORT", + "ENVIRONMENT_SAMPLE_VIEW", + "ENVIRONMENT_VIEW", + "EVENTGROUP_ARCHIVE", + "EVENTGROUP_CREATE", + "EVENTGROUP_DELETE", + "EVENTGROUP_EDIT", + "EVENTGROUP_LINK", + "EVENTPARTICIPANT_ARCHIVE", + "EVENTPARTICIPANT_CREATE", + "EVENTPARTICIPANT_DELETE", + "EVENTPARTICIPANT_EDIT", + "EVENTPARTICIPANT_IMPORT", + "EVENTPARTICIPANT_VIEW", + "EVENT_ARCHIVE", + "EVENT_CREATE", + "EVENT_DELETE", + "EVENT_EDIT", + "EVENT_EXPORT", + "EVENT_IMPORT", + "EVENT_VIEW", + "EXPORT_DATA_PROTECTION_DATA", + "EXTERNAL_MESSAGE_DELETE", + "EXTERNAL_MESSAGE_PROCESS", + "EXTERNAL_MESSAGE_VIEW", + "IMMUNIZATION_ARCHIVE", + "IMMUNIZATION_CREATE", + "IMMUNIZATION_DELETE", + "IMMUNIZATION_EDIT", + "IMMUNIZATION_VIEW", + "INFRASTRUCTURE_ARCHIVE", + "INFRASTRUCTURE_CREATE", + "INFRASTRUCTURE_EDIT", + "INFRASTRUCTURE_EXPORT", + "INFRASTRUCTURE_IMPORT", + "INFRASTRUCTURE_VIEW", + "LINE_LISTING_CONFIGURE", + "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", + "MANAGE_PUBLIC_EXPORT_CONFIGURATION", + "OUTBREAK_EDIT", + "OUTBREAK_VIEW", + "PATHOGEN_TEST_CREATE", + "PATHOGEN_TEST_DELETE", + "PATHOGEN_TEST_EDIT", + "PERFORM_BULK_OPERATIONS", + "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", + "PERFORM_BULK_OPERATIONS_EVENT", + "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", + "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", + "PERFORM_BULK_OPERATIONS_PSEUDONYM", + "PERSON_CONTACT_DETAILS_DELETE", + "PERSON_DELETE", + "PERSON_EDIT", + "PERSON_EXPORT", + "PERSON_MERGE", + "PERSON_VIEW", + "POPULATION_MANAGE", + "PORT_HEALTH_INFO_EDIT", + "PORT_HEALTH_INFO_VIEW", + "PRESCRIPTION_CREATE", + "PRESCRIPTION_DELETE", + "PRESCRIPTION_EDIT", + "QUARANTINE_ORDER_CREATE", + "SAMPLE_CREATE", + "SAMPLE_DELETE", + "SAMPLE_EDIT", + "SAMPLE_EDIT_NOT_OWNED", + "SAMPLE_EXPORT", + "SAMPLE_TRANSFER", + "SAMPLE_VIEW", + "SEE_PERSONAL_DATA_IN_JURISDICTION", + "SEE_SENSITIVE_DATA_IN_JURISDICTION", + "SEND_MANUAL_EXTERNAL_MESSAGES", + "SORMAS_REST", + "SORMAS_UI", + "STATISTICS_ACCESS", + "STATISTICS_EXPORT", + "TASK_ARCHIVE", + "TASK_ASSIGN", + "TASK_CREATE", + "TASK_DELETE", + "TASK_EDIT", + "TASK_EXPORT", + "TASK_VIEW", + "THERAPY_VIEW", + "TRAVEL_ENTRY_ARCHIVE", + "TRAVEL_ENTRY_CREATE", + "TRAVEL_ENTRY_DELETE", + "TRAVEL_ENTRY_EDIT", + "TRAVEL_ENTRY_MANAGEMENT_ACCESS", + "TRAVEL_ENTRY_VIEW", + "TREATMENT_CREATE", + "TREATMENT_DELETE", + "TREATMENT_EDIT", + "USER_CREATE", + "USER_EDIT", + "USER_ROLE_DELETE", + "USER_ROLE_EDIT", + "USER_ROLE_VIEW", + "USER_VIEW", + "VISIT_CREATE", + "VISIT_DELETE", + "VISIT_EDIT", + "VISIT_EXPORT", + "WEEKLYREPORT_VIEW" +] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json index 4050da8d1b6..567cd6e5c7b 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json @@ -1 +1,136 @@ -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_DELETE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DOCUMENT_DELETE","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_VIEW","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_DELETE","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_DELETE","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file +[ + "ACTION_CREATE", + "ACTION_DELETE", + "ACTION_EDIT", + "ADDITIONAL_TEST_DELETE", + "ADDITIONAL_TEST_VIEW", + "AGGREGATE_REPORT_EDIT", + "AGGREGATE_REPORT_EXPORT", + "AGGREGATE_REPORT_VIEW", + "CAMPAIGN_ARCHIVE", + "CAMPAIGN_FORM_DATA_ARCHIVE", + "CAMPAIGN_FORM_DATA_EDIT", + "CAMPAIGN_FORM_DATA_EXPORT", + "CAMPAIGN_FORM_DATA_VIEW", + "CAMPAIGN_VIEW", + "CASE_CHANGE_DISEASE", + "CASE_CHANGE_EPID_NUMBER", + "CASE_CLASSIFY", + "CASE_CREATE", + "CASE_DELETE", + "CASE_EDIT", + "CASE_EXPORT", + "CASE_INVESTIGATE", + "CASE_REFER_FROM_POE", + "CASE_SHARE", + "CASE_TRANSFER", + "CASE_VIEW", + "CLINICAL_COURSE_VIEW", + "CLINICAL_VISIT_DELETE", + "CONTACT_CONVERT", + "CONTACT_CREATE", + "CONTACT_DELETE", + "CONTACT_EDIT", + "CONTACT_EXPORT", + "CONTACT_REASSIGN_CASE", + "CONTACT_VIEW", + "DASHBOARD_CAMPAIGNS_VIEW", + "DASHBOARD_CONTACT_VIEW", + "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", + "DASHBOARD_SAMPLES_VIEW", + "DASHBOARD_SURVEILLANCE_VIEW", + "DATABASE_EXPORT_ACCESS", + "DOCUMENT_DELETE", + "DOCUMENT_UPLOAD", + "DOCUMENT_VIEW", + "ENVIRONMENT_ARCHIVE", + "ENVIRONMENT_CREATE", + "ENVIRONMENT_DELETE", + "ENVIRONMENT_EDIT", + "ENVIRONMENT_EXPORT", + "ENVIRONMENT_IMPORT", + "ENVIRONMENT_SAMPLE_CREATE", + "ENVIRONMENT_SAMPLE_DELETE", + "ENVIRONMENT_SAMPLE_EDIT", + "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", + "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", + "ENVIRONMENT_SAMPLE_EXPORT", + "ENVIRONMENT_SAMPLE_IMPORT", + "ENVIRONMENT_SAMPLE_VIEW", + "ENVIRONMENT_VIEW", + "EVENTGROUP_CREATE", + "EVENTGROUP_DELETE", + "EVENTGROUP_EDIT", + "EVENTGROUP_LINK", + "EVENTPARTICIPANT_CREATE", + "EVENTPARTICIPANT_DELETE", + "EVENTPARTICIPANT_EDIT", + "EVENTPARTICIPANT_IMPORT", + "EVENTPARTICIPANT_VIEW", + "EVENT_CREATE", + "EVENT_DELETE", + "EVENT_EDIT", + "EVENT_EXPORT", + "EVENT_VIEW", + "EXTERNAL_MESSAGE_DELETE", + "EXTERNAL_MESSAGE_PROCESS", + "EXTERNAL_MESSAGE_VIEW", + "IMMUNIZATION_CREATE", + "IMMUNIZATION_DELETE", + "IMMUNIZATION_EDIT", + "IMMUNIZATION_VIEW", + "INFRASTRUCTURE_ARCHIVE", + "INFRASTRUCTURE_EXPORT", + "INFRASTRUCTURE_VIEW", + "LINE_LISTING_CONFIGURE", + "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", + "MANAGE_PUBLIC_EXPORT_CONFIGURATION", + "OUTBREAK_EDIT", + "OUTBREAK_VIEW", + "PATHOGEN_TEST_CREATE", + "PATHOGEN_TEST_DELETE", + "PATHOGEN_TEST_EDIT", + "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", + "PERSON_CONTACT_DETAILS_DELETE", + "PERSON_DELETE", + "PERSON_EDIT", + "PERSON_EXPORT", + "PERSON_MERGE", + "PERSON_VIEW", + "PORT_HEALTH_INFO_EDIT", + "PORT_HEALTH_INFO_VIEW", + "PRESCRIPTION_DELETE", + "QUARANTINE_ORDER_CREATE", + "SAMPLE_CREATE", + "SAMPLE_DELETE", + "SAMPLE_EDIT", + "SAMPLE_EXPORT", + "SAMPLE_TRANSFER", + "SAMPLE_VIEW", + "SEE_PERSONAL_DATA_IN_JURISDICTION", + "SEE_SENSITIVE_DATA_IN_JURISDICTION", + "SEND_MANUAL_EXTERNAL_MESSAGES", + "SORMAS_REST", + "SORMAS_UI", + "STATISTICS_ACCESS", + "STATISTICS_EXPORT", + "TASK_ARCHIVE", + "TASK_ASSIGN", + "TASK_CREATE", + "TASK_DELETE", + "TASK_EDIT", + "TASK_EXPORT", + "TASK_VIEW", + "THERAPY_VIEW", + "TRAVEL_ENTRY_CREATE", + "TRAVEL_ENTRY_DELETE", + "TRAVEL_ENTRY_EDIT", + "TRAVEL_ENTRY_MANAGEMENT_ACCESS", + "TRAVEL_ENTRY_VIEW", + "TREATMENT_DELETE", + "VISIT_CREATE", + "VISIT_DELETE", + "VISIT_EDIT", + "VISIT_EXPORT", + "WEEKLYREPORT_VIEW" +] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json index cb6ba1e051b..567cd6e5c7b 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json @@ -1 +1,136 @@ -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_INVESTIGATE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_DELETE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DOCUMENT_DELETE","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_VIEW","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_DELETE","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_DELETE","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_CREATE","WEEKLYREPORT_VIEW"] \ No newline at end of file +[ + "ACTION_CREATE", + "ACTION_DELETE", + "ACTION_EDIT", + "ADDITIONAL_TEST_DELETE", + "ADDITIONAL_TEST_VIEW", + "AGGREGATE_REPORT_EDIT", + "AGGREGATE_REPORT_EXPORT", + "AGGREGATE_REPORT_VIEW", + "CAMPAIGN_ARCHIVE", + "CAMPAIGN_FORM_DATA_ARCHIVE", + "CAMPAIGN_FORM_DATA_EDIT", + "CAMPAIGN_FORM_DATA_EXPORT", + "CAMPAIGN_FORM_DATA_VIEW", + "CAMPAIGN_VIEW", + "CASE_CHANGE_DISEASE", + "CASE_CHANGE_EPID_NUMBER", + "CASE_CLASSIFY", + "CASE_CREATE", + "CASE_DELETE", + "CASE_EDIT", + "CASE_EXPORT", + "CASE_INVESTIGATE", + "CASE_REFER_FROM_POE", + "CASE_SHARE", + "CASE_TRANSFER", + "CASE_VIEW", + "CLINICAL_COURSE_VIEW", + "CLINICAL_VISIT_DELETE", + "CONTACT_CONVERT", + "CONTACT_CREATE", + "CONTACT_DELETE", + "CONTACT_EDIT", + "CONTACT_EXPORT", + "CONTACT_REASSIGN_CASE", + "CONTACT_VIEW", + "DASHBOARD_CAMPAIGNS_VIEW", + "DASHBOARD_CONTACT_VIEW", + "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", + "DASHBOARD_SAMPLES_VIEW", + "DASHBOARD_SURVEILLANCE_VIEW", + "DATABASE_EXPORT_ACCESS", + "DOCUMENT_DELETE", + "DOCUMENT_UPLOAD", + "DOCUMENT_VIEW", + "ENVIRONMENT_ARCHIVE", + "ENVIRONMENT_CREATE", + "ENVIRONMENT_DELETE", + "ENVIRONMENT_EDIT", + "ENVIRONMENT_EXPORT", + "ENVIRONMENT_IMPORT", + "ENVIRONMENT_SAMPLE_CREATE", + "ENVIRONMENT_SAMPLE_DELETE", + "ENVIRONMENT_SAMPLE_EDIT", + "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", + "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", + "ENVIRONMENT_SAMPLE_EXPORT", + "ENVIRONMENT_SAMPLE_IMPORT", + "ENVIRONMENT_SAMPLE_VIEW", + "ENVIRONMENT_VIEW", + "EVENTGROUP_CREATE", + "EVENTGROUP_DELETE", + "EVENTGROUP_EDIT", + "EVENTGROUP_LINK", + "EVENTPARTICIPANT_CREATE", + "EVENTPARTICIPANT_DELETE", + "EVENTPARTICIPANT_EDIT", + "EVENTPARTICIPANT_IMPORT", + "EVENTPARTICIPANT_VIEW", + "EVENT_CREATE", + "EVENT_DELETE", + "EVENT_EDIT", + "EVENT_EXPORT", + "EVENT_VIEW", + "EXTERNAL_MESSAGE_DELETE", + "EXTERNAL_MESSAGE_PROCESS", + "EXTERNAL_MESSAGE_VIEW", + "IMMUNIZATION_CREATE", + "IMMUNIZATION_DELETE", + "IMMUNIZATION_EDIT", + "IMMUNIZATION_VIEW", + "INFRASTRUCTURE_ARCHIVE", + "INFRASTRUCTURE_EXPORT", + "INFRASTRUCTURE_VIEW", + "LINE_LISTING_CONFIGURE", + "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", + "MANAGE_PUBLIC_EXPORT_CONFIGURATION", + "OUTBREAK_EDIT", + "OUTBREAK_VIEW", + "PATHOGEN_TEST_CREATE", + "PATHOGEN_TEST_DELETE", + "PATHOGEN_TEST_EDIT", + "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", + "PERSON_CONTACT_DETAILS_DELETE", + "PERSON_DELETE", + "PERSON_EDIT", + "PERSON_EXPORT", + "PERSON_MERGE", + "PERSON_VIEW", + "PORT_HEALTH_INFO_EDIT", + "PORT_HEALTH_INFO_VIEW", + "PRESCRIPTION_DELETE", + "QUARANTINE_ORDER_CREATE", + "SAMPLE_CREATE", + "SAMPLE_DELETE", + "SAMPLE_EDIT", + "SAMPLE_EXPORT", + "SAMPLE_TRANSFER", + "SAMPLE_VIEW", + "SEE_PERSONAL_DATA_IN_JURISDICTION", + "SEE_SENSITIVE_DATA_IN_JURISDICTION", + "SEND_MANUAL_EXTERNAL_MESSAGES", + "SORMAS_REST", + "SORMAS_UI", + "STATISTICS_ACCESS", + "STATISTICS_EXPORT", + "TASK_ARCHIVE", + "TASK_ASSIGN", + "TASK_CREATE", + "TASK_DELETE", + "TASK_EDIT", + "TASK_EXPORT", + "TASK_VIEW", + "THERAPY_VIEW", + "TRAVEL_ENTRY_CREATE", + "TRAVEL_ENTRY_DELETE", + "TRAVEL_ENTRY_EDIT", + "TRAVEL_ENTRY_MANAGEMENT_ACCESS", + "TRAVEL_ENTRY_VIEW", + "TREATMENT_DELETE", + "VISIT_CREATE", + "VISIT_DELETE", + "VISIT_EDIT", + "VISIT_EXPORT", + "WEEKLYREPORT_VIEW" +] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json index 2b77d5f90fe..bb48cf4606d 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json @@ -1 +1,184 @@ -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_TO_SORMAS_CLIENT","SORMAS_TO_SORMAS_PROCESS","SORMAS_TO_SORMAS_SHARE","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file +[ + "ACTION_CREATE", + "ACTION_DELETE", + "ACTION_EDIT", + "ADDITIONAL_TEST_CREATE", + "ADDITIONAL_TEST_DELETE", + "ADDITIONAL_TEST_EDIT", + "ADDITIONAL_TEST_VIEW", + "AGGREGATE_REPORT_EDIT", + "AGGREGATE_REPORT_EXPORT", + "AGGREGATE_REPORT_VIEW", + "CAMPAIGN_ARCHIVE", + "CAMPAIGN_DELETE", + "CAMPAIGN_EDIT", + "CAMPAIGN_FORM_DATA_ARCHIVE", + "CAMPAIGN_FORM_DATA_DELETE", + "CAMPAIGN_FORM_DATA_EDIT", + "CAMPAIGN_FORM_DATA_EXPORT", + "CAMPAIGN_FORM_DATA_VIEW", + "CAMPAIGN_VIEW", + "CASE_ARCHIVE", + "CASE_CHANGE_DISEASE", + "CASE_CHANGE_EPID_NUMBER", + "CASE_CLASSIFY", + "CASE_CLINICIAN_VIEW", + "CASE_CREATE", + "CASE_DELETE", + "CASE_EDIT", + "CASE_EXPORT", + "CASE_IMPORT", + "CASE_INVESTIGATE", + "CASE_MERGE", + "CASE_REFER_FROM_POE", + "CASE_SHARE", + "CASE_TRANSFER", + "CASE_VIEW", + "CLINICAL_COURSE_EDIT", + "CLINICAL_COURSE_VIEW", + "CLINICAL_VISIT_CREATE", + "CLINICAL_VISIT_DELETE", + "CLINICAL_VISIT_EDIT", + "CONTACT_ARCHIVE", + "CONTACT_CONVERT", + "CONTACT_CREATE", + "CONTACT_DELETE", + "CONTACT_EDIT", + "CONTACT_EXPORT", + "CONTACT_IMPORT", + "CONTACT_MERGE", + "CONTACT_REASSIGN_CASE", + "CONTACT_VIEW", + "DASHBOARD_CAMPAIGNS_VIEW", + "DASHBOARD_CONTACT_VIEW", + "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", + "DASHBOARD_SAMPLES_VIEW", + "DASHBOARD_SURVEILLANCE_VIEW", + "DATABASE_EXPORT_ACCESS", + "DEV_MODE", + "DOCUMENT_DELETE", + "DOCUMENT_TEMPLATE_MANAGEMENT", + "DOCUMENT_UPLOAD", + "DOCUMENT_VIEW", + "ENVIRONMENT_ARCHIVE", + "ENVIRONMENT_CREATE", + "ENVIRONMENT_DELETE", + "ENVIRONMENT_EDIT", + "ENVIRONMENT_EXPORT", + "ENVIRONMENT_IMPORT", + "ENVIRONMENT_SAMPLE_CREATE", + "ENVIRONMENT_SAMPLE_DELETE", + "ENVIRONMENT_SAMPLE_EDIT", + "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", + "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", + "ENVIRONMENT_SAMPLE_EXPORT", + "ENVIRONMENT_SAMPLE_IMPORT", + "ENVIRONMENT_SAMPLE_VIEW", + "ENVIRONMENT_VIEW", + "EVENTGROUP_ARCHIVE", + "EVENTGROUP_CREATE", + "EVENTGROUP_DELETE", + "EVENTGROUP_EDIT", + "EVENTGROUP_LINK", + "EVENTPARTICIPANT_ARCHIVE", + "EVENTPARTICIPANT_CREATE", + "EVENTPARTICIPANT_DELETE", + "EVENTPARTICIPANT_EDIT", + "EVENTPARTICIPANT_IMPORT", + "EVENTPARTICIPANT_VIEW", + "EVENT_ARCHIVE", + "EVENT_CREATE", + "EVENT_DELETE", + "EVENT_EDIT", + "EVENT_EXPORT", + "EVENT_IMPORT", + "EVENT_VIEW", + "EXPORT_DATA_PROTECTION_DATA", + "EXTERNAL_MESSAGE_DELETE", + "EXTERNAL_MESSAGE_PROCESS", + "EXTERNAL_MESSAGE_VIEW", + "EXTERNAL_SURVEILLANCE_DELETE", + "EXTERNAL_SURVEILLANCE_SHARE", + "IMMUNIZATION_ARCHIVE", + "IMMUNIZATION_CREATE", + "IMMUNIZATION_DELETE", + "IMMUNIZATION_EDIT", + "IMMUNIZATION_VIEW", + "INFRASTRUCTURE_ARCHIVE", + "INFRASTRUCTURE_CREATE", + "INFRASTRUCTURE_EDIT", + "INFRASTRUCTURE_EXPORT", + "INFRASTRUCTURE_IMPORT", + "INFRASTRUCTURE_VIEW", + "LINE_LISTING_CONFIGURE", + "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", + "MANAGE_PUBLIC_EXPORT_CONFIGURATION", + "OUTBREAK_EDIT", + "OUTBREAK_VIEW", + "PATHOGEN_TEST_CREATE", + "PATHOGEN_TEST_DELETE", + "PATHOGEN_TEST_EDIT", + "PERFORM_BULK_OPERATIONS", + "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", + "PERFORM_BULK_OPERATIONS_EVENT", + "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", + "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", + "PERFORM_BULK_OPERATIONS_PSEUDONYM", + "PERSON_CONTACT_DETAILS_DELETE", + "PERSON_DELETE", + "PERSON_EDIT", + "PERSON_EXPORT", + "PERSON_MERGE", + "PERSON_VIEW", + "POPULATION_MANAGE", + "PORT_HEALTH_INFO_EDIT", + "PORT_HEALTH_INFO_VIEW", + "PRESCRIPTION_CREATE", + "PRESCRIPTION_DELETE", + "PRESCRIPTION_EDIT", + "QUARANTINE_ORDER_CREATE", + "SAMPLE_CREATE", + "SAMPLE_DELETE", + "SAMPLE_EDIT", + "SAMPLE_EDIT_NOT_OWNED", + "SAMPLE_EXPORT", + "SAMPLE_TRANSFER", + "SAMPLE_VIEW", + "SEE_PERSONAL_DATA_IN_JURISDICTION", + "SEE_SENSITIVE_DATA_IN_JURISDICTION", + "SEND_MANUAL_EXTERNAL_MESSAGES", + "SORMAS_REST", + "SORMAS_TO_SORMAS_PROCESS", + "SORMAS_TO_SORMAS_SHARE", + "SORMAS_UI", + "STATISTICS_ACCESS", + "STATISTICS_EXPORT", + "TASK_ARCHIVE", + "TASK_ASSIGN", + "TASK_CREATE", + "TASK_DELETE", + "TASK_EDIT", + "TASK_EXPORT", + "TASK_VIEW", + "THERAPY_VIEW", + "TRAVEL_ENTRY_ARCHIVE", + "TRAVEL_ENTRY_CREATE", + "TRAVEL_ENTRY_DELETE", + "TRAVEL_ENTRY_EDIT", + "TRAVEL_ENTRY_MANAGEMENT_ACCESS", + "TRAVEL_ENTRY_VIEW", + "TREATMENT_CREATE", + "TREATMENT_DELETE", + "TREATMENT_EDIT", + "USER_CREATE", + "USER_EDIT", + "USER_ROLE_DELETE", + "USER_ROLE_EDIT", + "USER_ROLE_VIEW", + "USER_VIEW", + "VISIT_CREATE", + "VISIT_DELETE", + "VISIT_EDIT", + "VISIT_EXPORT", + "WEEKLYREPORT_VIEW" +] \ No newline at end of file diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json index 913ac1de6b0..bb48cf4606d 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SurvnetUserRights.json @@ -1 +1,184 @@ -["ACTION_CREATE","ACTION_DELETE","ACTION_EDIT","ADDITIONAL_TEST_CREATE","ADDITIONAL_TEST_DELETE","ADDITIONAL_TEST_EDIT","ADDITIONAL_TEST_VIEW","AGGREGATE_REPORT_EDIT","AGGREGATE_REPORT_EXPORT","AGGREGATE_REPORT_VIEW","CAMPAIGN_ARCHIVE","CAMPAIGN_DELETE","CAMPAIGN_EDIT","CAMPAIGN_FORM_DATA_ARCHIVE","CAMPAIGN_FORM_DATA_DELETE","CAMPAIGN_FORM_DATA_EDIT","CAMPAIGN_FORM_DATA_EXPORT","CAMPAIGN_FORM_DATA_VIEW","CAMPAIGN_VIEW","CASE_ARCHIVE","CASE_CHANGE_DISEASE","CASE_CHANGE_EPID_NUMBER","CASE_CLASSIFY","CASE_CLINICIAN_VIEW","CASE_CREATE","CASE_DELETE","CASE_EDIT","CASE_EXPORT","CASE_IMPORT","CASE_INVESTIGATE","CASE_MERGE","CASE_REFER_FROM_POE","CASE_SHARE","CASE_TRANSFER","CASE_VIEW","CLINICAL_COURSE_EDIT","CLINICAL_COURSE_VIEW","CLINICAL_VISIT_CREATE","CLINICAL_VISIT_DELETE","CLINICAL_VISIT_EDIT","CONTACT_ARCHIVE","CONTACT_CONVERT","CONTACT_CREATE","CONTACT_DELETE","CONTACT_EDIT","CONTACT_EXPORT","CONTACT_IMPORT","CONTACT_MERGE","CONTACT_REASSIGN_CASE","CONTACT_VIEW","DASHBOARD_CAMPAIGNS_VIEW","DASHBOARD_CONTACT_VIEW","DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS","DASHBOARD_SAMPLES_VIEW","DASHBOARD_SURVEILLANCE_VIEW","DATABASE_EXPORT_ACCESS","DEV_MODE","DOCUMENT_DELETE","DOCUMENT_TEMPLATE_MANAGEMENT","DOCUMENT_UPLOAD","DOCUMENT_VIEW","ENVIRONMENT_SAMPLE_CREATE","ENVIRONMENT_SAMPLE_DELETE","ENVIRONMENT_SAMPLE_EDIT","ENVIRONMENT_SAMPLE_EDIT_DISPATCH","ENVIRONMENT_SAMPLE_EDIT_RECEIVAL","ENVIRONMENT_SAMPLE_EXPORT","ENVIRONMENT_SAMPLE_IMPORT","ENVIRONMENT_SAMPLE_VIEW","EVENTGROUP_ARCHIVE","EVENTGROUP_CREATE","EVENTGROUP_DELETE","EVENTGROUP_EDIT","EVENTGROUP_LINK","EVENTPARTICIPANT_ARCHIVE","EVENTPARTICIPANT_CREATE","EVENTPARTICIPANT_DELETE","EVENTPARTICIPANT_EDIT","EVENTPARTICIPANT_IMPORT","EVENTPARTICIPANT_VIEW","EVENT_ARCHIVE","EVENT_CREATE","EVENT_DELETE","EVENT_EDIT","EVENT_EXPORT","EVENT_IMPORT","EVENT_VIEW","EXPORT_DATA_PROTECTION_DATA","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_SHARE","IMMUNIZATION_ARCHIVE","IMMUNIZATION_CREATE","IMMUNIZATION_DELETE","IMMUNIZATION_EDIT","IMMUNIZATION_VIEW","INFRASTRUCTURE_ARCHIVE","INFRASTRUCTURE_CREATE","INFRASTRUCTURE_EDIT","INFRASTRUCTURE_EXPORT","INFRASTRUCTURE_IMPORT","INFRASTRUCTURE_VIEW","LINE_LISTING_CONFIGURE","MANAGE_EXTERNAL_SYMPTOM_JOURNAL","MANAGE_PUBLIC_EXPORT_CONFIGURATION","OUTBREAK_EDIT","OUTBREAK_VIEW","PATHOGEN_TEST_CREATE","PATHOGEN_TEST_DELETE","PATHOGEN_TEST_EDIT","PERFORM_BULK_OPERATIONS","PERFORM_BULK_OPERATIONS_CASE_SAMPLES","PERFORM_BULK_OPERATIONS_EVENT","PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT","PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES","PERFORM_BULK_OPERATIONS_PSEUDONYM","PERSON_CONTACT_DETAILS_DELETE","PERSON_DELETE","PERSON_EDIT","PERSON_EXPORT","PERSON_MERGE","PERSON_VIEW","POPULATION_MANAGE","PORT_HEALTH_INFO_EDIT","PORT_HEALTH_INFO_VIEW","PRESCRIPTION_CREATE","PRESCRIPTION_DELETE","PRESCRIPTION_EDIT","QUARANTINE_ORDER_CREATE","SAMPLE_CREATE","SAMPLE_DELETE","SAMPLE_EDIT","SAMPLE_EDIT_NOT_OWNED","SAMPLE_EXPORT","SAMPLE_TRANSFER","SAMPLE_VIEW","SEE_PERSONAL_DATA_IN_JURISDICTION","SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION","SEE_SENSITIVE_DATA_IN_JURISDICTION","SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION","SEND_MANUAL_EXTERNAL_MESSAGES","SORMAS_REST","SORMAS_TO_SORMAS_CLIENT","SORMAS_TO_SORMAS_PROCESS","SORMAS_TO_SORMAS_SHARE","SORMAS_UI","STATISTICS_ACCESS","STATISTICS_EXPORT","TASK_ARCHIVE","TASK_ASSIGN","TASK_CREATE","TASK_DELETE","TASK_EDIT","TASK_EXPORT","TASK_VIEW","THERAPY_VIEW","TRAVEL_ENTRY_ARCHIVE","TRAVEL_ENTRY_CREATE","TRAVEL_ENTRY_DELETE","TRAVEL_ENTRY_EDIT","TRAVEL_ENTRY_MANAGEMENT_ACCESS","TRAVEL_ENTRY_VIEW","TREATMENT_CREATE","TREATMENT_DELETE","TREATMENT_EDIT","USER_CREATE","USER_EDIT","USER_ROLE_DELETE","USER_ROLE_EDIT","USER_ROLE_VIEW","USER_VIEW","VISIT_CREATE","VISIT_DELETE","VISIT_EDIT","VISIT_EXPORT","WEEKLYREPORT_VIEW"] \ No newline at end of file +[ + "ACTION_CREATE", + "ACTION_DELETE", + "ACTION_EDIT", + "ADDITIONAL_TEST_CREATE", + "ADDITIONAL_TEST_DELETE", + "ADDITIONAL_TEST_EDIT", + "ADDITIONAL_TEST_VIEW", + "AGGREGATE_REPORT_EDIT", + "AGGREGATE_REPORT_EXPORT", + "AGGREGATE_REPORT_VIEW", + "CAMPAIGN_ARCHIVE", + "CAMPAIGN_DELETE", + "CAMPAIGN_EDIT", + "CAMPAIGN_FORM_DATA_ARCHIVE", + "CAMPAIGN_FORM_DATA_DELETE", + "CAMPAIGN_FORM_DATA_EDIT", + "CAMPAIGN_FORM_DATA_EXPORT", + "CAMPAIGN_FORM_DATA_VIEW", + "CAMPAIGN_VIEW", + "CASE_ARCHIVE", + "CASE_CHANGE_DISEASE", + "CASE_CHANGE_EPID_NUMBER", + "CASE_CLASSIFY", + "CASE_CLINICIAN_VIEW", + "CASE_CREATE", + "CASE_DELETE", + "CASE_EDIT", + "CASE_EXPORT", + "CASE_IMPORT", + "CASE_INVESTIGATE", + "CASE_MERGE", + "CASE_REFER_FROM_POE", + "CASE_SHARE", + "CASE_TRANSFER", + "CASE_VIEW", + "CLINICAL_COURSE_EDIT", + "CLINICAL_COURSE_VIEW", + "CLINICAL_VISIT_CREATE", + "CLINICAL_VISIT_DELETE", + "CLINICAL_VISIT_EDIT", + "CONTACT_ARCHIVE", + "CONTACT_CONVERT", + "CONTACT_CREATE", + "CONTACT_DELETE", + "CONTACT_EDIT", + "CONTACT_EXPORT", + "CONTACT_IMPORT", + "CONTACT_MERGE", + "CONTACT_REASSIGN_CASE", + "CONTACT_VIEW", + "DASHBOARD_CAMPAIGNS_VIEW", + "DASHBOARD_CONTACT_VIEW", + "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", + "DASHBOARD_SAMPLES_VIEW", + "DASHBOARD_SURVEILLANCE_VIEW", + "DATABASE_EXPORT_ACCESS", + "DEV_MODE", + "DOCUMENT_DELETE", + "DOCUMENT_TEMPLATE_MANAGEMENT", + "DOCUMENT_UPLOAD", + "DOCUMENT_VIEW", + "ENVIRONMENT_ARCHIVE", + "ENVIRONMENT_CREATE", + "ENVIRONMENT_DELETE", + "ENVIRONMENT_EDIT", + "ENVIRONMENT_EXPORT", + "ENVIRONMENT_IMPORT", + "ENVIRONMENT_SAMPLE_CREATE", + "ENVIRONMENT_SAMPLE_DELETE", + "ENVIRONMENT_SAMPLE_EDIT", + "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", + "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", + "ENVIRONMENT_SAMPLE_EXPORT", + "ENVIRONMENT_SAMPLE_IMPORT", + "ENVIRONMENT_SAMPLE_VIEW", + "ENVIRONMENT_VIEW", + "EVENTGROUP_ARCHIVE", + "EVENTGROUP_CREATE", + "EVENTGROUP_DELETE", + "EVENTGROUP_EDIT", + "EVENTGROUP_LINK", + "EVENTPARTICIPANT_ARCHIVE", + "EVENTPARTICIPANT_CREATE", + "EVENTPARTICIPANT_DELETE", + "EVENTPARTICIPANT_EDIT", + "EVENTPARTICIPANT_IMPORT", + "EVENTPARTICIPANT_VIEW", + "EVENT_ARCHIVE", + "EVENT_CREATE", + "EVENT_DELETE", + "EVENT_EDIT", + "EVENT_EXPORT", + "EVENT_IMPORT", + "EVENT_VIEW", + "EXPORT_DATA_PROTECTION_DATA", + "EXTERNAL_MESSAGE_DELETE", + "EXTERNAL_MESSAGE_PROCESS", + "EXTERNAL_MESSAGE_VIEW", + "EXTERNAL_SURVEILLANCE_DELETE", + "EXTERNAL_SURVEILLANCE_SHARE", + "IMMUNIZATION_ARCHIVE", + "IMMUNIZATION_CREATE", + "IMMUNIZATION_DELETE", + "IMMUNIZATION_EDIT", + "IMMUNIZATION_VIEW", + "INFRASTRUCTURE_ARCHIVE", + "INFRASTRUCTURE_CREATE", + "INFRASTRUCTURE_EDIT", + "INFRASTRUCTURE_EXPORT", + "INFRASTRUCTURE_IMPORT", + "INFRASTRUCTURE_VIEW", + "LINE_LISTING_CONFIGURE", + "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", + "MANAGE_PUBLIC_EXPORT_CONFIGURATION", + "OUTBREAK_EDIT", + "OUTBREAK_VIEW", + "PATHOGEN_TEST_CREATE", + "PATHOGEN_TEST_DELETE", + "PATHOGEN_TEST_EDIT", + "PERFORM_BULK_OPERATIONS", + "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", + "PERFORM_BULK_OPERATIONS_EVENT", + "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", + "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", + "PERFORM_BULK_OPERATIONS_PSEUDONYM", + "PERSON_CONTACT_DETAILS_DELETE", + "PERSON_DELETE", + "PERSON_EDIT", + "PERSON_EXPORT", + "PERSON_MERGE", + "PERSON_VIEW", + "POPULATION_MANAGE", + "PORT_HEALTH_INFO_EDIT", + "PORT_HEALTH_INFO_VIEW", + "PRESCRIPTION_CREATE", + "PRESCRIPTION_DELETE", + "PRESCRIPTION_EDIT", + "QUARANTINE_ORDER_CREATE", + "SAMPLE_CREATE", + "SAMPLE_DELETE", + "SAMPLE_EDIT", + "SAMPLE_EDIT_NOT_OWNED", + "SAMPLE_EXPORT", + "SAMPLE_TRANSFER", + "SAMPLE_VIEW", + "SEE_PERSONAL_DATA_IN_JURISDICTION", + "SEE_SENSITIVE_DATA_IN_JURISDICTION", + "SEND_MANUAL_EXTERNAL_MESSAGES", + "SORMAS_REST", + "SORMAS_TO_SORMAS_PROCESS", + "SORMAS_TO_SORMAS_SHARE", + "SORMAS_UI", + "STATISTICS_ACCESS", + "STATISTICS_EXPORT", + "TASK_ARCHIVE", + "TASK_ASSIGN", + "TASK_CREATE", + "TASK_DELETE", + "TASK_EDIT", + "TASK_EXPORT", + "TASK_VIEW", + "THERAPY_VIEW", + "TRAVEL_ENTRY_ARCHIVE", + "TRAVEL_ENTRY_CREATE", + "TRAVEL_ENTRY_DELETE", + "TRAVEL_ENTRY_EDIT", + "TRAVEL_ENTRY_MANAGEMENT_ACCESS", + "TRAVEL_ENTRY_VIEW", + "TREATMENT_CREATE", + "TREATMENT_DELETE", + "TREATMENT_EDIT", + "USER_CREATE", + "USER_EDIT", + "USER_ROLE_DELETE", + "USER_ROLE_EDIT", + "USER_ROLE_VIEW", + "USER_VIEW", + "VISIT_CREATE", + "VISIT_DELETE", + "VISIT_EDIT", + "VISIT_EXPORT", + "WEEKLYREPORT_VIEW" +] \ No newline at end of file diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 54a7b140d02..51a4f6532fb 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -312,16 +312,17 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { And( "I check that Patientrole is change in SORMAS generated single XML file is {string}", (String expectedValue) -> { - String xmlValue = singleXmlFile - .getRootElement() - .getChildren() - .get(0) - .getChildren() - .get(1) - .getChildren() - .get(0) - .getAttribute("Value") - .getValue(); + String xmlValue = + singleXmlFile + .getRootElement() + .getChildren() + .get(0) + .getChildren() + .get(1) + .getChildren() + .get(0) + .getAttribute("Value") + .getValue(); softly.assertEquals(xmlValue, expectedValue, "Patientrole value is wrong"); softly.assertAll(); }); From 02dd49aa03723500d3f8f795701cba7ee235c4c4 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 18 Sep 2023 10:58:32 +0200 Subject: [PATCH 110/144] HSP-6247 Stabilize "Check Current condition of person of case when sending from SORMAS to Meldesoftware [2]" -removed unnecessary/failing step from scenario --- .../src/test/resources/features/sanity/web/Survnet.feature | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index c568136a299..22907e73452 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -488,5 +488,4 @@ Feature: Survnet tests And I open SORMAS generated XML file for single case message Then I check if the present condition status "Verstorben" is correctly mapped in SORMAS generated single XML file And I check if "date of death" in SORMAS generated XML file is correct - And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct - And I check that Patientrole is change in SORMAS generated single XML file is "-1" \ No newline at end of file + And I check if Cause of Death status is correctly setting in SORMAS generated XML file is correct \ No newline at end of file From 290a051b5b0286b736da6329e34b5bb97c64f2af Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Mon, 18 Sep 2023 13:47:14 +0300 Subject: [PATCH 111/144] #12355 - Environment entities that are obsolete (archived/soft deleted) are not removed from the mobile app --- .../api/environment/EnvironmentFacade.java | 3 ++ .../environment/EnvironmentFacadeEjb.java | 13 +++++++++ .../environment/EnvironmentService.java | 29 +++++++++++++++++++ .../rest/resources/EnvironmentResource.java | 2 +- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentFacade.java index 112b71aadb0..b5e297b4e6e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/EnvironmentFacade.java @@ -4,7 +4,10 @@ import de.symeda.sormas.api.CoreFacade; +import java.util.List; + @Remote public interface EnvironmentFacade extends CoreFacade { + List getAllActiveUuids(); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java index 64133f236ce..cbdfa9c0fed 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java @@ -4,6 +4,7 @@ import static java.util.Objects.isNull; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -52,6 +53,7 @@ import de.symeda.sormas.backend.infrastructure.region.Region; import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.location.LocationFacadeEjb; +import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.IterableHelper; @@ -406,6 +408,17 @@ public List restore(List uuids) { throw new NotImplementedException(); } + @Override + public List getAllActiveUuids() { + User user = userService.getCurrentUser(); + + if (user == null) { + return Collections.emptyList(); + } + + return service.getAllActiveUuids(user); + } + @LocalBean @Stateless public static class EnvironmentFacadeEjbLocal extends EnvironmentFacadeEjb { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java index 5afc74fa76b..3f3a4aa3549 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java @@ -1,6 +1,7 @@ package de.symeda.sormas.backend.environment; import java.sql.Timestamp; +import java.util.List; import javax.ejb.EJB; import javax.ejb.LocalBean; @@ -10,6 +11,7 @@ import javax.persistence.criteria.From; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.apache.commons.lang3.StringUtils; @@ -278,4 +280,31 @@ public EditPermissionType getEditPermissionType(Environment environment) { return super.getEditPermissionType(environment); } + + public List getAllActiveUuids(User user) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(String.class); + Root from = cq.from(getElementClass()); + EnvironmentQueryContext environmentQueryContext = new EnvironmentQueryContext(cb, cq, from); + + Predicate filter = createActiveEnvironmentFilter(cb, from); + + if (user != null) { + Predicate userFilter = createUserFilter(environmentQueryContext); + filter = CriteriaBuilderHelper.and(cb, filter, userFilter); + } + + if (RequestContextHolder.isMobileSync()) { + Predicate predicate = createLimitedChangeDateFilter(cb, from); + if (predicate != null) { + filter = CriteriaBuilderHelper.and(cb, filter, predicate); + } + } + + cq.where(filter); + cq.select(from.get(Environment.UUID)); + + return em.createQuery(cq).getResultList(); + } } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EnvironmentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EnvironmentResource.java index 142a43c80ab..93d6e0225d5 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EnvironmentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EnvironmentResource.java @@ -46,7 +46,7 @@ public List getByUuids(List uuids) { @GET @Path("/uuids") public List getAllUuids() { - return FacadeProvider.getEnvironmentFacade().getAllUuids(); + return FacadeProvider.getEnvironmentFacade().getAllActiveUuids(); } @GET From dab979d6e2df4c4b9b1a7182239d9ec4c5570254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 20 Sep 2023 09:09:26 +0200 Subject: [PATCH 112/144] New Crowdin updates (#12516) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (French, Congo) * New translations strings.properties (French, Tunisia) * New translations validations.properties (Romanian) * New translations validations.properties (French) * New translations validations.properties (Spanish) * New translations validations.properties (Arabic) * New translations validations.properties (Czech) * New translations validations.properties (German) * New translations validations.properties (Finnish) * New translations validations.properties (Italian) * New translations validations.properties (Japanese) * New translations validations.properties (Dutch) * New translations validations.properties (Norwegian) * New translations validations.properties (Polish) * New translations validations.properties (Portuguese) * New translations validations.properties (Russian) * New translations validations.properties (Swedish) * New translations validations.properties (Turkish) * New translations validations.properties (Ukrainian) * New translations validations.properties (Chinese Simplified) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Croatian) * New translations validations.properties (Hindi) * New translations validations.properties (Filipino) * New translations validations.properties (Fijian) * New translations validations.properties (Swahili) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Nepali) * New translations validations.properties (French, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations validations.properties (Dari) * New translations validations.properties (Pashto) * New translations validations.properties (Spanish, Cuba) * New translations validations.properties (English, Afghanistan) * New translations validations.properties (English, Nigeria) * New translations validations.properties (English, Ghana) * New translations validations.properties (French, Congo) * New translations validations.properties (French, Tunisia) * New translations strings.properties (Czech) * New translations validations.properties (Czech) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (French, Congo) * New translations strings.properties (French, Tunisia) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations captions.properties (German) * New translations strings.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations enum.properties (Romanian) * New translations enum.properties (French) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (French, Congo) * New translations enum.properties (French, Tunisia) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations enum.properties (Czech) * New translations enum.properties (Spanish, Cuba) * New translations strings.properties (French) * New translations validations.properties (Romanian) * New translations validations.properties (French) * New translations validations.properties (Spanish) * New translations validations.properties (Arabic) * New translations validations.properties (Czech) * New translations validations.properties (German) * New translations validations.properties (Finnish) * New translations validations.properties (Italian) * New translations validations.properties (Japanese) * New translations validations.properties (Dutch) * New translations validations.properties (Norwegian) * New translations validations.properties (Polish) * New translations validations.properties (Portuguese) * New translations validations.properties (Russian) * New translations validations.properties (Swedish) * New translations validations.properties (Turkish) * New translations validations.properties (Ukrainian) * New translations validations.properties (Chinese Simplified) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Croatian) * New translations validations.properties (Hindi) * New translations validations.properties (Filipino) * New translations validations.properties (Fijian) * New translations validations.properties (Swahili) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Nepali) * New translations validations.properties (French, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations validations.properties (Dari) * New translations validations.properties (Pashto) * New translations validations.properties (Spanish, Cuba) * New translations validations.properties (English, Afghanistan) * New translations validations.properties (English, Nigeria) * New translations validations.properties (English, Ghana) * New translations validations.properties (French, Congo) * New translations validations.properties (French, Tunisia) * New translations strings.xml (Romanian) * New translations strings.xml (French) * New translations strings.xml (Spanish) * New translations strings.xml (Arabic) * New translations strings.xml (Czech) * New translations strings.xml (German) * New translations strings.xml (Finnish) * New translations strings.xml (Italian) * New translations strings.xml (Japanese) * New translations strings.xml (Dutch) * New translations strings.xml (Norwegian) * New translations strings.xml (Polish) * New translations strings.xml (Portuguese) * New translations strings.xml (Russian) * New translations strings.xml (Swedish) * New translations strings.xml (Turkish) * New translations strings.xml (Ukrainian) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Urdu (Pakistan)) * New translations strings.xml (Croatian) * New translations strings.xml (Hindi) * New translations strings.xml (Filipino) * New translations strings.xml (Fijian) * New translations strings.xml (Swahili) * New translations strings.xml (German, Switzerland) * New translations strings.xml (Nepali) * New translations strings.xml (French, Switzerland) * New translations strings.xml (Italian, Switzerland) * New translations strings.xml (Dari) * New translations strings.xml (Pashto) * New translations strings.xml (Spanish, Cuba) * New translations strings.xml (English, Afghanistan) * New translations strings.xml (English, Nigeria) * New translations strings.xml (English, Ghana) * New translations strings.xml (French, Congo) * New translations strings.xml (French, Tunisia) * New translations captions.properties (Czech) * New translations strings.properties (Czech) * New translations validations.properties (Czech) * New translations strings.xml (Czech) * New translations captions.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations strings.xml (Spanish, Cuba) --- .../main/resources/captions_ar-SA.properties | 15 +- .../main/resources/captions_cs-CZ.properties | 45 ++-- .../main/resources/captions_de-CH.properties | 15 +- .../main/resources/captions_de-DE.properties | 87 ++++---- .../main/resources/captions_en-AF.properties | 15 +- .../main/resources/captions_en-GH.properties | 15 +- .../main/resources/captions_en-NG.properties | 15 +- .../main/resources/captions_es-CU.properties | 15 +- .../main/resources/captions_es-ES.properties | 15 +- .../main/resources/captions_fa-AF.properties | 15 +- .../main/resources/captions_fi-FI.properties | 15 +- .../main/resources/captions_fil-PH.properties | 15 +- .../main/resources/captions_fj-FJ.properties | 15 +- .../main/resources/captions_fr-CD.properties | 15 +- .../main/resources/captions_fr-CH.properties | 15 +- .../main/resources/captions_fr-FR.properties | 15 +- .../main/resources/captions_fr-TN.properties | 15 +- .../main/resources/captions_hi-IN.properties | 15 +- .../main/resources/captions_hr-HR.properties | 15 +- .../main/resources/captions_it-CH.properties | 15 +- .../main/resources/captions_it-IT.properties | 15 +- .../main/resources/captions_ja-JP.properties | 15 +- .../main/resources/captions_ne-NP.properties | 15 +- .../main/resources/captions_nl-NL.properties | 15 +- .../main/resources/captions_no-NO.properties | 15 +- .../main/resources/captions_pl-PL.properties | 15 +- .../main/resources/captions_ps-AF.properties | 15 +- .../main/resources/captions_pt-PT.properties | 15 +- .../main/resources/captions_ro-RO.properties | 15 +- .../main/resources/captions_ru-RU.properties | 15 +- .../main/resources/captions_sv-SE.properties | 15 +- .../main/resources/captions_sw-KE.properties | 15 +- .../main/resources/captions_tr-TR.properties | 15 +- .../main/resources/captions_uk-UA.properties | 15 +- .../main/resources/captions_ur-PK.properties | 15 +- .../main/resources/captions_zh-CN.properties | 15 +- .../src/main/resources/enum_ar-SA.properties | 2 +- .../src/main/resources/enum_cs-CZ.properties | 32 +-- .../src/main/resources/enum_de-CH.properties | 2 +- .../src/main/resources/enum_de-DE.properties | 2 +- .../src/main/resources/enum_en-AF.properties | 2 +- .../src/main/resources/enum_en-GH.properties | 2 +- .../src/main/resources/enum_en-NG.properties | 2 +- .../src/main/resources/enum_es-ES.properties | 2 +- .../src/main/resources/enum_fa-AF.properties | 2 +- .../src/main/resources/enum_fi-FI.properties | 2 +- .../src/main/resources/enum_fil-PH.properties | 2 +- .../src/main/resources/enum_fj-FJ.properties | 2 +- .../src/main/resources/enum_fr-CD.properties | 2 +- .../src/main/resources/enum_fr-CH.properties | 2 +- .../src/main/resources/enum_fr-FR.properties | 2 +- .../src/main/resources/enum_fr-TN.properties | 2 +- .../src/main/resources/enum_hi-IN.properties | 2 +- .../src/main/resources/enum_hr-HR.properties | 2 +- .../src/main/resources/enum_it-CH.properties | 2 +- .../src/main/resources/enum_it-IT.properties | 2 +- .../src/main/resources/enum_ja-JP.properties | 2 +- .../src/main/resources/enum_ne-NP.properties | 2 +- .../src/main/resources/enum_nl-NL.properties | 2 +- .../src/main/resources/enum_no-NO.properties | 2 +- .../src/main/resources/enum_pl-PL.properties | 2 +- .../src/main/resources/enum_ps-AF.properties | 2 +- .../src/main/resources/enum_pt-PT.properties | 2 +- .../src/main/resources/enum_ro-RO.properties | 2 +- .../src/main/resources/enum_ru-RU.properties | 2 +- .../src/main/resources/enum_sv-SE.properties | 2 +- .../src/main/resources/enum_sw-KE.properties | 2 +- .../src/main/resources/enum_tr-TR.properties | 2 +- .../src/main/resources/enum_uk-UA.properties | 2 +- .../src/main/resources/enum_ur-PK.properties | 2 +- .../src/main/resources/enum_zh-CN.properties | 2 +- .../main/resources/strings_ar-SA.properties | 152 ++++++++++---- .../main/resources/strings_cs-CZ.properties | 198 ++++++++++++------ .../main/resources/strings_de-CH.properties | 152 ++++++++++---- .../main/resources/strings_de-DE.properties | 152 ++++++++++---- .../main/resources/strings_en-AF.properties | 152 ++++++++++---- .../main/resources/strings_en-GH.properties | 152 ++++++++++---- .../main/resources/strings_en-NG.properties | 152 ++++++++++---- .../main/resources/strings_es-CU.properties | 152 ++++++++++---- .../main/resources/strings_es-ES.properties | 152 ++++++++++---- .../main/resources/strings_fa-AF.properties | 152 ++++++++++---- .../main/resources/strings_fi-FI.properties | 152 ++++++++++---- .../main/resources/strings_fil-PH.properties | 152 ++++++++++---- .../main/resources/strings_fj-FJ.properties | 152 ++++++++++---- .../main/resources/strings_fr-CD.properties | 152 ++++++++++---- .../main/resources/strings_fr-CH.properties | 152 ++++++++++---- .../main/resources/strings_fr-FR.properties | 152 ++++++++++---- .../main/resources/strings_fr-TN.properties | 152 ++++++++++---- .../main/resources/strings_hi-IN.properties | 152 ++++++++++---- .../main/resources/strings_hr-HR.properties | 152 ++++++++++---- .../main/resources/strings_it-CH.properties | 152 ++++++++++---- .../main/resources/strings_it-IT.properties | 152 ++++++++++---- .../main/resources/strings_ja-JP.properties | 152 ++++++++++---- .../main/resources/strings_ne-NP.properties | 152 ++++++++++---- .../main/resources/strings_nl-NL.properties | 152 ++++++++++---- .../main/resources/strings_no-NO.properties | 152 ++++++++++---- .../main/resources/strings_pl-PL.properties | 152 ++++++++++---- .../main/resources/strings_ps-AF.properties | 152 ++++++++++---- .../main/resources/strings_pt-PT.properties | 152 ++++++++++---- .../main/resources/strings_ro-RO.properties | 152 ++++++++++---- .../main/resources/strings_ru-RU.properties | 152 ++++++++++---- .../main/resources/strings_sv-SE.properties | 152 ++++++++++---- .../main/resources/strings_sw-KE.properties | 152 ++++++++++---- .../main/resources/strings_tr-TR.properties | 152 ++++++++++---- .../main/resources/strings_uk-UA.properties | 152 ++++++++++---- .../main/resources/strings_ur-PK.properties | 152 ++++++++++---- .../main/resources/strings_zh-CN.properties | 152 ++++++++++---- .../resources/validations_ar-SA.properties | 5 + .../resources/validations_cs-CZ.properties | 5 + .../resources/validations_de-CH.properties | 5 + .../resources/validations_de-DE.properties | 5 + .../resources/validations_en-AF.properties | 5 + .../resources/validations_en-GH.properties | 5 + .../resources/validations_en-NG.properties | 5 + .../resources/validations_es-CU.properties | 5 + .../resources/validations_es-ES.properties | 5 + .../resources/validations_fa-AF.properties | 5 + .../resources/validations_fi-FI.properties | 5 + .../resources/validations_fil-PH.properties | 5 + .../resources/validations_fj-FJ.properties | 5 + .../resources/validations_fr-CD.properties | 5 + .../resources/validations_fr-CH.properties | 5 + .../resources/validations_fr-FR.properties | 5 + .../resources/validations_fr-TN.properties | 5 + .../resources/validations_hi-IN.properties | 5 + .../resources/validations_hr-HR.properties | 5 + .../resources/validations_it-CH.properties | 5 + .../resources/validations_it-IT.properties | 5 + .../resources/validations_ja-JP.properties | 5 + .../resources/validations_ne-NP.properties | 5 + .../resources/validations_nl-NL.properties | 5 + .../resources/validations_no-NO.properties | 5 + .../resources/validations_pl-PL.properties | 5 + .../resources/validations_ps-AF.properties | 5 + .../resources/validations_pt-PT.properties | 5 + .../resources/validations_ro-RO.properties | 5 + .../resources/validations_ru-RU.properties | 5 + .../resources/validations_sv-SE.properties | 5 + .../resources/validations_sw-KE.properties | 5 + .../resources/validations_tr-TR.properties | 5 + .../resources/validations_uk-UA.properties | 5 + .../resources/validations_ur-PK.properties | 5 + .../resources/validations_zh-CN.properties | 5 + .../src/main/res/values-ar-rSA/strings.xml | 15 ++ .../src/main/res/values-cs-rCZ/strings.xml | 33 ++- .../src/main/res/values-de-rCH/strings.xml | 15 ++ .../src/main/res/values-de-rDE/strings.xml | 15 ++ .../src/main/res/values-en-rAF/strings.xml | 15 ++ .../src/main/res/values-en-rGH/strings.xml | 15 ++ .../src/main/res/values-en-rNG/strings.xml | 15 ++ .../src/main/res/values-es-rCU/strings.xml | 15 ++ .../src/main/res/values-es-rES/strings.xml | 15 ++ .../src/main/res/values-fa-rAF/strings.xml | 15 ++ .../src/main/res/values-fi-rFI/strings.xml | 15 ++ .../src/main/res/values-fil-rPH/strings.xml | 15 ++ .../src/main/res/values-fj-rFJ/strings.xml | 15 ++ .../src/main/res/values-fr-rCD/strings.xml | 15 ++ .../src/main/res/values-fr-rCH/strings.xml | 15 ++ .../src/main/res/values-fr-rFR/strings.xml | 15 ++ .../src/main/res/values-fr-rTN/strings.xml | 15 ++ .../src/main/res/values-hi-rIN/strings.xml | 15 ++ .../src/main/res/values-hr-rHR/strings.xml | 15 ++ .../src/main/res/values-it-rCH/strings.xml | 15 ++ .../src/main/res/values-it-rIT/strings.xml | 15 ++ .../src/main/res/values-ja-rJP/strings.xml | 15 ++ .../src/main/res/values-ne-rNP/strings.xml | 15 ++ .../src/main/res/values-nl-rNL/strings.xml | 15 ++ .../src/main/res/values-no-rNO/strings.xml | 15 ++ .../src/main/res/values-pl-rPL/strings.xml | 15 ++ .../src/main/res/values-ps-rAF/strings.xml | 15 ++ .../src/main/res/values-pt-rPT/strings.xml | 15 ++ .../src/main/res/values-ro-rRO/strings.xml | 15 ++ .../src/main/res/values-ru-rRU/strings.xml | 15 ++ .../src/main/res/values-sv-rSE/strings.xml | 15 ++ .../src/main/res/values-sw-rKE/strings.xml | 15 ++ .../src/main/res/values-tr-rTR/strings.xml | 15 ++ .../src/main/res/values-uk-rUA/strings.xml | 15 ++ .../src/main/res/values-ur-rPK/strings.xml | 15 ++ .../src/main/res/values-zh-rCN/strings.xml | 15 ++ 179 files changed, 5353 insertions(+), 1645 deletions(-) diff --git a/sormas-api/src/main/resources/captions_ar-SA.properties b/sormas-api/src/main/resources/captions_ar-SA.properties index 49d7c993329..9268bfe2a00 100644 --- a/sormas-api/src/main/resources/captions_ar-SA.properties +++ b/sormas-api/src/main/resources/captions_ar-SA.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index 12e5dff505a..105e1064ac4 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -1107,7 +1107,7 @@ DocumentTemplate.notUploaded=Dokumenty nelze nahrát následujícím entitám\: # Environment Environment=Prostředí -Environment.uuid=Environment ID +Environment.uuid=ID Prostředí Environment.reportDate=Datum zprávy Environment.reportingUser=Oznamující uživatel Environment.environmentName=Název prostředí @@ -1115,7 +1115,7 @@ Environment.description=Popis Environment.externalId=Externí ID Environment.responsibleUser=Odpovědný uživatel Environment.investigationStatus=Stav šetření -Environment.environmentMedia=Environment media +Environment.environmentMedia=medium prostředí Environment.waterType=Typ vody Environment.otherWaterType=Jiný typ vody Environment.infrastructureDetails=Podrobnosti o infrastruktuře @@ -1124,14 +1124,15 @@ Environment.waterUse=Využití vody Environment.otherWaterUse=Jiné využití vody Environment.location=Poloha -environmentActiveEnvironments=Active environments -environmentArchivedEnvironments = Archived environments -environmentAllActiveAndArchivedEnvironments = All active and archived environments -environmentDeletedEnvironments = Deleted environments -environmentNewEnvironment= New environment -environmentEnvironmentsList=Environments list +environmentActiveEnvironments=Aktivní prostředí +environmentArchivedEnvironments = Archivované prostředí +environmentAllActiveAndArchivedEnvironments = Všechna aktivní a archivovaná prostředí +environmentDeletedEnvironments = Smazané prostředí +environmentNewEnvironment= Nové prostředí +environmentEnvironmentsList=Seznam prostředí # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Prostředí EnvironmentSample.sampleDateTime = Datum odběru vzorků EnvironmentSample.sampleMaterial = Materiál vzorku @@ -1140,14 +1141,14 @@ EnvironmentSample.sampleVolume = Objem (v mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidita (v NTU) EnvironmentSample.phValue = pH vzorku -EnvironmentSample.sampleTemperature = Teplota (v �C) +EnvironmentSample.sampleTemperature = Teplota (v °C) EnvironmentSample.chlorineResiduals = Zbytky chloru celkem (mg/L) EnvironmentSample.laboratory = Laboratoř EnvironmentSample.laboratoryDetails = Detaily laboratoře -EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested -EnvironmentSample.otherRequestedPathogenTests = Other requested pathogens to be tested -EnvironmentSample.weatherConditions = Weather conditions at time of sampling -EnvironmentSample.heavyRain = Heavy rain in the past 24 hours before sampling? +EnvironmentSample.requestedPathogenTests = Požadované patogeny k testování +EnvironmentSample.otherRequestedPathogenTests = Jiné požadované patogeny k testováni +EnvironmentSample.weatherConditions = Počasí v době odběru vzorků +EnvironmentSample.heavyRain = Silný déšť v posledních 24 hodinách před odběrem vzorků? EnvironmentSample.dispatched = Odesláno/vydáno EnvironmentSample.dispatchDate = Datum odeslání EnvironmentSample.dispatchDetails = Detaily odeslání @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = ID laboratorního vzorku EnvironmentSample.specimenCondition = Stav vzorku EnvironmentSample.location = Umístění místa odběru vzorků EnvironmentSample.generalComment = Obecný komentář +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Aktivní události @@ -1565,7 +1569,7 @@ ExternalMessage.surveillanceReport=Odkaz na hlášení ExternalMessage.caseReportDate=Case report date ExternalMessage.personExternalId=Externí ID ExternalMessage.personNationalHealthId=National health ID -ExternalMessage.personPhoneNumberType=Phone number type +ExternalMessage.personPhoneNumberType=Typ telefonního čísla ExternalMessage.personCountry=Země externalMessageFetch=Načíst zprávy externalMessageProcess=Zpracování @@ -1659,7 +1663,7 @@ mainMenuExternalMessages=Zprávy mainMenuImmunizations=Imunizace mainMenuReports=Zprávy mainMenuSamples=Vzorky -mainMenuEnvironments=Environments +mainMenuEnvironments=Prostředí mainMenuStatistics=Statistiky mainMenuTasks=Úkoly mainMenuUsers=Uživatelé @@ -1735,7 +1739,7 @@ PathogenTest.ctValueRdrp=Ct target RDRP PathogenTest.ctValueS=Ct target S PathogenTest.ctValueOrf1=Ct target ORF1 PathogenTest.ctValueRdrpS=Ct target RDRP/S -PathogenTest.prescriber=Prescriber +PathogenTest.prescriber=Přepínač PathogenTest.prescriberPhysicianCode=Kód lékaře PathogenTest.prescriberFirstName=Jméno PathogenTest.prescriberLastName=Příjmení @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Telefon osoby TaskExport.personPhoneOwner=Vlastník telefonu TaskExport.personEmailAddress=E-mail osoby TaskExport.personOtherContactDetails = Detaily kontaktu osoby +environmentSampleNotShipped = Neodesláno +environmentSampleShipped = Odesláno +environmentSampleReceived = Přijato +environmentSampleActiveSamples=Aktivní vzorky prostředí +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Vzorek +environmentSampleViewType=Prostředí \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index ea8cf1a89a1..6a59eaba143 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Aktive Ereignisse @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Telefonnummer der Person TaskExport.personPhoneOwner=Telefonbesitzer des Telefons der Person TaskExport.personEmailAddress=E-Mail Adresse der Person TaskExport.personOtherContactDetails = Kontaktdetails der Person +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_de-DE.properties b/sormas-api/src/main/resources/captions_de-DE.properties index 2f9cd831bef..24ae122a7d7 100644 --- a/sormas-api/src/main/resources/captions_de-DE.properties +++ b/sormas-api/src/main/resources/captions_de-DE.properties @@ -281,7 +281,7 @@ bulkContactClassification=Kontaktdefinitionskategorie ändern bulkContactOfficer=Kontaktbeauftragte*n ändern bulkDelete=Löschen bulkDisease=Krankheit ändern -bulkDiseaseVariant=Change Disease variant +bulkDiseaseVariant=Krankheitsvariante ändern bulkEdit=Bearbeiten... bulkEventInvestigationStatus=Status der Ereignisuntersuchung ändern bulkEventManagementStatus=Ereignis-Management-Status ändern @@ -1132,31 +1132,35 @@ environmentNewEnvironment= Neue Umgebungen environmentEnvironmentsList=Liste der Umgebungen # EnvironmentSample -EnvironmentSample.environment = Environment -EnvironmentSample.sampleDateTime = Date of sampling -EnvironmentSample.sampleMaterial = Sample material -EnvironmentSample.otherSampleMaterial = Specify sample material -EnvironmentSample.sampleVolume = Volume (in mL) -EnvironmentSample.fieldSampleId = Field sample ID -EnvironmentSample.turbidity = Turbidity (in NTU) -EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in -EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) -EnvironmentSample.laboratory = Laboratory -EnvironmentSample.laboratoryDetails = Laboratory details +EnvironmentSample.uuid = Proben-ID +EnvironmentSample.environment = Umgebung +EnvironmentSample.sampleDateTime = Datum der Probenentnahme +EnvironmentSample.sampleMaterial = Probenmaterial +EnvironmentSample.otherSampleMaterial = anderes Probenmaterial +EnvironmentSample.sampleVolume = Volumen (in ml) +EnvironmentSample.fieldSampleId = Feld Proben-ID +EnvironmentSample.turbidity = Trübung (in NTU) +EnvironmentSample.phValue = pH Wert der Probe +EnvironmentSample.sampleTemperature = Temperature (in °C) +EnvironmentSample.chlorineResiduals = Gesamte Chlorreste (mg/L) +EnvironmentSample.laboratory = Labor +EnvironmentSample.laboratoryDetails = Labordetails EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested EnvironmentSample.otherRequestedPathogenTests = Other requested pathogens to be tested -EnvironmentSample.weatherConditions = Weather conditions at time of sampling -EnvironmentSample.heavyRain = Heavy rain in the past 24 hours before sampling? +EnvironmentSample.weatherConditions = Wetter zum Zeitpunkt der Probenahme +EnvironmentSample.heavyRain = Schwere Regen in den letzten 24 Stunden vor der Probe? EnvironmentSample.dispatched = Sent/dispatched EnvironmentSample.dispatchDate = Dispatchment date EnvironmentSample.dispatchDetails = Dispatchment details -EnvironmentSample.received = Received -EnvironmentSample.receivalDate = Receival date +EnvironmentSample.received = Erhalten +EnvironmentSample.receivalDate = Empfangsdatum EnvironmentSample.labSampleId = Lab sample ID -EnvironmentSample.specimenCondition = Specimen condition +EnvironmentSample.specimenCondition = Probenzustand EnvironmentSample.location = Location of sampling site -EnvironmentSample.generalComment = General comment +EnvironmentSample.generalComment = Allgemeiner Kommentar +EnvironmentSample.positivePathogenTests = Positive Erregertests +EnvironmentSample.latestPathogenTest = Neuester Erregertest +EnvironmentSample.numberOfTests = Anzahl der Tests # Event eventActiveEvents=Aktive Ereignisse @@ -1562,11 +1566,11 @@ ExternalMessage.sampleOverallTestResult=Gesamttestresultat ExternalMessage.assignee=Zugewiesen an ExternalMessage.type=Typ ExternalMessage.surveillanceReport=Verknüpfter Bericht -ExternalMessage.caseReportDate=Case report date +ExternalMessage.caseReportDate=Fallmeldedatum ExternalMessage.personExternalId=External ID ExternalMessage.personNationalHealthId=National health ID ExternalMessage.personPhoneNumberType=Phone number type -ExternalMessage.personCountry=Country +ExternalMessage.personCountry=Land externalMessageFetch=Meldungen abrufen externalMessageProcess=Verarbeiten externalMessageNoDisease=Keine Krankheit gefunden @@ -1737,13 +1741,13 @@ PathogenTest.ctValueOrf1=Ct target ORF1 PathogenTest.ctValueRdrpS=Ct target RDRP/S PathogenTest.prescriber=Prescriber PathogenTest.prescriberPhysicianCode=Physician code -PathogenTest.prescriberFirstName=First name -PathogenTest.prescriberLastName=Last name -PathogenTest.prescriberPhoneNumber=Phone number -PathogenTest.prescriberAddress=Address -PathogenTest.prescriberPostalCode=Postal code -PathogenTest.prescriberCity=City -PathogenTest.prescriberCountry=Country +PathogenTest.prescriberFirstName=Vorname +PathogenTest.prescriberLastName=Nachname +PathogenTest.prescriberPhoneNumber=Telefonnummer +PathogenTest.prescriberAddress=Adresse +PathogenTest.prescriberPostalCode=Postleitzahl +PathogenTest.prescriberCity=Stadt +PathogenTest.prescriberCountry=Land # Person personPersonsList=Personenliste personCreateNew=Eine neue Person anlegen @@ -2403,7 +2407,7 @@ Task.contextReference=Verknüpfter Link Task.creatorComment=Kommentare zur Aufgabe Task.creatorUser=Erstellt von Task.dueDate=Fälligkeitsdatum -Task.environment = Associated environment +Task.environment = Zugeordnete Umgebung Task.event=Zugehöriges Ereignis Task.observerUsers=Beobachtet von Task.perceivedStart=Erfasster Start @@ -2434,14 +2438,14 @@ TestReport.ctValueRdrp=Ct target RDRP TestReport.ctValueS=Ct target S TestReport.ctValueOrf1=Ct target ORF1 TestReport.ctValueRdrpS=Ct target RDRP/S -TestReport.prescriberPhysicianCode=Physician code -TestReport.prescriberFirstName=First name -TestReport.prescriberLastName=Last name -TestReport.prescriberPhoneNumber=Phone number -TestReport.prescriberAddress=Address -TestReport.prescriberPostalCode=Postal code -TestReport.prescriberCity=City -TestReport.prescriberCountry=Country +TestReport.prescriberPhysicianCode=Arztcode +TestReport.prescriberFirstName=Vorname +TestReport.prescriberLastName=Nachname +TestReport.prescriberPhoneNumber=Telefonnummer +TestReport.prescriberAddress=Adresse +TestReport.prescriberPostalCode=Postleitzahl +TestReport.prescriberCity=Stadt +TestReport.prescriberCountry=Land # TravelEntry travelEntryCreateCase=Fall erstellen travelEntryOnlyRecoveredEntries=Nur genesene Einreisende @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Telefonnummer der Person TaskExport.personPhoneOwner=Telefonbesitzer des Telefons der Person TaskExport.personEmailAddress=E-Mail Adresse der Person TaskExport.personOtherContactDetails = Kontaktdetails der Person +environmentSampleNotShipped = Nicht versendet +environmentSampleShipped = Versandt +environmentSampleReceived = Erhalten +environmentSampleActiveSamples=Aktive Umgebungs Proben +environmentSampleArchivedSamples=Archivierte Umgebungs Proben +environmentSampleAllActiveAndArchivedSamples=Alle aktiven und archivierten Umgebungs Proben +environmentSampleDeletedSamples=Gelöschte Umgebungs Proben +sampleViewType=Probe +environmentSampleViewType=Umgebung \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_en-AF.properties b/sormas-api/src/main/resources/captions_en-AF.properties index ab02b0a77a0..bb5dc6fdcff 100644 --- a/sormas-api/src/main/resources/captions_en-AF.properties +++ b/sormas-api/src/main/resources/captions_en-AF.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_en-GH.properties b/sormas-api/src/main/resources/captions_en-GH.properties index 5af9c6b234b..02c073039d1 100644 --- a/sormas-api/src/main/resources/captions_en-GH.properties +++ b/sormas-api/src/main/resources/captions_en-GH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_en-NG.properties b/sormas-api/src/main/resources/captions_en-NG.properties index cfaa30ad4e8..77f9953d63b 100644 --- a/sormas-api/src/main/resources/captions_en-NG.properties +++ b/sormas-api/src/main/resources/captions_en-NG.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_es-CU.properties b/sormas-api/src/main/resources/captions_es-CU.properties index 0aa78515bad..e55fc3e5516 100644 --- a/sormas-api/src/main/resources/captions_es-CU.properties +++ b/sormas-api/src/main/resources/captions_es-CU.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= Nuevo ambiente environmentEnvironmentsList=Lista de ambientes # EnvironmentSample +EnvironmentSample.uuid = Id de la muestra EnvironmentSample.environment = Ambiente EnvironmentSample.sampleDateTime = Fecha de la muestra EnvironmentSample.sampleMaterial = Material de la muestra @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volumen (en mL) EnvironmentSample.fieldSampleId = ID de muestra de campo EnvironmentSample.turbidity = Turbidez (en NTU) EnvironmentSample.phValue = pH de la muestra -EnvironmentSample.sampleTemperature = Temperatura (en �C) +EnvironmentSample.sampleTemperature = Temperatura (en °C) EnvironmentSample.chlorineResiduals = Residuos totales de clorina (mg/L) EnvironmentSample.laboratory = Laboratorio EnvironmentSample.laboratoryDetails = Detalles de laboratorio @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = ID de muestra de laboratorio EnvironmentSample.specimenCondition = Condición del espécimen EnvironmentSample.location = Ubicación del sitio de la muestra EnvironmentSample.generalComment = Comentario general +EnvironmentSample.positivePathogenTests = Pruebas de patógeno positivas +EnvironmentSample.latestPathogenTest = Última prueba de patógeno +EnvironmentSample.numberOfTests = Número de pruebas # Event eventActiveEvents=Eventos activos @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Teléfono de la persona TaskExport.personPhoneOwner=Propietario del teléfono de la persona TaskExport.personEmailAddress=Dirección de correo electrónico de la persona TaskExport.personOtherContactDetails = Datos de contacto de la persona +environmentSampleNotShipped = No enviado +environmentSampleShipped = Enviada +environmentSampleReceived = Recibida +environmentSampleActiveSamples=Muestras ambientales activas +environmentSampleArchivedSamples=Muestras ambientales archivadas +environmentSampleAllActiveAndArchivedSamples=Todas las muestras ambientales activas y archivadas +environmentSampleDeletedSamples=Muestras ambientales eliminadas +sampleViewType=Muestra +environmentSampleViewType=Ambiente \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_es-ES.properties b/sormas-api/src/main/resources/captions_es-ES.properties index 920f20c968c..912d39c6055 100644 --- a/sormas-api/src/main/resources/captions_es-ES.properties +++ b/sormas-api/src/main/resources/captions_es-ES.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fa-AF.properties b/sormas-api/src/main/resources/captions_fa-AF.properties index 9991e295f0a..2677a4d2c08 100644 --- a/sormas-api/src/main/resources/captions_fa-AF.properties +++ b/sormas-api/src/main/resources/captions_fa-AF.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fi-FI.properties b/sormas-api/src/main/resources/captions_fi-FI.properties index 81a90e576ab..e88363ff3fb 100644 --- a/sormas-api/src/main/resources/captions_fi-FI.properties +++ b/sormas-api/src/main/resources/captions_fi-FI.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Aktiiviset tapahtumat @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fil-PH.properties b/sormas-api/src/main/resources/captions_fil-PH.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_fil-PH.properties +++ b/sormas-api/src/main/resources/captions_fil-PH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fj-FJ.properties b/sormas-api/src/main/resources/captions_fj-FJ.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_fj-FJ.properties +++ b/sormas-api/src/main/resources/captions_fj-FJ.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-CD.properties b/sormas-api/src/main/resources/captions_fr-CD.properties index 6c3226a9aa3..3aac86b13ee 100644 --- a/sormas-api/src/main/resources/captions_fr-CD.properties +++ b/sormas-api/src/main/resources/captions_fr-CD.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-CH.properties b/sormas-api/src/main/resources/captions_fr-CH.properties index fcc7a732c80..3b9423d332f 100644 --- a/sormas-api/src/main/resources/captions_fr-CH.properties +++ b/sormas-api/src/main/resources/captions_fr-CH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Événements actifs @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index 6dff31da57d..9a5d82bb4f8 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Température (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Événements actifs @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-TN.properties b/sormas-api/src/main/resources/captions_fr-TN.properties index 5136975f565..0d0498e7fee 100644 --- a/sormas-api/src/main/resources/captions_fr-TN.properties +++ b/sormas-api/src/main/resources/captions_fr-TN.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Événements actifs @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_hi-IN.properties b/sormas-api/src/main/resources/captions_hi-IN.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_hi-IN.properties +++ b/sormas-api/src/main/resources/captions_hi-IN.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_hr-HR.properties b/sormas-api/src/main/resources/captions_hr-HR.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_hr-HR.properties +++ b/sormas-api/src/main/resources/captions_hr-HR.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_it-CH.properties b/sormas-api/src/main/resources/captions_it-CH.properties index 9bdd4f84038..2e057321e0b 100644 --- a/sormas-api/src/main/resources/captions_it-CH.properties +++ b/sormas-api/src/main/resources/captions_it-CH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Eventi attivi @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_it-IT.properties b/sormas-api/src/main/resources/captions_it-IT.properties index 42bbcc10c2a..39a09b8d15d 100644 --- a/sormas-api/src/main/resources/captions_it-IT.properties +++ b/sormas-api/src/main/resources/captions_it-IT.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Eventi attivi @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ja-JP.properties b/sormas-api/src/main/resources/captions_ja-JP.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_ja-JP.properties +++ b/sormas-api/src/main/resources/captions_ja-JP.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ne-NP.properties b/sormas-api/src/main/resources/captions_ne-NP.properties index 49d7c993329..9268bfe2a00 100644 --- a/sormas-api/src/main/resources/captions_ne-NP.properties +++ b/sormas-api/src/main/resources/captions_ne-NP.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_nl-NL.properties b/sormas-api/src/main/resources/captions_nl-NL.properties index c8bc3da0512..5e8097ac00c 100644 --- a/sormas-api/src/main/resources/captions_nl-NL.properties +++ b/sormas-api/src/main/resources/captions_nl-NL.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_no-NO.properties b/sormas-api/src/main/resources/captions_no-NO.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_no-NO.properties +++ b/sormas-api/src/main/resources/captions_no-NO.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index 8813277716e..3ee78198407 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ps-AF.properties b/sormas-api/src/main/resources/captions_ps-AF.properties index 10821913e20..35c8b3ffeb7 100644 --- a/sormas-api/src/main/resources/captions_ps-AF.properties +++ b/sormas-api/src/main/resources/captions_ps-AF.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_pt-PT.properties b/sormas-api/src/main/resources/captions_pt-PT.properties index 4adf8de84a4..beb4eb8e94f 100644 --- a/sormas-api/src/main/resources/captions_pt-PT.properties +++ b/sormas-api/src/main/resources/captions_pt-PT.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ro-RO.properties b/sormas-api/src/main/resources/captions_ro-RO.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_ro-RO.properties +++ b/sormas-api/src/main/resources/captions_ro-RO.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ru-RU.properties b/sormas-api/src/main/resources/captions_ru-RU.properties index dff566ee196..c9e2374e890 100644 --- a/sormas-api/src/main/resources/captions_ru-RU.properties +++ b/sormas-api/src/main/resources/captions_ru-RU.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_sv-SE.properties b/sormas-api/src/main/resources/captions_sv-SE.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_sv-SE.properties +++ b/sormas-api/src/main/resources/captions_sv-SE.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_sw-KE.properties b/sormas-api/src/main/resources/captions_sw-KE.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_sw-KE.properties +++ b/sormas-api/src/main/resources/captions_sw-KE.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_tr-TR.properties b/sormas-api/src/main/resources/captions_tr-TR.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_tr-TR.properties +++ b/sormas-api/src/main/resources/captions_tr-TR.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_uk-UA.properties b/sormas-api/src/main/resources/captions_uk-UA.properties index 45da8b1daf0..94c9546a71c 100644 --- a/sormas-api/src/main/resources/captions_uk-UA.properties +++ b/sormas-api/src/main/resources/captions_uk-UA.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index 59f63a544ad..e2b0ee24b36 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= نیا ماحول environmentEnvironmentsList=ماحولیات کی فہرست # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = ماحول EnvironmentSample.sampleDateTime = نمونے لینے کی تاریخ EnvironmentSample.sampleMaterial = نمونہ کا مواد @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = حجم (ایم ایل میں) EnvironmentSample.fieldSampleId = فیلڈ کے نمونے کی شناخت EnvironmentSample.turbidity = ٹربائڈیٹی (این ٹی یو میں) EnvironmentSample.phValue = نمونے کا پی ایچ -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=فعال تقریبات @@ -2860,3 +2864,12 @@ TaskExport.personPhone=شخص کا فون TaskExport.personPhoneOwner=شخص کے فون کا مالک TaskExport.personEmailAddress=شخص کا ای میل پتہ TaskExport.personOtherContactDetails = شخص کے رابطے کی تفصیلات +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_zh-CN.properties b/sormas-api/src/main/resources/captions_zh-CN.properties index 983ed05d6c4..8dc75d0e6e4 100644 --- a/sormas-api/src/main/resources/captions_zh-CN.properties +++ b/sormas-api/src/main/resources/captions_zh-CN.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling EnvironmentSample.sampleMaterial = Sample material @@ -1140,7 +1141,7 @@ EnvironmentSample.sampleVolume = Volume (in mL) EnvironmentSample.fieldSampleId = Field sample ID EnvironmentSample.turbidity = Turbidity (in NTU) EnvironmentSample.phValue = pH of sample -EnvironmentSample.sampleTemperature = Temperature (in +EnvironmentSample.sampleTemperature = Temperature (in °C) EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details @@ -1157,6 +1158,9 @@ EnvironmentSample.labSampleId = Lab sample ID EnvironmentSample.specimenCondition = Specimen condition EnvironmentSample.location = Location of sampling site EnvironmentSample.generalComment = General comment +EnvironmentSample.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests # Event eventActiveEvents=Active events @@ -2860,3 +2864,12 @@ TaskExport.personPhone=Person phone TaskExport.personPhoneOwner=Person phone owner TaskExport.personEmailAddress=Person email address TaskExport.personOtherContactDetails = Person contact details +environmentSampleNotShipped = Not shipped +environmentSampleShipped = Shipped +environmentSampleReceived = Received +environmentSampleActiveSamples=Active environment samples +environmentSampleArchivedSamples=Archived environment samples +environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples +environmentSampleDeletedSamples=Deleted environment samples +sampleViewType=Sample +environmentSampleViewType=Environment \ No newline at end of file diff --git a/sormas-api/src/main/resources/enum_ar-SA.properties b/sormas-api/src/main/resources/enum_ar-SA.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_ar-SA.properties +++ b/sormas-api/src/main/resources/enum_ar-SA.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_cs-CZ.properties b/sormas-api/src/main/resources/enum_cs-CZ.properties index b863b1c0bf6..3cc4fcc73cd 100644 --- a/sormas-api/src/main/resources/enum_cs-CZ.properties +++ b/sormas-api/src/main/resources/enum_cs-CZ.properties @@ -1566,14 +1566,14 @@ UserRight.ENVIRONMENT_ARCHIVE = Archivovat prostředí UserRight.ENVIRONMENT_DELETE = Odstranit prostředí ze systému UserRight.ENVIRONMENT_IMPORT = Importovat prostředí UserRight.ENVIRONMENT_EXPORT = Exportovat prostředí -UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples -UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples +UserRight.ENVIRONMENT_SAMPLE_VIEW = Zobrazit existující vzorky prostředí +UserRight.ENVIRONMENT_SAMPLE_CREATE = Vytvořit nové vzorky prostředí +UserRight.ENVIRONMENT_SAMPLE_EDIT = Upravit existující vzorky prostředí UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information -UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information -UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system -UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples -UserRight.ENVIRONMENT_SAMPLE_EXPORT = Export environment samples +UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Upravit příchozí informace vzorků prostředí +UserRight.ENVIRONMENT_SAMPLE_DELETE = Odstranit vzorky prostředí ze systému +UserRight.ENVIRONMENT_SAMPLE_IMPORT = Importovat vzorky prostředí +UserRight.ENVIRONMENT_SAMPLE_EXPORT = Exportovat vzorky prostředí # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Může archivovat případy @@ -1759,14 +1759,14 @@ UserRight.Desc.ENVIRONMENT_ARCHIVE = Možnost archivovat prostředí UserRight.Desc.ENVIRONMENT_DELETE = Možnost odstranit prostředí ze systému UserRight.Desc.ENVIRONMENT_IMPORT = Možnost importovat prostředí UserRight.Desc.ENVIRONMENT_EXPORT = Možnost exportovat prostředí -UserRight.Desc.ENVIRONMENT_SAMPLE_VIEW = Able to view existing environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_CREATE = Able to create new environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT = Able to edit existing environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Able to edit environment samples dispatch information -UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Able to edit environment samples receival information -UserRight.Desc.ENVIRONMENT_SAMPLE_DELETE = Able to delete environment samples from the system -UserRight.Desc.ENVIRONMENT_SAMPLE_IMPORT = Able to import environment samples -UserRight.Desc.ENVIRONMENT_SAMPLE_EXPORT = Able to export environment samples +UserRight.Desc.ENVIRONMENT_SAMPLE_VIEW = Může zobrazit existující vzorky prostředí +UserRight.Desc.ENVIRONMENT_SAMPLE_CREATE = Může vytvořit nové vzorky prostředí +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT = Může upravit existující vzorky prostředí +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Může upravit informace o odesílání vzorků z prostředí +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Může upravit příchozí informace o vzorcích prostředí +UserRight.Desc.ENVIRONMENT_SAMPLE_DELETE = Může odstranit vzorky prostředí ze systému +UserRight.Desc.ENVIRONMENT_SAMPLE_IMPORT = Může importovat vzorky prostředí +UserRight.Desc.ENVIRONMENT_SAMPLE_EXPORT = Může exportovat vzorky prostředí # UserRightGroup UserRightGroup.GENERAL = Obecné @@ -2221,7 +2221,7 @@ Pathogen.COXSACKIE_VIRUS = Coxsackie virus Pathogen.ECHOVIRUS = Echovirus Pathogen.HEPATITIS_A_VIRUS = Hepatitis A virus Pathogen.HEPATITIS_E_VIRUS = Hepatitis E virus -Pathogen.HUMAN_CALICIVIRUS = Human calicivirus +Pathogen.HUMAN_CALICIVIRUS = Lidský kalicivirus Pathogen.POLIO_VIRUS = Virus Polio 2 Pathogen.REOVIRUS = Reovirus Pathogen.ROTAVIRUS = Rotavirus diff --git a/sormas-api/src/main/resources/enum_de-CH.properties b/sormas-api/src/main/resources/enum_de-CH.properties index 78a6f8ccf61..342fd6059ae 100644 --- a/sormas-api/src/main/resources/enum_de-CH.properties +++ b/sormas-api/src/main/resources/enum_de-CH.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_de-DE.properties b/sormas-api/src/main/resources/enum_de-DE.properties index d923edcf8ee..5a09a441da2 100644 --- a/sormas-api/src/main/resources/enum_de-DE.properties +++ b/sormas-api/src/main/resources/enum_de-DE.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Umgebungen exportieren UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_en-AF.properties b/sormas-api/src/main/resources/enum_en-AF.properties index a1e6ed1f66f..09eab09a721 100644 --- a/sormas-api/src/main/resources/enum_en-AF.properties +++ b/sormas-api/src/main/resources/enum_en-AF.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_en-GH.properties b/sormas-api/src/main/resources/enum_en-GH.properties index 4f4a535b268..e985ab10787 100644 --- a/sormas-api/src/main/resources/enum_en-GH.properties +++ b/sormas-api/src/main/resources/enum_en-GH.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_en-NG.properties b/sormas-api/src/main/resources/enum_en-NG.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_en-NG.properties +++ b/sormas-api/src/main/resources/enum_en-NG.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_es-ES.properties b/sormas-api/src/main/resources/enum_es-ES.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_es-ES.properties +++ b/sormas-api/src/main/resources/enum_es-ES.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fa-AF.properties b/sormas-api/src/main/resources/enum_fa-AF.properties index 85f59d2b5b9..806510f2f40 100644 --- a/sormas-api/src/main/resources/enum_fa-AF.properties +++ b/sormas-api/src/main/resources/enum_fa-AF.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fi-FI.properties b/sormas-api/src/main/resources/enum_fi-FI.properties index 8522efba43e..142274dee5f 100644 --- a/sormas-api/src/main/resources/enum_fi-FI.properties +++ b/sormas-api/src/main/resources/enum_fi-FI.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fil-PH.properties b/sormas-api/src/main/resources/enum_fil-PH.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_fil-PH.properties +++ b/sormas-api/src/main/resources/enum_fil-PH.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fj-FJ.properties b/sormas-api/src/main/resources/enum_fj-FJ.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_fj-FJ.properties +++ b/sormas-api/src/main/resources/enum_fj-FJ.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fr-CD.properties b/sormas-api/src/main/resources/enum_fr-CD.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_fr-CD.properties +++ b/sormas-api/src/main/resources/enum_fr-CD.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fr-CH.properties b/sormas-api/src/main/resources/enum_fr-CH.properties index 5ca224acc67..0a9fab40238 100644 --- a/sormas-api/src/main/resources/enum_fr-CH.properties +++ b/sormas-api/src/main/resources/enum_fr-CH.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fr-FR.properties b/sormas-api/src/main/resources/enum_fr-FR.properties index bc18e311581..d318d188c15 100644 --- a/sormas-api/src/main/resources/enum_fr-FR.properties +++ b/sormas-api/src/main/resources/enum_fr-FR.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_fr-TN.properties b/sormas-api/src/main/resources/enum_fr-TN.properties index bc18e311581..d318d188c15 100644 --- a/sormas-api/src/main/resources/enum_fr-TN.properties +++ b/sormas-api/src/main/resources/enum_fr-TN.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_hi-IN.properties b/sormas-api/src/main/resources/enum_hi-IN.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_hi-IN.properties +++ b/sormas-api/src/main/resources/enum_hi-IN.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_hr-HR.properties b/sormas-api/src/main/resources/enum_hr-HR.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_hr-HR.properties +++ b/sormas-api/src/main/resources/enum_hr-HR.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_it-CH.properties b/sormas-api/src/main/resources/enum_it-CH.properties index c9a1924116a..20f2c328215 100644 --- a/sormas-api/src/main/resources/enum_it-CH.properties +++ b/sormas-api/src/main/resources/enum_it-CH.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_it-IT.properties b/sormas-api/src/main/resources/enum_it-IT.properties index 21c92c61b85..c525d8e210e 100644 --- a/sormas-api/src/main/resources/enum_it-IT.properties +++ b/sormas-api/src/main/resources/enum_it-IT.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_ja-JP.properties b/sormas-api/src/main/resources/enum_ja-JP.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_ja-JP.properties +++ b/sormas-api/src/main/resources/enum_ja-JP.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_ne-NP.properties b/sormas-api/src/main/resources/enum_ne-NP.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_ne-NP.properties +++ b/sormas-api/src/main/resources/enum_ne-NP.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_nl-NL.properties b/sormas-api/src/main/resources/enum_nl-NL.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_nl-NL.properties +++ b/sormas-api/src/main/resources/enum_nl-NL.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_no-NO.properties b/sormas-api/src/main/resources/enum_no-NO.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_no-NO.properties +++ b/sormas-api/src/main/resources/enum_no-NO.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_pl-PL.properties b/sormas-api/src/main/resources/enum_pl-PL.properties index b404af91f73..fa84f28d4c7 100644 --- a/sormas-api/src/main/resources/enum_pl-PL.properties +++ b/sormas-api/src/main/resources/enum_pl-PL.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_ps-AF.properties b/sormas-api/src/main/resources/enum_ps-AF.properties index 85f59d2b5b9..806510f2f40 100644 --- a/sormas-api/src/main/resources/enum_ps-AF.properties +++ b/sormas-api/src/main/resources/enum_ps-AF.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_pt-PT.properties b/sormas-api/src/main/resources/enum_pt-PT.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_pt-PT.properties +++ b/sormas-api/src/main/resources/enum_pt-PT.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_ro-RO.properties b/sormas-api/src/main/resources/enum_ro-RO.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_ro-RO.properties +++ b/sormas-api/src/main/resources/enum_ro-RO.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_ru-RU.properties b/sormas-api/src/main/resources/enum_ru-RU.properties index f8e0879f901..419a16cb75d 100644 --- a/sormas-api/src/main/resources/enum_ru-RU.properties +++ b/sormas-api/src/main/resources/enum_ru-RU.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_sv-SE.properties b/sormas-api/src/main/resources/enum_sv-SE.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_sv-SE.properties +++ b/sormas-api/src/main/resources/enum_sv-SE.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_sw-KE.properties b/sormas-api/src/main/resources/enum_sw-KE.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_sw-KE.properties +++ b/sormas-api/src/main/resources/enum_sw-KE.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_tr-TR.properties b/sormas-api/src/main/resources/enum_tr-TR.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_tr-TR.properties +++ b/sormas-api/src/main/resources/enum_tr-TR.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_uk-UA.properties b/sormas-api/src/main/resources/enum_uk-UA.properties index b5ca038cfcf..512d9ed97bd 100644 --- a/sormas-api/src/main/resources/enum_uk-UA.properties +++ b/sormas-api/src/main/resources/enum_uk-UA.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_ur-PK.properties b/sormas-api/src/main/resources/enum_ur-PK.properties index 310cd1b8aca..3b01e5883b4 100644 --- a/sormas-api/src/main/resources/enum_ur-PK.properties +++ b/sormas-api/src/main/resources/enum_ur-PK.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = ایکسپورٹ ماحول UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/enum_zh-CN.properties b/sormas-api/src/main/resources/enum_zh-CN.properties index aa3048ae71e..3c30caf3f09 100644 --- a/sormas-api/src/main/resources/enum_zh-CN.properties +++ b/sormas-api/src/main/resources/enum_zh-CN.properties @@ -1569,7 +1569,7 @@ UserRight.ENVIRONMENT_EXPORT = Export environments UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment dispatch information +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information UserRight.ENVIRONMENT_SAMPLE_DELETE = Delete environment samples from the system UserRight.ENVIRONMENT_SAMPLE_IMPORT = Import environment samples diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index 959e5c6f909..090f660aaa7 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 674aa442f75..8e758724fd3 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -38,7 +38,7 @@ fileName = Název souboru forCase = pro případ forContact = pro kontakt forEventParticipant = pro účastníka události -forEnvironment = for environment +forEnvironment = pro prostředí inactive = Neaktivní inColumn = ve sloupci lastTwoDays = poslední dva dny @@ -272,10 +272,10 @@ entityContinents=Kontinenty entityDistrict=Okres entityDistricts=Okresy entityDocuments=Dokumenty -entityEnvironment = Environment +entityEnvironment = Prostředí entityEnvironments = Prostředí -entityEnvironmentSample = Environment sample -entityEnvironmentSamples = Environment samples +entityEnvironmentSample = Vzorek prostředí +entityEnvironmentSamples = Vzorky prostředí entityEvent=Událost entityEvents=Události entityEventGroup=Skupina událostí @@ -398,7 +398,7 @@ errorExternalSurveillanceToolNonCoronavirusCase=Vybrané případy nelze odeslat errorExternalSurveillanceToolCasesNotSharable=%d z vybraných %d případů nelze odeslat do externího nástroje pro podávání zpráv.
Ujistěte se, že všechny níže uvedené případy jsou vlastněny a mohou být sdíleny s externím nástrojem pro podávání zpráv. Poté zkuste odeslat znovu nebo odešlete pouze ty, které odeslat lze. errorExternalSurveillanceToolNonClusterEvent=Vybrané události nelze odeslat do nástroje hlášení, protože událost %s není klastrem %s. errorExternalSurveillanceToolEventNotOwned=%d z vybraných událostí nelze odeslat do externího oznamovacího nástroje.
Ujistěte se, že všechny níže uvedené události jsou vlastněny. Potom je zkuste poslat znovu, nebo pouze ty, které mohou být odeslány. -errorEventFromAnotherJurisdiction = The event is related to a jurisdiction you don't have access to +errorEventFromAnotherJurisdiction = Událost souvisí s jurisdikcí, ke které nemáte přístup errorEventsFromAnotherJurisdiction = Nejméně jedna z vybraných událostí se týká jurisdikce, ke které nemáte přístup errorEventUnlinkEventGroupFromAnotherJurisdiction = Skupina událostí má událost související s jurisdikcí, ke které nemáte přístup errorCaseNotEditable = Tento případ již není upravitelný @@ -418,8 +418,8 @@ errorNotFound = Požadovaný subjekt nebyl nalezen errorDeleteUserRoleUsedAlone = Nelze odstranit uživatelskou roli, protože následující uživatelé by zůstali bez uživatelské role\:

%s

Prosím, dejte jim jinou roli a zkuste to znovu smazat. errorSurveillanceReportNotEditable = Tato zpráva již není upravitelná errorEnvironmentSampleNotEditable = Tento vzorek prostředí již není upravitelný -errorEnvironmentSampleNoDispatchRight = You do not have the necessary user right to change the dispatch status of this environment sample -errorEnvironmentSampleNoReceivalRight = You do not have the necessary user right to change the receival status of this environment sample +errorEnvironmentSampleNoDispatchRight = Nemáte potřebné uživatelské právo ke změně stavu odeslání tohoto vzorku +errorEnvironmentSampleNoReceivalRight = Nemáte potřebné uživatelské právo ke změně stavu příjmu tohoto vzorku prostředí # headings headingAccessDenied = Přístup odepřen headingActivityAsCase = Aktivita jako případ @@ -429,7 +429,7 @@ headingAnimalContacts = Kontakty se zvířaty headingArchiveCampaign = Archivovat kampaň headingArchiveCase = Archivovat případ headingArchiveContact = Aktivní kontakt -headingArchiveEnvironment = Archive environment +headingArchiveEnvironment = Archivovat prostředí headingArchiveEvent = Archivovat událost headingArchiveEventParticipant = Archivovat účastníka události headingArchiveEventGroup = Archivovat skupinu událostí @@ -445,6 +445,8 @@ headingCaseImport = Import případu headingPointOfEntryImport = Místo vstupu – import headingCaseStatusMap = Mapa stavu případu headingCasesDeleted = Případy odstraněny +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Převod na případ headingChangeCaseDisease = Změnit onemocnění případu headingCasesGuide = Příručka\: Adresář případů @@ -466,6 +468,9 @@ headingUnderFollowUp = Pod následnými opatřeními headingContactInformation = Kontaktní údaje headingContactMap = Mapa kontaktů headingContactsDeleted = Kontakty odstraněny +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Vytvořit nové dodatečné výsledky testu headingCreateEntry = Vytvořit záznam headingCreateNewAction = Vytvořit novou akci @@ -477,7 +482,7 @@ headingCreateNewClinicalVisit = Vytvořit nové klinické hodnocení headingCreateNewContact = Vytvořit nový kontakt headingCreateNewContactIssue = Problém s vytvořením kontaktu headingCreateNewTravelEntry=Vytvořit nový cestovní vstup -headingCreateNewEnvironment = Create new environment +headingCreateNewEnvironment = Vytvořit nové prostředí headingCreateNewEvent = Vytvořit novou událost headingCreateNewEventParticipant = Přidat nového účastníka události headingCreateNewEventGroup = Vytvořit novou skupinu událostí @@ -497,7 +502,7 @@ headingDatabaseExportFailed = Export databáze selhal headingDearchiveCampaign = Vyjmout z archivu kampaň headingDearchiveCase = Obnova archivace případu headingDearchiveContact = Vyjmout kontakt z archivu -headingDearchiveEnvironment = De-Archive environment +headingDearchiveEnvironment = De-archivovat prostředí headingDearchiveEvent = Obnova archivaci události headingDearchiveEventParticipant = Vyjmout účastníka události z archivu headingDearchiveEventGroup = Vyjmout z archivu skupinu událostí @@ -531,15 +536,24 @@ headingEditCountry = Upravit zemi headingEditContinent = Upravit kontinent headingEditSample = Upravit vzorek headingEditSubcontinent = Upravit subkontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Vystavení v životním prostředí headingEpiCurve = Epidemiologické křivky headingErrorReportNotAvailable = Zpráva o chybě není k dispozici headingEventData = Data událostí headingEventGroupData = Údaje skupiny událostí headingEventParticipantsDeleted = Účastníci události smazání +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Aktualizace jurisdikce událostí headingEventsDeleted = Události odstraněny +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export selhal headingFatalities=Úmrtnost headingFileExists = Duplikovat soubor @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Importovat výchozí subkontinenty headingImportAreas = Importovat oblasti headingImportRegions= Importovat regiony headingImportTravelEntries = Importovat záznamy o cestování +headingImportEnvironments = Importovat prostředí headingInformationSource = Zdroj informací headingInfrastructureLocked = Infrastruktura uzamčena headingIntroduction = Úvod @@ -596,7 +611,7 @@ headingNewTestResults = Nové výsledky testu headingNoCasesSelected = Nejsou vybrány žádné případy headingNoClinicalVisitsSelected = Nebyla vybrána žádná klinická hodnocení headingNoContactsSelected = Nebyly vybrány žádné kontakty -headingNoEnvironmentSelected = No environment selected +headingNoEnvironmentSelected = Není vybráno žádné prostředí headingNoEventParticipantsSelected = Nejsou vybráni žádní účastníci události headingNoEventsSelected = Nebyly vybrány žádné události headingNoTravelEntriesSelected = Nejsou vybrány žádná místa vstupu @@ -616,7 +631,7 @@ headingPaperFormDates = Datum přijetí papírové formy headingPersonData = Osobní údaje headingPersonInformation = Informace o osobě headingPersonOccupation = Zaměstnání a vzdělávání -headingPickEventGroup = Pick event group +headingPickEventGroup = Vybrat skupinu událostí headingPickEventParticipants = Vybrat nebo sloučit účastníky události headingPickEventParticipantsIncompleteSelection = Neúplný výběr headingPickOrCreateCase = Vyberte nebo vytvořte případ @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Požadované testy patogenu\: headingResponsibleJurisdiction=Odpovědná jurisdikce headingResults = Výsledky headingSamplesDeleted = Vzorky odstraněny +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Uložit oznámení headingSecurityAlert=Bezpečnostní upozornění headingSelectCampaign = Vybrat kampaň @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Klinické znamení a příznaky headingSimilarImmunization = Podobná imunizace headingSyncUsers = Synchronizovat uživatele headingTasksDeleted = Úkoly odstraněny +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Šablona není k dispozici headingTests = Testy patogenů headingTransferCase = Případ přenosu headingTravelEntryData = Data o cestovním vstupu headingTravelEntriesDeleted = Místa vstupu smazány +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Viz případ z místa vstupu headingTreatments = Provedená léčba headingTreatmentsDeleted = Léčba odstraněna @@ -674,6 +694,9 @@ headingViewVaccination = Zobrazit očkování headingViewVisit = Visit view headingVisits = Návštěvy headingVisitsDeleted = Návštěvy odstraněny +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Vizualizace headingWrongFileType = Chybný typ souboru headingWaterUse = Používání vody @@ -705,6 +728,9 @@ headingCasesRestored = Případy obnoveny headingContactsRestored = Kontakty obnoveny headingEventsRestored = Události obnoveny headingEventParticipantsRestored = Účastníci události obnoveni +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizace obnovena headingSamplesRestored = Vzorky obnoveny headingTravelEntriesRestored = Místa vstupu obnoveny @@ -717,22 +743,23 @@ headingNewSourceCases = Nové případy, které nebyly dříve známy jako konta headingNoCaseFound = Nebyl nalezen žádný případ headingNoEventFound = Nenalezena žádná událost headingEventNotDeleted = Událost nebyla smazána -headingSomeCasesNotDeleted = Některé případy nebyly odstraněny headingSomeCasesNotRestored = Některé případy nebyly obnoveny -headingSomeContactsNotDeleted = Některé kontakty nebyly odstraněny headingSomeContactsNotRestored = Některé kontakty nebyly obnoveny -headingSomeEventsNotRestored = Některé události nebyly obnoveny -headingSomeEventParticipantsNotDeleted = Někteří účastníci události nebyli smazáni +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Někteří účastníci události nebyli obnoveni +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Některé události nebyly obnoveny headingSomeImmunizationsNotRestored = Některé imunizace nebyly obnoveny -headingSomeSamplesNotDeleted = Některé vzorky nebyly smazány headingSomeSamplesNotRestored = Některé vzorky nebyly obnoveny -headingSomeTasksNotDeleted = Některé úkoly nebyly smazány -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Některá místa vstupu nebyla obnovena -headingSomeVisitsNotDeleted = Některé návštěvy nebyly smazány -headingSomeEventsNotDeleted = Některé události nebyly odstraněny -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Vyžadováno potvrzení kontaktu headingContactConversionFollowUpCommentLarge = Komentář k následnému sledování překročí maximální povolený počet znaků headingSelectSourceCase = Vyberte zdrojový případ @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export uživatelských práv selhal headingExternalMessageDownload = Stáhnout zprávu headingNoExternalMessagesSelected = Nebyly vybrány žádné zprávy headingExternalMessagesDeleted = Zprávy smazány +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Informace o vzorku @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = Nové testy patogenu headingFetchExternalMessages = Načíst nové zprávy headingCaution = Varování headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Odstranit imunizační vakcinaci headingDocumentCreated = Dokument vytvořen headingConfirmUnclearLabMessage=Potvrzení nejasné @@ -812,7 +842,12 @@ immunizationRecoveryHeading = Uzdravení headingAutomaticDeletionStarted = Automatické smazání zahájeno headingBulkOperationProgress = Průběh hromadné operace headingSomeContactsAlreadyInEvent = Některé kontakty jsou již propojeny s událostí -headingEnvironmentJurisdictionUpdated = Environment location update +headingEnvironmentJurisdictionUpdated = Aktualizace lokality prostředí +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Prosím zdokumentujte VŠECHNY relevantní aktivity po infekci\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = Pokud má případ více vzorků, bere se v infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = Všechny vybrané položky byly zpracovány\!
Nyní můžete toto okno zavřít. infoBulkProcessFinishedWithIneligibleItems = Hromadný proces byl úspěšně dokončen\!
Některé z vybraných položek však nemohly být zpracovány, protože nebyly způsobilé. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Hromadný proces byl úspěšně dokončen\!
Některé z vybraných položek však nemohly být zpracovány, s největší pravděpodobností proto, že byly mimo vaši jurisdikci. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Hromadný proces byl úspěšně dokončen\!
Některé z vybraných položek však nemohly být zpracovány, s největší pravděpodobností proto, že již byly archivovány nebo nejsou způsobilé. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Hromadný proces byl zrušen, protože pro tuto operaci nejsou žádné způsobilé položky\! infoBulkProcessCancelled = Hromadný proces byl zrušen\!
Všechny vybrané položky až do zpracování tohoto bodu. Nyní můžete toto okno zavřít. Budou vybrány všechny dosud nezpracované položky. infoBulkUnresponsiveWindowHint = Tip\: Pokud se ukazatel průběhu zdá být nereagující a po chvíli není vidět žádný průběh zkuste kliknout na toto vyskakovací okno nebo změnit velikost okna prohlížeče. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = Všechny případy jsou již propojeny s vybrano messageAllCasesLinkedToEvent = Všechny případy byly propojeny s vybranou událostí. messageAllContactsAlreadyInEvent = Všechny kontakty jsou již propojeny s vybranou událostí. messageAllContactsLinkedToEvent = Všechny kontakty byly propojeny s vybranou událostí. -messageSomeContactsLinkedToEvent = Některé z vybraných kontaktů byly propojeny s vybranou událostí. messageAlreadyEventParticipant = Vybraná osoba je již definována jako účastník této události. messageAnimalContactsHint = Uveďte prosím odpověď týkající se všech zvířat (živých nebo mrtvých), jimž byla osoba přímo vystavena (např. při lovu, doteku, jídlem) během inkubační doby messageArchiveUndoneReasonMandatory = Přidejte prosím důvod pro vyjmutí z archivu @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=Není možné spojit případ s událos messageCaseSaved = Případ uložen messageCaseSavedClassificationChanged = Případ uložen. Klasifikace byla automaticky změněna na %s. messageCaseTransfered = Případ byl převeden do jiného zařízení -messageCasesNotDeleted = Případy uvedené ve výše uvedeném seznamu UUID nelze odstranit. -messageCasesNotDeletedExternalReason = Případy uvedené ve výše uvedeném seznamu UUID nemohly být odstraněny, protože komunikace s oznamovacím nástrojem selhala. -messageCasesDeleted = Všechny vybrané způsobilé případy byly odstraněny messageCaseOutsideJurisdictionDeletionDenied = Nelze odstranit případ mimo jurisdikci uživatele +messageCasesDeleted = Všechny vybrané způsobilé případy byly odstraněny messageCasesMerged = Případy sloučeny a duplicitní případ odstraněn. messageCasesRestored = Všechny vybrané případy byly obnoveny -messageContactsNotRestored = Kontakty uvedené ve výše uvedeném seznamu UUID nelze obnovit. messageContactsRestored = Všechny vybrané kontakty byly obnoveny -messageEventsNotRestored = Události uvedené ve výše uvedeném seznamu UUID nelze obnovit. messageEventsRestored = Všechny vybrané události byly obnoveny -messageEventParticipantsNotRestored = Účastníky události uvedení na výše uvedeném seznamu UUID nelze obnovit. messageEventParticipantsRestored = Všichni vybraní účastníci události byli obnoveni -messageImmunizationsNotDeleted = Imunizace uvedené ve výše uvedeném seznamu UUID nelze odstranit. messageImmunizationsDeleted = Všechny vybrané způsobilé imunizace byly odstraněny -messageImmunizationsNotRestored = Imunizace uvedené ve výše uvedeném seznamu UUID nelze obnovit. messageImmunizationsRestored = Všechny vybrané imunizace byly obnoveny -messageSamplesNotRestored = Vzorky uvedené ve výše uvedeném seznamu UUID nelze obnovit. messageSamplesRestored = Všechny vybrané vzorky byly obnoveny -messageTravelEntriesNotRestored = Místa vstupu uvedené ve výše uvedeném seznamu UUID nelze obnovit. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = Případy uvedené ve výše uvedeném seznamu UUID nelze obnovit. messageChangePathogenTestResult = Výsledek testu tohoto patogenu se liší od současného celkového výsledku testu patogenu vzorku. Chcete aktualizovat výsledek na %s? messageCheckInputData = Zkontrolujte prosím vstupní data messageClinicalCourseSaved = Klinický kurz byl uložen @@ -1084,7 +1109,6 @@ messageContactCreated=Nový kontakt byl vytvořen messageContactArchived = Kontakt byl archivován messageContactDearchived = Kontakt byl dearchivován messageContactSaved = Data kontaktu uložena -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = Kontakt mimo jurisdikci uživatele nelze odstranit messageContactDuplicateDeleted = Duplicitní kontakt byl odstraněn. @@ -1092,6 +1116,7 @@ messageContactsMerged = Kontakty byly sloučeny a duplicitní kontakt byl smazá messageCopyPassword = Prosím, zkopírujte toto heslo, zobrazí se pouze jednou. messageCountCasesAlreadyInEvent = %s případů již bylo s událostí spojeno, všechny ostatní byly propojeny. messageCountContactsAlreadyInEvent = %s kontaktů již bylo spojeno s událostí, všechny ostatní byly propojeny. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Nastavili jste podmínku vzorku na nevyhovující.
Chcete vytvořit nový úkol sběru vzorků? messageDatabaseExportFailed = Kontaktujte prosím administrátora a informujte ho o tomto problému messageEntryCreated = Položka vytvořena @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = Vybraná událost byla úspěšně propojena messageEventLinkedAsSubordinate = Vybraná událost byla úspěšně připojena k této události jako podřízená událost messageEventLinkedToGroup = Vybraná událost byla úspěšně propojena s touto skupinou událostí messageEventsLinkedToGroup = Vybrané událostí byly úspěšně propojeny s touto skupinou událostí -messageSomeEventsLinkedToGroup = Některé z vybraných událostí byly úspěšně propojeny s touto skupinou událostí messageEventOutsideJurisdictionDeletionDenied = Událost mimo jurisdikci uživatele nelze odstranit messageEventSuperordinateEventUnlinked = Spojení mezi touto událostí a její superordinate událostí bylo úspěšně odstraněno messageEventSubordinateEventUnlinked = Spojení mezi touto událostí a její podřízenou událostí bylo úspěšně odstraněno @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Uživatel události byl dearchivován messageEventParticipantCreated = Nová osoba vytvořena messageEventParticipantSaved = Údaje o osobě byly uloženy messageEventParticipantOutsideJurisdictionDeletionDenied = Účastníka události mimo jurisdikci uživatele nelze odstranit -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Změna nebo odstranění odpovědné jurisdikce účastníka této události by mohla způsobit ztrátu přístupu k jeho osobním údajům a/nebo znemožnit jeho budoucí úpravu. Jste si jisti, že chcete pokračovat? messageEventParticipantToCaseWithoutEventDisease=Není možné vytvářet případy od účastníka události, pokud nebyla zadána nemoc události @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=Není možné vytvořit kont messageEventJurisdictionUpdated = Změna nebo odstranění jurisdikce této události by mohla způsobit ztrátu přístupu k jejím osobním údajům a/nebo znemožnit její budoucí úpravu. Jste si jisti, že chcete pokračovat? messageEventSaved = Data událostí uložena messageEventGroupSaved = Skupina událostí byla uložena -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = Všechny vybrané události byly odeslány na SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s kontaktů není obnoveno. UUID kontaktu není obnoveno\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s událostí není obnoveno. UUID událostí nebyly obnoveny\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s účastníků události není obnoveno. UUID účastníků události není obnoveno\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s imunizace nebyla obnovena. UUIDy imunizací nebyly obnoveny\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s vzorků nebylo obnoveno. UUID vzorků nebylo obnoveno\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = Žádné události, které obsahují propojené účastníky událostí, nebudou smazány. Odstraňte účastníky události z události, abyste ji mohli odstranit. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Došlo k chybě bránící exportu dat. Kontaktujte prosím administrátora a informujte ho o tomto problému. messageExportConfigurationDeleted = Nastavení exportu odstraněno messageExportConfigurationSaved = Nastavení exportu uloženo messageFollowUpCanceled = Sledování všech vybraných kontaktů bylo zrušeno -messageFollowUpCanceledForSome = Sledování některých vybraných kontaktů bylo zrušeno messageFollowUpStatusChanged = Následná kontrola všech vybraných kontaktů, které byly ztraceny k následování -messageFollowUpStatusChangedForSome = Následná kontrola některých vybraných kontaktů, které byly následně ztraceny messageFacilityChanged = Změnili jste zařízení tohoto případu. Chcete přesunout případ do nového zařízení (hospitalizace může být aktualizována), nebo chcete pouze upravit data k nápravě chyby? messageFacilityMulitChanged = Změnili jste zařízení více případů. Chcete přenést tyto případy do nového zařízení (hospitalizace může být aktualizována), nebo chcete pouze upravit jejich data pro opravu chyb? messageGdpr = V souladu se zásadou minimalizace údajů uloženou GDPR, musíte zajistit, že zde zadáte pouze objektivní údaje, které jsou naprosto nezbytné pro zpracování souboru. Nesmíte zejména vkládat genetické nebo biometrické, filozofické, politické, náboženské údaje, odborářské názory, sexuální život nebo orientace, etnický původ, trestné činy, odsouzení, bezpečnostní opatření, trestní rejstřík . nebo jakékoli jiné údaje, které se netýkají veřejného zdravotního dohledu. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import úspěšný\!
Všechny řádky byly messageUploadSuccessful = Nahrávání úspěšné\! Nyní můžete toto okno zavřít. messageIncompleteGpsCoordinates = GPS souřadnice jsou neúplné messageExternalMessagesAssigned = Přiřazená osoba byla změněna pro všechny vybrané zprávy -messageExternalMessagesNotDeleted = Externí zprávy uvedené ve výše uvedeném seznamu UUID nelze odstranit. messageLoginFailed = Zkontrolujte své uživatelské jméno a heslo a zkuste to znovu messageMissingCases = Vygenerujte prosím některé případy před vytvořením kontaktů messageMissingDateFilter = Vyplňte prosím obě pole filtrování data @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Nevybrali jste žádné kontakty messageNoCsvFile = Nevybrali jste soubor, který chcete nahrát. Vyberte prosím soubor .csv obsahující data, která chcete importovat z vašeho počítače. messageNoDocumentTemplateUploadFile = Nevybrali jste soubor, který chcete nahrát. Vyberte prosím šablonu .docx, kterou chcete importovat z vašeho počítače. messageNoDocumentUploadFile = Nevybrali jste soubor, který chcete nahrát. Vyberte soubor, který chcete importovat z vašeho počítače. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = Žádná z vybraných událostí není způsobilá pro smazání +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = Nevybrali jste žádné prostředí messageNoEventParticipantsSelected = Nevybrali jste žádné účastníky události messageNoEventsSelected = Nevybrali jste žádné události @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = Vzorek zmíněný v této laboratoři již existuje. messageRelatedSampleAndLabMessagesFound = Zpráva laboratoře se stejným ID zprávy již byla zpracována. Souvisí se vzorkem odkazovaným v této laboratoři.
Chcete tento vzorek otevřít přímo? messageSampleErrors = Ve formuláři vzorku jsou chyby, opravte je a uložte vzorek, než jej předáte jiné laboratoři. messageSampleSaved = Data vzorku uložena -messageSamplesNotDeleted = Vzorky uvedené ve výše uvedeném seznamu UUID nelze odstranit. messageSamplesDeleted = Všechny vybrané způsobilé vzorky byly odstraněny messageSpecifyColumnAttribute = Zadejte atribut sloupce, který jste vybrali pro vizualizaci messageSpecifyFilterAttributes = Zadejte všechny vybrané atributy a podatributy filtru @@ -1237,7 +1293,6 @@ messageSymptomsHint = Zaškrtněte prosím odpověď pro VŠECHNY příznaky, messageSymptomsVisitHint = Zaškrtněte prosím odpověď pro VŠECHNY příznaky, které naznačují, zda byly přítomny v době této návštěvy\: messageTaskArchived = Úkol byl archivován messageTasksEdited = Všechny úkoly byly upraveny -messageTasksNotDeleted = Úkoly uvedené ve výše uvedeném seznamu UUID nelze odstranit. messageTaskDearchived = Úkol byl dearchivován messageTasksDeleted = Všechny vybrané způsobilé úkoly byly odstraněny messageTemplateNotAvailable = Soubor šablony není k dispozici. Kontaktujte prosím administrátora a řekněte mu o tomto problému. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Zadané údaje o cestování uloženy messageTravelEntryArchived = Místo vstupu bylo archivováno messageTravelEntryDearchived = Místo vstupu bylo vyjmuto z archivu messageTravelEntryPOEFilledBySystem = [System] Automaticky vyplněný vstupní bod -messageTravelEntriesNotDeleted = Místa vstupu uvedené ve výše uvedeném seznamu UUID nelze odstranit. messageTravelEntriesDeleted = Všechny vybrané záznamy o cestování byly odstraněny messageTreatmentCreated = Léčba vytvořena messageTreatmentSaved = Léčba uložena @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = Nemoc externí zprávy nebylo možné a messageUserRoleCombination = nelze kombinovat s messageUserRoleSaved = Uživatelská role uložena messageVaccinationOutsideJurisdictionDeletionDenied = Očkování mimo jurisdikci uživatele nelze odstranit -messageVisitsNotDeleted = Návštěvy uvedené ve výše uvedeném seznamu UUID nelze odstranit. messageVisitsDeleted = Všechny vybrané způsobilé návštěvy byly odstraněny +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Zadejte soubor .csv obsahující data, která chcete importovat. Doporučuje se použít soubor importované šablony jako výchozí bod. messageWrongTemplateFileType=Pro %s poskytněte soubor.%s . messageLineListingDisabled = Výpis řádků byl zakázán @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = Všechny vybrané způsobilé zprávy byly odst messageQuarantineOrderDocumentCreated = Doklad o příkazu karantény byl vytvořen messageUnavailableTaskEditionDueToDifferentDistricts = Editace úloh není k dispozici, pokud se týká různých okresů messageUsersEnabled = Všichni vybraní uživatelé byli povoleni -messageSomeUsersEnabled = Někteří z vybraných uživatelů byli povoleni messageUsersDisabled = Všichni vybraní uživatelé byli zakázáni -messageSomeUsersDisabled = Někteří z vybraných uživatelů byli zakázáni messageDontShareWithReportingToolWarning = Tento případ je aktivně blokován před zasíláním externím nástrojem pro hlášení zpráv messageBulkCasesWithDifferentDiseasesSelected = Vybrali jste případy s různými chorobami. Některé možnosti hromadné úpravy mohou být nedostupné. messageBulkContactsWithDifferentDiseasesSelected = Vybrali jste kontakty s různými chorobami. Některé možnosti hromadné úpravy mohou být nedostupné. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = Toto očkování není pro to messageVaccinationNoDateNotRelevantForEventParticipant = Toto očkování není pro tohoto účastníka události relevantní, protože nemá datum očkování. messageAcceptRequestToNavigate = Žádost ještě není přijata. Musíte ji nejprve přijmout, abyste tam mohli přejít. messageEntityNotFound = %s nebyl nalezen v systému. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = Ve vašem systému je alespoň jeden podobný případ. Pokud souhlasíte s požadavkem, možná bude případ ve vašem systému jako duplicitní.
Pokud ano, měli byste po přijetí konsolidovat případy.
Ujistěte se, že pro tento účel používáte přijatý případ. messageSormasToSormasSimilarConvertedCaseFound = Ve vašem systému je alespoň jeden podobný případ. Pokud souhlasíte s požadavkem, možná bude případ ve vašem systému jako duplicitní.
Pokud ano, měli byste tyto případy konsolidovat po přijetí.
Po konsolidaci případů může být nezbytné provést manuální přeměnu některých kontaktů na přijatý případ.
Ujistěte se, že k tomuto účelu používáte přijatý případ. messageSormasToSormasSimilarContactToCaseFound = Ve vašem systému existuje alespoň jeden podobný kontakt.
Po přijetí žádosti může být nezbytné provést manuální přeměnu těchto kontaktů na přijatý případ. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = Pro sloučení musíte vybrat dvě osoby\ messageAutomaticDeletionStarted = Automatické smazání bylo zahájeno a bude provedeno na pozadí. Vezměte prosím na vědomí, že v závislosti na množství dat, která jsou odstraněna, může tento proces nějakou dobu trvat. messageUserRoleUnusableForLogin = Uživatelé s pouze touto rolí se nebudou moci přihlásit, protože role nemá přístupové Sormas UI ani přístup k Sormas REST right messageUserRoleHasNoRights = Tato uživatelská role nemá žádná práva. Vyberte prosím alespoň jedno právo. -messageEntriesEditedExceptArchived = %s položek bylo úspěšně upraveno. Některé položky nemohly být upraveny, protože jsou v jiné jurisdikci nebo již byly archivovány. messageEntriesEdited = Všechny položky byly upraveny messageAllEntitiesArchived = Všechny vybrané položky byly archivovány -messageSomeEntitiesArchived = %s položek bylo archivováno. messageAllEntitiesDearchived = Všechny vybrané položky byly dearchivovány -messageSomeEntitiesDearchived = %s záznamů bylo dearchivováno. -messageEnvironmentCreated = Environment created -messageEnvironmentSaved = Environment saved -messageEnvironmentArchived = Environment has been archived -messageEnvironmentDearchived = Environment has been de-archived -messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted -messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. +messageEnvironmentCreated = Prostředí vytvořeno +messageEnvironmentSaved = Prostředí uloženo +messageEnvironmentArchived = Prostředí bylo archivováno +messageEnvironmentDearchived = Prostředí bylo dearchivováno +messageEnvironmentSampleOutsideJurisdictionDeletionDenied = Vzorek prostředí mimo jurisdikci uživatele nelze odstranit +messageEnvironmentJurisdictionUpdated = Změna umístění tohoto prostředí by mohla způsobit ztrátu přístupu k jeho podrobnostem a/nebo znemožnit budoucí úpravy. Opravdu chcete pokračovat? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = Klasifikace případu %s se změnila na %s. @@ -1426,7 +1483,7 @@ notificationTaskAssociatedCaseLink = Odkaz na související případ\: %s notificationTaskAssociatedContactLink = Odkaz na související kontakt\: %s notificationTaskAssociatedEventLink = Odkaz na související událost\: %s notificationTaskAssociatedTravelEntryLink = Odkaz na související cestovní záznam\: %s -notificationTaskAssociatedEnvironmentLink = Link to the associated environment entry\: %s +notificationTaskAssociatedEnvironmentLink = Odkaz na související položku prostředí\: %s notificationTaskGeneralUpdatedAssigneeUserSource = Váš %s úkol byl přiřazen jinému uživateli. Již nemáte na starosti tento úkol. notificationTaskGeneralUpdatedAssigneeUserTarget = %s úkol byl přiřazen na vás. notificationTaskSpecificUpdatedAssigneeUserSource = Váš %s úkol pro %s byl přiřazen jinému uživateli. Již nemáte na starosti tento úkol. @@ -1578,12 +1635,25 @@ promptTravelEntryEpiWeekTo = ... do epi týdne promptEnvironmentFreeTextSearch = UUID, External ID, Name, Description promptEnvironmentDateFrom = Datum hlášení od... promptEnvironmentDateTo = ... do -promptEnvironmentEpiWeekFrom = Report date from epi week... +promptEnvironmentEpiWeekFrom = Datum hlášení od týdne epi... promptEnvironmentEpiWeekTo = ... do epi týdne -promptEnvironmentLatFrom= Latitude from... +promptEnvironmentLatFrom= Zeměpisná šířka od... promptEnvironmentLatTo= ... do -promptEnvironmentLonFrom= Longitude from... +promptEnvironmentLonFrom= Zeměpisná délka od... promptEnvironmentLonTo= ... do +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratoř +promptEnvironmentSampleTestedPathogen = Testovaný patogen +promptEnvironmentSampleDateFrom = Datum hlášení od... +promptEnvironmentSampleDateTo = ... do +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Zeměpisná šířka prostředí od... +promptEnvironmentSampleLatTo= ... do +promptEnvironmentSampleLonFrom= Zeměpisná délka prostředí.od... +promptEnvironmentSampleLonTo= ... do # Unsaved changes unsavedChanges.warningTitle = Neuložené změny @@ -1603,9 +1673,9 @@ infoBAGExport=Plný export do SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Záznam byl odeslán do nástroje hlášení ExternalSurveillanceToolGateway.notificationEntriesSent = Všechny vybrané položky byly odeslány do oznamovacího nástroje. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Některé z vybraných položek byly odeslány do oznamovacího nástroje. ExternalSurveillanceToolGateway.notificationEntriesDeleted = Všechny vybrané položky byly úspěšně odstraněny v nástroji hlášení. ExternalSurveillanceToolGateway.notificationEntryNotSent = Záznam nemohl být odeslán +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Chyba při odesílání záznamu ExternalSurveillanceToolGateway.unableToSend=Před odesláním %s do nástroje hlášeníí uložte nebo vymažte všechny neuložené změny. ExternalSurveillanceToolGateway.confirmSendCase=Opravdu chcete odeslat případ do nástroje hlášení? diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index 820b1b99774..ef223b3917b 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -445,6 +445,8 @@ headingCaseImport = Fall Import headingPointOfEntryImport = Import Einreiseort headingCaseStatusMap = Fallstatuskarte headingCasesDeleted = Fälle gelöscht +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Konvertierung in Fall headingChangeCaseDisease = Fallerkrankung ändern headingCasesGuide = Leitfaden\: Fallverzeichnis @@ -466,6 +468,9 @@ headingUnderFollowUp = In der Nachverfolgung headingContactInformation = Kontaktinformationen headingContactMap = Kontakt-Karte headingContactsDeleted = Kontakte gelöscht +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Neue zusätzliche Testergebnisse erstellen headingCreateEntry = Eintrag erstellen headingCreateNewAction = Neue Aktion erstellen @@ -531,15 +536,24 @@ headingEditCountry = Land bearbeiten headingEditContinent = Kontinent bearbeiten headingEditSample = Probe bearbeiten headingEditSubcontinent = Subkontinent bearbeiten +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Umweltexpositionen headingEpiCurve = Epidemiologische Kurve headingErrorReportNotAvailable = Fehlerbericht nicht verfügbar headingEventData = Ereignisdaten headingEventGroupData = Ereignisgruppendaten headingEventParticipantsDeleted = Ereignisteilnehmer gelöscht +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Ereignisteilnehmer Zuständigkeitsaktualisierung headingEventJurisdictionUpdated = Ereignis Zuständigkeitsbereich Aktualisierung headingEventsDeleted = Ereignisse gelöscht +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export fehlgeschlagen headingFatalities=Todesfälle headingFileExists = Duplikatdatei @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Standard-Subkontinente importieren headingImportAreas = Gebiete Importieren headingImportRegions= Kantone importieren headingImportTravelEntries = Einreisen importieren +headingImportEnvironments = Import Environments headingInformationSource = Informationsquelle headingInfrastructureLocked = Infrastrukturdaten gesperrt headingIntroduction = Einführung @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Angeforderte Erregertests\: headingResponsibleJurisdiction=Zuständigkeitsbereich headingResults = Ergebnisse headingSamplesDeleted = Proben gelöscht +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Benachrichtigung speichern headingSecurityAlert=Sicherheitswarnung headingSelectCampaign = Kampagne auswählen @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Klinische Zeichen und Symptome headingSimilarImmunization = Ähnliche Immunisierung headingSyncUsers = Benutzer synchronisieren headingTasksDeleted = Aufgaben gelöscht +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Vorlage nicht verfügbar headingTests = Erregertests headingTransferCase = Fall übertragen headingTravelEntryData = Einreisedaten headingTravelEntriesDeleted = Einreisen gelöscht +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Fall vom Einreiseort weiterleiten headingTreatments = Ausgeführte Behandlungen headingTreatmentsDeleted = Behandlungen gelöscht @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Nachverfolgungsübersicht headingVisits = Anrufe headingVisitsDeleted = Anrufe gelöscht +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualisierung headingWrongFileType = Falscher Dateityp headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = Neue Fälle, die bisher nicht als Kontakte bekannt waren headingNoCaseFound = Kein Fall gefunden headingNoEventFound = Kein Ereignis gefunden headingEventNotDeleted = Ereignis nicht gelöscht -headingSomeCasesNotDeleted = Einige Fälle wurden nicht gelöscht headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Einige Ereignisse wurden nicht gelöscht -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Kontaktbestätigung erforderlich headingContactConversionFollowUpCommentLarge = Nachverfolgungs-Kommentar wird die maximal zulässige Anzahl von Zeichen überschreiten headingSelectSourceCase = Indexfall wählen @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export der Benutzerrechte fehlgeschlagen headingExternalMessageDownload = Meldung herunterladen headingNoExternalMessagesSelected = Keine Meldungen ausgewählt headingExternalMessagesDeleted = Meldungen gelöscht +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Korrekturmeldung headingExternalMessageProcessSample = Probe- und Erregertests verarbeiten headingExternalMessageSampleInformation = Probeninformation @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = Neue Erregertests headingFetchExternalMessages = Neue Meldungen abrufen headingCaution = Achtung headingUnavailableTaskEdition = Unverfügbare Aufgabenbearbeitung +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Impfungen entfernen headingDocumentCreated = Dokument erstellt headingConfirmUnclearLabMessage=Unklar bestätigen @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatisches Löschen gestartet headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Bitte dokumentieren Sie ALLE relevanten Aktivitäten nach der Infektion\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = Alle Fälle sind bereits mit dem ausgewählten E messageAllCasesLinkedToEvent = Alle Fälle wurden mit dem ausgewählten Ereignis verknüpft. messageAllContactsAlreadyInEvent = Alle Kontakte sind bereits mit dem ausgewählten Ereignis verknüpft. messageAllContactsLinkedToEvent = Alle Kontakte wurden mit dem ausgewählten Ereignis verknüpft. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = Die Person, die Sie ausgewählt haben, ist bereits als Ereignisteilnehmer dieser Veranstaltung definiert. messageAnimalContactsHint = Bitte geben Sie eine Antwort in Bezug auf ALLE Tiere (lebendig oder tot) an, denen die Person während der Inkubationszeit direkt ausgesetzt war (z.B. Jagd, Berühren, Essen). messageArchiveUndoneReasonMandatory = Bitte geben Sie einen Grund für die Dearchivierung an @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=Es ist nicht möglich, einen Fall mit e messageCaseSaved = Fall gespeichert messageCaseSavedClassificationChanged = Fall gespeichert. Die Falldefinitionskategorie wurde automatisch auf %s geändert. messageCaseTransfered = Fall wurde an eine andere Einrichtung übertragen -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Fälle wurden zusammengeführt und der doppelte Fall gelöscht. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = Das Ergebnis dieses Erregertests unterscheidet sich vom aktuellen allgemeinen Erregertestergebnis der Probe. Möchten Sie das Ergebnis auf %s aktualisieren? messageCheckInputData = Bitte überprüfen Sie die Eingabedaten messageClinicalCourseSaved = Klinischer Verlauf gespeichert @@ -1084,7 +1109,6 @@ messageContactCreated=Neuer Kontakt angelegt messageContactArchived = Kontakt wurde archiviert messageContactDearchived = Kontakt wurde dearchiviert messageContactSaved = Kontaktdaten gespeichert -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = Der doppelte Kontakt wurde gelöscht. @@ -1092,6 +1116,7 @@ messageContactsMerged = Kontakte wurden zusammengeführt und der doppelte Kontak messageCopyPassword = Bitte kopieren Sie dieses Passwort, es wird nur einmal angezeigt. messageCountCasesAlreadyInEvent = %s Fälle waren bereits mit dem Ereignis verknüpft, alle anderen wurden verknüpft. messageCountContactsAlreadyInEvent = %s Kontakte waren bereits mit dem Ereignis verknüpft, alle anderen wurden verknüpft. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Sie haben die Probenbedingung als unzureichend festgelegt.
Möchten Sie eine neue Probenentnahme-Aufgabe erstellen? messageDatabaseExportFailed = Bitte kontaktieren Sie einen Administrator und benachrichtigen Sie ihn über dieses Problem messageEntryCreated = Eintrag erstellt @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = Das ausgewählte Ereignis wurde erfolgreich messageEventLinkedAsSubordinate = Das ausgewählte Ereignis wurde erfolgreich als untergeordnetes Ereignis mit diesem Ereignis verknüpft messageEventLinkedToGroup = Das ausgewählte Ereignis wurde erfolgreich mit dieser Ereignisgruppe verknüpft messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = Die Verbindung zwischen diesem Ereignis und seinem übergeordneten Ereignis wurde erfolgreich entfernt messageEventSubordinateEventUnlinked = Die Verbindung zwischen diesem Ereignis und seinem untergeordneten Ereignis wurde erfolgreich entfernt @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Ereignisteilnehmer wurde dearchiviert messageEventParticipantCreated = Neue Person erstellt messageEventParticipantSaved = Personendaten gespeichert messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Das Ändern oder Entfernen des Zuständigkeitsbereiches dieses Ereignisteilnehmers könnte dazu führen, dass Sie den Zugriff auf seine persönlichen Daten verlieren und/oder es Ihnen nicht erlaubt wird, diese in der Zukunft zu bearbeiten. Sind Sie sicher, dass Sie fortfahren möchten? messageEventParticipantToCaseWithoutEventDisease=Es ist nicht möglich, Fälle über einen Ereignisteilnehmer zu erstellen, wenn die Krankheit zum Ereignis nicht festgelegt wurde @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=Es ist nicht möglich, einen messageEventJurisdictionUpdated = Das Ändern oder Entfernen des Zuständigkeitsbereiches dieses Ereignisteilnehmers könnte dazu führen, dass Sie den Zugriff auf seine persönlichen Daten verlieren und/oder es Ihnen nicht erlaubt wird, diese in der Zukunft zu bearbeiten. Sind Sie sicher, dass Sie fortfahren möchten? messageEventSaved = Ereignisdaten gespeichert messageEventGroupSaved = Ereignisgruppendaten gespeichert -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = Alle ausgewählten Ereignisse wurden an SurvNet gesendet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Es gab einen Fehler beim Export der Daten. Bitte kontaktieren Sie einen Administrator und informieren Sie ihn über dieses Problem. messageExportConfigurationDeleted = Exporteinstellung gelöscht messageExportConfigurationSaved = Exporteinstellung gespeichert messageFollowUpCanceled = Die Nachverfolgung aller ausgewählten Kontakte wurde abgebrochen -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Das Follow-up/die Nachverfolgung aller ausgewählten Kontakte mit Follow-up/Nachverfolgung wurde auf "Nachverfolgung nicht möglich" gesetzt -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = Sie haben die Einrichtung dieses Falls geändert. Möchten Sie den Fall an die neue Einrichtung übertragen (der Krankenhausaufenthalt würde möglicherweise aktualisiert werden) oder nur die Daten bearbeiten, um einen Fehler zu korrigieren? messageFacilityMulitChanged = Sie haben die Einrichtung mehrerer Fälle geändert. Möchten Sie diese Fälle an die neue Einrichtung übertragen (der Krankenhausaufenthalt würde möglicherweise aktualisiert werden) oder nur die Daten bearbeiten, um einen Fehler zu korrigieren? messageGdpr = Gemäss dem von der DSGVO/GDPR vorgeschriebenen Prinzip der Datenminimierung müssen Sie sicherstellen, dass Sie hier nur objektive Daten eingeben, die für die Verarbeitung der Datei absolut notwendig sind. Insbesondere dürfen Sie weder genetische noch biometrische Daten eingeben, noch philosophische, politische, religiöse und gewerkschaftliche Meinungen, sexuelles Leben oder Orientierung, ethnische Herkunft, Straftaten, Verurteilungen, Sicherheitsmassnahmen ... oder andere Daten, die nicht mit der Gesundheitsbefragung zusammenhängen. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import erfolgreich\!
Alle Zeilen wurden imp messageUploadSuccessful = Erfolgreich hochgeladen\! Sie können dieses Fenster nun schliessen. messageIncompleteGpsCoordinates = GPS-Koordinaten sind unvollständig messageExternalMessagesAssigned = Die Zuweisung wurde für alle ausgewählten Meldungen geändert -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Überprüfen Sie Benutzername und Passwort und versuchen Sie es noch einmal messageMissingCases = Bitte erzeugen Sie einige Fälle, bevor Sie Kontakte generieren messageMissingDateFilter = Bitte beide Datums-Felder ausfüllen @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Sie haben keine Kontakte ausgewählt messageNoCsvFile = Sie haben keine Datei zum Hochladen ausgewählt. Bitte wählen Sie eine .csv-Datei, die die Daten enthält, die Sie von Ihrem Computer importieren möchten. messageNoDocumentTemplateUploadFile = Sie haben keine Datei zum Hochladen ausgewählt. Bitte wählen Sie eine .docx Dateivorlage, die Sie von Ihrem Computer importieren möchten. messageNoDocumentUploadFile = Sie haben keine Datei zum Hochladen ausgewählt. Bitte wählen Sie eine Datei aus, die Sie von Ihrem Computer importieren möchten. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = Sie haben keine Teilnehmer*innen ausgewählt messageNoEventsSelected = Sie haben keine Ereignisse ausgewählt @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = Die in dieser Labormeldung referenzierte Probe schei messageRelatedSampleAndLabMessagesFound = Eine Labormeldung mit der gleichen Meldungs-ID wurde bereits verarbeitet. Sie ist mit einer Probe verknüpft, die auch in dieser Labormeldung referenziert wird.
Möchten Sie diese Probe direkt öffnen? messageSampleErrors = Es gibt Fehler im Probenformular. Bitte korrigieren Sie diese und speichern Sie die Probe, bevor Sie sie an ein anderes Labor weiterleiten. messageSampleSaved = Probendaten gespeichert -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Bitte geben Sie das Spaltenattribut an, das Sie für die Visualisierung ausgewählt haben messageSpecifyFilterAttributes = Bitte geben Sie alle ausgewählten Filterattribute und Unterattribute an @@ -1237,7 +1293,6 @@ messageSymptomsHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um a messageSymptomsVisitHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzeigen, ob sie während des Anrufs präsent waren\: messageTaskArchived = Die Aufgabe wurde archiviert messageTasksEdited = Alle Aufgaben wurden bearbeitet -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = Die Aufgabe wurde dearchiviert messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Die Vorlagen-Datei ist nicht verfügbar. Bitte kontaktieren Sie einen Administrator und teilen Sie ihm dieses Problem mit. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Einreisedaten gespeichert messageTravelEntryArchived = Einreise wurde archiviert messageTravelEntryDearchived = Einreise wurde dearchiviert messageTravelEntryPOEFilledBySystem = [System] Automatisch befüllter Einreiseort -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Behandlung erstellt messageTreatmentSaved = Behandlung gespeichert @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = Die Krankheit der Meldung konnte nicht messageUserRoleCombination = kann nicht kombiniert werden mit messageUserRoleSaved = Benutzerrolle gespeichert messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Bitte stellen Sie eine .csv-Datei bereit, die die Daten enthält, die Sie importieren möchten. Es wird empfohlen, die Importvorlagen-Datei als Ausgangspunkt zu verwenden. messageWrongTemplateFileType=Für %s geben Sie bitte eine .%s -Datei an. messageLineListingDisabled = Line Listing/Zeilenauflistung wurde deaktiviert @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Dokument wurde erstellt messageUnavailableTaskEditionDueToDifferentDistricts = Die Aufgabenbearbeitung ist nicht verfügbar, wenn sie mit verschiedenen Bezirken verknüpft sind messageUsersEnabled = Alle ausgewählten Benutzer wurden aktiviert -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = Alle ausgewählten Benutzer wurden deaktiviert -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = Dieser Fall wird aktiv daran gehindert, an die Meldesoftware gesendet zu werden messageBulkCasesWithDifferentDiseasesSelected = Sie haben Fälle mit unterschiedlichen Krankheiten ausgewählt. Einige Massenbearbeitungsoptionen sind möglicherweise nicht verfügbar. messageBulkContactsWithDifferentDiseasesSelected = Sie haben Kontakte mit verschiedenen Krankheiten ausgewählt. Einige Massenbearbeitungsoptionen sind möglicherweise nicht verfügbar. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = Diese Impfung ist für diesen messageVaccinationNoDateNotRelevantForEventParticipant = Die Relevanz dieser Impfung für diesen Ereignisteilnehmer kann aufgrund des fehlenden Impfdatums nicht ermittelt werden. messageAcceptRequestToNavigate = Die Übergabe wurde noch nicht übernommen. Sie müssen sie zuerst übernehmen, um dorthin navigieren zu können. messageEntityNotFound = Der %s wurde im System nicht gefunden. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = Es gibt mindestens einen ähnlichen Fall in Ihrem System. Wenn Sie die Anfrage annehmen, wird der Fall möglicherweise als Duplikat in Ihrem System sein.
Wenn ja, sollten Sie die Fälle nach der Annahme konsolidieren.
Bitte stellen Sie sicher, dass Sie den akzeptierten Fall für diesen Zweck verwenden. messageSormasToSormasSimilarConvertedCaseFound = Es gibt mindestens einen ähnlichen Fall in Ihrem System. Wenn Sie die Anfrage annehmen, wird der Fall möglicherweise als Duplikat in Ihrem System sein.
Wenn ja, sollten Sie die Fälle nach der Annahme konsolidieren.
Nach der Konsolidierung der Fälle kann es notwendig sein, eine manuelle Konvertierung einiger Kontakte in den akzeptierten Fall durchzuführen.
Bitte stellen Sie sicher, dass Sie den akzeptierten Fall für diesen Zweck verwenden. messageSormasToSormasSimilarContactToCaseFound = Es gibt mindestens einen ähnlichen Kontakt in Ihrem System.
Nach der Annahme der Anfrage kann es notwendig sein, eine manuelle Konvertierung dieser Kontakte in den akzeptierten Fall durchzuführen. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = Sie müssen zwei Personen zum Zusammenfü messageAutomaticDeletionStarted = Automatisches Löschen wurde gestartet und wird im Hintergrund ausgeführt. Bitte beachten Sie, dass dieser Prozess je nach Anzahl der zu löschenden Daten einige Zeit in Anspruch nehmen kann. messageUserRoleUnusableForLogin = Benutzer mit nur dieser Rolle können sich nicht anmelden, da die Rolle weder Zugang Sormas UI noch Zugang Sormas REST Rechte hat messageUserRoleHasNoRights = Diese Benutzerrolle hat keine Rechte. Bitte wählen Sie mindestens ein Recht aus. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Ungespeicherte Änderungen @@ -1603,9 +1673,9 @@ infoBAGExport=Vollständiger Export zu SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Eintrag wurde an die Meldesoftware gesendet ExternalSurveillanceToolGateway.notificationEntriesSent = Alle ausgewählten Einträge wurden an die Meldesoftware gesendet. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = Alle ausgewählten Einträge wurden erfolgreich in der Meldesoftware gelöscht. ExternalSurveillanceToolGateway.notificationEntryNotSent = Eintrag konnte nicht gesendet werden +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Fehler beim Senden des Eintrags ExternalSurveillanceToolGateway.unableToSend=Bitte speichern oder verwerfen Sie ungespeicherte Änderungen, bevor Sie %s an die Meldesoftware senden. ExternalSurveillanceToolGateway.confirmSendCase=Sind Sie sicher, dass Sie den Fall an die Meldesoftware senden möchten? diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index dd9d497948e..7e5d57ecc60 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -445,6 +445,8 @@ headingCaseImport = Fall Import headingPointOfEntryImport = Import Einreiseort headingCaseStatusMap = Fallstatuskarte headingCasesDeleted = Fälle gelöscht +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Konvertierung in Fall headingChangeCaseDisease = Fallerkrankung ändern headingCasesGuide = Leitfaden\: Fallverzeichnis @@ -466,6 +468,9 @@ headingUnderFollowUp = In der Nachverfolgung headingContactInformation = Kontaktinformationen headingContactMap = Kontakt-Karte headingContactsDeleted = Kontakte gelöscht +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Neue zusätzliche Testergebnisse erstellen headingCreateEntry = Eintrag erstellen headingCreateNewAction = Neue Aktion erstellen @@ -531,15 +536,24 @@ headingEditCountry = Land bearbeiten headingEditContinent = Kontinent bearbeiten headingEditSample = Probe bearbeiten headingEditSubcontinent = Subkontinent bearbeiten +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Umweltexpositionen headingEpiCurve = Epidemiologische Kurve headingErrorReportNotAvailable = Fehlerbericht nicht verfügbar headingEventData = Ereignisdaten headingEventGroupData = Ereignisgruppendaten headingEventParticipantsDeleted = Ereignisteilnehmer gelöscht +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Ereignisteilnehmer Zuständigkeitsaktualisierung headingEventJurisdictionUpdated = Ereignis Zuständigkeitsbereich Aktualisierung headingEventsDeleted = Ereignisse gelöscht +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export fehlgeschlagen headingFatalities=Todesfälle headingFileExists = Duplikatdatei @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Standard-Subkontinente importieren headingImportAreas = Gebiete Importieren headingImportRegions= Bundesländer importieren headingImportTravelEntries = Einreisen importieren +headingImportEnvironments = Import Environments headingInformationSource = Informationsquelle headingInfrastructureLocked = Infrastrukturdaten gesperrt headingIntroduction = Einführung @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Angeforderte Erregertests\: headingResponsibleJurisdiction=Zuständigkeitsbereich headingResults = Ergebnisse headingSamplesDeleted = Proben gelöscht +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Benachrichtigung speichern headingSecurityAlert=Sicherheitswarnung headingSelectCampaign = Kampagne auswählen @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Klinische Zeichen und Symptome headingSimilarImmunization = Ähnliche Immunisierung headingSyncUsers = Benutzer synchronisieren headingTasksDeleted = Aufgaben gelöscht +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Vorlage nicht verfügbar headingTests = Erregertests headingTransferCase = Fall übertragen headingTravelEntryData = Einreisedaten headingTravelEntriesDeleted = Einreisen gelöscht +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Fall vom Einreiseort weiterleiten headingTreatments = Ausgeführte Behandlungen headingTreatmentsDeleted = Behandlungen gelöscht @@ -674,6 +694,9 @@ headingViewVaccination = Impfung anzeigen headingViewVisit = Nachverfolgungsübersicht headingVisits = Anrufe headingVisitsDeleted = Anrufe gelöscht +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualisierung headingWrongFileType = Falscher Dateityp headingWaterUse = Wasserverbrauch @@ -705,6 +728,9 @@ headingCasesRestored = Fälle wiederhergestellt headingContactsRestored = Kontakte wiederhergestellt headingEventsRestored = Ereignisse wiederhergestellt headingEventParticipantsRestored = Ereignisteilnehmer wiederhergestellt +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunisierungen wiederhergestellt headingSamplesRestored = Proben wiederhergestellt headingTravelEntriesRestored = Einreisemeldungen wiederhergestellt @@ -717,22 +743,23 @@ headingNewSourceCases = Neue Fälle, die bisher nicht als Kontakte bekannt waren headingNoCaseFound = Kein Fall gefunden headingNoEventFound = Kein Ereignis gefunden headingEventNotDeleted = Ereignisse nicht gelöscht -headingSomeCasesNotDeleted = Einige Fälle wurden nicht gelöscht headingSomeCasesNotRestored = Einige Fälle wurden nicht wiederhergestellt -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Einige Kontakte wurden nicht wiederhergestellt -headingSomeEventsNotRestored = Einige Ereignisse wurden nicht wiederhergestellt -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Einige Ereignisteilnehmer wurden nicht wiederhergestellt +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Einige Ereignisse wurden nicht wiederhergestellt headingSomeImmunizationsNotRestored = Einige Immunisierungen wurden nicht wiederhergestellt -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Einige Proben wurden nicht wiederhergestellt -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Einige Einreisemeldungen wurden nicht wiederhergestellt -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Einige Ereignisse wurden nicht gelöscht -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Kontaktbestätigung erforderlich headingContactConversionFollowUpCommentLarge = Nachverfolgungs-Kommentar wird die maximal zulässige Anzahl von Zeichen überschreiten headingSelectSourceCase = Indexfall wählen @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export der Benutzerrechte fehlgeschlagen headingExternalMessageDownload = Meldung herunterladen headingNoExternalMessagesSelected = Keine Meldungen ausgewählt headingExternalMessagesDeleted = Meldungen gelöscht +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Korrekturmeldung headingExternalMessageProcessSample = Probe- und Erregertests verarbeiten headingExternalMessageSampleInformation = Probeninformation @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = Neue Erregertests headingFetchExternalMessages = Neue Meldungen abrufen headingCaution = Achtung headingUnavailableTaskEdition = Unverfügbare Aufgabenbearbeitung +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Impfungen entfernen headingDocumentCreated = Dokument erstellt headingConfirmUnclearLabMessage=Unklar bestätigen @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatisches Löschen gestartet headingBulkOperationProgress = Fortschritt bei der Massenverarbeitung headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Bitte dokumentieren Sie ALLE relevanten Betreuungen, Unterbringungen und Tätigkeiten in Einrichtungen\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = Wenn ein Fall mehrere Proben hat, wird nur infoBulkProcess = %d ausgewählte Einträge werden derzeit verarbeitet. Dies kann eine Weile dauern. Der Fortschritt wird für jede 20 Einträge aktualisiert, die bearbeitet wurden. infoBulkProcessFinished = Alle ausgewählten Einträge wurden verarbeitet\!
Sie können nun dieses Fenster schließen. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Massenverarbeitung wurde abgebrochen\!
Alle ausgewählten Einträge bis zu diesem Punkt verarbeitet. Sie können dieses Fenster nun schließen. Alle noch nicht bearbeiteten Einträge werden weiterhin ausgewählt. infoBulkUnresponsiveWindowHint = Tipp\: Wenn der Fortschrittsbalken nicht reagiert und nach einer Weile kein Fortschritt sichtbar ist versuchen Sie auf dieses Popup-Fenster zu klicken oder die Größe Ihres Browserfensters zu verändern. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = Alle Fälle sind bereits mit dem ausgewählten E messageAllCasesLinkedToEvent = Alle Fälle wurden mit dem ausgewählten Ereignis verknüpft. messageAllContactsAlreadyInEvent = Alle Kontakte sind bereits mit dem ausgewählten Ereignis verknüpft. messageAllContactsLinkedToEvent = Alle Kontakte wurden mit dem ausgewählten Ereignis verknüpft. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = Die Person, die Sie ausgewählt haben, ist bereits als Ereignisteilnehmer dieser Veranstaltung definiert. messageAnimalContactsHint = Bitte geben Sie eine Antwort in Bezug auf ALLE Tiere (lebendig oder tot) an, denen die Person während der Inkubationszeit direkt ausgesetzt war (z.B. Jagd, Berühren, Essen). messageArchiveUndoneReasonMandatory = Bitte geben Sie einen Grund für die Wiedereröffnung an @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=Es ist nicht möglich, einen Fall mit e messageCaseSaved = Fall gespeichert messageCaseSavedClassificationChanged = Fall gespeichert. Die Falldefinitionskategorie wurde automatisch auf %s geändert. messageCaseTransfered = Fall wurde an eine andere Einrichtung übertragen -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = Der Fall außerhalb der Zuständigkeit des Benutzers kann nicht gelöscht werden +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Fälle wurden zusammengeführt und der doppelte Fall gelöscht. messageCasesRestored = Alle ausgewählten Fälle wurden wiederhergestellt -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = Alle ausgewählten Konakte wurden wiederhergestellt -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = Alle ausgewählten Ereignisse wurden wiederhergestellt -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = Alle ausgewählten Ereignisteilnehmenden wurden wiederhergestellt -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = Alle ausgewählten Immunisierungen wurden wiederhergestellt -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = Alle ausgewählten Probe wurden wiederhergestellt -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = Alle ausgewählten Einreisemeldungen wurden wiederhergestellt -messageCasesNotRestored = Die in der obigen Liste der UUIDs genannten Fälle konnten nicht wiederhergestellt werden. messageChangePathogenTestResult = Das Ergebnis dieses Erregertests unterscheidet sich vom aktuellen allgemeinen Erregertestergebnis der Probe. Möchten Sie das Ergebnis auf %s aktualisieren? messageCheckInputData = Bitte überprüfen Sie die Eingabedaten messageClinicalCourseSaved = Klinischer Verlauf gespeichert @@ -1084,7 +1109,6 @@ messageContactCreated=Neuer Kontakt angelegt messageContactArchived = Kontakt wurde abgeschlossen messageContactDearchived = Kontakt wurde wiedereröffnet messageContactSaved = Kontaktdaten gespeichert -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = Der Kontakt außerhalb der Zuständigkeit des Benutzers kann nicht gelöscht werden messageContactDuplicateDeleted = Der doppelte Kontakt wurde gelöscht. @@ -1092,6 +1116,7 @@ messageContactsMerged = Kontakte wurden zusammengeführt und der doppelte Kontak messageCopyPassword = Bitte kopieren Sie dieses Passwort, es wird nur einmal angezeigt. messageCountCasesAlreadyInEvent = %s Fälle waren bereits mit dem Ereignis verknüpft, alle anderen wurden verknüpft. messageCountContactsAlreadyInEvent = %s Kontakte waren bereits mit dem Ereignis verknüpft, alle anderen wurden verknüpft. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Sie haben die Probenbedingung als unzureichend festgelegt.
Möchten Sie eine neue Probenentnahme-Aufgabe erstellen? messageDatabaseExportFailed = Bitte kontaktieren Sie einen Administrator und benachrichtigen Sie ihn über dieses Problem messageEntryCreated = Eintrag erstellt @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = Das ausgewählte Ereignis wurde erfolgreich messageEventLinkedAsSubordinate = Das ausgewählte Ereignis wurde erfolgreich als untergeordnetes Ereignis mit diesem Ereignis verknüpft messageEventLinkedToGroup = Das ausgewählte Ereignis wurde erfolgreich mit dieser Ereignisgruppe verknüpft messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = Das Ereignis außerhalb der Zuständigkeit des Benutzers kann nicht gelöscht werden messageEventSuperordinateEventUnlinked = Die Verbindung zwischen diesem Ereignis und seinem übergeordneten Ereignis wurde erfolgreich entfernt messageEventSubordinateEventUnlinked = Die Verbindung zwischen diesem Ereignis und seinem untergeordneten Ereignis wurde erfolgreich entfernt @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Ereignisteilnehmer wurde wiedereröffnet messageEventParticipantCreated = Neue Person erstellt messageEventParticipantSaved = Personendaten gespeichert messageEventParticipantOutsideJurisdictionDeletionDenied = Der Ereignisteilnehmer außerhalb der Zuständigkeit des Benutzers kann nicht gelöscht werden -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Das Ändern oder Entfernen des Zuständigkeitsbereiches dieses Ereignisteilnehmers könnte dazu führen, dass Sie den Zugriff auf seine persönlichen Daten verlieren und/oder es Ihnen nicht erlaubt wird, diese in der Zukunft zu bearbeiten. Sind Sie sicher, dass Sie fortfahren möchten? messageEventParticipantToCaseWithoutEventDisease=Es ist nicht möglich, Fälle über einen Ereignisteilnehmer zu erstellen, wenn die Krankheit zum Ereignis nicht festgelegt wurde @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=Es ist nicht möglich, einen messageEventJurisdictionUpdated = Das Ändern oder Entfernen des Zuständigkeitsbereiches dieses Ereignisteilnehmers könnte dazu führen, dass Sie den Zugriff auf seine persönlichen Daten verlieren und/oder es Ihnen nicht erlaubt wird, diese in der Zukunft zu bearbeiten. Sind Sie sicher, dass Sie fortfahren möchten? messageEventSaved = Ereignisdaten gespeichert messageEventGroupSaved = Ereignisgruppendaten gespeichert -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = Alle ausgewählten Ereignisse wurden an SurvNet gesendet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s Fälle nicht wiederhergestellt. UUIDs von Fällen nicht wiederhergestellt\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s Kontakte nicht wiederhergestellt. UUIDs von nicht wiederhergestellten Kontakten\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s Ereignisse nicht wiederhergestellt. UUIDs von nicht wiederhergestellten Ereignissen\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s Ereignissteilnehmende nicht wiederhergestellt. UUIDs von nicht wiederhergestellten Ereignissteilnehmenden\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s Immunisierungen nicht wiederhergestellt. UUIDs von nicht wiederhergestellten Immunisierungen\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s Proben nicht wiederhergestellt. UUIDs von nicht wiederhergestellten Proben\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s Ereignisteilnehmer nicht wiederhergestellt. UUIDs von nicht wiederhergestellten Ereignisteilnehmern\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Es gab einen Fehler beim Export der Daten. Bitte kontaktieren Sie einen Administrator und informieren Sie ihn über dieses Problem. messageExportConfigurationDeleted = Exporteinstellung gelöscht messageExportConfigurationSaved = Exporteinstellung gespeichert messageFollowUpCanceled = Die Nachverfolgung aller ausgewählten Kontakte wurde abgebrochen -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Die Nachverfolgung aller ausgewählten Kontakte mit Nachverfolgung wurde auf "Nachverfolgung nicht möglich" gesetzt -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = Sie haben die Einrichtung dieses Falls geändert. Möchten Sie den Fall an die neue Einrichtung übertragen (der Krankenhausaufenthalt wird aktualisiert) oder nur die Daten bearbeiten, um einen Fehler zu korrigieren? messageFacilityMulitChanged = Sie haben die Einrichtung mehrerer Fälle geändert. Möchten Sie den Fall an die neue Einrichtung übertragen (der Krankenhausaufenthalt wird möglicherweise aktualisiert) oder nur die Daten bearbeiten, um einen Fehler zu korrigieren? messageGdpr = Gemäß dem von der DSGVO vorgeschriebenen Prinzip der Datenminimierung müssen Sie sicherstellen, dass Sie hier nur objektive Daten eingeben, die für die Verarbeitung der Daten absolut notwendig sind. Insbesondere dürfen Sie weder biometrische, philosophische, politische oder religiöse Daten, noch gewerkschaftliche Meinungen, sexuelles Leben oder Orientierung, ethnische Herkunft, Straftaten, Verurteilungen, Sicherheitsmaßnahmen, Vorbestrafungen ... oder andere Daten, die nicht mit der Gesundheitsbefragung zusammenhängen eingeben. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import erfolgreich\!
Alle Zeilen wurden imp messageUploadSuccessful = Erfolgreich hochgeladen\! Sie können dieses Fenster nun schließen. messageIncompleteGpsCoordinates = GPS-Koordinaten sind unvollständig messageExternalMessagesAssigned = Die Zuweisung wurde für alle ausgewählten Meldungen geändert -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Überprüfen Sie Benutzername und Passwort und versuchen Sie es noch einmal messageMissingCases = Bitte erzeugen Sie einige Fälle, bevor Sie Kontakte generieren messageMissingDateFilter = Bitte beide Datums-Felder ausfüllen @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Sie haben keine Kontakte ausgewählt messageNoCsvFile = Sie haben keine Datei zum Hochladen ausgewählt. Bitte wählen Sie eine .csv-Datei, die die Daten enthält, die Sie von Ihrem Computer importieren möchten. messageNoDocumentTemplateUploadFile = Sie haben keine Datei zum Hochladen ausgewählt. Bitte wählen Sie eine .docx Dateivorlage, die Sie von Ihrem Computer importieren möchten. messageNoDocumentUploadFile = Sie haben keine Datei zum Hochladen ausgewählt. Bitte wählen Sie eine Datei aus, die Sie von Ihrem Computer importieren möchten. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = Sie haben keine Umgebungen ausgewählt messageNoEventParticipantsSelected = Sie haben keine Teilnehmer*innen ausgewählt messageNoEventsSelected = Sie haben keine Ereignisse ausgewählt @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = Die in dieser Labormeldung referenzierte Probe schei messageRelatedSampleAndLabMessagesFound = Eine Labormeldung mit der gleichen Meldungs-ID wurde bereits verarbeitet. Sie ist mit einer Probe verknüpft, die auch in dieser Labormeldung referenziert wird.
Möchten Sie diese Probe direkt öffnen? messageSampleErrors = Es gibt Fehler im Probenformular. Bitte korrigieren Sie diese und speichern Sie die Probe, bevor Sie sie an ein anderes Labor weiterleiten. messageSampleSaved = Probendaten gespeichert -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Bitte geben Sie das Spaltenattribut an, das Sie für die Visualisierung ausgewählt haben messageSpecifyFilterAttributes = Bitte geben Sie alle ausgewählten Filterattribute und Unterattribute an @@ -1237,7 +1293,6 @@ messageSymptomsHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um a messageSymptomsVisitHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzuzeigen, ob sie während des Anrufs präsent waren\: messageTaskArchived = Die Aufgabe wurde archiviert messageTasksEdited = Alle Aufgaben wurden bearbeitet -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = Die Aufgabe wurde dearchiviert messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Die Vorlagen-Datei ist nicht verfügbar. Bitte kontaktieren Sie einen Administrator und teilen Sie ihm dieses Problem mit. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Einreisedaten gespeichert messageTravelEntryArchived = Einreise wurde abgeschlossen messageTravelEntryDearchived = Einreise wurde wiedereröffnet messageTravelEntryPOEFilledBySystem = [System] Automatisch befüllter Einreiseort -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Behandlung erstellt messageTreatmentSaved = Behandlung gespeichert @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = Die Krankheit der externen Meldung konn messageUserRoleCombination = kann nicht kombiniert werden mit messageUserRoleSaved = Benutzerrolle gespeichert messageVaccinationOutsideJurisdictionDeletionDenied = Die Impfung außerhalb der Zuständigkeit des Benutzers kann nicht gelöscht werden -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Bitte stellen Sie eine .csv-Datei bereit, die die Daten enthält, die Sie importieren möchten. Es wird empfohlen, die Importvorlagen-Datei als Ausgangspunkt zu verwenden. messageWrongTemplateFileType=Für %s geben Sie bitte eine .%s -Datei an. messageLineListingDisabled = Line Listing/Zeilenauflistung wurde deaktiviert @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Dokument wurde erstellt messageUnavailableTaskEditionDueToDifferentDistricts = Die Aufgabenbearbeitung ist nicht verfügbar, wenn sie mit verschiedenen Landkreisen verknüpft sind messageUsersEnabled = Alle ausgewählten Benutzer wurden aktiviert -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = Alle ausgewählten Benutzer wurden deaktiviert -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = Dieser Fall wird aktiv daran gehindert, an die Meldesoftware gesendet zu werden messageBulkCasesWithDifferentDiseasesSelected = Sie haben Fälle mit unterschiedlichen Krankheiten ausgewählt. Einige Massenbearbeitungsoptionen sind möglicherweise nicht verfügbar. messageBulkContactsWithDifferentDiseasesSelected = Sie haben Kontakte mit verschiedenen Krankheiten ausgewählt. Einige Massenbearbeitungsoptionen sind möglicherweise nicht verfügbar. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = Diese Impfung ist für diesen messageVaccinationNoDateNotRelevantForEventParticipant = Die Relevanz dieser Impfung für diesen Ereignisteilnehmer kann aufgrund des fehlenden Impfdatums nicht ermittelt werden. messageAcceptRequestToNavigate = Die Übrgabe wurde noch nicht übernommen. Sie müssen sie zuerst übernehmen, um dorthin navigieren zu können. messageEntityNotFound = Der %s wurde im System nicht gefunden. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = Es gibt mindestens einen ähnlichen Fall in Ihrem System. Wenn Sie die Anfrage annehmen, wird der Fall möglicherweise als Duplikat in Ihrem System sein.
Wenn ja, sollten Sie die Fälle nach der Annahme zusammenführen.
Bitte stellen Sie sicher, dass Sie den akzeptierten Fall für diesen Zweck verwenden. messageSormasToSormasSimilarConvertedCaseFound = Es gibt mindestens einen ähnlichen Fall in Ihrem System. Wenn Sie die Anfrage annehmen, wird der Fall möglicherweise als Duplikat in Ihrem System sein.
Wenn ja, sollten Sie die Fälle nach der Annahme zusammenführen.
Nach dem Zusammenführen der Fälle kann es notwendig sein, eine manuelle Konvertierung einiger Kontakte in den akzeptierten Fall durchzuführen.
Bitte stellen Sie sicher, dass Sie den akzeptierten Fall für diesen Zweck verwenden. messageSormasToSormasSimilarContactToCaseFound = Es gibt mindestens einen ähnlichen Kontakt in Ihrem System.
Nach der Annahme der Anfrage kann es notwendig sein, eine manuelle Konvertierung dieser Kontakte in den akzeptierten Fall durchzuführen. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = Sie müssen zwei Personen zum Zusammenfü messageAutomaticDeletionStarted = Automatisches Löschen wurde gestartet und wird im Hintergrund ausgeführt. Bitte beachten Sie, dass dieser Prozess je nach Anzahl der zu löschenden Daten einige Zeit in Anspruch nehmen kann. messageUserRoleUnusableForLogin = Benutzer mit nur dieser Rolle können sich nicht anmelden, da die Rolle weder Zugang Sormas UI noch Zugang Sormas REST Rechte hat messageUserRoleHasNoRights = Diese Benutzerrolle hat keine Rechte. Bitte wählen Sie mindestens ein Recht aus. -messageEntriesEditedExceptArchived = %s Einträge wurden erfolgreich bearbeitet. Einige Einträge konnten nicht bearbeitet werden, da sie in einem anderen Zuständigkeitsbereich liegen oder bereits abgeschlossen wurden. messageEntriesEdited = Alle Entitäten wurden bearbeitet messageAllEntitiesArchived = Alle ausgewählten Einträge wurden archiviert -messageSomeEntitiesArchived = %s Einträge wurden archiviert. messageAllEntitiesDearchived = Alle ausgewählten Einträge wurden de-archiviert -messageSomeEntitiesDearchived = %s Einträge wurden dearchiviert. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Umgebung erstellt messageEnvironmentSaved = Umgebung gespeichert messageEnvironmentArchived = Umgebung wurde archiviert messageEnvironmentDearchived = Umgebung wurde de-archiviert messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Breitengrad von... promptEnvironmentLatTo= ... bis promptEnvironmentLonFrom= Längengrad von... promptEnvironmentLonTo= ... bis +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Ungespeicherte Änderungen @@ -1603,9 +1673,9 @@ infoBAGExport=Kompletter Export zu SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Eintrag wurde an die Meldesoftware gesendet ExternalSurveillanceToolGateway.notificationEntriesSent = Alle ausgewählten Einträge wurden an die Meldesoftware gesendet. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = Alle ausgewählten Einträge wurden erfolgreich in der Meldesoftware gelöscht. ExternalSurveillanceToolGateway.notificationEntryNotSent = Eintrag konnte nicht gesendet werden +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Fehler beim Senden des Eintrags ExternalSurveillanceToolGateway.unableToSend=Bitte speichern oder verwerfen Sie ungespeicherte Änderungen, bevor Sie %s an die Meldesoftware senden. ExternalSurveillanceToolGateway.confirmSendCase=Sind Sie sicher, dass Sie den Fall an die Meldesoftware senden möchten? diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index 41272bf882f..607112e63f3 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Regions headingImportRegions= Import Provinces headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index 5d7d95a3bd1..92e4b36ce9b 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index 647e85cb1cc..156b6779031 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 4b41f7ad47f..916136c5f1a 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -445,6 +445,8 @@ headingCaseImport = Importar caso headingPointOfEntryImport = Importar punto de entrada headingCaseStatusMap = Mapa de estado de casos headingCasesDeleted = Casos eliminados +headingCasesNotDeleted = Ninguno de los casos fue eliminado +headingCasesNotRestored = Ninguno de los casos fue restaurado headingCaseConversion = Conversión a caso headingChangeCaseDisease = Cambiar enfermedad del caso headingCasesGuide = Guía\: Directorio de casos @@ -466,6 +468,9 @@ headingUnderFollowUp = Bajo seguimiento headingContactInformation = Información del contacto headingContactMap = Mapa de contactos headingContactsDeleted = Contactos eliminados +headingContactsNotDeleted = Ninguno de los contactos fue eliminado +headingContactsNotLinked = Ninguno de los contactos fue vinculado +headingContactsNotRestored = \= Ninguno de los contactos fue restaurado headingCreateAdditionalTest = Crear nuevos resultados de pruebas adicionales headingCreateEntry = Crear entrada headingCreateNewAction = Crear nueva acción @@ -531,15 +536,24 @@ headingEditCountry = Editar país headingEditContinent = Editar continente headingEditSample = Editar muestra headingEditSubcontinent = Editar subcontinente +headingEntitiesNotArchived = Ninguna de las entidades fue archivada +headingEntitiesNotDearchived = Ninguna de las entidades fue desarchivada +headingEntitiesNotEdited = Ninguna de las entidades fue editada +headingEntitiesNotSent = Ninguna de las entidades fue enviada headingEnvironmentalExposure = Exposición ambiental headingEpiCurve = Curva epidemiológica headingErrorReportNotAvailable = Informe de error no disponible headingEventData = Datos del evento headingEventGroupData = Datos de grupo de eventos headingEventParticipantsDeleted = Se eliminaron los participantes del evento +headingEventParticipantsNotDeleted = Ninguno de los participantes de eventos fue eliminado +headingEventParticipantsNotRestored = Ninguno de los participantes de eventos fue restaurado headingEventParticipantResponsibleJurisdictionUpdated = Actualización de jurisdicción del participante del evento headingEventJurisdictionUpdated = Actualización de jurisdicción de evento headingEventsDeleted = Eventos eliminados +headingEventsNotLinked = Ninguno de los eventos fue vinculado +headingEventsNotDeleted = Ninguno de los eventos fue eliminado +headingEventsNotRestored = Ninguno de los eventos fue restaurado headingExportFailed = Falló la exportación headingFatalities=Muertes headingFileExists = Archivo duplicado @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Importar subcontinentes por defecto headingImportAreas = Importar zonas headingImportRegions= Importar provincias headingImportTravelEntries = Importar entradas de viaje +headingImportEnvironments = Importar ambientes headingInformationSource = Fuente de información headingInfrastructureLocked = Infraestructura bloqueada headingIntroduction = Introducción @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Pruebas de patógeno solicitadas\: headingResponsibleJurisdiction=Jurisdicción responsable headingResults = Resultados headingSamplesDeleted = Muestras eliminadas +headingSamplesNotDeleted = Ninguna de las muestras fue eliminada +headingSamplesNotRestored = Ninguna de las muestras fue restaurada headingSaveNotification = Guardar notificación headingSecurityAlert=Alerta de seguridad headingSelectCampaign = Seleccione una campaña @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Signos y síntomas clínicos headingSimilarImmunization = Inmunización similar headingSyncUsers = Sincronizar usuarios headingTasksDeleted = Tareas eliminadas +headingTasksNotDeleted = Ninguna de las tareas fue eliminada headingTemplateNotAvailable = Plantilla no disponible headingTests = Pruebas de patógeno headingTransferCase = Transferir caso headingTravelEntryData = Datos de entrada de viaje headingTravelEntriesDeleted = Entradas de viaje eliminadas +headingTravelEntriesNotDeleted = Ninguna de las entradas de viaje fue eliminada +headingTravelEntriesNotRestored = Ninguna de las entradas de viaje fue restaurada headingReferCaseFromPointOfEntry = Referir el caso desde un punto de entrada headingTreatments = Tratamientos ejecutados headingTreatmentsDeleted = Tratamientos eliminados @@ -674,6 +694,9 @@ headingViewVaccination = Ver vacunación headingViewVisit = Vista de visita headingVisits = Visitas headingVisitsDeleted = Visitas eliminadas +headingVisitsNotCancelled= Ninguna de las visitas de seguimiento fue cancelada +headingVisitsNotDeleted = Ninguna de las visitas fue eliminada +headingVisitsNotSetToLost= Ninguna de las visitas de seguimiento fue marcada como perdida headingVisualization = Visualización headingWrongFileType = Tipo de archivo incorrecto headingWaterUse = Uso del agua @@ -705,6 +728,9 @@ headingCasesRestored = Casos restaurados headingContactsRestored = Contactos restaurados headingEventsRestored = Eventos restaurados headingEventParticipantsRestored = Participantes de evento restaurados +headingImmunizationsDeleted = Inmunizaciones eliminadas +headingImmunizationsNotDeleted = Ninguna de las inmunizaciones fue eliminada +headingImmunizationsNotRestored = Ninguna de las inmunizaciones fue restaurada headingImmunizationsRestored = Inmunizaciones restauradas headingSamplesRestored = Muestras restauradas headingTravelEntriesRestored = Entradas de viaje restauradas @@ -717,22 +743,23 @@ headingNewSourceCases = Nuevos casos no conocidos previamente como contactos headingNoCaseFound = Ningún caso encontrado headingNoEventFound = Ningún evento encontrado headingEventNotDeleted = Evento no eliminado -headingSomeCasesNotDeleted = Algunos casos no fueron eliminados headingSomeCasesNotRestored = Algunos casos no fueron restaurados -headingSomeContactsNotDeleted = Algunos contactos no fueron eliminados headingSomeContactsNotRestored = Algunos contactos no fueron restaurados -headingSomeEventsNotRestored = Algunos eventos no fueron restaurados -headingSomeEventParticipantsNotDeleted = Algunos participantes de evento no fueron eliminados +headingSomeEntitiesNotArchived= Algunas entidades no fueron archivadas +headingSomeEntitiesNotDearchived = Algunas entidades no fueron desarchivadas +headingSomeEntitiesNotDeleted= Algunas entidades no fueron eliminadas +headingSomeEntitiesNotEdited = Algunas entidades no fueron editadas +headingSomeEnvironmentSamplesNotRestored = Algunas muestras ambientales no fueron restauradas headingSomeEventParticipantsNotRestored = Algunos participantes de evento no fueron restaurados +headingSomeEventsNotLinked = Algunos eventos no fueron vinculados +headingSomeEventsNotRestored = Algunos eventos no fueron restaurados headingSomeImmunizationsNotRestored = Algunas inmunizaciones no fueron restauradas -headingSomeSamplesNotDeleted = Algunas muestras no fueron eliminadas headingSomeSamplesNotRestored = Algunas muestras no fueron restauradas -headingSomeTasksNotDeleted = Algunas tareas no fueron eliminadas -headingSomeTravelEntriesNotDeleted = Algunas entradas de viaje no fueron eliminadas headingSomeTravelEntriesNotRestored = Algunas entradas de viaje no fueron restauradas -headingSomeVisitsNotDeleted = Algunas visitas no fueron eliminadas -headingSomeEventsNotDeleted = Algunos eventos no fueron eliminados -headingSomeExternalMessagesNotDeleted = Algunos mensajes externos no fueron eliminados +headingSomeUsersNotDisabled = Algunos usuarios no fueron desactivados +headingSomeUsersNotEnabled= Algunos usuarios no fueron activados +headingSomeVisitsNotCancelled= Algunas visitas de seguimiento no fueron canceladas +headingSomeVisitsNotSetToLost= Algunas visitas de seguimiento no fueron marcadas como perdidas headingContactConfirmationRequired = Confirmación del contacto requerida headingContactConversionFollowUpCommentLarge = El comentario de seguimiento excederá el máximo de caracteres permitidos headingSelectSourceCase = Seleccionar caso de origen @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Fallo al exportar derechos de usuario headingExternalMessageDownload = Descargar mensaje headingNoExternalMessagesSelected = No hay mensajes seleccionados headingExternalMessagesDeleted = Mensajes eliminados +headingExternalMessagesNotDeleted = Ninguno de los mensajes externos fue eliminado headingExternalMessageCorrection = Mensaje de corrección headingExternalMessageProcessSample = Procesar muestra e informes de prueba headingExternalMessageSampleInformation = Información de muestras @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = Nuevas pruebas de patógeno headingFetchExternalMessages = Obtener nuevos mensajes headingCaution = Alerta headingUnavailableTaskEdition = Edición de tareas no disponible +headingUsersNotDisabled = Ninguno de los usuarios fue desactivado +headingUsersNotEnabled = Ninguno de los usuarios fue activado headingDeleteVaccinations = Eliminar vacunaciones de inmunización headingDocumentCreated = Documento creado headingConfirmUnclearLabMessage=Confirmar poco claro @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Eliminación automática iniciada headingBulkOperationProgress = Progreso de la operación masiva headingSomeContactsAlreadyInEvent = Algunos contactos ya están vinculados al evento seleccionado headingEnvironmentJurisdictionUpdated = Actualización de ubicación del ambiente +headingNoEnvironmentSamplesSelected = No hay muestras ambientales seleccionadas +headingEnvironmentSamplesDeleted = Muestras ambientales eliminadas +headingEnvironmentSamplesNotDeleted = Ninguna de las muestras ambientales fue eliminada +headingEnvironmentSamplesNotRestored = Ninguna de las muestras ambientales fue restaurada +headingEnvironmentSamplesRestored = Muestras ambientales restauradas # Info texts infoActivityAsCaseInvestigation = Por favor, documente TODAS las actividades relevantes después de la infección\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = Cuando un caso tiene múltiples muestras, s infoBulkProcess = Se están procesando %d entradas seleccionadas. Esto puede tardar un tiempo. El progreso se actualizará por cada 20 entradas que hayan sido procesadas. infoBulkProcessFinished = ¡Todas las entradas seleccionadas han sido procesadas\!
Ahora puede cerrar esta ventana. infoBulkProcessFinishedWithIneligibleItems = ¡El proceso masivo se completó con éxito\!
Sin embargo, algunas de las entradas seleccionadas no se pudieron procesar, debido a que no eran elegibles. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = ¡El proceso masivo se completó con éxito\!
Sin embargo, algunas de las entradas seleccionadas no se pudieron procesar, probablemente por estar fuera de su jurisdicción. +infoBulkProcessFinishedWithoutSuccess = ¡El proceso masivo finalizó sin éxito\!
¡Ninguna de las entradas fue procesada exitosamente\! infoBulkProcessFinishedWithSkips = ¡El proceso masivo se completó con éxito\!
Sin embargo, algunas de las entradas seleccionadas no se pudieron procesar, probablemente por estar fuera de su jurisdicción, ya archivadas o no ser elegibles. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = ¡El proceso masivo se completó con éxito\!
Sin embargo, algunas de las entradas seleccionadas no se pudieron procesar, probablemente por estar fuera de su jurisdicción o no ser elegibles. infoBulkProcessNoEligibleEntries = ¡El proceso masivo se ha cancelado porque no hay entradas elegibles para esta operación\! infoBulkProcessCancelled = ¡El proceso masivo se canceló\!
Todas las entradas seleccionadas hasta este punto han sido procesadas. Ahora puede cerrar esta ventana. Todas las entradas aún no procesadas seguirán seleccionadas. infoBulkUnresponsiveWindowHint = Sugerencia\: Si la barra de progreso parece no responder y no hay progreso visible por algún tiempo, pruebe hacer clic en esta ventana emergente o cambiar el tamaño de la ventana de su navegador. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = Todos los casos ya están vinculados al evento s messageAllCasesLinkedToEvent = Todos los casos fueron vinculados al evento seleccionado. messageAllContactsAlreadyInEvent = Todos los contactos ya están vinculados al evento seleccionado. messageAllContactsLinkedToEvent = Todos los contactos fueron vinculados al evento seleccionado. -messageSomeContactsLinkedToEvent = Algunos de los contactos seleccionados fueron vinculados al evento seleccionado. messageAlreadyEventParticipant = La persona seleccionada ya está definida como participante de este evento. messageAnimalContactsHint = Por favor, indique una respuesta con respecto a TODOS los animales (vivos o muertos) a los que la persona se expuso directamente (por ejemplo, cazó, tocó, comió) durante el período de incubación. messageArchiveUndoneReasonMandatory = Por favor, agregue una razón para desarchivar @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=No es posible vincular un caso a un eve messageCaseSaved = Caso guardado messageCaseSavedClassificationChanged = Caso guardado. La clasificación se cambió automáticamente a %s. messageCaseTransfered = El caso fue transferido a otro centro de salud -messageCasesNotDeleted = Los casos mencionados en la lista anterior de UUIDs no se pudieron eliminar. -messageCasesNotDeletedExternalReason = Los casos mencionados en la lista anterior de UUIDs no se pudieron eliminar porque falló la comunicación con la herramienta de informes. -messageCasesDeleted = Todos los casos elegibles seleccionados fueron eliminados messageCaseOutsideJurisdictionDeletionDenied = El caso fuera de la jurisdicción del usuario no puede ser eliminado +messageCasesDeleted = Todos los casos elegibles seleccionados fueron eliminados messageCasesMerged = Casos combinados y caso duplicado eliminado. messageCasesRestored = Todos los casos seleccionados fueron restaurados -messageContactsNotRestored = Los contactos mencionados en la lista anterior de UUIDs no se pudieron restaurar. messageContactsRestored = Todos los contactos seleccionados fueron restaurados -messageEventsNotRestored = Los eventos mencionados en la lista anterior de UUIDs no se pudieron restaurar. messageEventsRestored = Todos los eventos seleccionados fueron restaurados -messageEventParticipantsNotRestored = Los participantes de evento mencionados en la lista anterior de UUIDs no se pudieron restaurar. messageEventParticipantsRestored = Todos los participantes de evento seleccionados fueron restaurados -messageImmunizationsNotDeleted = Las inmunizaciones mencionadas en la lista anterior de UUIDs no se pudieron eliminar. messageImmunizationsDeleted = Todas las inmunizaciones elegibles seleccionadas fueron eliminadas -messageImmunizationsNotRestored = Las inmunizaciones mencionadas en la lista anterior de UUIDs no se pudieron restaurar. messageImmunizationsRestored = Todas las inmunizaciones seleccionadas fueron restauradas -messageSamplesNotRestored = Las muestras mencionadas en la lista anterior de UUIDs no se pudieron restaurar. messageSamplesRestored = Todas las muestras seleccionadas fueron restauradas -messageTravelEntriesNotRestored = Las entradas de viaje mencionadas en la lista anterior de UUIDs no se pudieron restaurar. messageTravelEntriesRestored = Todas las entradas de viaje seleccionadas fueron restauradas -messageCasesNotRestored = Los casos mencionados en la lista anterior de UUIDs no se pudieron restaurar. messageChangePathogenTestResult = El resultado de esta prueba de patógeno difiere del actual resultado general de la prueba de patógeno. ¿Desea actualizar su resultado a %s? messageCheckInputData = Por favor, revise los datos ingresados messageClinicalCourseSaved = Curso clínico guardado @@ -1084,7 +1109,6 @@ messageContactCreated=Nuevo contacto creado messageContactArchived = El contacto fue archivado messageContactDearchived = El contacto fue desarchivado messageContactSaved = Datos del contacto guardados -messageContactsNotDeleted = Los contactos mencionados en la lista anterior de UUIDs no se pudieron eliminar. messageContactsDeleted = Todos los contactos elegibles seleccionados fueron eliminados messageContactOutsideJurisdictionDeletionDenied = El contacto fuera de la jurisdicción del usuario no puede ser eliminado messageContactDuplicateDeleted = El contacto duplicado fue eliminado. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contactos combinados y contacto duplicado eliminado. messageCopyPassword = Por favor copie esta contraseña, se muestra sólo una vez. messageCountCasesAlreadyInEvent = %s casos ya estaban vinculados al evento, todos los demás fueron vinculados. messageCountContactsAlreadyInEvent = %s contactos ya estaban vinculados al evento, todos los demás fueron vinculados. +messageCountEnvironmentSamplesNotRestored = %s muestras ambientales no restauradas. UUIDs de muestras no restauradas\: %s messageCreateCollectionTask = Estableció la condición del espécimen como inadecuada.
¿Desea crear una nueva tarea de recolección de muestras? messageDatabaseExportFailed = Por favor contacte a un administrador y notifíquele sobre este problema messageEntryCreated = Entrada creada @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = El evento seleccionado fue vinculado exitosa messageEventLinkedAsSubordinate = El evento seleccionado fue vinculado exitosamente a este evento como un evento subordinado messageEventLinkedToGroup = El evento seleccionado fue vinculado exitosamente a este grupo de eventos messageEventsLinkedToGroup = Los eventos seleccionados fueron vinculados exitosamente a este grupo de eventos -messageSomeEventsLinkedToGroup = Algunos de los eventos seleccionados fueron vinculados exitosamente a este grupo de eventos messageEventOutsideJurisdictionDeletionDenied = El evento fuera de la jurisdicción del usuario no puede ser eliminado messageEventSuperordinateEventUnlinked = El vínculo entre este evento y su evento superior fue eliminado exitosamente messageEventSubordinateEventUnlinked = El vínculo entre este evento y su evento subordinado fue eliminado exitosamente @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = El participante de evento fue desarchivado messageEventParticipantCreated = Nueva persona creada messageEventParticipantSaved = Datos de persona guardados messageEventParticipantOutsideJurisdictionDeletionDenied = El participante de evento fuera de la jurisdicción del usuario no puede ser eliminado -messageEventParticipantsNotDeleted = Los participantes de evento mencionados en la lista anterior de UUIDs no se pudieron eliminar. messageEventParticipantsDeleted = Todos los participantes de evento elegibles seleccionados fueron eliminados messageEventParticipantResponsibleJurisdictionUpdated = Cambiar o eliminar la jurisdicción responsable de este participante de evento puede hacerle perder el acceso a sus datos personales y/o no permitirle editarlo en el futuro. ¿Está seguro de que desea continuar? messageEventParticipantToCaseWithoutEventDisease=No es posible crear casos a partir de un participante de evento si la enfermedad del evento no está especificada @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=No es posible crear un conta messageEventJurisdictionUpdated = Cambiar o eliminar la jurisdicción de este evento puede hacerle perder el acceso a sus datos personales y/o no permitirle editarlo en el futuro. ¿Está seguro de que desea continuar? messageEventSaved = Datos del evento guardados messageEventGroupSaved = Datos de grupo de eventos guardados -messageEventsNotDeleted = Los eventos mencionados en la lista anterior de UUIDs no se pudieron eliminar. messageEventsDeleted = Todos los eventos elegibles seleccionados fueron eliminados messageEventsSentToSurvnet = Todos los eventos seleccionados fueron enviados a SurvNet +messageCountCasesNotArchivedExternalReason = %s casos no archivados porque falló la comunicación con la herramienta de informes\: %s +messageCountCasesNotDearchivedExternalReason = %s casos no desarchivados porque falló la comunicación con la herramienta de informes\: %s messageCountCasesNotDeleted = %s casos no eliminados. UUIDs de casos no eliminados\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s casos no eliminados por no estar en jurisdicción o posesión\: %s +messageCountCasesNotDeletedExternalReason = %s casos no eliminados porque falló la comunicación con la herramienta de informes\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s casos no eliminados por un intento fallido de revocar solicitudes de compartición pendientes\: %s messageCountCasesNotRestored = %s casos no restaurados. UUIDs de casos no restaurados\: %s messageCountContactsNotDeleted = %s contactos no eliminados. UUIDs de contactos no eliminados\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contactos no eliminados por no estar en jurisdicción o posesión\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contactos no eliminados por un intento fallido de revocar solicitudes de compartición pendientes\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contactos no vinculados porque el contacto ya no es editable o el usuario carece de derechos\: %s messageCountContactsNotRestored = %s contactos no restaurados. UUIDs de contactos no restaurados\: %s +messageCountEntitiesNotArchived = %s entidades no se pueden archivar\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s entidades de infraestructura no se pueden archivar porque son utilizadas en otros datos de infraestructura\: %s +messageCountEntitiesNotDearchived = %s entidades no se pueden desarchivar\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s entidades de infraestructura no se pueden desarchivar porque tienen infraestructura de nivel superior archivada\: %s +messageCountEntitiesNotEdited = %s entidades no se pueden editar porque están en una jurisdicción diferente o ya fueron archivadas\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entidades no editadas porque ya no son editables\: %s +messageCountEntitiesNotSent = %s entidades no se pueden enviar a la herramienta de informes\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entidades no se pueden enviar a la herramienta de informes porque el usuario no tiene los derechos requeridos\: %s +messageCountEntitiesNotSentExternalReason = %s entidades no se pueden enviar a la herramienta de informes porque falló la comunicación con la herramienta de informes\: %s +messageCountEventsNotArchivedExternalReason = %s eventos no archivados porque falló la comunicación con la herramienta de informes\: %s +messageCountEventsNotDearchivedExternalReason = %s eventos no desarchivados porque falló la comunicación con la herramienta de informes\: %s +messageCountEventsNotLinked = %s eventos no se pueden vincular o ya están vinculados al grupo de eventos\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s eventos no se pueden vincular al grupo de eventos porque no está permitido vincular eventos de otra provincia a un grupo de eventos\: %s messageCountEventsNotRestored = %s eventos no restaurados. UUIDs de eventos no restaurados\: %s messageCountEventParticipantsNotDeleted = %s participantes de evento no eliminados. UUIDs de participantes de evento no eliminados\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s participantes de evento no eliminados por no estar en jurisdicción o posesión\: %s messageCountEventParticipantsNotRestored = %s participantes de evento no restaurados. UUIDs de participantes de evento no restaurados\: %s messageCountExternalMessagesNotDeleted = %s mensajes externos no eliminados. UUIDs de mensajes externos no eliminados\: %s +messageCountImmunizationsNotDeleted = %s inmunizaciones no eliminadas\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s inmunizaciones no eliminadas por no estar en jurisdicción o posesión\: %s messageCountImmunizationsNotRestored = %s inmunizaciones no restauradas. UUIDs de inmunizaciones no restauradas\: %s messageCountSamplesNotDeleted = %s muestras no eliminadas. UUIDs de muestras no eliminadas\: %s messageCountSamplesNotRestored = %s muestras no restauradas. UUIDs de muestras no restauradas\: %s messageCountTasksNotDeleted = %s tareas no eliminadas. UUIDs de tareas no eliminadas\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tareas no eliminadas por no estar en jurisdicción o posesión\: %s messageCountTravelEntriesNotDeleted = %s entradas de viaje no eliminadas. UUIDs de entradas de viaje no eliminadas\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s entradas de viaje no eliminadas por no estar en jurisdicción o posesión\: %s messageCountTravelEntriesNotRestored = %s entradas de viaje no restauradas. UUIDs de entradas de viaje no restauradas\: %s +messageCountUsersNotDisabled = %s usuarios no desactivados\: %s +messageCountUsersNotEnabled = %s usuarios no activados\: %s +messageCountVisitsNotCancelled = %s visitas de seguimiento no canceladas\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s visitas de seguimiento no canceladas porque el contacto ya no es editable o está fuera de la jurisdicción del usuario\: %s messageCountVisitsNotDeleted = %s visitas no eliminadas. UUIDs de visitas no eliminadas\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visitas no eliminadas por no estar en jurisdicción o posesión\: %s +messageCountVisitsNotSetToLost = %s visitas de seguimiento no marcadas como perdidas\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s visitas de seguimiento no marcadas como perdidas porque el contacto ya no es editable o está fuera de la jurisdicción del usuario\: %s messageCountEventsNotDeleted = %s eventos no eliminados. UUIDs de eventos no eliminados\: %s -messageEventsNotDeletedExternalReason = Los eventos mencionados en la lista anterior de UUIDs no se pudieron eliminar porque falló la comunicación con la herramienta de informes. +messageCountEventsNotDeletedAccessDeniedReason = %s eventos no eliminados por no estar en jurisdicción o posesión\: %s +messageCountEventsNotDeletedExternalReason = %s eventos no eliminados porque falló la comunicación con la herramienta de informes\: %s messageEventsNotDeletedLinkedEntitiesReason = No se eliminarán eventos que tengan participantes vinculados. Por favor, elimine los participantes del evento para poder eliminarlo. +messageCountEventsNotDeletedSormasToSormasReason = %s eventos no eliminados por un intento fallido de revocar solicitudes de compartición pendientes\: %s messageExportFailed = Un error impidió exportar los datos. Por favor, contacte a un administrador e infórmele sobre este problema. messageExportConfigurationDeleted = Configuración de exportación eliminada messageExportConfigurationSaved = Configuración de exportación guardada messageFollowUpCanceled = El seguimiento de todos los contactos seleccionados fue cancelado -messageFollowUpCanceledForSome = El seguimiento de algunos contactos seleccionados fue cancelado messageFollowUpStatusChanged = El seguimiento de todos los contactos seleccionados que tienen seguimiento se especificó como seguimiento perdido -messageFollowUpStatusChangedForSome = El seguimiento de algunos contactos seleccionados que tienen seguimiento se especificó como seguimiento perdido messageFacilityChanged = Ha cambiado la instalación de este caso. ¿Desea transferir el caso a la nueva instalación (la hospitalización puede ser actualizada) o sólo desea editar los datos para corregir un error? messageFacilityMulitChanged = Ha cambiado la instalación de múltiples casos. ¿Desea transferir estos casos a la nueva instalación (la hospitalización puede actualizada) o sólo desea editar sus datos para corregir errores? messageGdpr = Debe asegurarse de introducir aquí sólo datos objetivos absolutamente necesarios para el procesamiento del archivo. En particular, no debe introducir datos genéticos o biométricos, filosóficos, políticos, religiosos, opiniones sindicales, vida u orientación sexual, origen étnico, delitos, condenas, medidas de seguridad, antecedentes penales ... o cualquier otro dato que no esté relacionado con la vigilancia de la salud pública. @@ -1183,7 +1238,6 @@ messageImportSuccessful = ¡Importación exitosa\!
Todas las filas se messageUploadSuccessful = ¡Carga exitosa\! Ahora puede cerrar esta ventana. messageIncompleteGpsCoordinates = Las coordenadas GPS están incompletas messageExternalMessagesAssigned = Se cambió el responsable de todos los mensajes seleccionados -messageExternalMessagesNotDeleted = Los mensajes externos mencionados en la lista anterior de UUIDs no se pudieron eliminar. messageLoginFailed = Por favor verifique su nombre de usuario y contraseña e intente de nuevo messageMissingCases = Por favor, genere algunos casos antes de generar contactos messageMissingDateFilter = Por favor llene ambos campos de filtro de fecha @@ -1195,7 +1249,10 @@ messageNoContactsSelected = No ha seleccionado ningún contacto messageNoCsvFile = No ha seleccionado un archivo para cargar. Por favor, seleccione un archivo .csv que contenga los datos que desea importar de su computadora. messageNoDocumentTemplateUploadFile = No ha seleccionado un archivo para cargar. Por favor, seleccione un archivo de plantilla .docx que desee importar desde su computadora. messageNoDocumentUploadFile = No ha seleccionado un archivo para cargar. Por favor, seleccione un archivo que desee importar desde su computadora. +messageNoEligibleEntityForEditing = Ninguna de las entidades seleccionadas es elegible para edición messageNoEligibleEventForDeletionSelected = Ninguno de los eventos seleccionados es elegible para eliminación +messageNoEligibleVisitForCancellation = Ninguna de las visitas de seguimiento fue elegible para cancelación +messageNoEligibleVisitForSettingToLost = Ninguna de las visitas de seguimiento fue elegible para marcar como perdida messageNoEnvironmentsSelected = No ha seleccionado ningún ambiente messageNoEventParticipantsSelected = No ha seleccionado ningún participante del evento messageNoEventsSelected = No ha seleccionado ningún evento @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = La muestra a la que se hace referencia en este mensa messageRelatedSampleAndLabMessagesFound = Ya se procesó un mensaje de laboratorio con el mismo ID de informe. Está relacionado con una muestra también referenciada en este mensaje de laboratorio.
¿Desea abrir directamente esa muestra? messageSampleErrors = Hay errores en el formulario de muestra. Por favor corríjalos y guarde la muestra antes de referirla a otro laboratorio. messageSampleSaved = Datos de muestra guardados -messageSamplesNotDeleted = Las muestras mencionadas en la lista anterior de UUIDs no se pudieron eliminar. messageSamplesDeleted = Todas las muestras elegibles seleccionadas fueron eliminadas messageSpecifyColumnAttribute = Por favor especifique el atributo de columna que eligió para la visualización messageSpecifyFilterAttributes = Por favor especifique todos los atributos y sub-atributos de filtro seleccionados @@ -1237,7 +1293,6 @@ messageSymptomsHint = Por favor, marque una respuesta para TODOS los síntoma messageSymptomsVisitHint = Por favor, marque una respuesta para TODOS los síntomas indicando si estaban presentes en el momento de esta visita\: messageTaskArchived = La tarea fue archivada messageTasksEdited = Todas las tareas fueron editadas -messageTasksNotDeleted = Las tareas mencionadas en la lista anterior de UUIDs no se pudieron eliminar. messageTaskDearchived = La tarea fue desarchivada messageTasksDeleted = Todas las tareas elegibles seleccionadas fueron eliminadas messageTemplateNotAvailable = El archivo de plantilla no está disponible. Por favor, contacte a un administrador e infórmele sobre este problema. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Datos de entrada de viaje guardados messageTravelEntryArchived = La entrada de viaje fue archivada messageTravelEntryDearchived = La entrada de viaje fue desarchivada messageTravelEntryPOEFilledBySystem = [System] Punto de entrada rellenado automáticamente -messageTravelEntriesNotDeleted = Las entradas de viaje mencionadas en la lista anterior de UUIDs no se pudieron eliminar. messageTravelEntriesDeleted = Todas las entradas de viaje elegibles seleccionadas fueron eliminadas messageTreatmentCreated = Tratamiento creado messageTreatmentSaved = Tratamiento guardado @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = No se pudo determinar automáticamente messageUserRoleCombination = no se puede combinar con messageUserRoleSaved = Rol de usuario guardado messageVaccinationOutsideJurisdictionDeletionDenied = La vacunación fuera de la jurisdicción del usuario no puede ser eliminada -messageVisitsNotDeleted = Las visitas mencionadas en la lista anterior de UUIDs no se pudieron eliminar. messageVisitsDeleted = Todas las visitas elegibles seleccionadas fueron eliminadas +messageVisitsWithWrongStatusNotCancelled = Las visitas de seguimiento con estado de CANCELADA o SIN SEGUIMIENTO no se pueden cancelar +messageVisitsWithWrongStatusNotSetToLost = Las visitas de seguimiento con estado SIN SEGUIMIENTO no se pueden marcar como perdidas messageWrongFileType = Por favor, proporcione un archivo .csv que contenga los datos que desea importar. Se recomienda usar el archivo de plantilla de importación como punto de partida. messageWrongTemplateFileType=Para %s, por favor proporcione un archivo .%s. messageLineListingDisabled = El listado de líneas fue deshabilitado @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = Todos los mensajes elegibles seleccionados fuer messageQuarantineOrderDocumentCreated = El documento para orden de cuarentena fue creado messageUnavailableTaskEditionDueToDifferentDistricts = La edición de tareas no está disponible si están relacionadas con diferentes municipios messageUsersEnabled = Todos los usuarios seleccionados fueron activados -messageSomeUsersEnabled = Algunos de los usuarios seleccionados fueron activados messageUsersDisabled = Todos los usuarios seleccionados fueron desactivados -messageSomeUsersDisabled = Algunos de los usuarios seleccionados fueron desactivados messageDontShareWithReportingToolWarning = Se evita activamente el envío de este caso a la herramienta externa de reporte messageBulkCasesWithDifferentDiseasesSelected = Ha seleccionado casos con diferentes enfermedades. Algunas opciones de edición masiva podrían no estar disponibles. messageBulkContactsWithDifferentDiseasesSelected = Ha seleccionado contactos con diferentes enfermedades. Algunas opciones de edición masiva podrían no estar disponibles. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = Esta vacunación no es releva messageVaccinationNoDateNotRelevantForEventParticipant = Esta vacunación no es relevante para este participante de evento porque no tiene una fecha de vacunación. messageAcceptRequestToNavigate = La solicitud aún no ha sido aceptada. Tiene que aceptarla primero para poder navegar allí. messageEntityNotFound = No se encontró %s en el sistema. +messageEntitiesNotEditable = No hay entidades que puedan ser editadas messageSormasToSormasSimilarCaseFound = Hay al menos un caso similar en su sistema. Si acepta la solicitud, el caso podría quedar en su sistema como un duplicado.
Si es así, debería consolidar los casos después de aceptar.
Por favor, asegúrese de usar el caso aceptado para este fin. messageSormasToSormasSimilarConvertedCaseFound = Hay al menos un caso similar en su sistema. Si acepta la solicitud, el caso podría quedar en su sistema como un duplicado.
Si es así, debería consolidar los casos después de aceptar.
Después de consolidar los casos, puede ser necesario realizar una conversión manual de algunos contactos al caso aceptado.
Por favor, asegúrese de usar el caso aceptado para este fin. messageSormasToSormasSimilarContactToCaseFound = Hay al menos un contacto similar en su sistema.
Después de aceptar la solicitud, puede ser necesario realizar una conversión manual de esos contactos al caso aceptado. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = ¡Debe seleccionar dos personas para comb messageAutomaticDeletionStarted = La eliminación automática se ha iniciado y se ejecutará en segundo plano. Tenga en cuenta que, dependiendo de la cantidad de datos que se eliminen, este proceso puede tardar algún tiempo. messageUserRoleUnusableForLogin = Los usuarios que sólo tengan este rol no podrán iniciar sesión porque el rol no tiene derecho de Acceso a Sormas UI ni derecho de Acceso a Sormas REST messageUserRoleHasNoRights = Este rol de usuario no tiene derechos. Por favor, seleccione al menos un derecho. -messageEntriesEditedExceptArchived = %s entradas fueron editadas con éxito. Algunas de las entradas no pudieron ser editadas porque están en una jurisdicción diferente o ya estaban archivadas. messageEntriesEdited = Todas las entradas fueron editadas messageAllEntitiesArchived = Todas las entradas seleccionadas fueron archivadas -messageSomeEntitiesArchived = %s entradas fueron archivadas. messageAllEntitiesDearchived = Todas las entradas seleccionadas fueron desarchivadas -messageSomeEntitiesDearchived = %s entradas fueron desarchivadas. +messageAllEventsAlreadyLinkedToGroup = Todos los eventos seleccionados ya estaban vinculados al grupo de eventos. messageEnvironmentCreated = El ambiente fue creado messageEnvironmentSaved = El ambiente fue guardado messageEnvironmentArchived = El ambiente fue archivado messageEnvironmentDearchived = El ambiente fue desarchivado messageEnvironmentSampleOutsideJurisdictionDeletionDenied = La muestra ambiental fuera de la jurisdicción del usuario no puede ser eliminada messageEnvironmentJurisdictionUpdated = Cambiar la ubicación de este ambiente puede hacerle perder el acceso a sus detalles o no permitirle editar en el futuro. ¿Está seguro de que desea continuar? +messageNoEnvironmentSamplesSelected = No ha seleccionado ninguna muestra ambiental +messageEnvironmentSamplesDeleted = Todas las muestras ambientales elegibles seleccionadas fueron eliminadas +messageCountEnvironmentSamplesNotDeleted = %s muestras ambientales no eliminadas\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s muestras ambientales no eliminadas por no estar en jurisdicción o posesión\: %s +messageEnvironmentSamplesRestored = Todas las muestras ambientales seleccionadas fueron restauradas # Notifications notificationCaseClassificationChanged = La clasificación del caso %s se cambió a %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitud desde... promptEnvironmentLatTo= ... hasta promptEnvironmentLonFrom= Longitud desde... promptEnvironmentLonTo= ... hasta +promptEnvironmentSampleFreetext = ID de muestra, ID de muestra de laboratorio, ID de ambiente, Nombre de ambiente +promptEnvironmentSampleRegion = Provincia del ambiente +promptEnvironmentSampleDistrict = Municipio del ambiente +promptEnvironmentSampleLab = Laboratorio +promptEnvironmentSampleTestedPathogen = Patógeno probado +promptEnvironmentSampleDateFrom = Fecha de informe desde... +promptEnvironmentSampleDateTo = ... hasta +promptEnvironmentSampleEpiWeekFrom = Fecha de informe desde la semana epi... +promptEnvironmentSampleEpiWeekTo = ... hasta la semana epi +promptEnvironmentSampleLatFrom= Latitud de ambiente desde... +promptEnvironmentSampleLatTo= ... hasta +promptEnvironmentSampleLonFrom= Longitud de ambiente desde... +promptEnvironmentSampleLonTo= ... hasta # Unsaved changes unsavedChanges.warningTitle = Cambios sin guardar @@ -1603,9 +1673,9 @@ infoBAGExport=Exportar completamente a SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entrada enviada a la herramienta de reporte ExternalSurveillanceToolGateway.notificationEntriesSent = Todas las entradas seleccionadas se enviaron a la herramienta de informes. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Algunas de las entradas seleccionadas se enviaron a la herramienta de informes. ExternalSurveillanceToolGateway.notificationEntriesDeleted = Todas las entradas seleccionadas fueron eliminadas exitosamente en la herramienta de reporte. ExternalSurveillanceToolGateway.notificationEntryNotSent = La entrada no se pudo enviar +ExternalSurveillanceToolGateway.notificationErrorArchiving = La entidad no fue archivada porque falló la comunicación con la herramienta de informes ExternalSurveillanceToolGateway.notificationErrorSending = Error al enviar la entrada ExternalSurveillanceToolGateway.unableToSend=Por favor, guarde o descarte cualquier cambio no guardado antes de enviar el %s a la herramienta de reporte. ExternalSurveillanceToolGateway.confirmSendCase=¿Está seguro de que desea enviar el caso a la herramienta de reporte? diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index c12e7656c62..dded50c4061 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -445,6 +445,8 @@ headingCaseImport = Potilaan tuonti headingPointOfEntryImport = Maahantulopaikan tuonti headingCaseStatusMap = Kartta potilaiden sairaudentiloista headingCasesDeleted = Poistetut potilaat +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Vaihda potilaan sairaus headingCasesGuide = Ohje\: Potilashakemisto @@ -466,6 +468,9 @@ headingUnderFollowUp = Seurannassa headingContactInformation = Yhteystiedot headingContactMap = Jäljityskartta headingContactsDeleted = Kontaktit poistettu +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Luo uusia testituloksia headingCreateEntry = Luo syöte headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Ympäristöaltiste headingEpiCurve = Epidemiologinen käyrä headingErrorReportNotAvailable = Virheraportti ei saatavilla headingEventData = Tapahtumatiedot headingEventGroupData = Event group data headingEventParticipantsDeleted = Tapahtuman osallistujat poistettu +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Tapahtumat poistettu +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Vienti epäonnistui headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Tuo alueita headingImportRegions= Tuo erva-alueita headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Tietolähde headingInfrastructureLocked = Infrastructure locked headingIntroduction = Johdanto @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Vaaditut patogeenitestit\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Tulokset headingSamplesDeleted = Näytteet poistettu +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Tallenna ilmoitus headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Kliiniset havainnot ja oireet headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tehtävät poistettu +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Mallia ei saatavilla headingTests = Patogeenitestit headingTransferCase = Siirrä potilas headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Lähetä potilas eteenpäin maahantulopaikasta headingTreatments = Annetut hoidot headingTreatmentsDeleted = Hoidot poistettu @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Käynnit headingVisitsDeleted = Käynnit poistettu +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualisointi headingWrongFileType = Väärä tiedoston tyyppi headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = Uusia potilaita, joita ei tiedetty aikaisemmin kontaktei headingNoCaseFound = Potilasta ei löydy headingNoEventFound = Tapahtumaa ei löytynyt headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Kontaktin vahvistus vaaditaan headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Valitse tartuttanut potilas @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Merkitse vastaus koskien KAIKKIA eläimiä (eläviä tai kuolleita), joille henkilö on suoraan altistunut (esim. metsästäessä, koskettaessa, syömällä) itämisajan aikana. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Potilas tallennettu messageCaseSavedClassificationChanged = Potilas tallennettu. Luokittelu on automaattisesti muutettu tilaan %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Potilaat on yhdistetty ja kaksoiskappale on poistettu. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = Tämän patogeenitestin tulos poikkeaa näytteen nykyisten patogeenitestien kokonaistuloksesta. Haluatko päivittää testin tuloksen arvoon %s? messageCheckInputData = Ole hyvä ja tarkista syötetty tieto messageClinicalCourseSaved = Sairauden kliininen kulku tallennettu @@ -1084,7 +1109,6 @@ messageContactCreated=Uusi kontakti luotu messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Kontaktitiedot tallennettu -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Ole ystävällinen ja kopioi tämä salasana. Se näytetään vain kerran. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Olet määrittänyt kerätyn näytteen kunnoltaan epäsopivaksi.
Haluatko lisätä uuden näyttenottotehtävän? messageDatabaseExportFailed = Ota yhteyttä ylläpitäjiin ja ilmoita heille tästä ongelmasta messageEntryCreated = Syöte lisätty @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = Uusi henkilö luotu messageEventParticipantSaved = Henkilön tiedot tallennettu messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Tapahtuman tiedot tallennettu messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Kohdattiin ongelma, jonka takia tietoja ei saatu vietyä. Ota yhteyttä ylläpitoon ja kerro heille tästä ongelmasta. messageExportConfigurationDeleted = Vientiasetukset poistettu messageExportConfigurationSaved = Vientiasetukset tallennettu messageFollowUpCanceled = Kaikkien valittujen kontaktien seuranta on peruttu -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Kaikkien niiden valittujen kontaktien osalta, jolla on seuranta-aikaa, on seurannan tila asetettu seurannasta kadonneeksi -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Tuonti onnistui\!
Kaikki rivit on tuotu. Vo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS koordinaatit ovat puutteelliset messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Tarkista käyttäjänimi ja salasana ja yritä uudelleen messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Täytä molemmat päivämäärän suodatuskentät @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Et ole valinnut yhtään kontaktia messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = Et ole valinnut yhtään tapahtumaan osallistujaa messageNoEventsSelected = Et ole valinnut yhtään tapahtumaa @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = Näytelomakkeella on virheitä. Korjaa ne ja tallenna näytetiedot ennen sen lähettämistä toiseen laboratorioon. messageSampleSaved = Näytteen tiedot tallennettu -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Määritä sarakeatribuutti, jonka olet valinnut visualisoitavaksi messageSpecifyFilterAttributes = Määritä kaikki valitut suodatusatribuutit ja aliatribuutit @@ -1237,7 +1293,6 @@ messageSymptomsHint = Merkitse vastaus KAIKILLE oireille jotka ovat ilmenneet messageSymptomsVisitHint = Merkitse vastaus KAIKILLE oireille, jotka olivat havaittavissa käynnin aikana\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Mallitiedosto ei ole saatavilla. Ota yhteyttä ylläpitoon ja kerro heillä tästä ongelmasta. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Hoito luotu messageTreatmentSaved = Hoito tallennettu @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = ei voi yhdistää roolin kanssa messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Anna .csv-tiedosto, joka sisältää tiedot, jotka haluat tuoda. On suositeltavaa käyttää tuonnin mallitiedostoa lähtökohtana. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Rivilistaus on poistettu käytöstä @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = Potilaan %s luokitus on muuttunut luokkaan %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fr-CD.properties b/sormas-api/src/main/resources/strings_fr-CD.properties index 1dfc88cdbd5..5770f77b0b1 100644 --- a/sormas-api/src/main/resources/strings_fr-CD.properties +++ b/sormas-api/src/main/resources/strings_fr-CD.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index 33187ca3404..aa33e4b063f 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -445,6 +445,8 @@ headingCaseImport = Importer un cas headingPointOfEntryImport = Importation au point d'entrée headingCaseStatusMap = Carte de statut du cas headingCasesDeleted = Cas supprimé +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Changer la maladie de cas headingCasesGuide = Guide \: Répertoire des cas @@ -466,6 +468,9 @@ headingUnderFollowUp = En cours de suivi headingContactInformation = Information de contact headingContactMap = Carte de contact headingContactsDeleted = Contacts supprimés +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Créer de nouveaux résultats de test supplémentaires headingCreateEntry = Créer une entrée headingCreateNewAction = Créer une nouvelle action @@ -531,15 +536,24 @@ headingEditCountry = Modifier le pays headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Exposition environnementale headingEpiCurve = Courbe épidémiologique headingErrorReportNotAvailable = Rapport d'erreur non disponible headingEventData = Données de l'événement headingEventGroupData = Event group data headingEventParticipantsDeleted = Participants de l'événement supprimés +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Evènement supprimé +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Exportation échouée headingFatalities=Fatalities headingFileExists = Dupliquer le fichier @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Importer les zones headingImportRegions= Importer des régions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source d'information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Tests de pathogènes demandés\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Résultats headingSamplesDeleted = Échantillons supprimés +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Enregistrer la notification headingSecurityAlert=Security Alert headingSelectCampaign = Sélectionnez une campagne @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Signes et symptômes cliniques headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tâches supprimées +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Modèle non disponible headingTests = Tests headingTransferCase = Transfert le cas headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Référez le cas du point d'entrée headingTreatments = Traitements exécutés headingTreatmentsDeleted = Traitement supprimé @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visites headingVisitsDeleted = Visite supprimée +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualisation headingWrongFileType = Type de fichier incorrect headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = Nouveaux cas, n'étant pas des contacts auparavant headingNoCaseFound = Aucun cas trouvé headingNoEventFound = Aucun événement trouvé headingEventNotDeleted = Événement non supprimé -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Certains événements n'ont pas été supprimés -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Confirmation du contact requise headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Sélectionner le cas source @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = La personne sélectionnée est déjà un participant à cet événement. messageAnimalContactsHint = Veuillez indiquer une réponse concernant TOUS les animaux (vivants ou morts) que la personne a eu une exposition directe (par exemple chasse, toucher, manger) pendant la période d'incubation. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Cas enregistré messageCaseSavedClassificationChanged = Cas enregistré. La classification a été automatiquement modifiée en %s. messageCaseTransfered = Le cas a été transféré à un autre établissement de santé -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cas fusionné et double supprimé. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = Le résultat de ce test pathogène est différent du résultat global actuel du test pathogène de l'échantillon. Voulez-vous mettre à jour son résultat sur %s? messageCheckInputData = Veuillez vérifier les données d'entrée messageClinicalCourseSaved = Cours clinique enregistré @@ -1084,7 +1109,6 @@ messageContactCreated=Nouveau contact créé messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Données de contact enregistrées -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Veuillez copier ce mot de passe, il n'est affiché qu'une seule fois. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Vous avez défini la condition de spécimen sur non adéquate.
Voulez-vous créer une nouvelle tâche pour collecter un autre échantillon? messageDatabaseExportFailed = Veuillez contacter un administrateur et les prévenir sur ce problème messageEntryCreated = Entrée créée @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = Nouvelle personne créée messageEventParticipantSaved = Données de la personne enregistrées messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Données de l'événement enregistrées messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Il y a eu une erreur empêchant l'exportation des données. Veuillez contacter un administrateur et l'informer de ce problème. messageExportConfigurationDeleted = Configuration d'export supprimée messageExportConfigurationSaved = Configuration d'exportation enregistrée messageFollowUpCanceled = Le suivi de tous les contacts sélectionnés a été annulé -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Le suivi de tous les contacts sélectionnés qui n'ont pas terminé leur suivi a été paramétré pour être perdu de vue -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = Vous avez changé le centre de santé de ce cas. Souhaitez-vous transférer le cas dans le nouvel établissement de santé (l'hospitalisation serait mise à jour) ou souhaitez-vous modifier les données seulement pour corriger une erreur? messageFacilityMulitChanged = Vous avez changé l'établissement de santé de plusieurs cas. Souhaitez-vous transférer ces cas vers le nouvel établissement de santé (l'hospitalisation serait mise à jour) ou souhaitez-vous modifier les données seulement pour corriger des erreurs? messageGdpr = Conformément au principe de minimisation des données imposé par le RGPD, vous devez veiller à ne saisir ici que des données objectives absolument nécessaires au traitement du dossier. En particulier, vous ne devez pas saisir de données génétiques ou biométriques, opinions philosophiques, politiques, religieuses, syndicales, vie sexuelle ou orientation, origine ethnique, infractions, condamnations, mesures de sûreté, casier judiciaire… ou toutes autres données qui ne seraient pas en rapport avec l’enquête sanitaire. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Importation réussie \!
Toutes les lignes o messageUploadSuccessful = Envoi réussi\! Vous pouvez maintenant fermer cette fenêtre. messageIncompleteGpsCoordinates = Les coordonnées GPS sont incomplètes messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Vérifiez votre identifiant et mot de passe et réessayez messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Veuillez remplir les deux champs de filtre de date @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Vous n'avez pas sélectionné de contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = Vous n'avez pas sélectionné de fichier à envoyer. Veuillez sélectionner un fichier modèle .docx que vous souhaitez importer depuis votre ordinateur. messageNoDocumentUploadFile = Vous n'avez pas sélectionné de fichier à télécharger. Veuillez sélectionner un fichier que vous souhaitez importer depuis votre ordinateur. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = Vous n'avez sélectionné aucun participant à l'événement messageNoEventsSelected = Vous n'avez sélectionné aucun événement @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = Il y a des erreurs dans le formulaire d'échantillon. Veuillez les corriger et enregistrer l'échantillon avant de le renvoyer à un autre laboratoire. messageSampleSaved = Exemple de données sauvegardées -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Veuillez spécifier l'attribut de colonne que vous avez choisi pour la visualisation messageSpecifyFilterAttributes = Veuillez spécifier tous les attributs de filtre et sous-attributs sélectionnés @@ -1237,7 +1293,6 @@ messageSymptomsHint = Veuillez cocher une réponse pour TOUS les symptômes i messageSymptomsVisitHint = Veuillez cocher une réponse pour TOUS les symptômes indiquant s'ils étaient présents au moment de cette visite \: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Le fichier de modèle n'est pas disponible. Veuillez contacter un administrateur et leur dire ce problème. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Traitement créé messageTreatmentSaved = Traitement enregistré @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = ne peut pas être combiné avec messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Veuillez fournir un fichier .csv contenant les données que vous souhaitez importer. Il est recommandé d'utiliser le fichier de modèle d'importation comme point de départ. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = La liste des cas a été désactivée @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Exportation complète vers SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index f0deaeb43c2..6ae860bf9d7 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -445,6 +445,8 @@ headingCaseImport = Importer un cas headingPointOfEntryImport = Importation au point d'entrée headingCaseStatusMap = Carte de statut des cas headingCasesDeleted = Cas supprimé +headingCasesNotDeleted = Aucun des cas n'a été supprimé +headingCasesNotRestored = Aucun des cas n'a été restauré headingCaseConversion = Conversion en cas headingChangeCaseDisease = Changer la maladie de cas headingCasesGuide = Guide \: Répertoire des cas @@ -466,6 +468,9 @@ headingUnderFollowUp = Suivi en cours headingContactInformation = Informations relatives au contact headingContactMap = Carte des contacts headingContactsDeleted = Contacts supprimés +headingContactsNotDeleted = Aucun des contacts n'a été supprimé +headingContactsNotLinked = Aucun des contacts n'a été lié +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Créer de nouveaux résultats de test supplémentaires headingCreateEntry = Créer une entrée headingCreateNewAction = Créer une nouvelle action @@ -531,15 +536,24 @@ headingEditCountry = Modifier le pays headingEditContinent = Modifier le continent headingEditSample = Modifier l'échantillon headingEditSubcontinent = Modifier le sous-continent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Exposition environnementale headingEpiCurve = Courbe épidémiologique headingErrorReportNotAvailable = Rapport d'erreur non disponible headingEventData = Données de l'événement headingEventGroupData = Données du groupe d'événements headingEventParticipantsDeleted = Participants de l'événement supprimés +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Mise à jour de la juridiction des participants headingEventJurisdictionUpdated = Mise à jour de la juridiction de l'événement headingEventsDeleted = Evènements supprimés +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Exportation échouée headingFatalities=Fatalité headingFileExists = Dupliquer le fichier @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Importer les sous-continents par défaut headingImportAreas = Importer les zones headingImportRegions= Importer des provinces headingImportTravelEntries = Importer des entrées de voyage +headingImportEnvironments = Import Environments headingInformationSource = Source d'information headingInfrastructureLocked = Infrastructure verrouillée headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Tests de pathogènes demandés\: headingResponsibleJurisdiction=Juridiction responsable headingResults = Résultats headingSamplesDeleted = Échantillons supprimés +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Enregistrer la notification headingSecurityAlert=Alerte de sécurité headingSelectCampaign = Sélectionnez une campagne @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Signes et symptômes cliniques headingSimilarImmunization = Immunisation similaire headingSyncUsers = Synchroniser l'utilisateur headingTasksDeleted = Tâches supprimées +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Modèle non disponible headingTests = Tests headingTransferCase = Transfert le cas headingTravelEntryData = Donnée d'entrée de voyage headingTravelEntriesDeleted = Entrées de voyage supprimées +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Référez le cas du point d'entrée headingTreatments = Traitements exécutés headingTreatmentsDeleted = Traitement supprimé @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Vue de visite headingVisits = Visites headingVisitsDeleted = Visite supprimée +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualisation headingWrongFileType = Type de fichier incorrect headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cas restaurés headingContactsRestored = Contacts restaurés headingEventsRestored = Événements restaurés headingEventParticipantsRestored = Participants de l'événement restauré +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunisations restaurées headingSamplesRestored = Échantillons restaurés headingTravelEntriesRestored = Entrées de voyage restaurées @@ -717,22 +743,23 @@ headingNewSourceCases = Les nouveaux cas ne sont pas connus précédemment pour headingNoCaseFound = Aucun cas trouvé headingNoEventFound = Aucun événement trouvé headingEventNotDeleted = Événement non supprimé -headingSomeCasesNotDeleted = Certains cas n'ont pas été supprimés headingSomeCasesNotRestored = Certains cas n'ont pas été restaurés -headingSomeContactsNotDeleted = Certains contacts n'ont pas été supprimés headingSomeContactsNotRestored = Certains cas n'ont pas été restaurés -headingSomeEventsNotRestored = Certains événements n'ont pas été restaurés -headingSomeEventParticipantsNotDeleted = Certains participants à l'événement n'ont pas été supprimés +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Certains participants à l'événement n'ont pas été restaurés +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Certains événements n'ont pas été restaurés headingSomeImmunizationsNotRestored = Certaines immunisations n'ont pas été restaurées -headingSomeSamplesNotDeleted = Certains échantillons n'ont pas été supprimés headingSomeSamplesNotRestored = Certains échantillons n'ont pas été restaurés -headingSomeTasksNotDeleted = Certaines tâches n'ont pas été supprimées -headingSomeTravelEntriesNotDeleted = Certaines entrées de voyage n'ont pas été supprimées headingSomeTravelEntriesNotRestored = Certaines entrées de voyage n'ont pas été restaurés -headingSomeVisitsNotDeleted = Certaines visites n'ont pas été supprimées -headingSomeEventsNotDeleted = Certains événements n'ont pas été supprimés -headingSomeExternalMessagesNotDeleted = Certains messages externes n'ont pas été supprimés +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Confirmation du contact requise headingContactConversionFollowUpCommentLarge = Le commentaire de suivi dépasse le nombre maximum de caractères autorisés headingSelectSourceCase = Sélectionner le cas source @@ -765,6 +792,7 @@ headingExportUserRightsFailed = L'exportation des droits utilisateur a échoué headingExternalMessageDownload = Télécharger le message headingNoExternalMessagesSelected = Aucun message sélectionné headingExternalMessagesDeleted = Messages supprimés +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Message de correction headingExternalMessageProcessSample = Traiter les échantillons et les rapports de test headingExternalMessageSampleInformation = Information d'échantillon @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = Nouveaux tests pathogènes headingFetchExternalMessages = Récupérer les nouveaux messages headingCaution = Attention headingUnavailableTaskEdition = Édition de la tâche indisponible +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Enlever l'immunité par vaccination headingDocumentCreated = Document créé headingConfirmUnclearLabMessage=Confirmer la suppression @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Veuillez documenter toutes les activités pertinentes après l'infection \: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Le processus en lot a été complété avec succès \!
Cependant, certaines des entrées sélectionnées n'ont pas pu être traitées, car elles n'étaient pas éligibles. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Le processus en lot a été complété avec succès \!
Cependant, certaines des entrées sélectionnées n'ont pas pu être traitées, probablement parce qu'elles étaient hors de votre juridiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Le traitement en lot a été complété avec succès \!
Cependant, certaines des entrées sélectionnées n'ont pas pu être traitées, probablement parce qu'ils étaient hors de votre juridiction, déjà archivés ou non admissibles. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Le processus en lot a été annulé car il n'y a pas d'entrées éligibles pour cette opération \! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = Tous les contacts ont été liés à l'événement sélectionné. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = La personne que vous avez sélectionnée est déjà définie comme participant à cet événement. messageAnimalContactsHint = Veuillez indiquer une réponse concernant TOUS les animaux (vivants ou morts) que la personne a eu une exposition directe (par exemple chasse, toucher, manger) pendant la période d'incubation. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=Il n'est pas possible de lier un cas à messageCaseSaved = Cas enregistré messageCaseSavedClassificationChanged = Cas enregistré. La classification a été automatiquement modifiée en %s. messageCaseTransfered = Le cas a été transféré à un autre établissement de santé -messageCasesNotDeleted = Les cas mentionnés dans la liste des UUID ci-dessus n'ont pas pu être supprimés. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = Le cas en dehors de la juridiction de l'utilisateur ne peut pas être supprimé +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cas fusionné et double supprimé. messageCasesRestored = Tous les cas sélectionnés ont été restaurés -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = Tous les contacts sélectionnés ont été restaurés -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = Tous les événements sélectionnés ont été restaurés -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = Tous les participants d'événements sélectionnés ont été restaurés -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = Tous les échantillons sélectionnés ont été restaurés -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = Le résultat de ce test pathogène est différent du résultat global actuel du test pathogène de l'échantillon. Voulez-vous mettre à jour son résultat sur %s? messageCheckInputData = Veuillez vérifier les données d'entrée messageClinicalCourseSaved = Cours clinique enregistré @@ -1084,7 +1109,6 @@ messageContactCreated=Nouveau contact créé messageContactArchived = Le contact a été archivé messageContactDearchived = Le contact a été désarchivé messageContactSaved = Données de contact enregistrées -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = Le contact en dehors de la juridiction de l'utilisateur ne peut pas être supprimé messageContactDuplicateDeleted = Le contact en double a été supprimé. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts fusionnés et doublons de contact supprimés. messageCopyPassword = Veuillez copier ce mot de passe, il n'est affiché qu'une seule fois. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Vous avez défini la condition de spécimen sur non adéquate.
Voulez-vous créer une nouvelle tâche pour collecter un autre échantillon? messageDatabaseExportFailed = Veuillez contacter un administrateur et les prévenir sur ce problème messageEntryCreated = Entrée créée @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = L'événement sélectionné a été lié ave messageEventLinkedAsSubordinate = L'événement sélectionné a été lié avec succès à cet événement en tant qu'événement subordonné messageEventLinkedToGroup = L'événement sélectionné a été associé avec succès à ce groupe d'événements messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = L'événement en dehors de la juridiction de l'utilisateur ne peut pas être supprimé messageEventSuperordinateEventUnlinked = Le lien entre cet événement et son événement superordonné a été supprimé avec succès messageEventSubordinateEventUnlinked = Le lien entre cet événement et son événement subordonné a été supprimé avec succès @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = Nouvelle personne créée messageEventParticipantSaved = Données de la personne enregistrées messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = La modification ou la suppression de la juridiction responsable du participant à cet événement pourrait vous faire perdre accès à ses données personnelles et/ou vous interdire de les modifier dans le futur. Êtes-vous sûr de vouloir continuer ? messageEventParticipantToCaseWithoutEventDisease=Il n'est pas possible de transformer une personne participant à un événement en cas si la maladie de l'événement n'a pas été définie @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=Il n'est pas possible de cr messageEventJurisdictionUpdated = La modification ou la suppression de la juridiction de cet événement pourrait vous faire perdre l'accès à ses données personnelles et/ou vous interdire de les modifier à l'avenir. Êtes-vous sûr de vouloir continuer ? messageEventSaved = Données de l'événement enregistrées messageEventGroupSaved = Données de groupe d'événements enregistrées -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = Tous les événements sélectionnés ont été envoyés à SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Il y a eu une erreur empêchant l'exportation des données. Veuillez contacter un administrateur et l'informer de ce problème. messageExportConfigurationDeleted = Configuration d'export supprimée messageExportConfigurationSaved = Configuration d'exportation enregistrée messageFollowUpCanceled = Le suivi de tous les contacts sélectionnés a été annulé -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Le suivi de tous les contacts sélectionnés qui n'ont pas terminé leur suivi a été paramétré pour être perdu de vue -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = Vous avez changé le centre de santé de ce cas. Souhaitez-vous transférer le cas dans le nouvel établissement de santé (l'hospitalisation sera mise à jour) ou souhaitez-vous uniquement modifier les données pour corriger une erreur? messageFacilityMulitChanged = Vous avez changé l'établissement de santé de plusieurs cas. Souhaitez-vous transférer ces cas dans le nouvel établissement de santé (l'hospitalisation sera mise à jour) ou souhaitez-vous uniquement modifier leurs données pour corriger les erreurs? messageGdpr = Conformément au principe de minimisation des données vous devez veiller à ne saisir ici que des données adéquates, pertinentes et limitées à ce qui est nécessaire au traitement. En particulier sont interdites des données relatives à l'origine raciale ou ethnique, aux opinions politiques, aux convictions religieuses ou philosophiques ou à l'appartenance syndicale, des données génétiques, biométriques, de santé, ou des données concernant la vie sexuelle ou l'orientation sexuelle d'une personne physique, des données relatives aux condamnations pénales et aux infractions, aux mesures de sûreté connexes ou toutes autres données qui ne seraient pas en rapport avec l’enquête sanitaire. Par ailleurs, des informations relatives aux utilisateurs SORMAS sont collectées au sein de l'application et sont susceptibles d'être transmises et/ou consultées directement dans SORMAS. Pour toute information ou exercice de vos droits Informatique et Libertés, vous pouvez consulter la rubrique « A propos de ». @@ -1183,7 +1238,6 @@ messageImportSuccessful = Importation réussie \!
Toutes les lignes o messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = Les coordonnées GPS sont incomplètes messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Vérifiez votre identifiant et mot de passe et réessayez messageMissingCases = Veuillez générer quelques cas avant de générer des contacts messageMissingDateFilter = Veuillez remplir les deux champs de filtre de date @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Vous n'avez pas sélectionné de contacts messageNoCsvFile = Vous n'avez pas sélectionné de fichier à télécharger. Veuillez sélectionner un fichier .csv contenant les données que vous souhaitez importer depuis votre ordinateur. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = Vous n'avez pas sélectionné de fichier à télécharger. Veuillez sélectionner un fichier que vous souhaitez importer depuis votre ordinateur. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = Vous n'avez sélectionné aucun participant à l'événement messageNoEventsSelected = Vous n'avez sélectionné aucun événement @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = L'exemple référencé dans ce message de laboratoir messageRelatedSampleAndLabMessagesFound = Un message de laboratoire avec le même ID de rapport a déjà été traité. Il est lié à un échantillon également référencé dans ce message de laboratoire.
Voulez-vous ouvrir directement cet échantillon ? messageSampleErrors = Il y a des erreurs dans le formulaire d'échantillon. Veuillez les corriger et enregistrer l'échantillon avant de le renvoyer à un autre laboratoire. messageSampleSaved = Exemple de données sauvegardées -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Veuillez spécifier l'attribut de colonne que vous avez choisi pour la visualisation messageSpecifyFilterAttributes = Veuillez spécifier tous les attributs de filtre et sous-attributs sélectionnés @@ -1237,7 +1293,6 @@ messageSymptomsHint = Veuillez cocher une réponse pour TOUS les symptômes i messageSymptomsVisitHint = Veuillez cocher une réponse pour TOUS les symptômes indiquant s'ils étaient présents au moment de cette visite \: messageTaskArchived = La tâche a été archivée messageTasksEdited = Toutes les tâches ont été modifiées -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = La tâche a été désarchivée messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Le fichier de modèle n'est pas disponible. Veuillez contacter un administrateur et leur dire ce problème. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Traitement créé messageTreatmentSaved = Traitement enregistré @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = ne peut pas être combiné avec messageUserRoleSaved = Rôle de l'utilisateur sauvegardé messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Veuillez fournir un fichier .csv contenant les données que vous souhaitez importer. Il est recommandé d'utiliser le fichier de modèle d'importation comme point de départ. messageWrongTemplateFileType=Pour %s, veuillez fournir un fichier .%s. messageLineListingDisabled = La liste des cas a été désactivée @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Le document de la commande de quarantaine a été créé messageUnavailableTaskEditionDueToDifferentDistricts = L'édition de la tâche n'est pas disponible si elle est liée à différents départements. messageUsersEnabled = Tous les utilisateurs sélectionnés ont été activés -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = Tous les utilisateurs sélectionnés ont été désactivés -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = Ce cas est activement empêché d'être envoyé à l'outil de reporting externe messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Modifications non enregistrées @@ -1603,9 +1673,9 @@ infoBAGExport=Exportation complète vers SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = L'entrée a été envoyée à l'outil de rapport ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = Toutes les entrées sélectionnées ont été supprimées avec succès dans l'outil de rapport. ExternalSurveillanceToolGateway.notificationEntryNotSent = L'observation n’a pas pu être envoyée +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Erreur lors de l'envoi du fichier ExternalSurveillanceToolGateway.unableToSend=Veuillez enregistrer ou annuler toute modification non enregistrée avant d'envoyer le %s à l'outil de rapport. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_fr-TN.properties b/sormas-api/src/main/resources/strings_fr-TN.properties index 2d317ace079..52bdcb1ce34 100644 --- a/sormas-api/src/main/resources/strings_fr-TN.properties +++ b/sormas-api/src/main/resources/strings_fr-TN.properties @@ -445,6 +445,8 @@ headingCaseImport = Importer un cas headingPointOfEntryImport = Importation au point d'entrée headingCaseStatusMap = Carte de statut des cas headingCasesDeleted = Cas supprimé +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion en cas headingChangeCaseDisease = Changer la maladie de cas headingCasesGuide = Guide \: Répertoire des cas @@ -466,6 +468,9 @@ headingUnderFollowUp = Suivi en cours headingContactInformation = Informations relatives au contact headingContactMap = Carte des contacts headingContactsDeleted = Contacts supprimés +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Créer de nouveaux résultats de test supplémentaires headingCreateEntry = Créer une entrée headingCreateNewAction = Créer une nouvelle action @@ -531,15 +536,24 @@ headingEditCountry = Modifier le pays headingEditContinent = Modifier le continent headingEditSample = Modifier l'échantillon headingEditSubcontinent = Modifier le sous-continent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Exposition environnementale headingEpiCurve = Courbe épidémiologique headingErrorReportNotAvailable = Rapport d'erreur non disponible headingEventData = Données de l'événement headingEventGroupData = Données du groupe d'événements headingEventParticipantsDeleted = Participants de l'événement supprimés +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Mise à jour de la juridiction des participants headingEventJurisdictionUpdated = Mise à jour de la juridiction de l'événement headingEventsDeleted = Evènements supprimés +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Exportation échouée headingFatalities=Fatalité headingFileExists = Dupliquer le fichier @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Importer les sous-continents par défaut headingImportAreas = Importer les zones headingImportRegions= Importer des provinces headingImportTravelEntries = Importer des entrées de voyage +headingImportEnvironments = Import Environments headingInformationSource = Source d'information headingInfrastructureLocked = Infrastructure verrouillée headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Tests de pathogènes demandés\: headingResponsibleJurisdiction=Juridiction responsable headingResults = Résultats headingSamplesDeleted = Échantillons supprimés +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Enregistrer la notification headingSecurityAlert=Alerte de sécurité headingSelectCampaign = Sélectionnez une campagne @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Signes et symptômes cliniques headingSimilarImmunization = Immunisation similaire headingSyncUsers = Synchroniser l'utilisateur headingTasksDeleted = Tâches supprimées +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Modèle non disponible headingTests = Tests headingTransferCase = Transfert le cas headingTravelEntryData = Donnée d'entrée de voyage headingTravelEntriesDeleted = Entrées de voyage supprimées +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Référez le cas du point d'entrée headingTreatments = Traitements exécutés headingTreatmentsDeleted = Traitement supprimé @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Vue de visite headingVisits = Visites headingVisitsDeleted = Visite supprimée +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualisation headingWrongFileType = Type de fichier incorrect headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cas restaurés headingContactsRestored = Contacts restaurés headingEventsRestored = Événements restaurés headingEventParticipantsRestored = Participants de l'événement restauré +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunisations restaurées headingSamplesRestored = Échantillons restaurés headingTravelEntriesRestored = Entrées de voyage restaurées @@ -717,22 +743,23 @@ headingNewSourceCases = Les nouveaux cas ne sont pas connus précédemment pour headingNoCaseFound = Aucun cas trouvé headingNoEventFound = Aucun événement trouvé headingEventNotDeleted = Événement non supprimé -headingSomeCasesNotDeleted = Certains cas n'ont pas été supprimés headingSomeCasesNotRestored = Certains cas n'ont pas été restaurés -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Certains cas n'ont pas été restaurés -headingSomeEventsNotRestored = Certains événements n'ont pas été restaurés -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Certains participants à l'événement n'ont pas été restaurés +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Certains événements n'ont pas été restaurés headingSomeImmunizationsNotRestored = Certaines immunisations n'ont pas été restaurées -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Certains échantillons n'ont pas été restaurés -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Certaines entrées de voyage n'ont pas été restaurés -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Certains événements n'ont pas été supprimés -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Confirmation du contact requise headingContactConversionFollowUpCommentLarge = Le commentaire de suivi dépasse le nombre maximum de caractères autorisés headingSelectSourceCase = Sélectionner le cas source @@ -765,6 +792,7 @@ headingExportUserRightsFailed = L'exportation des droits utilisateur a échoué headingExternalMessageDownload = Télécharger le message headingNoExternalMessagesSelected = Aucun message sélectionné headingExternalMessagesDeleted = Messages supprimés +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Message de correction headingExternalMessageProcessSample = Traiter les échantillons et les rapports de test headingExternalMessageSampleInformation = Information d'échantillon @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = Nouveaux tests pathogènes headingFetchExternalMessages = Récupérer les nouveaux messages headingCaution = Attention headingUnavailableTaskEdition = Édition de la tâche indisponible +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Enlever l'immunité par vaccination headingDocumentCreated = Document créé headingConfirmUnclearLabMessage=Confirmer la suppression @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Veuillez documenter toutes les activités pertinentes après l'infection \: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = La personne que vous avez sélectionnée est déjà définie comme participant à cet événement. messageAnimalContactsHint = Veuillez indiquer une réponse concernant TOUS les animaux (vivants ou morts) que la personne a eu une exposition directe (par exemple chasse, toucher, manger) pendant la période d'incubation. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=Il n'est pas possible de lier un cas à messageCaseSaved = Cas enregistré messageCaseSavedClassificationChanged = Cas enregistré. La classification a été automatiquement modifiée en %s. messageCaseTransfered = Le cas a été transféré à un autre établissement de santé -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cas fusionné et double supprimé. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = Le résultat de ce test pathogène est différent du résultat global actuel du test pathogène de l'échantillon. Voulez-vous mettre à jour son résultat sur %s? messageCheckInputData = Veuillez vérifier les données d'entrée messageClinicalCourseSaved = Cours clinique enregistré @@ -1084,7 +1109,6 @@ messageContactCreated=Nouveau contact créé messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Données de contact enregistrées -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = Le contact en double a été supprimé. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts fusionnés et doublons de contact supprimés. messageCopyPassword = Veuillez copier ce mot de passe, il n'est affiché qu'une seule fois. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Vous avez défini la condition de spécimen sur non adéquate.
Voulez-vous créer une nouvelle tâche pour collecter un autre échantillon? messageDatabaseExportFailed = Veuillez contacter un administrateur et les prévenir sur ce problème messageEntryCreated = Entrée créée @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = L'événement sélectionné a été lié ave messageEventLinkedAsSubordinate = L'événement sélectionné a été lié avec succès à cet événement en tant qu'événement subordonné messageEventLinkedToGroup = L'événement sélectionné a été associé avec succès à ce groupe d'événements messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = Le lien entre cet événement et son événement superordonné a été supprimé avec succès messageEventSubordinateEventUnlinked = Le lien entre cet événement et son événement subordonné a été supprimé avec succès @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = Nouvelle personne créée messageEventParticipantSaved = Données de la personne enregistrées messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = La modification ou la suppression de la juridiction responsable du participant à cet événement pourrait vous faire perdre accès à ses données personnelles et/ou vous interdire de les modifier dans le futur. Êtes-vous sûr de vouloir continuer ? messageEventParticipantToCaseWithoutEventDisease=Il n'est pas possible de transformer une personne participant à un événement en cas si la maladie de l'événement n'a pas été définie @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=Il n'est pas possible de cr messageEventJurisdictionUpdated = La modification ou la suppression de la juridiction de cet événement pourrait vous faire perdre l'accès à ses données personnelles et/ou vous interdire de les modifier à l'avenir. Êtes-vous sûr de vouloir continuer ? messageEventSaved = Données de l'événement enregistrées messageEventGroupSaved = Données de groupe d'événements enregistrées -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = Tous les événements sélectionnés ont été envoyés à SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Il y a eu une erreur empêchant l'exportation des données. Veuillez contacter un administrateur et l'informer de ce problème. messageExportConfigurationDeleted = Configuration d'export supprimée messageExportConfigurationSaved = Configuration d'exportation enregistrée messageFollowUpCanceled = Le suivi de tous les contacts sélectionnés a été annulé -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Le suivi de tous les contacts sélectionnés qui n'ont pas terminé leur suivi a été paramétré pour être perdu de vue -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = Vous avez changé le centre de santé de ce cas. Souhaitez-vous transférer le cas dans le nouvel établissement de santé (l'hospitalisation sera mise à jour) ou souhaitez-vous uniquement modifier les données pour corriger une erreur? messageFacilityMulitChanged = Vous avez changé l'établissement de santé de plusieurs cas. Souhaitez-vous transférer ces cas dans le nouvel établissement de santé (l'hospitalisation sera mise à jour) ou souhaitez-vous uniquement modifier leurs données pour corriger les erreurs? messageGdpr = Conformément au principe de minimisation des données vous devez veiller à ne saisir ici que des données adéquates, pertinentes et limitées à ce qui est nécessaire au traitement. En particulier sont interdites des données relatives à l'origine raciale ou ethnique, aux opinions politiques, aux convictions religieuses ou philosophiques ou à l'appartenance syndicale, des données génétiques, biométriques, de santé, ou des données concernant la vie sexuelle ou l'orientation sexuelle d'une personne physique, des données relatives aux condamnations pénales et aux infractions, aux mesures de sûreté connexes ou toutes autres données qui ne seraient pas en rapport avec l’enquête sanitaire. Par ailleurs, des informations relatives aux utilisateurs SORMAS sont collectées au sein de l'application et sont susceptibles d'être transmises et/ou consultées directement dans SORMAS. Pour toute information ou exercice de vos droits Informatique et Libertés, vous pouvez consulter la rubrique « A propos de ». @@ -1183,7 +1238,6 @@ messageImportSuccessful = Importation réussie \!
Toutes les lignes o messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = Les coordonnées GPS sont incomplètes messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Vérifiez votre identifiant et mot de passe et réessayez messageMissingCases = Veuillez générer quelques cas avant de générer des contacts messageMissingDateFilter = Veuillez remplir les deux champs de filtre de date @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Vous n'avez pas sélectionné de contacts messageNoCsvFile = Vous n'avez pas sélectionné de fichier à télécharger. Veuillez sélectionner un fichier .csv contenant les données que vous souhaitez importer depuis votre ordinateur. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = Vous n'avez pas sélectionné de fichier à télécharger. Veuillez sélectionner un fichier que vous souhaitez importer depuis votre ordinateur. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = Vous n'avez sélectionné aucun participant à l'événement messageNoEventsSelected = Vous n'avez sélectionné aucun événement @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = L'exemple référencé dans ce message de laboratoir messageRelatedSampleAndLabMessagesFound = Un message de laboratoire avec le même ID de rapport a déjà été traité. Il est lié à un échantillon également référencé dans ce message de laboratoire.
Voulez-vous ouvrir directement cet échantillon ? messageSampleErrors = Il y a des erreurs dans le formulaire d'échantillon. Veuillez les corriger et enregistrer l'échantillon avant de le renvoyer à un autre laboratoire. messageSampleSaved = Exemple de données sauvegardées -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Veuillez spécifier l'attribut de colonne que vous avez choisi pour la visualisation messageSpecifyFilterAttributes = Veuillez spécifier tous les attributs de filtre et sous-attributs sélectionnés @@ -1237,7 +1293,6 @@ messageSymptomsHint = Veuillez cocher une réponse pour TOUS les symptômes i messageSymptomsVisitHint = Veuillez cocher une réponse pour TOUS les symptômes indiquant s'ils étaient présents au moment de cette visite \: messageTaskArchived = The task has been archived messageTasksEdited = Toutes les tâches ont été modifiées -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Le fichier de modèle n'est pas disponible. Veuillez contacter un administrateur et leur dire ce problème. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Traitement créé messageTreatmentSaved = Traitement enregistré @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = ne peut pas être combiné avec messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Veuillez fournir un fichier .csv contenant les données que vous souhaitez importer. Il est recommandé d'utiliser le fichier de modèle d'importation comme point de départ. messageWrongTemplateFileType=Pour %s, veuillez fournir un fichier .%s. messageLineListingDisabled = La liste des cas a été désactivée @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Le document de la commande de quarantaine a été créé messageUnavailableTaskEditionDueToDifferentDistricts = L'édition de la tâche n'est pas disponible si elle est liée à différents départements. messageUsersEnabled = Tous les utilisateurs sélectionnés ont été activés -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = Tous les utilisateurs sélectionnés ont été désactivés -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = Ce cas est activement empêché d'être envoyé à l'outil de reporting externe messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Modifications non enregistrées @@ -1603,9 +1673,9 @@ infoBAGExport=Exportation complète vers SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = L'entrée a été envoyée à l'outil de rapport ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = Toutes les entrées sélectionnées ont été supprimées avec succès dans l'outil de rapport. ExternalSurveillanceToolGateway.notificationEntryNotSent = L'observation n’a pas pu être envoyée +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Erreur lors de l'envoi du fichier ExternalSurveillanceToolGateway.unableToSend=Veuillez enregistrer ou annuler toute modification non enregistrée avant d'envoyer le %s à l'outil de rapport. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index a8988356cba..664a2562228 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -445,6 +445,8 @@ headingCaseImport = Importa caso headingPointOfEntryImport = Importa punto di entrata headingCaseStatusMap = Mappa stato del caso headingCasesDeleted = Casi eliminati +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Cambia malattia caso headingCasesGuide = Guida\: elenco dei casi @@ -466,6 +468,9 @@ headingUnderFollowUp = Soggetto a follow-up headingContactInformation = Informazioni contatto headingContactMap = Mappa contatto headingContactsDeleted = Contatti eliminati +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Crea nuovi risultati di test supplementari headingCreateEntry = Crea voce headingCreateNewAction = Crea nuova azione @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Esposizione ambientale headingEpiCurve = Curva epidemiologica headingErrorReportNotAvailable = Segnalazione errore non disponibile headingEventData = Data dell'evento headingEventGroupData = Event group data headingEventParticipantsDeleted = Partecipanti all'evento eliminati +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Eventi eliminati +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Esportazione non riuscita headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Importa Aree headingImportRegions= Importa Cantoni headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Fonte di informazione headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduzione @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Test patogeni richiesti\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Risultati headingSamplesDeleted = Campioni eliminati +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Salva notifica headingSecurityAlert=Security Alert headingSelectCampaign = Seleziona una campagna @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Segni e sintomi clinici headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Compiti eliminati +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Modello non disponibile headingTests = Test patogeni headingTransferCase = Trasferisci caso headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Trasferisci caso dal punto di entrata headingTreatments = Trattamenti eseguiti headingTreatmentsDeleted = Trattamenti eliminati @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visite headingVisitsDeleted = Visite eliminate +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualizzazione headingWrongFileType = Tipo di file errato headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = Nuovi casi non noti precedentemente quali contatti headingNoCaseFound = Nessun caso trovato headingNoEventFound = Nessun evento trovato headingEventNotDeleted = Evento non eliminato -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Alcuni eventi non sono stati eliminati -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Richiesta conferma contatto headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Seleziona caso indice @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = La persona che hai selezionato è già definita come partecipante di questo evento. messageAnimalContactsHint = Si prega di indicare una risposta riguardante TUTTI gli animali (vivi o morti) a cui la persona è stata esposta direttamente (p. es. cacciare, toccare, mangiare) durante il periodo di incubazione. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Caso salvato messageCaseSavedClassificationChanged = Caso salvato. La classificazione è stata cambiata automaticamente in %s. messageCaseTransfered = Il caso è stato trasferito ad un'altra struttura -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Casi fusi e caso duplicato eliminato. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = Il risultato di questo test patogeno differisce dall'attuale risultato complessivo del test patogeno del campione. Vuoi aggiornare il suo risultato in %s? messageCheckInputData = Controlla i dati inseriti messageClinicalCourseSaved = Decorso clinico salvato @@ -1084,7 +1109,6 @@ messageContactCreated=Nuovo contatto creato messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Dati del contatto salvati -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Si prega di copiare la password, non sarà più visualizzata. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Hai impostato lo stato dell'esemplare su non adeguato.
Vuoi creare un nuovo compito di raccolta campioni? messageDatabaseExportFailed = Si prega di contattare un amministratore e segnalargli il problema messageEntryCreated = Voce creata @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = Nuova persona creata messageEventParticipantSaved = Dati personali salvati messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Dati evento salvati messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Si è verificato un errore che impedisce l'esportazione dei dati. Si prega di contattare un amministratore e segnalargli il problema. messageExportConfigurationDeleted = Configurazione di esportazione eliminata messageExportConfigurationSaved = Configurazione di esportazione salvata messageFollowUpCanceled = Il follow-up di tutti i contatti selezionati è stato annullato -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Il follow-up di tutti i contatti selezionati con follow-up è stato impostato su "Perso al follow-up" -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = Hai cambiato la struttura di questo caso. Vuoi trasferire il caso alla nuova struttura (l'ospedalizzazione verrà aggiornata) o vuoi solo modificare i dati per correggere un errore? messageFacilityMulitChanged = Hai cambiato la struttura di più casi. Vuoi trasferire questi casi alla nuova struttura (l'ospedalizzazione potrebbe essere aggiornata) o vuoi solo modificare i loro dati per correggere un errore? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Importazione riuscita\!
Tutte le righe sono messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = Le coordinate GPS sono incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Controlla il nome utente e la password e riprova messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Compila entrambi i campi del filtro data @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Non hai selezionato nessun contatto messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = Non hai selezionato nessun partecipante all'evento messageNoEventsSelected = Non hai selezionato nessun evento @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = Ci sono errori nel formulario del campione. Si prega di correggerli e salvare il campione prima di inoltrarlo a un altro laboratorio. messageSampleSaved = Dati del campione salvati -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Specifica l'attributo colonna che hai scelto per la visualizzazione messageSpecifyFilterAttributes = Specifica tutti gli attributi e i sottoattributi di filtro selezionati @@ -1237,7 +1293,6 @@ messageSymptomsHint = Si prega di spuntare una risposta per TUTTI i sintomi, messageSymptomsVisitHint = Si prega di spuntare una risposta per TUTTI i sintomi, indicando se erano presenti al momento di questa visita\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Il file modello non è disponibile. Si prega di contattare un amministratore e segnalargli il problema. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Trattamento creato messageTreatmentSaved = Trattamento salvato @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = non può essere combinato con messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Fornisci un file .csv contenente i dati che vuoi importare. Come punto di partenza, si consiglia di utilizzare il modello di importazione. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = L'elenco linee è stato disabilitato @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = La classificazione del caso %s è cambiata in %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index ae0632b291c..642ce218806 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -445,6 +445,8 @@ headingCaseImport = Importa caso headingPointOfEntryImport = Importa punto di entrata headingCaseStatusMap = Mappa stato del caso headingCasesDeleted = Casi eliminati +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Cambia malattia caso headingCasesGuide = Guida\: elenco dei casi @@ -466,6 +468,9 @@ headingUnderFollowUp = Soggetto a follow-up headingContactInformation = Informazioni contatto headingContactMap = Mappa contatto headingContactsDeleted = Contatti eliminati +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Crea nuovi risultati di test supplementari headingCreateEntry = Crea voce headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Esposizione ambientale headingEpiCurve = Curva epidemiologica headingErrorReportNotAvailable = Segnalazione errore non disponibile headingEventData = Data dell'evento headingEventGroupData = Event group data headingEventParticipantsDeleted = Partecipanti all'evento eliminati +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Eventi eliminati +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Esportazione non riuscita headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Importa Aree headingImportRegions= Importa Cantoni headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Fonte di informazione headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduzione @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Test patogeni richiesti\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Risultati headingSamplesDeleted = Campioni eliminati +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Salva notifica headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Segni e sintomi clinici headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Compiti eliminati +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Modello non disponibile headingTests = Test patogeni headingTransferCase = Trasferisci caso headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Trasferisci caso dal punto di entrata headingTreatments = Trattamenti eseguiti headingTreatmentsDeleted = Trattamenti eliminati @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visite headingVisitsDeleted = Visite eliminate +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualizzazione headingWrongFileType = Tipo di file errato headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = Nuovi casi non noti precedentemente da considerare conta headingNoCaseFound = Nessun caso trovato headingNoEventFound = Nessun evento trovato headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Richiesta conferma contatto headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Seleziona caso indice @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Si prega di indicare una risposta riguardante TUTTI gli animali (vivi o morti) a cui la persona è stata esposta direttamente (p. es. cacciare, toccare, mangiare) durante il periodo di incubazione. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Caso salvato messageCaseSavedClassificationChanged = Caso salvato. La classificazione è stata cambiata automaticamente in %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Casi fusi e caso duplicato eliminato. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = Il risultato di questo test patogeno differisce dall'attuale risultato complessivo del test patogeno del campione. Vuoi aggiornare il suo risultato in %s? messageCheckInputData = Controlla i dati inseriti messageClinicalCourseSaved = Decorso clinico salvato @@ -1084,7 +1109,6 @@ messageContactCreated=Nuovo contatto creato messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Dati del contatto salvati -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Si prega di copiare la password, non sarà più visualizzata. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = Hai impostato lo stato dell'esemplare su non adeguato.
Vuoi creare un nuovo compito di raccolta campioni? messageDatabaseExportFailed = Si prega di contattare un amministratore e segnalargli il problema messageEntryCreated = Voce creata @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = Nuova persona creata messageEventParticipantSaved = Dati personali salvati messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Dati evento salvati messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = Si è verificato un errore che impedisce l'esportazione dei dati. Si prega di contattare un amministratore e segnalargli il problema. messageExportConfigurationDeleted = Configurazione di esportazione eliminata messageExportConfigurationSaved = Configurazione di esportazione salvata messageFollowUpCanceled = Il follow-up di tutti i contatti selezionati è stato annullato -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Il follow-up di tutti i contatti selezionati con follow-up è stato impostato su "Perso al follow-up" -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Importazione riuscita\!
Tutte le righe sono messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = Le coordinate GPS sono incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Controlla il nome utente e la password e riprova messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Compila entrambi i campi del filtro data @@ -1195,7 +1249,10 @@ messageNoContactsSelected = Non hai selezionato nessun contatto messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = Non hai selezionato nessun partecipante all'evento messageNoEventsSelected = Non hai selezionato nessun evento @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = Ci sono errori nel formulario del campione. Si prega di correggerli e salvare il campione prima di inoltrarlo a un altro laboratorio. messageSampleSaved = Dati del campione salvati -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Specifica l'attributo colonna che hai scelto per la visualizzazione messageSpecifyFilterAttributes = Specifica tutti gli attributi e i sottoattributi di filtro selezionati @@ -1237,7 +1293,6 @@ messageSymptomsHint = Si prega di spuntare una risposta per TUTTI i sintomi, messageSymptomsVisitHint = Si prega di spuntare una risposta per TUTTI i sintomi, indicando se erano presenti al momento di questa visita\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = Il file modello non è disponibile. Si prega di contattare un amministratore e segnalargli il problema. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Trattamento creato messageTreatmentSaved = Trattamento salvato @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = non può essere combinato con messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Fornisci un file .csv contenente i dati che vuoi importare. Come punto di partenza, si consiglia di utilizzare il modello di importazione. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = L'elenco linee è stato disabilitato @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = La classificazione del caso %s è cambiata in %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index 959e5c6f909..090f660aaa7 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index 836dfd33c90..fcbe8b39016 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = Wszystkie zaznaczone wpisy zostały zarchiwizowane -messageSomeEntitiesArchived = %s wpisów zostało zarchiwizowanych. messageAllEntitiesDearchived = Wszystkie zaznaczone wpisy zostały usunięte z archiwum -messageSomeEntitiesDearchived = %s wpisów zostało usuniętych z archiwum. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index 1f811561ce5..55d87216316 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index 9fcfa8cbe32..bc21c15dc6b 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 3819e87c95e..2920385ad2e 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 723714cdb7f..8c133c256f4 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -445,6 +445,8 @@ headingCaseImport = کیس امپورٹ headingPointOfEntryImport = داخلے کی جگہ امپورٹ headingCaseStatusMap = کیس کی حالت کا نقشہ headingCasesDeleted = کیسز مٹا دیے گئے +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = کیس میں تبدیل headingChangeCaseDisease = کیس کی بیماری کو تبدیل کریں headingCasesGuide = گائیڈ\: کیس ڈائرکٹری @@ -466,6 +468,9 @@ headingUnderFollowUp = فالو اپ جاری ہے headingContactInformation = رابطے کی معلومات headingContactMap = رابطہ کا نقشہ headingContactsDeleted = رابطے مٹا دیے گئے +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = نئے اضافی ٹیسٹ کے نتائج بنائیں headingCreateEntry = اندراج بنائیں headingCreateNewAction = نئی کارروائی بنائیں @@ -531,15 +536,24 @@ headingEditCountry = ملک میں ترمیم کریں headingEditContinent = براعظم میں ترمیم کریں headingEditSample = نمونہ میں ترمیم کریں headingEditSubcontinent = برصغیر میں ترمیم کریں +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = ماحولیاتی سامنہ headingEpiCurve = وبائی امراض کا کرو headingErrorReportNotAvailable = خرابی کی رپورٹ دستیاب نہیں ہے headingEventData = تقریب کا ڈیٹا headingEventGroupData = تقریب گروپ ڈیٹا headingEventParticipantsDeleted = تقریب کے شرکاء کو مٹا دیا گیا +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = تقریب کے شرکاء کے دائرہ اختیار کی اپ ڈیٹ headingEventJurisdictionUpdated = تقریب کے دائرہ اختیار کی اپ ڈیٹ headingEventsDeleted = تقریبات مٹا کر دیی گئی +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = ایکسپورٹ ناکام ہوا headingFatalities=ہلاکتیں headingFileExists = ڈپلیکیٹ فائل @@ -574,6 +588,7 @@ headingImportAllSubcontinents = پہلے سے طے شدہ برصغیر ایمپ headingImportAreas = خطے امپورٹ کریں headingImportRegions= علاقے امپورٹ کریں headingImportTravelEntries = سفری اندراجات امپورٹ کریں +headingImportEnvironments = Import Environments headingInformationSource = معلومات کا ذریعہ headingInfrastructureLocked = انفراسٹرکچر کو تالہ لگا دیا گیا headingIntroduction = تعارف @@ -641,6 +656,8 @@ headingRequestedPathogenTests = درخواست کردہ پیتھوجین ٹیس headingResponsibleJurisdiction=ذمہ دار دائرہ اختیار headingResults = نتائج headingSamplesDeleted = نمونے مٹا دیے گئے +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = نوٹیفکیشن کو محفوظ کریں headingSecurityAlert=سیکیورٹی الرٹ headingSelectCampaign = ایک مہم منتخب کریں @@ -650,11 +667,14 @@ headingSignsAndSymptoms = طبی نشانیاں اور علامات headingSimilarImmunization = اسی طرح کی امیونائزیشن headingSyncUsers = صارفین کی مطابقت پذیری headingTasksDeleted = کاموں کو مٹا دیا گیا +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = ٹیمپلیٹ دستیاب نہیں ہے headingTests = پیتھوجین ٹیسٹس headingTransferCase = کیس کی منتقلی headingTravelEntryData = سفر کے اندراج کا ڈیٹا headingTravelEntriesDeleted = سفری اندراجات مٹا دیے گئے +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = داخلے کا جگہ سے کیس کا حوالہ دیں headingTreatments = عمل شدہ علاج headingTreatmentsDeleted = علاج مٹا دیے گیے @@ -674,6 +694,9 @@ headingViewVaccination = ویکسینیشن دیکھیں headingViewVisit = دورہ کا نظارہ headingVisits = دورے headingVisitsDeleted = دورے مٹا دیۓ +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = ویژولائزیشن headingWrongFileType = فائل کی غلط قسم headingWaterUse = پانی کا استعمال @@ -705,6 +728,9 @@ headingCasesRestored = مقدمات بحال کر دیے گئے headingContactsRestored = رابطے بحال ہو گئے headingEventsRestored = تقریبات بحال ہو گئیں headingEventParticipantsRestored = تقریب کے شرکا بحال ہو گئے +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = امیونائزیشنز کو بحال کیا گیا headingSamplesRestored = نمونے بحال کر دیے گئے headingTravelEntriesRestored = سفری اندراجات بحال ہو گئے @@ -717,22 +743,23 @@ headingNewSourceCases = نئے کیسز جو پہلے رابطے کے طور پ headingNoCaseFound = کوئی کیس نہیں ملا headingNoEventFound = کوئی تقریب نہیں ملی headingEventNotDeleted = تقریب مٹی نہیں -headingSomeCasesNotDeleted = کچھ کیسز کو مٹایا نہیں گیا تھا headingSomeCasesNotRestored = کچھ کیسز بحال نہیں ہوئے -headingSomeContactsNotDeleted = کچھ رابطے نہیں مٹائے تھے headingSomeContactsNotRestored = کچھ رابطے بحال نہیں ہوئے تھے -headingSomeEventsNotRestored = کچھ تقریبات بحال نہیں ہوئی تھی۔ -headingSomeEventParticipantsNotDeleted = تقریب کے کچھ شرکاء کو مٹایا نہیں گیا تھا +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = تقریب کے کچھ شرکاء کو بحال نہیں کیا گیا تھا +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = کچھ تقریبات بحال نہیں ہوئی تھی۔ headingSomeImmunizationsNotRestored = کچھ امیونائزیشنز کو بحال نہیں کیا گیا تھا -headingSomeSamplesNotDeleted = کچھ نمونوں کو مٹایا نہیں گیا تھا headingSomeSamplesNotRestored = کچھ نمونے بحال نہیں ہوئے تھے -headingSomeTasksNotDeleted = کچھ کاموں کو مٹایا نہیں گیا تھا -headingSomeTravelEntriesNotDeleted = کچھ سفری اندراجات کو مٹایا نہیں کیا گیا تھا headingSomeTravelEntriesNotRestored = کچھ سفری اندراجات بحال نہیں ہوئے تھے -headingSomeVisitsNotDeleted = کچھ دوروں کو مٹایا نہیں گیا تھا -headingSomeEventsNotDeleted = کچھ تقریبات کو مٹایا نہیں گیا تھا -headingSomeExternalMessagesNotDeleted = کچھ بیرونی پیغامات کو مٹایا نہیں کیا گیا تھا +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = رابطہ کی تصدیق درکار ہے headingContactConversionFollowUpCommentLarge = فالو اپ کمنٹ کی اجازت زیادہ سے زیادہ حروف سے تجاوز کر جائے گے headingSelectSourceCase = سورس کیس کو منتخب کریں @@ -765,6 +792,7 @@ headingExportUserRightsFailed = صارف کے حقوق ایکسپورٹ کرنے headingExternalMessageDownload = پیغام ڈاؤن لوڈ کریں headingNoExternalMessagesSelected = کوئی پیغامات منتخب نہیں کیے گئے headingExternalMessagesDeleted = پیغامات مٹا دیے گئے +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = تصحیحی پیغام headingExternalMessageProcessSample = نمونے اور ٹیسٹ رپورٹس پر عمل کریں headingExternalMessageSampleInformation = نمونہ کی معلومات @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = نیا پیتھوجین ٹیسٹ headingFetchExternalMessages = پیغامات حاصل کریں headingCaution = انتباہ headingUnavailableTaskEdition = غیر دستیاب ٹاسک ایڈیشن +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = امیونائزیشن کی ویکسین کو مٹا دیں headingDocumentCreated = دستاویز بنائی گئی headingConfirmUnclearLabMessage=غیر واضح کی تصدیق کریں @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = خودکار حذف مٹانا شروع ہو headingBulkOperationProgress = بلک آپریشن کی پیشرفت میں headingSomeContactsAlreadyInEvent = کچھ رابطے پہلے ہی تقریب سے منسلک ہیں headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = براہ کرم انفیکشن کے بعد تمام متعلقہ سرگرمیوں کو دستاویز کریں\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = جب ایک کیس میں ایک سے زی infoBulkProcess = فی الحال %d منتخب اندراجات پر کارروائی ہو رہی ہے۔ اس میں کچھ وقت لگ سکتا ہے۔ پیشرفت ہر 20 اندراجات کے لیے اپ ڈیٹ کی جائے گی جن پر کارروائی کی گئی ہے۔ infoBulkProcessFinished = تمام منتخب اندراجات پر کارروائی ہو چکی ہے\!
اب آپ اس ونڈو کو بند کر سکتے ہیں۔ infoBulkProcessFinishedWithIneligibleItems = بڑی تعداد میں عمل کامیابی سے مکمل ہو گیا ہے\!
تاہم، کچھ منتخب اندراجات پر کارروائی نہیں ہو سکی، کیونکہ وہ اہل نہیں تھیں۔ -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = بڑی تعداد میں کارروائی کامیابی کے ساتھ مکمل ہو گئی ہے\!
تاہم، کچھ منتخب اندراجات پر کارروائی نہیں ہو سکی، زیادہ تر امکان ہے کہ وہ آپ کے دائرہ اختیار سے باہر تھیں۔ +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = بڑی تعداد میں عمل کامیابی کے ساتھ مکمل ہو گیا ہے\!
تاہم، کچھ منتخب اندراجات پر کارروائی نہیں ہو سکی، زیادہ تر امکان اس لیے کہ وہ آپ کے دائرہ اختیار سے باہر تھیں، پہلے ہی محفوظ شدہ یا اہل نہیں تھیں۔ +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = بڑی تعداد میں عمل کو منسوخ کر دیا گیا ہے کیونکہ اس آپریشن کے لیے کوئی اہل اندراجات نہیں ہیں\! infoBulkProcessCancelled = بلک پروسیس کو منسوخ کر دیا گیا ہے\!
اس پوائنٹ پر کارروائی ہونے تک تمام منتخب اندراجات۔ اب آپ اس ونڈو کو بند کر سکتے ہیں۔ تمام ابھی تک پروسیس شدہ اندراجات کا انتخاب نہیں کیا جائے گا۔ infoBulkUnresponsiveWindowHint = اشارہ\: اگر پروگریس بار غیر جوابی لگتا ہے اور تھوڑی دیر کے بعد کوئی پیش رفت نظر نہیں آتی ہے، تو اس پاپ اپ ونڈو پر کلک کرنے کی کوشش کریں یا اپنی براؤزر ونڈو کا سائز تبدیل کریں۔ @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = تمام کیسز پہلے ہی منتخب تق messageAllCasesLinkedToEvent = تمام کیسز کو منتخب تقریب سے جوڑ دیا گیا ہے۔ messageAllContactsAlreadyInEvent = تمام رابطے پہلے سے ہی منتخب تقریب سے منسلک ہیں۔ messageAllContactsLinkedToEvent = تمام رابطوں کو منتخب تقریب سے منسلک کر دیا گیا ہے۔ -messageSomeContactsLinkedToEvent = کچھ منتخب رابطوں کو منتخب تقریب سے منسلک کر دیا گیا ہے۔ messageAlreadyEventParticipant = آپ نے جس شخص کو منتخب کیا ہے اس کی پہلے سے ہی اس تقریب کے ایک شرکت کنندہ کے طور پر بتایا کی گئی ہے۔ messageAnimalContactsHint = براہ کرم ان تمام جانوروں (زندہ یا مردہ) کے بارے میں ایک جواب کی نشاندہی کریں جو انکیوبیشن کی مدت کے دوران اس شخص سے براہ راست متاثر ہوا تھا (مثلاً شکار، چھونا، کھانا)۔ messageArchiveUndoneReasonMandatory = براہ کرم ڈی آرکائیو کرنے کی وجہ شامل کریں @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=اگر واقعہ کی بیماری ک messageCaseSaved = کیس محفوظ ہو گیا messageCaseSavedClassificationChanged = کیس محفوظ ہو گیا۔ درجہ بندی خود بخود %s میں تبدیل ہو گئی۔ messageCaseTransfered = کیس کو دوسری سہولت گاہ میں منتقل کر دیا گیا ہے -messageCasesNotDeleted = UUID کی اوپر دی گئی فہرست میں درج کیسز کو مٹایا نہیں جا سکا۔ -messageCasesNotDeletedExternalReason = UUIDs کی مذکورہ فہرست میں مذکور کیسز کو مٹایا نہیں جا سکا کیونکہ رپورٹنگ ٹول کے ساتھ رابطہ ناکام ہو گیا تھا۔ -messageCasesDeleted = تمام منتخب اہل کیسزکو مٹا دیا گیا ہے messageCaseOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر کا معاملہ حذف نہیں کیا جاسکتاصارف کے دائرہ اختیار سے باہر کا معاملہ حذف نہیں کیا جاسکتا +messageCasesDeleted = تمام منتخب اہل کیسزکو مٹا دیا گیا ہے messageCasesMerged = کیسز کو ضم کر دیا گیا اور ڈپلیکیٹ کیس کو مٹا دیا گیا۔ messageCasesRestored = تمام منتخب کیسز کو بحال کر دیا گیا ہے -messageContactsNotRestored = UUID کی مذکورہ فہرست میں مذکور رابطے بحال نہیں کیے جاسکے۔ messageContactsRestored = تمام منتخب رابطے بحال کر دیے گئے ہیں -messageEventsNotRestored = UUID کی مذکورہ فہرست میں ذکر کردہ تقریبات کو بحال نہیں کیا جا سکا۔ messageEventsRestored = تمام منتخب تقریبات کو بحال کر دیا گیا ہے -messageEventParticipantsNotRestored = UUID کی مذکورہ فہرست میں ذکر کردہ تقریبات کے شرکاء کو بحال نہیں کیا جا سکا۔ messageEventParticipantsRestored = تقریب کے تمام منتخب شرکاء کو بحال کر دیا گیا ہے -messageImmunizationsNotDeleted = UUID کی مذکورہ فہرست میں مذکور حفاظتی ٹیکوں کو مٹایا نہیں جا سکا۔ messageImmunizationsDeleted = تمام منتخب کردہ اہل حفاظتی ٹیکوں کو مٹا دیا گیا ہے -messageImmunizationsNotRestored = UUIDs کی مذکورہ فہرست میں مذکور حفاظتی ٹیکوں کو بحال نہیں کیا جا سکا۔ messageImmunizationsRestored = تمام منتخب امیونائزیشنز کو بحال کر دیا گیا ہے -messageSamplesNotRestored = UUID کی اوپر دی گئی فہرست میں بیان کردہ نمونے بحال نہیں کیے جا سکے۔ messageSamplesRestored = تمام منتخب نمونوں کو بحال کر دیا گیا ہے -messageTravelEntriesNotRestored = UUID کی مذکورہ فہرست میں مذکور سفری اندراجات بحال نہیں ہوسکے۔ messageTravelEntriesRestored = تمام منتخب سفری اندراجات کو بحال کر دیا گیا ہے -messageCasesNotRestored = UUID کی مذکورہ فہرست میں درج کیسز بحال نہیں ہوسکے messageChangePathogenTestResult = اس پیتھوجین ٹیسٹ کا نتیجہ نمونے کے موجودہ مجموعی پیتھوجین ٹیسٹ کے نتائج سے مختلف ہے۔ کیا آپ اس کا نتیجہ %s میں اپ ڈیٹ کرنا چاہتے ہیں؟ messageCheckInputData = براہ کرم ان پٹ ڈیٹا چیک کریں messageClinicalCourseSaved = طبی کورس محفوظ کر لیے @@ -1084,7 +1109,6 @@ messageContactCreated=نیا رابطہ بنایا گیا messageContactArchived = رابطہ کو آرکائیو کر دیا گیا ہے messageContactDearchived = رابطہ ڈی آرکائیو کردیا گیا ہے messageContactSaved = رابطے کا ڈیٹا محفوظ ہو گیا -messageContactsNotDeleted = UUID کی اوپر دی گئی فہرست میں مذکور رابطوں کو مٹایا نہیں جا سکا۔ messageContactsDeleted = تمام منتخب کردہ اہل رابطوں کو مٹا دیا گیا ہے messageContactOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر رابطے کو حذف نہیں کیا جاسکتا messageContactDuplicateDeleted = ڈپلیکیٹ رابطہ کو مٹا دیا گیا ہے۔ @@ -1092,6 +1116,7 @@ messageContactsMerged = روابط کو ضم کر دیا گیا اور ڈپلی messageCopyPassword = براہ کرم اس پاس ورڈ کو کاپی کریں، یہ صرف ایک بار دکھایا گیا ہے۔ messageCountCasesAlreadyInEvent = %s کیسز پہلے سے ہی تقریب سے منسلک تھے، باقی تمام منسلک تھے۔ messageCountContactsAlreadyInEvent = %s روابط پہلے سے ہی تقریب سے منسلک تھے، باقی تمام منسلک تھے۔ +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = آپ نے نمونہ کی شرط کو مناسب نہ ہونے پر سیٹ کیا ہے۔
کیا آپ نمونہ جمع کرنے کا نیا کام بنانا چاہتے ہیں؟ messageDatabaseExportFailed = براہ کرم کسی منتظم سے رابطہ کریں اور انہیں اس مسئلے کے بارے میں مطلع کریں۔ messageEntryCreated = اندراج بنایا گیا @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = منتخب تقریب کو کامیابی ک messageEventLinkedAsSubordinate = منتخب تقریب کو ماتحت تقریب کے طور پر کامیابی کے ساتھ اس تقریب سے منسلک کر دیا گیا messageEventLinkedToGroup = منتخب کردہ تقریب کو کامیابی کے ساتھ اس تقریبی گروہ سے منسلک کر دیا گیا تھا۔ messageEventsLinkedToGroup = منتخب تقریبات کو کامیابی کے ساتھ اس تقریبی گروپ سے منسلک کر دیا گیا ہے -messageSomeEventsLinkedToGroup = کچھ منتخب تقریبات کو کامیابی کے ساتھ اس تقریبی گروپ سے منسلک کر دیا گیا ہے messageEventOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر کو تقریب حذف نہیں کیا جا سکتا messageEventSuperordinateEventUnlinked = اس تقریب اور اس کے اعلیٰ ترین تقریب کے درمیان تعلق کو کامیابی کے ساتھ ہٹا دیا گیا۔ messageEventSubordinateEventUnlinked = اس تقریب اور اس کے ماتحت تقریب کے درمیان تعلق کو کامیابی کے ساتھ ہٹا دیا گیا تھا @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = تقریب کے شریک کو ڈی آرکا messageEventParticipantCreated = نیا شخص بنایا messageEventParticipantSaved = شخص کا ڈیٹا محفوظ ہو گیا messageEventParticipantOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر تقریب کے شریک کو حذف نہیں کیا جا سکتا -messageEventParticipantsNotDeleted = UUID کی مذکورہ فہرست میں ذکر کردہ تقریب کے شرکاء کو مٹایا نہیں جا سکا۔ messageEventParticipantsDeleted = تمام منتخب کردہ اہل تقریب کے شرکاء کو مٹا دیا گیا ہے messageEventParticipantResponsibleJurisdictionUpdated = اس تقریب کے شرکاء کے ذمہ دار دائرہ اختیار کو تبدیل کرنے یا ہٹانے سے آپ اس کی ذاتی تفصیلات تک رسائی سے محروم ہو سکتے ہیں اور/یا آپ کو مستقبل میں اس میں ترمیم کرنے کی اجازت نہیں دے سکتے۔ کیا آپ واقعی آگے بڑھنا چاہتے ہیں؟ messageEventParticipantToCaseWithoutEventDisease=اگر تقریب کی بیماری کا تعین نہ کیا گیا ہو تو تقریب کے شریک سے کیس بنانا ممکن نہیں ہے @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=اگر تقریب کی بی messageEventJurisdictionUpdated = اس تقریب کے دائرہ اختیار کو تبدیل کرنے یا ہٹانے سے آپ اس کی ذاتی تفصیلات تک رسائی سے محروم ہو سکتے ہیں اور/یا آپ کو مستقبل میں اس میں ترمیم کرنے کی اجازت نہیں دے سکتے۔ کیا آپ واقعی آگے بڑھنا چاہتے ہیں؟ messageEventSaved = تقریب کا ڈیٹا محفوظ ہو گیا messageEventGroupSaved = تقریبی گروہ کا ڈیٹا محفوظ ہو گیا -messageEventsNotDeleted = UUID کی مذکورہ فہرست میں مذکور تقریبات کو مٹایا نہیں جا سکا۔ messageEventsDeleted = تمام منتخب کردہ اہل تقریبات کو مٹا دیا گیا ہے messageEventsSentToSurvnet = تمام منتخب تقریبات SurvNet کو بھیجے گئے ہیں +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s کیسز نہیں مٹے ہوئے۔ نہیں مٹائے گئے کیسز کی UUIDs\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s کیسز بحال نہیں ہوئے۔ کیسز کے UUID بحال نہیں ہوئے\: %s messageCountContactsNotDeleted = %s رابطے نہیں نہیں مٹے ہوئے ۔ نہیں مٹائے گئے رابطوں کی UUIDs \: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s رابطے بحال نہیں ہوئے۔ رابطے کے UUID بحال نہیں ہوئے\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s تقریبات بحال نہیں ہوئے۔ تقریبات کے UUID بحال نہیں ہوئے\: %s messageCountEventParticipantsNotDeleted = %s تقریب کے شرکاء کو مٹایا نہیں گیا۔ تقریب کے شرکاء کے UUID مٹایۓ نہیں گئے\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = تقریب کے %s شرکاء کو بحال نہیں کیا گیا۔ تقریب کے شرکاء کے UUID بحال نہیں ہوئے\: %s messageCountExternalMessagesNotDeleted = %s بیرونی پیغامات نہیں مٹے ہوئے۔ خارجی پیغامات کے UUID نہیں مٹے ہوئے\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s امیونائزیشنز کو بحال نہیں کیا گیا۔ امیونائزیشنز کے UUID بحال نہیں ہوئے\: %s messageCountSamplesNotDeleted = %s نمونے مٹے نہیں ہوئے۔ نمونوں کے UUIDs مٹے نہیں ہوئے\: %s messageCountSamplesNotRestored = %s نمونے بحال نہیں ہوئے۔ نمونوں کے UUID بحال نہیں ہوئے\: %s messageCountTasksNotDeleted = %s کام مٹے نہیں ہوئے۔ سفری اندراجات کے UUID مٹے نہیں ہوئے\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s سفری اندراجات مٹے نہیں ہوئے۔ سفری اندراجات کے UUID مٹے نہیں ہوئے\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s سفری اندراجات بحال نہیں ہوئے۔ سفری اندراجات کے UUID بحال نہیں ہوئے\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s دورے مٹے نہیں ہوئے۔ دوروں کے UUID مٹے نہیں ہوئے\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s تقریبات مٹے نہیں ہوئے۔ تقریبات کے UUIDs مٹے نہیں ہوئے\: %s -messageEventsNotDeletedExternalReason = UUIDs کی مذکورہ فہرست میں مذکور تقریبات کو مٹایا نہیں جا سکا کیونکہ رپورٹنگ ٹول کے ساتھ رابطہ ناکام ہو گیا تھا۔ +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = کسی بھی تقریب کو مٹایا نہیں جائے گا جس میں تقریب کے شرکاء سے منسلک ہوں۔ براہ کرم تقریب کے شرکاء کو تقریب سے ہٹا دیں تاکہ اسے مٹایا کیا جا سکے۔ +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = ڈیٹا کو ایکسپورٹ کرنے سے روکنے میں ایک خرابی تھی۔ براہ کرم ایڈمن سے رابطہ کریں اور انہیں اس مسئلے سے آگاہ کریں۔ messageExportConfigurationDeleted = ايکسپورٹ کنفیگریشن مٹا دی گئ messageExportConfigurationSaved = ایکسپورٹ کنفیگریشن محفوظ ہو گئی messageFollowUpCanceled = تمام منتخب رابطوں کا فالو اپ منسوخ کر دیا گیا ہے -messageFollowUpCanceledForSome = کچھ منتخب رابطوں کا فالو اپ منسوخ کر دیا گیا ہے messageFollowUpStatusChanged = ان تمام منتخب رابطوں کا فالو اپ جن کا فالو اپ ہے فالو اپ کو ختم کرنے کے لیے سیٹ کیا گیا ہے -messageFollowUpStatusChangedForSome = کچھ منتخب رابطوں کا فالو اپ جن کا فالو اپ ہے فالو اپ کو ختم کرنے کے لیے سیٹ کر دیا گیا ہے۔ messageFacilityChanged = آپ نے اس کیس کی سہولت گاہ تبدیل کر دی ہے۔ کیا آپ کیس کو نئی سہولت گاہ میں منتقل کرنا چاہتے ہیں (ہسپتال میں داخلے کو اپ ڈیٹ کیا جا سکتا ہے) یا آپ غلطی کو درست کرنے کے لیے صرف ڈیٹا میں ترمیم کرنا چاہتے ہیں؟ messageFacilityMulitChanged = آپ نے متعدد کیسز کی سہولت گاہ کو تبدیل کیا ہے۔ کیا آپ ان کیسز کو نئی سہولت گاہ میں منتقل کرنا چاہتے ہیں (ہسپتال میں داخلے کو اپ ڈیٹ کیا جا سکتا ہے) یا آپ غلطیوں کو درست کرنے کے لیے صرف ان کے ڈیٹا میں ترمیم کرنا چاہتے ہیں؟ messageGdpr = GDPR کی طرف سے لاگو کردہ ڈیٹا مائنسائزیشن کے اصول کے مطابق، آپ کو یقینی بنانا چاہیے کہ آپ یہاں صرف وہی معروضی ڈیٹا درج کریں جو فائل کی پروسیسنگ کے لیے بالکل ضروری ہے۔ خاص طور پر، آپ کو جینیاتی یا بائیو میٹرک، فلسفیانہ، سیاسی، مذہبی ڈیٹا، یونین کی رائے، جنسی زندگی یا رجحان، نسلی اصل، جرائم، سزائیں، حفاظتی اقدامات، مجرمانہ ریکارڈ... یا کوئی دوسرا ڈیٹا درج نہیں کرنا چاہیے جس کا تعلق عوامی صحت کی نگرانی سے نہ ہو۔ @@ -1183,7 +1238,6 @@ messageImportSuccessful = امپورٹ کامیاب\!
تمام قطا messageUploadSuccessful = اپ لوڈ کامیاب\! اب آپ اس ونڈو کو بند کر سکتے ہیں۔ messageIncompleteGpsCoordinates = GPS کوآرڈینیٹس نامکمل ہیں messageExternalMessagesAssigned = تمام منتخب پیغامات کے لیے ذمہ دار کو تبدیل کر دیا گیا ہے -messageExternalMessagesNotDeleted = UUID کی اوپر دی گئی فہرست میں مذکور بیرونی پیغامات کو مٹایا نہیں جا سکا۔ messageLoginFailed = براہ کرم اپنا صارف نام اور پاس ورڈ چیک کریں اور دوبارہ کوشش کریں messageMissingCases = براہ کرم رابطے بنانے سے پہلے کچھ کیسز بنائیں messageMissingDateFilter = براہ کرم تاریخ کے فلٹر کے دونوں فیلڈز پُر کریں @@ -1195,7 +1249,10 @@ messageNoContactsSelected = آپ نے کوئی رابطہ منتخب نہیں ک messageNoCsvFile = آپ نے اپ لوڈ کرنے کے لیے فائل کا انتخاب نہیں کیا ہے۔ براہ کرم ایک .csv فائل منتخب کریں جس میں وہ ڈیٹا موجود ہو جسے آپ اپنے کمپیوٹر سے امپورٹ کرنا چاہتے ہیں۔ messageNoDocumentTemplateUploadFile = آپ نے اپ لوڈ کرنے کے لیے فائل کا انتخاب نہیں کیا ہے۔ براہ کرم ایک .docx ٹیمپلیٹ فائل منتخب کریں جسے آپ اپنے کمپیوٹر سے امپورٹ کرنا چاہتے ہیں۔ messageNoDocumentUploadFile = آپ نے اپ لوڈ کرنے کے لیے فائل کا انتخاب نہیں کیا ہے۔ براہ کرم ایک فائل منتخب کریں جسے آپ اپنے کمپیوٹر سے امپورٹ کرنا چاہتے ہیں۔ +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = منتخب کردہ تقریبات میں سے کوئی بھی مٹانے کے اہل نہیں ہے +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = آپ نے کوئی ماحول منتخب نہیں کیا ہے messageNoEventParticipantsSelected = آپ نے کسی بھی تقریب کے شرکاء کا انتخاب نہیں کیا ہے messageNoEventsSelected = آپ نے کوئی تقریبات منتخب نہیں کی۔ @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = اس لیب کے پیغام میں حوالہ دیا messageRelatedSampleAndLabMessagesFound = اسی رپورٹ ID کے ساتھ ایک لیب کے پیغام پر پہلے ہی کارروائی کی گئی تھی۔ اس کا تعلق اس نمونے سے ہے جس کا حوالہ بھی اس لیب کے پیغام میں دیا گیا ہے۔
کیا آپ اس نمونے کو براہ راست کھولنا چاہتے ہیں؟ messageSampleErrors = نمونے کے فارم میں غلطیاں ہیں۔ براہ کرم انہیں ٹھیک کریں اور نمونے کو کسی اور لیبارٹری میں بھیجنے سے پہلے محفوظ کریں۔ messageSampleSaved = نمونہ کا ڈیٹا محفوظ ہو گیا -messageSamplesNotDeleted = UUID کی اوپر دی گئی فہرست میں درج نمونوں کو مٹایا نہیں جا سکا۔ messageSamplesDeleted = تمام منتخب کردہ اہل نمونے مٹا دیے گئے ہیں messageSpecifyColumnAttribute = براہ کرم اس کالم کی خصوصیت کی وضاحت کریں جسے آپ نے ویژولائزیشن کے لیے منتخب کیا ہے messageSpecifyFilterAttributes = براہ کرم تمام منتخب فلٹر کی خصوصیات اور ذیلی خصوصیات کی وضاحت کریں @@ -1237,7 +1293,6 @@ messageSymptomsHint = براہ کرم تمام علامات کے جواب پ messageSymptomsVisitHint = براہ کرم تمام علامات کے جواب پر نشان لگائیں جو یہ بتاتا ہے کہ آیا وہ اس دورے کے وقت موجود تھے\: messageTaskArchived = کام کو آرکائیو کر دیا گیا ہے messageTasksEdited = تمام کاموں میں ترمیم کی گئی ہے -messageTasksNotDeleted = UUID کی مذکورہ فہرست میں مذکور کاموں کو مٹایا نہیں جا سکا۔ messageTaskDearchived = کام ڈی آرکائیو کردیا گیا ہے messageTasksDeleted = تمام منتخب کردہ اہل کاموں کو مٹا دیا گیا ہے messageTemplateNotAvailable = ٹیمپلیٹ فائل دستیاب نہیں ہے۔ براہ کرم کسی ایڈمن سے رابطہ کریں اور انہیں اس مسئلے کے بارے میں بتائیں۔ @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = سفر کے اندراج کا ڈیٹا محفوظ ہو messageTravelEntryArchived = سفری اندراج کو آرکائیو کر دیا گیا ہے messageTravelEntryDearchived = سفری اندراج کو ڈی آرکائیو کر دیا گیا ہے messageTravelEntryPOEFilledBySystem = [System] داخلے کی جگہ خود بخود پرہو گئی -messageTravelEntriesNotDeleted = UUID کی مذکورہ فہرست میں مذکور سفری اندراجات کو مٹایا نہیں جا سکا۔ messageTravelEntriesDeleted = تمام منتخب کردہ اہل سفری اندراجات کو مٹا دیا گیا ہے messageTreatmentCreated = علاج بنایا messageTreatmentSaved = علاج محفوظ کر لیا @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = خارجی پیغام کی بیماری messageUserRoleCombination = کے ساتھ مل کر نہیں کیا جا سکتا messageUserRoleSaved = صارف کا کردار محفوظ ہو گیا messageVaccinationOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر کی ویکسینیشن کو حذف نہیں کیا جا سکتا -messageVisitsNotDeleted = UUID کی مذکورہ فہرست میں مذکور دوروں کو مٹایا نہیں جا سکا۔ messageVisitsDeleted = تمام منتخب کردہ اہل دورے مٹا دیے گئے ہیں +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = براہ کرم ایک .csv فائل فراہم کریں جس میں وہ ڈیٹا موجود ہو جسے آپ امپورٹ کرنا چاہتے ہیں۔ امپورٹ ٹیمپلیٹ فائل کو آغاز کے طور پر استعمال کرنے کی تجویز کی جاتی ہے۔ messageWrongTemplateFileType=%s کے لیے، براہ کرم ایک .%s فائل فراہم کریں۔ messageLineListingDisabled = لائن لسٹنگ کو غیر فعال کر دیا گیا ہے @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = تمام منتخب کردہ اہل پیغام messageQuarantineOrderDocumentCreated = قرنطینہ آرڈر کی دستاویز بنا دی گئی ہے messageUnavailableTaskEditionDueToDifferentDistricts = اگر وہ مختلف اضلاع سے متعلق ہیں تو ٹاسک ایڈیشن دستیاب نہیں ہے messageUsersEnabled = تمام منتخب صارفین کو فعال کر دیا گیا ہے -messageSomeUsersEnabled = منتخب کردہ صارفین میں سے کچھ کو فعال کر دیا گیا ہے messageUsersDisabled = تمام منتخب صارفین کو غیر فعال کر دیا گیا ہے -messageSomeUsersDisabled = کچھ منتخب صارفین کو غیر فعال کر دیا گیا ہے messageDontShareWithReportingToolWarning = اس کیس کو فعال طور پر بیرونی رپورٹنگ ٹول کو بھیجے جانے سے روک دیا گیا ہے messageBulkCasesWithDifferentDiseasesSelected = آپ نے مختلف بیماریوں والے کیسز کا انتخاب کیا ہے۔ کچھ بڑی تعداد میں ترمیم کے اختیارات دستیاب نہیں ہو سکتے ہیں۔ messageBulkContactsWithDifferentDiseasesSelected = آپ نے مختلف بیماریوں والے روابط کا انتخاب کیا ہے۔ کچھ بڑی تعداد میں ترمیم کے اختیارات دستیاب نہیں ہو سکتے ہیں۔ @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = یہ ویکسینیشن اس messageVaccinationNoDateNotRelevantForEventParticipant = یہ ویکسینیشن اس تقریب کے شرکاء کے لیے متعلقہ نہیں ہے کیونکہ اس میں ویکسینیشن کی تاریخ نہیں ہے۔ messageAcceptRequestToNavigate = درخواست ابھی تک قبول نہیں ہوئی ہے۔ وہاں جانے کے لیے آپ کو پہلے اسے قبول کرنا ہوگا۔ messageEntityNotFound = سسٹم میں %s نہیں ملا۔ +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = آپ کے سسٹم میں کم از کم ایک ایسا ہی کیس ہے۔ اگر آپ درخواست کو قبول کرتے ہیں تو یہ کیس آپ کے سسٹم میں ڈپلیکیٹ کے طور پر ہو سکتا ہے۔
اگر ایسا ہے تو، آپ کو قبول کرنے کے بعد کیسز کو یکجا کرنا چاہیے۔ messageSormasToSormasSimilarConvertedCaseFound = آپ کے سسٹم میں کم از کم ایک ایسا ہی کیس ہے۔ اگر آپ درخواست کو قبول کرتے ہیں تو یہ کیس آپ کے سسٹم میں ڈپلیکیٹ کے طور پر ہو سکتا ہے۔
اگر ایسا ہے تو، آپ کو قبول کرنے کے بعد کیسز کویقینی بنانا چاہیے۔کیسز کو یکجا کرنے کے بعد، کچھ رابطوں کو قبول شدہ کیس میں دستی طور پر تبدیل کرنا ضروری ہو سکتا ہے۔۔
براہ کرم یقینی بنائیں کہ آپ اس مقصد کے لیے قبول شدہ کیس کا استعمال کرتے ہیں۔ messageSormasToSormasSimilarContactToCaseFound = آپ کے سسٹم میں کم از کم ایک ایسا ہی رابطہ موجود ہے۔
درخواست قبول کرنے کے بعد، ان رابطوں کو قبول شدہ کیس میں دستی طور پر تبدیل کرنا ضروری ہو سکتا ہے۔ @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = آپ کو انضمام کے لیے دو messageAutomaticDeletionStarted = خودکار مٹانا شروع کر دیا گیا ہے اور اسے پس منظر میں عمل میں لایا جائے گا۔ براہ کرم نوٹ کریں کہ مٹنے والے ڈیٹا کی مقدار پر منحصر ہے، اس عمل میں کچھ وقت لگ سکتا ہے۔ messageUserRoleUnusableForLogin = صرف اس کردار کے حامل صارفین لاگ ان نہیں کر پائیں گے کیونکہ اس رول میں Access Sormas UI نہیں ہے اور نہ ہی Sormas REST تک رسائی حاصل ہے۔ messageUserRoleHasNoRights = اس صارف کے کردار کا کوئی حق نہیں ہے۔ براہ کرم کم از کم ایک صحیح منتخب کریں۔ -messageEntriesEditedExceptArchived = %s اندراجات میں کامیابی کے ساتھ ترمیم کی گئی ہے۔ کچھ اندراجات میں ترمیم نہیں کی جا سکی کیونکہ وہ ایک مختلف دائرہ اختیار میں ہیں یا پہلے ہی محفوظ شدہ تھیں۔ messageEntriesEdited = تمام اندراجات میں ترمیم کی گئی ہے messageAllEntitiesArchived = تمام منتخب اندراجات کو آرکائیو کر لیا گیا ہے -messageSomeEntitiesArchived = %s اندراجات کو آرکائیو کر لیا گیا ہے۔ messageAllEntitiesDearchived = تمام منتخب اندراجات کو ڈی آرکائیو کر دیا گیا ہے -messageSomeEntitiesDearchived = %s اندراجات کو ڈی آرکائیو کر دیا گیا ہے۔ +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = ماحول بنایاگیا messageEnvironmentSaved = ماحول کومحفوظ کر لیا messageEnvironmentArchived = ماحول کو محفوظ کیا گیا ہے messageEnvironmentDearchived = ماحولیات کو ڈی آرکائیو کر دیا گیا ہے messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = کیس %s کی درجہ بندی %s میں تبدیل ہو گئی ہے۔ @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= عرض بلد سے... promptEnvironmentLatTo= ... تک promptEnvironmentLonFrom= طول البلد سے... promptEnvironmentLonTo= ... تک +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = غیر محفوظ تبدیلیاں @@ -1603,9 +1673,9 @@ infoBAGExport=SEDEX کو مکمل ایکسپورٹ کریں # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = رپورٹنگ ٹول پر اندراج بھیج دیا گیا ہے ExternalSurveillanceToolGateway.notificationEntriesSent = تمام منتخب اندراجات رپورٹنگ ٹول کو بھیج دیے گئے ہیں. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = کچھ منتخب اندراجات رپورٹنگ ٹول کو بھیج دیے گئے ہیں۔ ExternalSurveillanceToolGateway.notificationEntriesDeleted = رپورٹنگ ٹول میں تمام منتخب اندراجات کو کامیابی کے ساتھ مٹا دیا گیا ہے۔ ExternalSurveillanceToolGateway.notificationEntryNotSent = اندراج نہیں بھیجا جا سکا +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = اندراج بھیجتے وقت خرابی ExternalSurveillanceToolGateway.unableToSend=براہ کرم رپورٹنگ ٹول کو %s بھیجنے سے پہلے کسی بھی غیر محفوظ شدہ تبدیلیوں کو محفوظ یا رد کر دیں۔ ExternalSurveillanceToolGateway.confirmSendCase=کیا آپ واقعی کیس کو رپورٹنگ ٹول کو بھیجنا چاہتے ہیں؟ diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index 96f1d0b703c..86b74c02bd0 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -445,6 +445,8 @@ headingCaseImport = Case Import headingPointOfEntryImport = Point of Entry Import headingCaseStatusMap = Case Status Map headingCasesDeleted = Cases deleted +headingCasesNotDeleted = None of the cases were deleted +headingCasesNotRestored = None of the cases were restored headingCaseConversion = Conversion to case headingChangeCaseDisease = Change case disease headingCasesGuide = Guide\: Case Directory @@ -466,6 +468,9 @@ headingUnderFollowUp = Under Follow-up headingContactInformation = Contact information headingContactMap = Contact Map headingContactsDeleted = Contacts deleted +headingContactsNotDeleted = None of the contacts were deleted +headingContactsNotLinked = None of the contacts were linked +headingContactsNotRestored = \= None of the contacts were restored headingCreateAdditionalTest = Create new additional test results headingCreateEntry = Create entry headingCreateNewAction = Create new action @@ -531,15 +536,24 @@ headingEditCountry = Edit country headingEditContinent = Edit continent headingEditSample = Edit sample headingEditSubcontinent = Edit subcontinent +headingEntitiesNotArchived = None of the entities were archived +headingEntitiesNotDearchived = None of the entities were dearchived +headingEntitiesNotEdited = None of the entities were edited +headingEntitiesNotSent = None of the entities were sent headingEnvironmentalExposure = Environmental Exposure headingEpiCurve = Epidemiological Curve headingErrorReportNotAvailable = Error report not available headingEventData = Event data headingEventGroupData = Event group data headingEventParticipantsDeleted = Event participants deleted +headingEventParticipantsNotDeleted = None of the event participants were deleted +headingEventParticipantsNotRestored = None of the event participants were restored headingEventParticipantResponsibleJurisdictionUpdated = Event participant jurisdiction update headingEventJurisdictionUpdated = Event jurisdiction update headingEventsDeleted = Events deleted +headingEventsNotLinked = None of the events were linked +headingEventsNotDeleted = None of the events were deleted +headingEventsNotRestored = None of the events were restored headingExportFailed = Export failed headingFatalities=Fatalities headingFileExists = Duplicate File @@ -574,6 +588,7 @@ headingImportAllSubcontinents = Import Default Subcontinents headingImportAreas = Import Areas headingImportRegions= Import Regions headingImportTravelEntries = Import Travel Entries +headingImportEnvironments = Import Environments headingInformationSource = Source of Information headingInfrastructureLocked = Infrastructure locked headingIntroduction = Introduction @@ -641,6 +656,8 @@ headingRequestedPathogenTests = Requested pathogen tests\: headingResponsibleJurisdiction=Responsible jurisdiction headingResults = Results headingSamplesDeleted = Samples deleted +headingSamplesNotDeleted = None of the samples were deleted +headingSamplesNotRestored = None of the samples were restored headingSaveNotification = Save notification headingSecurityAlert=Security Alert headingSelectCampaign = Select a campaign @@ -650,11 +667,14 @@ headingSignsAndSymptoms = Clinical Signs and Symptoms headingSimilarImmunization = Similar immunizaton headingSyncUsers = Sync Users headingTasksDeleted = Tasks deleted +headingTasksNotDeleted = None of the tasks were deleted headingTemplateNotAvailable = Template not available headingTests = Pathogen tests headingTransferCase = Transfer case headingTravelEntryData = Travel entry data headingTravelEntriesDeleted = Travel entries deleted +headingTravelEntriesNotDeleted = None of the travel entries were deleted +headingTravelEntriesNotRestored = None of the travel entries were restored headingReferCaseFromPointOfEntry = Refer case from point of entry headingTreatments = Executed treatments headingTreatmentsDeleted = Treatments deleted @@ -674,6 +694,9 @@ headingViewVaccination = View vaccination headingViewVisit = Visit view headingVisits = Visits headingVisitsDeleted = Visits deleted +headingVisitsNotCancelled= None of the follow-up visits were cancelled +headingVisitsNotDeleted = None of the visits were deleted +headingVisitsNotSetToLost= None of the follow-up visits were set to lost headingVisualization = Visualization headingWrongFileType = Wrong file type headingWaterUse = Use of water @@ -705,6 +728,9 @@ headingCasesRestored = Cases restored headingContactsRestored = Contacts restored headingEventsRestored = Events restored headingEventParticipantsRestored = Event participants restored +headingImmunizationsDeleted = Immunizations deleted +headingImmunizationsNotDeleted = None of the immunizations were deleted +headingImmunizationsNotRestored = None of the immunizations were restored headingImmunizationsRestored = Immunizations restored headingSamplesRestored = Samples restored headingTravelEntriesRestored = Travel entries restored @@ -717,22 +743,23 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts headingNoCaseFound = No case found headingNoEventFound = No event found headingEventNotDeleted = Event not deleted -headingSomeCasesNotDeleted = Some cases were not deleted headingSomeCasesNotRestored = Some cases were not restored -headingSomeContactsNotDeleted = Some contacts were not deleted headingSomeContactsNotRestored = Some contacts were not restored -headingSomeEventsNotRestored = Some events were not restored -headingSomeEventParticipantsNotDeleted = Some event participants were not deleted +headingSomeEntitiesNotArchived= Some entities were not archived +headingSomeEntitiesNotDearchived = Some entities were not dearchived +headingSomeEntitiesNotDeleted= Some entities were not deleted +headingSomeEntitiesNotEdited = Some entities were not edited +headingSomeEnvironmentSamplesNotRestored = Some environment samples were not restored headingSomeEventParticipantsNotRestored = Some event participants were not restored +headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotRestored = Some events were not restored headingSomeImmunizationsNotRestored = Some immunizations were not restored -headingSomeSamplesNotDeleted = Some samples were not deleted headingSomeSamplesNotRestored = Some samples were not restored -headingSomeTasksNotDeleted = Some tasks were not deleted -headingSomeTravelEntriesNotDeleted = Some travel entries were not deleted headingSomeTravelEntriesNotRestored = Some travel entries were not restored -headingSomeVisitsNotDeleted = Some visits were not deleted -headingSomeEventsNotDeleted = Some events were not deleted -headingSomeExternalMessagesNotDeleted = Some external messages were not deleted +headingSomeUsersNotDisabled = Some users were not disabled +headingSomeUsersNotEnabled= Some users were not enabled +headingSomeVisitsNotCancelled= Some follow-up visits were not cancelled +headingSomeVisitsNotSetToLost= Some follow-up visits were not set to lost headingContactConfirmationRequired = Contact confirmation required headingContactConversionFollowUpCommentLarge = Follow up comment will exceed the max characters allowed headingSelectSourceCase = Select Source Case @@ -765,6 +792,7 @@ headingExportUserRightsFailed = Export user rights failed headingExternalMessageDownload = Download message headingNoExternalMessagesSelected = No messages selected headingExternalMessagesDeleted = Messages deleted +headingExternalMessagesNotDeleted = None of the external messages were deleted headingExternalMessageCorrection = Correction message headingExternalMessageProcessSample = Process sample and test reports headingExternalMessageSampleInformation = Sample information @@ -773,6 +801,8 @@ headingExternalMessageNewPathogenTests = New pathogen tests headingFetchExternalMessages = Fetch new messages headingCaution = Caution headingUnavailableTaskEdition = Unavailable task edition +headingUsersNotDisabled = None of the users were disabled +headingUsersNotEnabled = None of the users were enabled headingDeleteVaccinations = Remove immunization vaccinations headingDocumentCreated = Document created headingConfirmUnclearLabMessage=Confirm unclear @@ -813,6 +843,11 @@ headingAutomaticDeletionStarted = Automatic deletion started headingBulkOperationProgress = Bulk operation progress headingSomeContactsAlreadyInEvent = Some contacts are already linked to the event headingEnvironmentJurisdictionUpdated = Environment location update +headingNoEnvironmentSamplesSelected = No environment samples selected +headingEnvironmentSamplesDeleted = Environment samples deleted +headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted +headingEnvironmentSamplesNotRestored = None of the environment samples were restored +headingEnvironmentSamplesRestored = Environment samples restored # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: @@ -1004,8 +1039,9 @@ infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the infoBulkProcess = %d selected entries are currently being processed. This may take a while. The progress will be updated for each 20 entries that have been processed. infoBulkProcessFinished = All selected entries have been processed\!
You can now close this window. infoBulkProcessFinishedWithIneligibleItems = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, because they were not eligible. -infoBulkProcessFinishedWithSkipsOutsideJurisdiction = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction. +infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! infoBulkProcessFinishedWithSkips = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction, already archived or not eligible. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk process has been successfully completed\!
However, some of the selected entries could not be processed, most likely because they were outside your jurisdiction or not eligible. infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. @@ -1023,7 +1059,6 @@ messageAllCasesAlreadyInEvent = All cases are already linked to the selected eve messageAllCasesLinkedToEvent = All cases have been linked to the selected event. messageAllContactsAlreadyInEvent = All contacts are already linked to the selected event. messageAllContactsLinkedToEvent = All contacts have been linked to the selected event. -messageSomeContactsLinkedToEvent = Some of the selected contacts have been linked to the selected event. messageAlreadyEventParticipant = The person you have selected is already defined as an event participant of this event. messageAnimalContactsHint = Please indicate an answer regarding ALL animals (live or dead) the person had direct exposure to (e.g. hunt, touch, eat) during the incubation period. messageArchiveUndoneReasonMandatory = Please add a reason for de-archiving @@ -1044,27 +1079,17 @@ messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an messageCaseSaved = Case saved messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. messageCaseTransfered = Case has been transfered to another facility -messageCasesNotDeleted = The cases mentioned in the above list of UUIDs could not be deleted. -messageCasesNotDeletedExternalReason = The cases mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. -messageCasesDeleted = All selected eligible cases have been deleted messageCaseOutsideJurisdictionDeletionDenied = The case outside user's jurisdiction cannot be deleted +messageCasesDeleted = All selected eligible cases have been deleted messageCasesMerged = Cases merged and duplicate case deleted. messageCasesRestored = All selected cases have been restored -messageContactsNotRestored = The contacts mentioned in the above list of UUIDs could not be restored. messageContactsRestored = All selected contacts have been restored -messageEventsNotRestored = The events mentioned in the above list of UUIDs could not be restored. messageEventsRestored = All selected events have been restored -messageEventParticipantsNotRestored = The event participants mentioned in the above list of UUIDs could not be restored. messageEventParticipantsRestored = All selected event participants have been restored -messageImmunizationsNotDeleted = The immunizations mentioned in the above list of UUIDs could not be deleted. messageImmunizationsDeleted = All selected eligible immunizations have been deleted -messageImmunizationsNotRestored = The immunizations mentioned in the above list of UUIDs could not be restored. messageImmunizationsRestored = All selected immunizations have been restored -messageSamplesNotRestored = The samples mentioned in the above list of UUIDs could not be restored. messageSamplesRestored = All selected samples have been restored -messageTravelEntriesNotRestored = The travel entries mentioned in the above list of UUIDs could not be restored. messageTravelEntriesRestored = All selected travel entries have been restored -messageCasesNotRestored = The cases mentioned in the above list of UUIDs could not be restored. messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s? messageCheckInputData = Please check the input data messageClinicalCourseSaved = Clinical course saved @@ -1084,7 +1109,6 @@ messageContactCreated=New contact created messageContactArchived = Contact has been archived messageContactDearchived = Contact has been de-archived messageContactSaved = Contact data saved -messageContactsNotDeleted = The contacts mentioned in the above list of UUIDs could not be deleted. messageContactsDeleted = All selected eligible contacts have been deleted messageContactOutsideJurisdictionDeletionDenied = The contact outside user's jurisdiction cannot be deleted messageContactDuplicateDeleted = The duplicate contact has been deleted. @@ -1092,6 +1116,7 @@ messageContactsMerged = Contacts merged and duplicate contact deleted. messageCopyPassword = Please copy this password, it is shown only once. messageCountCasesAlreadyInEvent = %s cases were already linked to the event, all others were linked. messageCountContactsAlreadyInEvent = %s contacts were already linked to the event, all others were linked. +messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s messageCreateCollectionTask = You have set the specimen condition to not adequate.
Do you want to create a new sample collection task? messageDatabaseExportFailed = Please contact an admin and notify them about this problem messageEntryCreated = Entry created @@ -1112,7 +1137,6 @@ messageEventLinkedAsSuperordinate = The selected event was successfully linked t messageEventLinkedAsSubordinate = The selected event was successfully linked to this event as a subordinate event messageEventLinkedToGroup = The selected event was successfully linked to this event group messageEventsLinkedToGroup = The selected events hav been successfully linked to this event group -messageSomeEventsLinkedToGroup = Some of the selected events have been successfully linked to this event group messageEventOutsideJurisdictionDeletionDenied = The event outside user's jurisdiction cannot be deleted messageEventSuperordinateEventUnlinked = The link between this event and its superordinate event was successfully removed messageEventSubordinateEventUnlinked = The link between this event and its subordinate event was successfully removed @@ -1125,7 +1149,6 @@ messageEventParticipantDearchived = Event participant has been de-archived messageEventParticipantCreated = New person created messageEventParticipantSaved = Person data saved messageEventParticipantOutsideJurisdictionDeletionDenied = The event participant outside user's jurisdiction cannot be deleted -messageEventParticipantsNotDeleted = The event participants mentioned in the above list of UUIDs could not be deleted. messageEventParticipantsDeleted = All selected eligible event participants have been deleted messageEventParticipantResponsibleJurisdictionUpdated = Changing or removing the responsible jurisdiction of this event participant could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventParticipantToCaseWithoutEventDisease=It is not possible to create cases from an event participant if the disease of the event has not been set @@ -1133,34 +1156,66 @@ messageEventParticipantToContactWithoutEventDisease=It is not possible to create messageEventJurisdictionUpdated = Changing or removing the jurisdiction of this event could make you lose access to its personal details and/or disallow you to edit it in the future. Are you sure you want to proceed? messageEventSaved = Event data saved messageEventGroupSaved = Event group data saved -messageEventsNotDeleted = The events mentioned in the above list of UUIDs could not be deleted. messageEventsDeleted = All selected eligible events have been deleted messageEventsSentToSurvnet = All selected events have been sent to SurvNet +messageCountCasesNotArchivedExternalReason = %s cases not archived because the communication with the reporting tool failed\: %s +messageCountCasesNotDearchivedExternalReason = %s cases not dearchived because the communication with the reporting tool failed\: %s messageCountCasesNotDeleted = %s cases not deleted. UUIDs of cases not deleted\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s cases not deleted because they are not in jurisdiction or owned\: %s +messageCountCasesNotDeletedExternalReason = %s cases not deleted because the communication with the reporting tool failed\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s cases not deleted because of failed attempt to revoke pending share request(s)\: %s messageCountCasesNotRestored = %s cases not restored. UUIDs of cases not restored\: %s messageCountContactsNotDeleted = %s contacts not deleted. UUIDs of contacts not deleted\: %s +messageCountContactsNotDeletedAccessDeniedReason = %s contacts not deleted because they are not in jurisdiction or owned\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s contacts not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s contacts not linked because the contact is not editable anymore or the user is missing the rights\: %s messageCountContactsNotRestored = %s contacts not restored. UUIDs of contact not restored\: %s +messageCountEntitiesNotArchived = %s entities can not be archived\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s infrastructure entities can not be archived because the entities are used in other infrastructure data\: %s +messageCountEntitiesNotDearchived = %s entities can not be dearchived\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s infrastructure entities can not be dearchived because the entities have archived parent infrastructure\: %s +messageCountEntitiesNotEdited = %s entities can not be edited because they are in a different jurisdiction or were already archived.\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s entities not edited because the entity is not editable anymore\: %s +messageCountEntitiesNotSent = %s entities can not be sent to the reporting tool\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s entities can not be sent to the reporting tool because the user does not have the proper rights\: %s +messageCountEntitiesNotSentExternalReason = %s entities can not be sent to the reporting tool because the communication with the reporting tool failed\: %s +messageCountEventsNotArchivedExternalReason = %s events not archived because the communication with the reporting tool failed\: %s +messageCountEventsNotDearchivedExternalReason = %s events not dearchived because the communication with the reporting tool failed\: %s +messageCountEventsNotLinked = %s events can not be linked or they are already linked to the event group\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s events can not be linked to the event group because it's not allowed to link events from another region to an event group.\: %s messageCountEventsNotRestored = %s events not restored. UUIDs of events not restored\: %s messageCountEventParticipantsNotDeleted = %s event participants not deleted. UUIDs of event participants not deleted\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s messageCountEventParticipantsNotRestored = %s event participants not restored. UUIDs of event participants not restored\: %s messageCountExternalMessagesNotDeleted = %s external messages not deleted. UUIDs of external messages not deleted\: %s +messageCountImmunizationsNotDeleted = %s immunizations not deleted\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s immunizations not deleted because they are not in jurisdiction or owned\: %s messageCountImmunizationsNotRestored = %s immunizations not restored. UUIDs of immunizations not restored\: %s messageCountSamplesNotDeleted = %s samples not deleted. UUIDs of samples not deleted\: %s messageCountSamplesNotRestored = %s samples not restored. UUIDs of samples not restored\: %s messageCountTasksNotDeleted = %s tasks not deleted. UUIDs of travel entries not deleted\: %s +messageCountTasksNotDeletedAccessDeniedReason = %s tasks not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotDeleted = %s travel entries not deleted. UUIDs of travel entries not deleted\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s messageCountTravelEntriesNotRestored = %s travel entries not restored. UUIDs of travel entries not restored\: %s +messageCountUsersNotDisabled = %s users not disabled\: %s +messageCountUsersNotEnabled = %s users not enabled\: %s +messageCountVisitsNotCancelled = %s follow-up visits not cancelled\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s follow-up visits not cancelled because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountVisitsNotDeleted = %s visits not deleted. UUIDs of visits not deleted\: %s +messageCountVisitsNotDeletedAccessDeniedReason = %s visits not deleted because they are not in jurisdiction or owned\: %s +messageCountVisitsNotSetToLost = %s follow-up visits not set to lost\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s follow-up visits not set to lost because the contact is not editable anymore or is outside the user's jurisdiction\: %s messageCountEventsNotDeleted = %s events not deleted. UUIDs of events not deleted\: %s -messageEventsNotDeletedExternalReason = The events mentioned in the above list of UUIDs could not be deleted because the communication with the reporting tool failed. +messageCountEventsNotDeletedAccessDeniedReason = %s events not deleted because they are not in jurisdiction or owned\: %s +messageCountEventsNotDeletedExternalReason = %s events not deleted because the communication with the reporting tool failed\: %s messageEventsNotDeletedLinkedEntitiesReason = No events that contain event participants linked will be deleted. Please remove the event participants from the event in order to be able to delete it. +messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue. messageExportConfigurationDeleted = Export configuration deleted messageExportConfigurationSaved = Export configuration saved messageFollowUpCanceled = Follow-up of all selected contacts has been canceled -messageFollowUpCanceledForSome = Follow-up of some selected contacts has been canceled messageFollowUpStatusChanged = Follow-up of all selected contacts that have follow-up has been set to lost to follow-up -messageFollowUpStatusChangedForSome = Follow-up of some selected contacts that have follow-up has been set to lost to follow-up messageFacilityChanged = You have changed the facility of this case. Do you want to transfer the case to the new facility (the hospitalization may be updated) or do you only want to edit the data to correct a mistake? messageFacilityMulitChanged = You have changed the facility of multiple cases. Do you want to transfer these cases to the new facility (the hospitalization may be updated) or do you only want to edit their data to correct mistakes? messageGdpr = In accordance with the principle of data minimization imposed by the GDPR, you must ensure that you enter here only objective data absolutely necessary for the processing of the file. In particular, you must not enter genetic or biometric, philosophical, political, religious data, union opinions, sexual life or orientation, ethnic origin, offenses, convictions, security measures, criminal record ... or any other data that is not related to public health surveillance. @@ -1183,7 +1238,6 @@ messageImportSuccessful = Import successful\!
All rows have been impo messageUploadSuccessful = Upload successful\! You can now close this window. messageIncompleteGpsCoordinates = GPS coordinates are incomplete messageExternalMessagesAssigned = The assignee has been changed for all selected messages -messageExternalMessagesNotDeleted = The external messages mentioned in the above list of UUIDs could not be deleted. messageLoginFailed = Please check your username and password and try again messageMissingCases = Please generate some cases before generating contacts messageMissingDateFilter = Please fill in both date filter fields @@ -1195,7 +1249,10 @@ messageNoContactsSelected = You have not selected any contacts messageNoCsvFile = You have not selected a file to upload. Please select a .csv file containing the data you want to import from your computer. messageNoDocumentTemplateUploadFile = You have not selected a file to upload. Please select a .docx template file you want to import from your computer. messageNoDocumentUploadFile = You have not selected a file to upload. Please select a file you want to import from your computer. +messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing messageNoEligibleEventForDeletionSelected = None of the selected events are eligible for deletion +messageNoEligibleVisitForCancellation = None of the follow-up visits were eligible for cancellation +messageNoEligibleVisitForSettingToLost = None of the follow-up visits were eligible for setting to lost messageNoEnvironmentsSelected = You have not selected any environments messageNoEventParticipantsSelected = You have not selected any event participants messageNoEventsSelected = You have not selected any events @@ -1228,7 +1285,6 @@ messageRelatedSampleFound = The sample referenced in this lab message seems to a messageRelatedSampleAndLabMessagesFound = A lab message with the same report ID was already processed. It is related to a sample also referenced in this lab message.
Do you want to directly open that sample? messageSampleErrors = There are errors in the sample form. Please fix them and save the sample before referring it to another laboratory. messageSampleSaved = Sample data saved -messageSamplesNotDeleted = The samples mentioned in the above list of UUIDs could not be deleted. messageSamplesDeleted = All selected eligible samples have been deleted messageSpecifyColumnAttribute = Please specify the column attribute you have chosen for the visualization messageSpecifyFilterAttributes = Please specify all selected filter attributes and sub attributes @@ -1237,7 +1293,6 @@ messageSymptomsHint = Please tick an answer for ALL symptoms indicating if th messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited -messageTasksNotDeleted = The tasks mentioned in the above list of UUIDs could not be deleted. messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected eligible tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. @@ -1246,7 +1301,6 @@ messageTravelEntrySaved = Travel entry data saved messageTravelEntryArchived = Travel entry has been archived messageTravelEntryDearchived = Travel entry has been de-archived messageTravelEntryPOEFilledBySystem = [System] Automatically filled point of entry -messageTravelEntriesNotDeleted = The travel entries mentioned in the above list of UUIDs could not be deleted. messageTravelEntriesDeleted = All selected eligible travel entries have been deleted messageTreatmentCreated = Treatment created messageTreatmentSaved = Treatment saved @@ -1258,8 +1312,9 @@ messageDiseaseNotSpecifiedInLabMessage = The disease of the external message cou messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved messageVaccinationOutsideJurisdictionDeletionDenied = The vaccination outside user's jurisdiction cannot be deleted -messageVisitsNotDeleted = The visits mentioned in the above list of UUIDs could not be deleted. messageVisitsDeleted = All selected eligible visits have been deleted +messageVisitsWithWrongStatusNotCancelled = Follow-up visits with CANCELLED or NO FOLLOW-UP status can not be cancelled +messageVisitsWithWrongStatusNotSetToLost = Follow-up visits with NO FOLLOW-UP status can not be set to lost messageWrongFileType = Please provide a .csv file containing the data you want to import. It's recommended to use the import template file as a starting point. messageWrongTemplateFileType=For %s, please provide a .%s file. messageLineListingDisabled = Line listing has been disabled @@ -1356,9 +1411,7 @@ messageExternalMessagesDeleted = All selected eligible messages have been delete messageQuarantineOrderDocumentCreated = Quarantine order document has been created messageUnavailableTaskEditionDueToDifferentDistricts = Task edition is not available if they are related to different districts messageUsersEnabled = All selected users have been enabled -messageSomeUsersEnabled = Some of the selected users have been enabled messageUsersDisabled = All selected users have been disabled -messageSomeUsersDisabled = Some of the selected users have been disabled messageDontShareWithReportingToolWarning = This case is actively prevented from being sent to the external reporting tool messageBulkCasesWithDifferentDiseasesSelected = You have selected cases with different diseases. Some bulk edit options might be unavailable. messageBulkContactsWithDifferentDiseasesSelected = You have selected contacts with different diseases. Some bulk edit options might be unavailable. @@ -1376,6 +1429,7 @@ messageVaccinationNotRelevantForEventParticipant = This vaccination is not relev messageVaccinationNoDateNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because it does not have a vaccination date. messageAcceptRequestToNavigate = The request is not yet accepted. You have to accept it first to be able to navigate there. messageEntityNotFound = The %s was not found in the system. +messageEntitiesNotEditable = There are no entities which are allowed to be edited messageSormasToSormasSimilarCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarConvertedCaseFound = There is at least one similar case in your system. If you accept the request the case maybe will be in your system as a duplicate.
If so, you should consolidate the cases after accepting.
After consolidating the cases, it may be necessary to perform a manual conversion of some contacts to the accepted case.
Please make sure that you use the accepted case for this purpose. messageSormasToSormasSimilarContactToCaseFound = There is at least one similar contact in your system.
After accepting the request, it may be necessary to perform a manual conversion of those contacts to the accepted case. @@ -1388,18 +1442,21 @@ messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\ messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right messageUserRoleHasNoRights = This user role has no rights. Please select at least one right. -messageEntriesEditedExceptArchived = %s entries have been successfully edited. Some of the entries could not be edited because they are in a different jurisdiction or were already archived. messageEntriesEdited = All entries have been edited messageAllEntitiesArchived = All selected entries have been archived -messageSomeEntitiesArchived = %s entries have been archived. messageAllEntitiesDearchived = All selected entries have been dearchived -messageSomeEntitiesDearchived = %s entries have been dearchived. +messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. messageEnvironmentCreated = Environment created messageEnvironmentSaved = Environment saved messageEnvironmentArchived = Environment has been archived messageEnvironmentDearchived = Environment has been de-archived messageEnvironmentSampleOutsideJurisdictionDeletionDenied = The environment sample outside user's jurisdiction cannot be deleted messageEnvironmentJurisdictionUpdated = Changing the location of this environment could make you lose access to its details and/or disallow you to edit in the future. Are you sure you want to proceed? +messageNoEnvironmentSamplesSelected = You have not selected any environment samples +messageEnvironmentSamplesDeleted = All selected eligible environment samples have been deleted +messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s +messageEnvironmentSamplesRestored = All selected environment samples have been restored # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. @@ -1584,6 +1641,19 @@ promptEnvironmentLatFrom= Latitude from... promptEnvironmentLatTo= ... to promptEnvironmentLonFrom= Longitude from... promptEnvironmentLonTo= ... to +promptEnvironmentSampleFreetext = Sample ID, Lab sample ID, Environment ID, Environment name +promptEnvironmentSampleRegion = Region of Environment +promptEnvironmentSampleDistrict = District of Environment +promptEnvironmentSampleLab = Laboratory +promptEnvironmentSampleTestedPathogen = Tested pathogen +promptEnvironmentSampleDateFrom = Report date from... +promptEnvironmentSampleDateTo = ... to +promptEnvironmentSampleEpiWeekFrom = Report date from epi week... +promptEnvironmentSampleEpiWeekTo = ... to epi week +promptEnvironmentSampleLatFrom= Environment latitude from... +promptEnvironmentSampleLatTo= ... to +promptEnvironmentSampleLonFrom= Environment longitude from... +promptEnvironmentSampleLonTo= ... to # Unsaved changes unsavedChanges.warningTitle = Unsaved changes @@ -1603,9 +1673,9 @@ infoBAGExport=Full-Export to SEDEX # Survnet Gateway ExternalSurveillanceToolGateway.notificationEntrySent = Entry has been sent to the reporting tool ExternalSurveillanceToolGateway.notificationEntriesSent = All selected entries have been sent to the reporting tool. -ExternalSurveillanceToolGateway.notificationSomeEntriesSent = Some of the selected entries have been sent to the reporting tool. ExternalSurveillanceToolGateway.notificationEntriesDeleted = All selected entries have been successfully deleted in the reporting tool. ExternalSurveillanceToolGateway.notificationEntryNotSent = Entry could not be sent +ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed ExternalSurveillanceToolGateway.notificationErrorSending = Error when sending entry ExternalSurveillanceToolGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to the reporting tool. ExternalSurveillanceToolGateway.confirmSendCase=Are you sure you want to send the case to the reporting tool? diff --git a/sormas-api/src/main/resources/validations_ar-SA.properties b/sormas-api/src/main/resources/validations_ar-SA.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_ar-SA.properties +++ b/sormas-api/src/main/resources/validations_ar-SA.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_cs-CZ.properties b/sormas-api/src/main/resources/validations_cs-CZ.properties index 26e4ff887b0..a7c8ec12170 100644 --- a/sormas-api/src/main/resources/validations_cs-CZ.properties +++ b/sormas-api/src/main/resources/validations_cs-CZ.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Chyba při pokusu o import hodnoty %s ve slou importPersonContactDetailsWithoutFacilityType = Pro adresu, pro kterou jste zadali kontaktní údaje osoby, musíte zadat alespoň typ zařízení. importProbablyInvalidSeparator=Nahraný csv soubor pravděpodobně používá jiný oddělovač než výchozí oddělovač. Před importem vyberte správný oddělovač. importIncompleteContent=Obsah souboru je neúplný. Záhlaví (i více) chybí nebo nejsou k dispozici žádná data pro import. Pro vytvoření platného importního souboru prosím zkontrolujte pokyny k importu. +importEnvironmentPropertyTypeNotAllowed = Typ vlastnosti %s není povolen při importu prostředí +importEnvironmentUnexpectedError = Neočekávaná chyba při pokusu o import tohoto prostředí. Pošlete prosím soubor hlášení o chybě správci a odeberte tento případ z importního souboru. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Není dovoleno nastavit stav vyšetřování na dokončený pro neklasifikovaný případ. jurisdictionChangeUserAssignment = Úroveň jurisdikce nemůže být změněna, protože uživatelská role je přiřazena alespoň jednomu uživateli. caseClassificationInvalid = Klasifikace případů neodpovídá laboratorním výsledkům a příznakům případu. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Nelze odstranit všechny uživatelské rol removeUserRightEditRightFromOwnUser = Nelze odebrat právo editovat uživatele aktuálně přihlášeného uživatele removeUserEditRightFromOwnUser = Nelze odebrat právo editovat uživatele aktuálně přihlášeného uživatele externalMessageRefersToMultipleEntities = Externí zpráva se týká více subjektů (nejméně dva případy nebo případ a kontakt nebo účastník události) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS souřadnice jsou povinné \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_de-CH.properties b/sormas-api/src/main/resources/validations_de-CH.properties index 5451378a3a6..ca2aeaff9d1 100644 --- a/sormas-api/src/main/resources/validations_de-CH.properties +++ b/sormas-api/src/main/resources/validations_de-CH.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Fehler beim Importieren des Wertes %s in Spal importPersonContactDetailsWithoutFacilityType = Sie müssen mindestens eine Einrichtungsart für die Adresse angeben, für die Sie die Ansprechpartner Kontaktdaten angegeben haben. importProbablyInvalidSeparator=Die hochgeladene csv-Datei verwendet möglicherweise ein anderes Trennzeichen als das Standard-Trennzeichen. Bitte wählen Sie vor dem Importieren das richtige Trennzeichen aus. importIncompleteContent=Der Inhalt der Datei ist unvollständig. Kopfzeile(n) fehlen oder es gibt keine Daten zum Importieren. Bitte überprüfen Sie die Importanweisungen, um eine gültige Importdatei zu erstellen. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Es ist nicht erlaubt, den Untersuchungsstatus für einen Fall ohne Definitionskategorie festzulegen. jurisdictionChangeUserAssignment = Die Zuständigkeitsebene kann nicht geändert werden, weil die Benutzerrolle mindestens einem Benutzer zugeordnet ist. caseClassificationInvalid = Die Fallklassifizierung entspricht nicht den Laborergebnissen und Symptomen des Falls. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Keiner der Benutzerrollen mit dem Recht Benutzer bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden removeUserEditRightFromOwnUser = Das Recht Benutzerrecht bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden externalMessageRefersToMultipleEntities = Die externe Nachricht bezieht sich auf mehrere Entitäten (mindestens zwei Fälle oder einen Fall und einen Kontakt oder einen Ereignis-Teilnehmer) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_de-DE.properties b/sormas-api/src/main/resources/validations_de-DE.properties index 3aae00e889f..adaec25e0d9 100644 --- a/sormas-api/src/main/resources/validations_de-DE.properties +++ b/sormas-api/src/main/resources/validations_de-DE.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Fehler beim Importieren des Wertes %s in Spal importPersonContactDetailsWithoutFacilityType = Sie müssen mindestens eine Einrichtungsart für die Adresse angeben, für die Sie die Ansprechpartner Kontaktdaten angegeben haben. importProbablyInvalidSeparator=Die hochgeladene csv-Datei verwendet möglicherweise ein anderes Trennzeichen als das Standard-Trennzeichen. Bitte wählen Sie vor dem Importieren das richtige Trennzeichen aus. importIncompleteContent=Der Inhalt der Datei ist unvollständig. Kopfzeile(n) fehlen oder es gibt keine Daten zum Importieren. Bitte überprüfen Sie die Importanweisungen, um eine gültige Importdatei zu erstellen. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Es ist nicht erlaubt, den Untersuchungsstatus für einen Fall ohne Definitionskategorie festzulegen. jurisdictionChangeUserAssignment = Die Zuständigkeitsebene kann nicht geändert werden, weil die Benutzerrolle mindestens einem Benutzer zugeordnet ist. caseClassificationInvalid = Die Fallklassifizierung entspricht nicht den Laborergebnissen und Symptomen des Falls. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Keiner der Benutzerrollen mit dem Recht Benutzer bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden removeUserEditRightFromOwnUser = Das Recht Benutzerrecht bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden externalMessageRefersToMultipleEntities = Die externe Nachricht bezieht sich auf mehrere Entitäten (mindestens zwei Fälle oder einen Fall und einen Kontakt oder einen Ereignis-Teilnehmer) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_en-AF.properties b/sormas-api/src/main/resources/validations_en-AF.properties index 9c1946df807..02db5e17d22 100644 --- a/sormas-api/src/main/resources/validations_en-AF.properties +++ b/sormas-api/src/main/resources/validations_en-AF.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_en-GH.properties b/sormas-api/src/main/resources/validations_en-GH.properties index 7b982b7c5cc..b9c4e33b17a 100644 --- a/sormas-api/src/main/resources/validations_en-GH.properties +++ b/sormas-api/src/main/resources/validations_en-GH.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_en-NG.properties b/sormas-api/src/main/resources/validations_en-NG.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_en-NG.properties +++ b/sormas-api/src/main/resources/validations_en-NG.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_es-CU.properties b/sormas-api/src/main/resources/validations_es-CU.properties index e136c054ed1..bc979cea33f 100644 --- a/sormas-api/src/main/resources/validations_es-CU.properties +++ b/sormas-api/src/main/resources/validations_es-CU.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error al tratar de importar el valor %s en la importPersonContactDetailsWithoutFacilityType = Tiene que especificar al menos un tipo de instalación para la dirección para la que ha especificado datos de contacto de persona. importProbablyInvalidSeparator=El archivo csv cargado probablemente utiliza un separador diferente al predeterminado. Por favor, seleccione el separador correcto antes de importar. importIncompleteContent=El contenido del archivo está incompleto. Falta la cabecera(s) o no hay datos para importar. Por favor, lea las instrucciones de importación para crear un archivo de importación válido. +importEnvironmentPropertyTypeNotAllowed = El tipo de propiedad %s no está permitido al importar ambientes +importEnvironmentUnexpectedError = Error inesperado al intentar importar este ambiente. Por favor, envíe su archivo de informe de error a un administrador y elimine este caso de su archivo de importación. +importInvalidWaterUseValue = Valor no válido %s para %s; debe ser un objeto json con las claves posibles [%s] y valor booleano investigationStatusUnclassifiedCase = No se permite especificar un estado de investigación de terminada para un caso no clasificado. jurisdictionChangeUserAssignment = El nivel de jurisdicción no se puede cambiar porque el rol de usuario está asignado al menos a un usuario. caseClassificationInvalid = La clasificación del caso no se corresponde con los resultados de laboratorio y los síntomas del caso. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = No se pueden eliminar todos los roles de u removeUserRightEditRightFromOwnUser = No se puede eliminar el derecho de editar usuario del usuario conectado actualmente removeUserEditRightFromOwnUser = No se puede eliminar el derecho de editar derecho de usuario del usuario conectado actualmente externalMessageRefersToMultipleEntities = El mensaje externo se refiere a múltiples entidades (Al menos dos casos, o un caso y un contacto o un participante de evento) +environmentWaterFieldsSetWithNotWaterMedia = Los siguientes campos sólo se pueden establecer si el tipo de medio es Agua\: %s +gpsCoordinatesRequired = Se requieren las coordenadas GPS \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_es-ES.properties b/sormas-api/src/main/resources/validations_es-ES.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_es-ES.properties +++ b/sormas-api/src/main/resources/validations_es-ES.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fa-AF.properties b/sormas-api/src/main/resources/validations_fa-AF.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_fa-AF.properties +++ b/sormas-api/src/main/resources/validations_fa-AF.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fi-FI.properties b/sormas-api/src/main/resources/validations_fi-FI.properties index 73f52ec942b..0c802875c77 100644 --- a/sormas-api/src/main/resources/validations_fi-FI.properties +++ b/sormas-api/src/main/resources/validations_fi-FI.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Selvittelyn tilaa ei voi asettaa valmiiksi luokittamattomalle potilaalle. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fil-PH.properties b/sormas-api/src/main/resources/validations_fil-PH.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_fil-PH.properties +++ b/sormas-api/src/main/resources/validations_fil-PH.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fj-FJ.properties b/sormas-api/src/main/resources/validations_fj-FJ.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_fj-FJ.properties +++ b/sormas-api/src/main/resources/validations_fj-FJ.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fr-CD.properties b/sormas-api/src/main/resources/validations_fr-CD.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_fr-CD.properties +++ b/sormas-api/src/main/resources/validations_fr-CD.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fr-CH.properties b/sormas-api/src/main/resources/validations_fr-CH.properties index 58924ccf414..83ba3554a38 100644 --- a/sormas-api/src/main/resources/validations_fr-CH.properties +++ b/sormas-api/src/main/resources/validations_fr-CH.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Il n'est pas permis de fixer le statut d'enquête à faire pour un cas non classifié. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = La classification du cas ne correspond ni aux résultats du test de laboratoire ni aux symptômes du cas. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fr-FR.properties b/sormas-api/src/main/resources/validations_fr-FR.properties index 11c2abb9649..f9337da9d85 100644 --- a/sormas-api/src/main/resources/validations_fr-FR.properties +++ b/sormas-api/src/main/resources/validations_fr-FR.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Erreur lors de l'importation de la valeur %s importPersonContactDetailsWithoutFacilityType = Vous devez spécifier au moins un type d'établissement pour l'adresse pour laquelle vous avez spécifié les coordonnées de la personne. importProbablyInvalidSeparator=Le fichier csv téléchargé utilise probablement un séparateur différent du séparateur par défaut. Veuillez sélectionner le séparateur correct avant d'importer. importIncompleteContent=Le contenu du fichier est incomplet. Les en-têtes sont manquants ou il n'y a pas de données à importer. Veuillez vérifier les instructions d'importation pour créer un fichier d'importation valide. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Il n'est pas permis de fixer le statut d'enquête à faire pour un cas non classifié. jurisdictionChangeUserAssignment = Le niveau de juridiction ne peut pas être modifié car le rôle d'utilisateur est attribué à au moins un utilisateur. caseClassificationInvalid = La classification des cas ne correspond pas aux résultats de laboratoire et aux symptômes du cas. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = Les coordonnées GPS sont requises \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_fr-TN.properties b/sormas-api/src/main/resources/validations_fr-TN.properties index cabdad0d7a8..63c02a383f4 100644 --- a/sormas-api/src/main/resources/validations_fr-TN.properties +++ b/sormas-api/src/main/resources/validations_fr-TN.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Erreur lors de l'importation de la valeur %s importPersonContactDetailsWithoutFacilityType = Vous devez spécifier au moins un type d'établissement pour l'adresse pour laquelle vous avez spécifié les coordonnées de la personne. importProbablyInvalidSeparator=Le fichier csv téléchargé utilise probablement un séparateur différent du séparateur par défaut. Veuillez sélectionner le séparateur correct avant d'importer. importIncompleteContent=Le contenu du fichier est incomplet. Les en-têtes sont manquants ou il n'y a pas de données à importer. Veuillez vérifier les instructions d'importation pour créer un fichier d'importation valide. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Il n'est pas permis de fixer le statut d'enquête à faire pour un cas non classifié. jurisdictionChangeUserAssignment = Le niveau de juridiction ne peut pas être modifié car le rôle d'utilisateur est attribué à au moins un utilisateur. caseClassificationInvalid = La classification des cas ne correspond pas aux résultats de laboratoire et aux symptômes du cas. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_hi-IN.properties b/sormas-api/src/main/resources/validations_hi-IN.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_hi-IN.properties +++ b/sormas-api/src/main/resources/validations_hi-IN.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_hr-HR.properties b/sormas-api/src/main/resources/validations_hr-HR.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_hr-HR.properties +++ b/sormas-api/src/main/resources/validations_hr-HR.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_it-CH.properties b/sormas-api/src/main/resources/validations_it-CH.properties index 93afa31dd51..e38a5fe2d3b 100644 --- a/sormas-api/src/main/resources/validations_it-CH.properties +++ b/sormas-api/src/main/resources/validations_it-CH.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Per i casi non classificati, lo stato dell'indagine non può essere "Fatto". jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = La classificazione dei casi non corrisponde ai risultati di laboratorio e ai sintomi del caso. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_it-IT.properties b/sormas-api/src/main/resources/validations_it-IT.properties index 335ba9e883b..2acdeb3a8f4 100644 --- a/sormas-api/src/main/resources/validations_it-IT.properties +++ b/sormas-api/src/main/resources/validations_it-IT.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = Per i casi non classificati, lo stato dell'indagine non può essere "Fatto". jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_ja-JP.properties b/sormas-api/src/main/resources/validations_ja-JP.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_ja-JP.properties +++ b/sormas-api/src/main/resources/validations_ja-JP.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_ne-NP.properties b/sormas-api/src/main/resources/validations_ne-NP.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_ne-NP.properties +++ b/sormas-api/src/main/resources/validations_ne-NP.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_nl-NL.properties b/sormas-api/src/main/resources/validations_nl-NL.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_nl-NL.properties +++ b/sormas-api/src/main/resources/validations_nl-NL.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_no-NO.properties b/sormas-api/src/main/resources/validations_no-NO.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_no-NO.properties +++ b/sormas-api/src/main/resources/validations_no-NO.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_pl-PL.properties b/sormas-api/src/main/resources/validations_pl-PL.properties index e2faa1285cf..3bdf9615a1e 100644 --- a/sormas-api/src/main/resources/validations_pl-PL.properties +++ b/sormas-api/src/main/resources/validations_pl-PL.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_ps-AF.properties b/sormas-api/src/main/resources/validations_ps-AF.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_ps-AF.properties +++ b/sormas-api/src/main/resources/validations_ps-AF.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_pt-PT.properties b/sormas-api/src/main/resources/validations_pt-PT.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_pt-PT.properties +++ b/sormas-api/src/main/resources/validations_pt-PT.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_ro-RO.properties b/sormas-api/src/main/resources/validations_ro-RO.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_ro-RO.properties +++ b/sormas-api/src/main/resources/validations_ro-RO.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_ru-RU.properties b/sormas-api/src/main/resources/validations_ru-RU.properties index cb2ee0174c9..c3bb584481e 100644 --- a/sormas-api/src/main/resources/validations_ru-RU.properties +++ b/sormas-api/src/main/resources/validations_ru-RU.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_sv-SE.properties b/sormas-api/src/main/resources/validations_sv-SE.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_sv-SE.properties +++ b/sormas-api/src/main/resources/validations_sv-SE.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_sw-KE.properties b/sormas-api/src/main/resources/validations_sw-KE.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_sw-KE.properties +++ b/sormas-api/src/main/resources/validations_sw-KE.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_tr-TR.properties b/sormas-api/src/main/resources/validations_tr-TR.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_tr-TR.properties +++ b/sormas-api/src/main/resources/validations_tr-TR.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_uk-UA.properties b/sormas-api/src/main/resources/validations_uk-UA.properties index 02ed8292af5..59273b324ae 100644 --- a/sormas-api/src/main/resources/validations_uk-UA.properties +++ b/sormas-api/src/main/resources/validations_uk-UA.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_ur-PK.properties b/sormas-api/src/main/resources/validations_ur-PK.properties index 6e5ba6ce705..9858bb4f94a 100644 --- a/sormas-api/src/main/resources/validations_ur-PK.properties +++ b/sormas-api/src/main/resources/validations_ur-PK.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = %sکالم میں%s معلومات امپو importPersonContactDetailsWithoutFacilityType = آپ کو اس ایڈریس کے لیے کم از کم ایک سہولت گاہ کی قسم بتانا ہو گی جس کے لیے آپ نے شخص سے رابطہ کی تفصیلات بتائی ہیں۔ importProbablyInvalidSeparator=اپ لوڈ کردہ csv فائل شاید پہلے سے طے شدہ سیپریٹر سے مختلف سیپریٹر استعمال کرتی ہے۔ براہ کرم امپورٹ کرنے سے پہلے درست سیپریٹرمنتخب کریں۔ importIncompleteContent=فائل کا مواد نامکمل ہے۔ سرخی غائب ہیں یا امپورٹ کرنے کے لیے کوئی ڈیٹا نہیں ہے۔ ایک درست امپورٹ فائل بنانے کے لیے براہ کرم امپورٹ والی ہدایات کو چیک کریں۔ +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = کسی غیر درجہ بند کیس کے لیے تفتیش کی حیثیت کو سب ٹھیک ہے کرنے کی اجازت نہیں ہے۔ jurisdictionChangeUserAssignment = دائرہ اختیار کی سطح کو تبدیل نہیں کیا جا سکتا کیونکہ صارف کا کردار کم از کم ایک صارف کے استعمال میں ہے۔ caseClassificationInvalid = کیس کی درجہ بندی لیب کے نتائج اور کیس کی علامات سے مطابقت نہیں رکھتی۔ @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = فی الحال لاگ ان صارف کے removeUserRightEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف میں ترمیم کریں کو مٹایا نہیں جا سکتا removeUserEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف کے حق میں ترمیم کریں کو مٹایا نہیں جا سکتا externalMessageRefersToMultipleEntities = بیرونی پیغام سے مراد متعدد اداروں (یا تو کم از کم دو کیسز یا کیس اور ایک رابطہ یا ایونٹ میں شریک) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_zh-CN.properties b/sormas-api/src/main/resources/validations_zh-CN.properties index 946f87c0882..1cffe32fc7e 100644 --- a/sormas-api/src/main/resources/validations_zh-CN.properties +++ b/sormas-api/src/main/resources/validations_zh-CN.properties @@ -71,6 +71,9 @@ importErrorCustomizableEnumValue = Error when trying to import value %s in colum importPersonContactDetailsWithoutFacilityType = You have to specify at least a facility type for the address that you have specified person contact details for. importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. +importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentUnexpectedError = Unexpected error when trying to import this environment. Please send your error report file to an administrator and remove this case from your import file. +importInvalidWaterUseValue = Invalid value %s for %s; Must be a json object with the possible keys [%s] and boolean value investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. @@ -270,3 +273,5 @@ removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s +gpsCoordinatesRequired = GPS coordinates are required \ No newline at end of file diff --git a/sormas-app/app/src/main/res/values-ar-rSA/strings.xml b/sormas-app/app/src/main/res/values-ar-rSA/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-ar-rSA/strings.xml +++ b/sormas-app/app/src/main/res/values-ar-rSA/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-cs-rCZ/strings.xml b/sormas-app/app/src/main/res/values-cs-rCZ/strings.xml index 09c344db92a..03d4684b3e3 100644 --- a/sormas-app/app/src/main/res/values-cs-rCZ/strings.xml +++ b/sormas-app/app/src/main/res/values-cs-rCZ/strings.xml @@ -54,9 +54,10 @@ Upravit Upravit případ Upravit kontakt - Edit Environment + Upravit prostředí Upravit Udalost Upravit vzorek + Upravit vzorek prostředí Zapomenutý PIN? Nápověda Instalovat @@ -72,9 +73,10 @@ Nová imunizace Nová data formuláře kampaně Nový kontakt - New Environment + Nové prostředí Nová udalost Nový vzorek + Nový vzorek prostředí Nový úkol Nevykonatelný OK @@ -101,6 +103,7 @@ Uložit účastníka události Uložit předpis Uložit vzorek + Uložit vzorek prostředí Uložit úkol Uložit léčbu Uložit následnou návštěvu @@ -167,7 +170,9 @@ Epi týden Zpráva Environment Information + Vzorky prostředí Environment Tasks + Environment Sample Information Popis Poloha Datum události @@ -384,13 +389,17 @@ Upravit vzorek Nový vzorek Číst vzorek + Read Environment Sample + Edit Environment Sample + New Environment Sample Shrnutí vzorku Seznam vzorků - Environment Listing - Edit Environment - New Environment - Read Environment - Environment location update + Seznam vzorků prostředí + Seznam prostředí + Upravit prostředí + Nové prostředí + Číst prostředí + Aktualizace lokality prostředí Upravit imunizaci Nová imunizace Číst imunizaci @@ -439,6 +448,10 @@ Upravit očkování Nové očkování Hledat konkrétní případ + Laboratorní vzorek + Měření vzorku + Umístění místa odběru vzorků + Sample management Přidejte nový záznam stisknutím symbolu \"+\" v pravém horním rohu. Vymazat Vyberte si prosím čtyřmístný PIN kód, který budete používat k ověření při každém otevření aplikace SORMAS. @@ -511,7 +524,8 @@ Události Zprávy Vzorky - Environments + Prostředí + Vzorky prostředí Imunizace Nastavení Úkoly @@ -663,7 +677,7 @@ Datum léčby N/A Typ N/A ID N/A - ExternalID N/A + ExternalID není k dispozici Datum návštěvy N/A Poznámky N/A Čas návštěvy N/A @@ -678,4 +692,5 @@ Datum očkování N/A Očkovací látka N/A Výrobce N/A + Název prostředí není k dispozici diff --git a/sormas-app/app/src/main/res/values-de-rCH/strings.xml b/sormas-app/app/src/main/res/values-de-rCH/strings.xml index d65f37f73ce..5d7d827bdb8 100644 --- a/sormas-app/app/src/main/res/values-de-rCH/strings.xml +++ b/sormas-app/app/src/main/res/values-de-rCH/strings.xml @@ -57,6 +57,7 @@ Edit Environment Ereignis bearbeiten Probe bearbeiten + Edit Environment Sample PIN vergessen? Hilfe Installieren @@ -75,6 +76,7 @@ New Environment Neues Ereignis Neue Probe + New Environment Sample Neue Aufgabe Nicht ausführbar OK @@ -101,6 +103,7 @@ Ereignisteilnehmer*in speichern Rezept speichern Probe speichern + Save Environment Sample Aufgabe speichern Behandlung speichern Follow-up/Nachverfolgungs-Anruf speichern @@ -167,7 +170,9 @@ Epi Woche Bericht Environment Information + Environment Samples Environment Tasks + Environment Sample Information Beschreibung Ort Datum des Ereignisses @@ -384,8 +389,12 @@ Probe bearbeiten Neue Probe Probe lesen + Read Environment Sample + Edit Environment Sample + New Environment Sample Probe-Zusammenfassung Proben-Liste + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Impfung bearbeiten Neue Impfung Spezifischen Fall suchen + Laboratory sample + Sample measurements + Location of sampling site + Sample management Fügen Sie einen neuen Eintrag hinzu, indem Sie das \"+\" Symbol oben rechts drücken. Löschen Bitte wählen Sie eine vierstellige PIN aus, mit der Sie sich bei jedem Öffnen der SORMAS-App authentifizieren werden. @@ -512,6 +525,7 @@ Meldungen Proben Environments + Environment Samples Immunisierungen Einstellungen Aufgaben @@ -678,4 +692,5 @@ Impfdatum N/A Impfstoff N/A Hersteller N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-de-rDE/strings.xml b/sormas-app/app/src/main/res/values-de-rDE/strings.xml index 9a6f4f82e46..fb9636698f4 100644 --- a/sormas-app/app/src/main/res/values-de-rDE/strings.xml +++ b/sormas-app/app/src/main/res/values-de-rDE/strings.xml @@ -57,6 +57,7 @@ Edit Environment Ereignis bearbeiten Probe bearbeiten + Edit Environment Sample PIN vergessen? Hilfe Installieren @@ -75,6 +76,7 @@ New Environment Neues Ereignis Neue Probe + New Environment Sample Neue Aufgabe Nicht ausführbar OK @@ -101,6 +103,7 @@ Ereignisteilnehmer*in speichern Verschreibung speichern Probe speichern + Save Environment Sample Aufgabe speichern Behandlung speichern Nachverfolgungs-Anruf speichern @@ -167,7 +170,9 @@ Epi Woche Bericht Environment Information + Environment Samples Environment Tasks + Environment Sample Information Beschreibung Ort Datum des Ereignisses @@ -384,8 +389,12 @@ Probe bearbeiten Neue Probe Probe lesen + Read Environment Sample + Edit Environment Sample + New Environment Sample Probe-Zusammenfassung Proben-Liste + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Impfung bearbeiten Neue Impfung Spezifischen Fall suchen + Laboratory sample + Sample measurements + Location of sampling site + Sample management Fügen Sie einen neuen Eintrag hinzu, indem Sie das \"+\" Symbol oben rechts drücken. Löschen Bitte wählen Sie eine vierstellige PIN aus, mit der Sie sich bei jedem Öffnen der SORMAS-App authentifizieren werden. @@ -512,6 +525,7 @@ Meldungen Proben Environments + Environment Samples Immunisierungen Einstellungen Aufgaben @@ -678,4 +692,5 @@ Impfdatum N/A Impfstoff N/A Hersteller N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-en-rAF/strings.xml b/sormas-app/app/src/main/res/values-en-rAF/strings.xml index 1ce2fb032be..23e75e9d9ba 100644 --- a/sormas-app/app/src/main/res/values-en-rAF/strings.xml +++ b/sormas-app/app/src/main/res/values-en-rAF/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-en-rGH/strings.xml b/sormas-app/app/src/main/res/values-en-rGH/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-en-rGH/strings.xml +++ b/sormas-app/app/src/main/res/values-en-rGH/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-en-rNG/strings.xml b/sormas-app/app/src/main/res/values-en-rNG/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-en-rNG/strings.xml +++ b/sormas-app/app/src/main/res/values-en-rNG/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-es-rCU/strings.xml b/sormas-app/app/src/main/res/values-es-rCU/strings.xml index f74cf8c6941..c4edf3cf7c6 100644 --- a/sormas-app/app/src/main/res/values-es-rCU/strings.xml +++ b/sormas-app/app/src/main/res/values-es-rCU/strings.xml @@ -57,6 +57,7 @@ Editar ambiente Editar evento Editar muestra + Editar muestra ambiental ¿Olvidó el PIN? Ayuda Instalar @@ -75,6 +76,7 @@ Nuevo ambiente Nuevo evento Nueva muestra + Nueva muestra ambiental Nueva tarea No ejecutable OK @@ -101,6 +103,7 @@ Guardar participante de evento Guardar prescripción Guardar muestra + Guardar muestra ambiental Guardar tarea Guardar tratamiento Guardar visita de seguimiento @@ -167,7 +170,9 @@ Semana epi Informe Información del ambiente + Muestras ambientales Tareas del ambiente + Información de muestra ambiental Descripción Ubicación Fecha del evento @@ -384,8 +389,12 @@ Editar muestra Nueva muestra Leer muestra + Leer muestra ambiental + Editar muestra ambiental + Nueva muestra ambiental Resumen de la muestra Listado de muestras + Listado de muestras ambientales Listado de ambientes Editar ambiente Nuevo ambiente @@ -439,6 +448,10 @@ Editar vacunación Nueva vacunación Buscar caso específico + Muestra de laboratorio + Medidas de muestra + Ubicación del sitio de la muestra + Gestión de muestras Añada una nueva entrada pulsando el símbolo \"+\" en la parte superior derecha. Limpiar Por favor, elija un PIN de cuatro dígitos que utilizará para autenticarse cada vez que abra la aplicación SORMAS. @@ -512,6 +525,7 @@ Informes Muestras Ambientes + Muestras ambientales Inmunizaciones Ajustes Tareas @@ -678,4 +692,5 @@ Fecha de vacunación N/A Vacuna N/A Fabricante N/A + Nombre de ambiente N/A diff --git a/sormas-app/app/src/main/res/values-es-rES/strings.xml b/sormas-app/app/src/main/res/values-es-rES/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-es-rES/strings.xml +++ b/sormas-app/app/src/main/res/values-es-rES/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fa-rAF/strings.xml b/sormas-app/app/src/main/res/values-fa-rAF/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-fa-rAF/strings.xml +++ b/sormas-app/app/src/main/res/values-fa-rAF/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fi-rFI/strings.xml b/sormas-app/app/src/main/res/values-fi-rFI/strings.xml index 9fcbb08abd3..e61a0118206 100644 --- a/sormas-app/app/src/main/res/values-fi-rFI/strings.xml +++ b/sormas-app/app/src/main/res/values-fi-rFI/strings.xml @@ -57,6 +57,7 @@ Edit Environment Muokkaa tapahtumaa Muokkaa näytettä + Edit Environment Sample PIN-koodi unohtui? Ohjeet Asenna @@ -75,6 +76,7 @@ New Environment Uusi tapahtuma Uusi Näyte + New Environment Sample Uusi tehtävä Ei toteutettavissa OK @@ -101,6 +103,7 @@ Tallenna tapahtuman osallistuja Tallenna lääkemääräys Tallenna näyte + Save Environment Sample Tallenna tehtävä Tallenna hoito Tallenna seurantakäynti @@ -167,7 +170,9 @@ Epidemiaviikko Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Muokkaa näytettä Uusi Näyte Lue näyte + Read Environment Sample + Edit Environment Sample + New Environment Sample Näytteen yhteenveto Näytelistaus + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Lisää uusi merkintä painamalla \"+\" symbolia oikeassa yläkulmassa. Tyhjennä Valitse neljänumeroinen PIN jota käytät vahvistamaan itsesi, kun avaat SORMAS-sovelluksen. @@ -512,6 +525,7 @@ Raportit Näytteet Environments + Environment Samples Immunizations Asetukset Tehtävät @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fil-rPH/strings.xml b/sormas-app/app/src/main/res/values-fil-rPH/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-fil-rPH/strings.xml +++ b/sormas-app/app/src/main/res/values-fil-rPH/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fj-rFJ/strings.xml b/sormas-app/app/src/main/res/values-fj-rFJ/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-fj-rFJ/strings.xml +++ b/sormas-app/app/src/main/res/values-fj-rFJ/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fr-rCD/strings.xml b/sormas-app/app/src/main/res/values-fr-rCD/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-fr-rCD/strings.xml +++ b/sormas-app/app/src/main/res/values-fr-rCD/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fr-rCH/strings.xml b/sormas-app/app/src/main/res/values-fr-rCH/strings.xml index f37ba2fb80c..0fa2f97ee68 100644 --- a/sormas-app/app/src/main/res/values-fr-rCH/strings.xml +++ b/sormas-app/app/src/main/res/values-fr-rCH/strings.xml @@ -57,6 +57,7 @@ Edit Environment Modifier l\'événement Modifier l\'échantillon + Edit Environment Sample Code PIN oublié ? Aide Installer @@ -75,6 +76,7 @@ New Environment Nouvel événement Nouveau échantillon + New Environment Sample Nouvelle tâche Non exécutable OK @@ -101,6 +103,7 @@ Enregistrer le participant de l\'événement Enregistrer l\'ordonnance Enregistrer l\'échantillon + Save Environment Sample Enregistrer la tâche Enregistrer le traitement Enregistrer la visite de suivi @@ -167,7 +170,9 @@ Semaine Epidemiologique Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Lieu Date de l\'événement @@ -384,8 +389,12 @@ Modifier l\'échantillon Nouvel échantillon Lire l\'échantillon + Read Environment Sample + Edit Environment Sample + New Environment Sample Résumé de l\'échantillon Liste d\'échantillons + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Ajouter une nouvelle entrée en appuyant sur \"+\" en haut à droite. Supprimer Veuillez choisir un code PIN à quatre chiffres que vous utiliserez pour vous authentifier à chaque fois que vous ouvrirez l\'application SORMAS. @@ -512,6 +525,7 @@ Rapports Échantillons Environments + Environment Samples Immunizations Paramètres Tâches @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fr-rFR/strings.xml b/sormas-app/app/src/main/res/values-fr-rFR/strings.xml index 523cc2dda57..78772f81f20 100644 --- a/sormas-app/app/src/main/res/values-fr-rFR/strings.xml +++ b/sormas-app/app/src/main/res/values-fr-rFR/strings.xml @@ -57,6 +57,7 @@ Edit Environment Modifier l\'événement Modifier l\'échantillon + Modifier l\'échantillon Code PIN oublié ? Aide Installer @@ -75,6 +76,7 @@ New Environment Nouvel événement Nouvel échantillon + New Environment Sample Nouvelle tâche Non exécutable OK @@ -101,6 +103,7 @@ Enregistrer le participant de l\'événement Enregistrer l\'ordonnance Enregistrer l\'échantillon + Enregistrer l\'échantillon Enregistrer la tâche Enregistrer le traitement Enregistrer la visite de suivi @@ -167,7 +170,9 @@ Semaine Epidemiologique Rapport Environment Information + Echantillons environementaux Environment Tasks + Information sur l\'échantillon Description Lieu Date de l\'événement @@ -384,8 +389,12 @@ Modifier l\'échantillon Nouvel échantillon Lire l\'échantillon + Read Environment Sample + Modifier l\'échantillon + Nouvel échantillon Résumé de l\'échantillon Liste d\'échantillons + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Modifier la vaccination Nouvelle Vaccination Rechercher un cas spécifique + Laboratory sample + Sample measurements + Emplacement du site d\'échantillonnage + Gestion des échantillons Ajouter une nouvelle entrée en appuyant sur \"+\" en haut à droite. Supprimer Veuillez choisir un code PIN à quatre chiffres que vous utiliserez pour vous authentifier à chaque fois que vous ouvrirez l\'application SORMAS. @@ -512,6 +525,7 @@ Rapports Échantillons Environments + Environment Samples Immunizations Paramètres Tâches @@ -678,4 +692,5 @@ Date de vaccination N/A Vaccin N/A Fabricant N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-fr-rTN/strings.xml b/sormas-app/app/src/main/res/values-fr-rTN/strings.xml index 523cc2dda57..17d66e4d694 100644 --- a/sormas-app/app/src/main/res/values-fr-rTN/strings.xml +++ b/sormas-app/app/src/main/res/values-fr-rTN/strings.xml @@ -57,6 +57,7 @@ Edit Environment Modifier l\'événement Modifier l\'échantillon + Edit Environment Sample Code PIN oublié ? Aide Installer @@ -75,6 +76,7 @@ New Environment Nouvel événement Nouvel échantillon + New Environment Sample Nouvelle tâche Non exécutable OK @@ -101,6 +103,7 @@ Enregistrer le participant de l\'événement Enregistrer l\'ordonnance Enregistrer l\'échantillon + Save Environment Sample Enregistrer la tâche Enregistrer le traitement Enregistrer la visite de suivi @@ -167,7 +170,9 @@ Semaine Epidemiologique Rapport Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Lieu Date de l\'événement @@ -384,8 +389,12 @@ Modifier l\'échantillon Nouvel échantillon Lire l\'échantillon + Read Environment Sample + Edit Environment Sample + New Environment Sample Résumé de l\'échantillon Liste d\'échantillons + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Modifier la vaccination Nouvelle Vaccination Rechercher un cas spécifique + Laboratory sample + Sample measurements + Location of sampling site + Sample management Ajouter une nouvelle entrée en appuyant sur \"+\" en haut à droite. Supprimer Veuillez choisir un code PIN à quatre chiffres que vous utiliserez pour vous authentifier à chaque fois que vous ouvrirez l\'application SORMAS. @@ -512,6 +525,7 @@ Rapports Échantillons Environments + Environment Samples Immunizations Paramètres Tâches @@ -678,4 +692,5 @@ Date de vaccination N/A Vaccin N/A Fabricant N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-hi-rIN/strings.xml b/sormas-app/app/src/main/res/values-hi-rIN/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-hi-rIN/strings.xml +++ b/sormas-app/app/src/main/res/values-hi-rIN/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-hr-rHR/strings.xml b/sormas-app/app/src/main/res/values-hr-rHR/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-hr-rHR/strings.xml +++ b/sormas-app/app/src/main/res/values-hr-rHR/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-it-rCH/strings.xml b/sormas-app/app/src/main/res/values-it-rCH/strings.xml index b4249a994de..c428819a3a9 100644 --- a/sormas-app/app/src/main/res/values-it-rCH/strings.xml +++ b/sormas-app/app/src/main/res/values-it-rCH/strings.xml @@ -57,6 +57,7 @@ Edit Environment Modifica evento Modifica campione + Edit Environment Sample PIN dimenticato? Aiuto Installa @@ -75,6 +76,7 @@ New Environment Nuovo Evento Nuovo campione + New Environment Sample Nuovo incarico Non eseguibile OK @@ -101,6 +103,7 @@ Salva partecipante evento Salva prescrizione Salva campione + Save Environment Sample Salva attività Salva trattamento Salva visita supplementare @@ -167,7 +170,9 @@ Settimana Epi Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Descrizione Ubicazione Data dell\'evento @@ -384,8 +389,12 @@ Modifica campione Nuovo campione Lettura Campione + Read Environment Sample + Edit Environment Sample + New Environment Sample Riepilogo Campione Elenco Campioni + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Aggiungi una nuova voce premendo il simbolo \"+\" in alto a destra. Elimina tutto Scegli un PIN a quattro cifre che utilizzerai per autenticarti ogni volta che apri l\'app SORMAS. @@ -512,6 +525,7 @@ Rapporti Campioni Environments + Environment Samples Immunizations Impostazioni Attività @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-it-rIT/strings.xml b/sormas-app/app/src/main/res/values-it-rIT/strings.xml index 3dfdebfd194..56fbf684cbe 100644 --- a/sormas-app/app/src/main/res/values-it-rIT/strings.xml +++ b/sormas-app/app/src/main/res/values-it-rIT/strings.xml @@ -57,6 +57,7 @@ Edit Environment Modifica evento Modifica campione + Edit Environment Sample PIN dimenticato? Aiuto Installa @@ -75,6 +76,7 @@ New Environment Nuovo Evento Nuovo campione + New Environment Sample Nuovo incarico Non eseguibile OK @@ -101,6 +103,7 @@ Salva partecipante evento Salva prescrizione Salva campione + Save Environment Sample Salva attività Salva trattamento Salva visita supplementare @@ -167,7 +170,9 @@ Settimana Epi Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Modifica campione Nuovo campione Lettura Campione + Read Environment Sample + Edit Environment Sample + New Environment Sample Riepilogo Campione Elenco Campioni + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Aggiungi una nuova voce premendo il simbolo \"+\" in alto a destra. Elimina tutto Scegli un PIN a quattro cifre che utilizzerai per autenticarti ogni volta che apri l\'app SORMAS. @@ -512,6 +525,7 @@ Rapporti Campioni Environments + Environment Samples Immunizations Impostazioni Attività @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-ja-rJP/strings.xml b/sormas-app/app/src/main/res/values-ja-rJP/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-ja-rJP/strings.xml +++ b/sormas-app/app/src/main/res/values-ja-rJP/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-ne-rNP/strings.xml b/sormas-app/app/src/main/res/values-ne-rNP/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-ne-rNP/strings.xml +++ b/sormas-app/app/src/main/res/values-ne-rNP/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-nl-rNL/strings.xml b/sormas-app/app/src/main/res/values-nl-rNL/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-nl-rNL/strings.xml +++ b/sormas-app/app/src/main/res/values-nl-rNL/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-no-rNO/strings.xml b/sormas-app/app/src/main/res/values-no-rNO/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-no-rNO/strings.xml +++ b/sormas-app/app/src/main/res/values-no-rNO/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-pl-rPL/strings.xml b/sormas-app/app/src/main/res/values-pl-rPL/strings.xml index 2df468fa29a..c687567f3ec 100644 --- a/sormas-app/app/src/main/res/values-pl-rPL/strings.xml +++ b/sormas-app/app/src/main/res/values-pl-rPL/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Zapomniany PIN? Pomoc Zainstaluj @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edytuj szczepienie Nowe szczepienie Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Określ czterocyfrowy kod PIN, którego będziesz używać do uwierzytelniania przy każdym uruchomieniu aplikacji SORMAS. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-ps-rAF/strings.xml b/sormas-app/app/src/main/res/values-ps-rAF/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-ps-rAF/strings.xml +++ b/sormas-app/app/src/main/res/values-ps-rAF/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-pt-rPT/strings.xml b/sormas-app/app/src/main/res/values-pt-rPT/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-pt-rPT/strings.xml +++ b/sormas-app/app/src/main/res/values-pt-rPT/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-ro-rRO/strings.xml b/sormas-app/app/src/main/res/values-ro-rRO/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-ro-rRO/strings.xml +++ b/sormas-app/app/src/main/res/values-ro-rRO/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-ru-rRU/strings.xml b/sormas-app/app/src/main/res/values-ru-rRU/strings.xml index e6669d38ab4..56a4dab8d0c 100644 --- a/sormas-app/app/src/main/res/values-ru-rRU/strings.xml +++ b/sormas-app/app/src/main/res/values-ru-rRU/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-sv-rSE/strings.xml b/sormas-app/app/src/main/res/values-sv-rSE/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-sv-rSE/strings.xml +++ b/sormas-app/app/src/main/res/values-sv-rSE/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-sw-rKE/strings.xml b/sormas-app/app/src/main/res/values-sw-rKE/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-sw-rKE/strings.xml +++ b/sormas-app/app/src/main/res/values-sw-rKE/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-tr-rTR/strings.xml b/sormas-app/app/src/main/res/values-tr-rTR/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-tr-rTR/strings.xml +++ b/sormas-app/app/src/main/res/values-tr-rTR/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-uk-rUA/strings.xml b/sormas-app/app/src/main/res/values-uk-rUA/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-uk-rUA/strings.xml +++ b/sormas-app/app/src/main/res/values-uk-rUA/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-ur-rPK/strings.xml b/sormas-app/app/src/main/res/values-ur-rPK/strings.xml index c757732bafe..a6f90874534 100644 --- a/sormas-app/app/src/main/res/values-ur-rPK/strings.xml +++ b/sormas-app/app/src/main/res/values-ur-rPK/strings.xml @@ -57,6 +57,7 @@ Edit Environment تقریب میں ترمیم کریں نمونہ میں ترمیم کریں + Edit Environment Sample پن بھول گئے؟ مد د انسٹال کریں @@ -75,6 +76,7 @@ New Environment نئی تقریب نیا نمونہ + New Environment Sample نیا کام غیر قابل عمل ٹھیک ہے @@ -101,6 +103,7 @@ تقریب میں شریک شخص کو محفوظ کریں نسخہ محفوظ کریں نمونہ محفوظ کریں + Save Environment Sample کام کو محفوظ کریں۔ علاج محفوظ کریں فالو اپ وزٹ کو محفوظ کریں @@ -167,7 +170,9 @@ EPI ہفتہ رپورٹ Environment Information + Environment Samples Environment Tasks + Environment Sample Information تفصیل پتہ تقریب کی تاریخ @@ -384,8 +389,12 @@ نمونہ میں ترمیم کریں نیا نمونہ نمونہ پڑھیں + Read Environment Sample + Edit Environment Sample + New Environment Sample نمونہ کا خلاصہ نمونہ کی فہرست + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ ویکسینیش کی ترمیم کریں نئی ویکسینیشن مخصوص کیس تلاش کریں + Laboratory sample + Sample measurements + Location of sampling site + Sample management اوپر دائیں جانب \"+\" علامت کو دبا کر ایک نئا اندراج شامل کریں مٹا دیں برائے مہربانی ایک چار ہندسوں کا پن منتخب کریں جسے آپ جب بھی سورماس ایپ کھولیں گے تو اپنی تصدیق کے لیے استعمال کریں گے @@ -512,6 +525,7 @@ رپورٹس نمونے ماحولیات + Environment Samples امیونائزیشنز ترتیبات کام @@ -678,4 +692,5 @@ ویکسینیشن کی تاریخ دستیاب نہیں ہے ویکسین دستیاب نہیں مینوفیکچرر دستیاب نہیں ہے + Environment Name N/A diff --git a/sormas-app/app/src/main/res/values-zh-rCN/strings.xml b/sormas-app/app/src/main/res/values-zh-rCN/strings.xml index 6667908375d..7dd3dd47e47 100644 --- a/sormas-app/app/src/main/res/values-zh-rCN/strings.xml +++ b/sormas-app/app/src/main/res/values-zh-rCN/strings.xml @@ -57,6 +57,7 @@ Edit Environment Edit Event Edit Sample + Edit Environment Sample Forgot PIN? Help Install @@ -75,6 +76,7 @@ New Environment New Event New Sample + New Environment Sample New Task Not Executable OK @@ -101,6 +103,7 @@ Save Event Participant Save Prescription Save Sample + Save Environment Sample Save Task Save Treatment Save Follow-up Visit @@ -167,7 +170,9 @@ Epi Week Report Environment Information + Environment Samples Environment Tasks + Environment Sample Information Description Location Date of event @@ -384,8 +389,12 @@ Edit Sample New Sample Read Sample + Read Environment Sample + Edit Environment Sample + New Environment Sample Sample Summary Sample Listing + Environment Sample Listing Environment Listing Edit Environment New Environment @@ -439,6 +448,10 @@ Edit Vaccination New Vaccination Search specific case + Laboratory sample + Sample measurements + Location of sampling site + Sample management Add a new entry by pressing the \"+\" symbol in the top right. Clear Please choose a four-digit PIN which you will use to authenticate yourself whenever you open the SORMAS app. @@ -512,6 +525,7 @@ Reports Samples Environments + Environment Samples Immunizations Settings Tasks @@ -678,4 +692,5 @@ Vaccination Date N/A Vaccine N/A Manufacturer N/A + Environment Name N/A From 0cd26390abcc738e2f8772a3cf156abe7d74e52f Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Wed, 20 Sep 2023 12:15:37 +0200 Subject: [PATCH 113/144] HSP-6240 Sormas - Progress window for bulk archive - initial commit --- .../application/cases/CaseDirectoryPage.java | 4 +++ .../application/cases/CaseDirectorySteps.java | 22 ++++++++++++ .../features/sanity/web/Case.feature | 36 +++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java index 86636db7b00..74e7c36952c 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java @@ -112,6 +112,7 @@ public static final By getCaseResultsUuidLocator(String uuid) { public static final By BULK_ACTIONS = By.id("bulkActions-2"); public static final By BULK_ACTIONS_VALUES = By.id("bulkActions-10"); public static final By BULK_ACTIONS_ARCHIVE = By.id("bulkActions-5"); + public static final By BULK_ACTIONS_DE_ARCHIVE = By.id("bulkActions-6"); public static final By BULK_CREATE_QUARANTINE_ORDER = By.id("bulkActions-9"); public static final By CASE_REPORTING_USER_FILTER = By.cssSelector("[id='reportingUserLike']"); public static final By CASE_YEAR_FILTER = @@ -240,6 +241,9 @@ public static By getMergeDuplicatesButtonById(String uuid) { public static final By ENTER_BULK_EDIT_MODE_POPUP_HEADER = By.cssSelector( "[class='popupContent'] [class='v-window-outerheader'] div[class='v-window-header']"); + public static final By DE_ARCHIVE_EDIT_MODE_POPUP_HEADER = + By.cssSelector( + "[class='popupContent'] [class='v-window-outerheader'] div[class='v-window-header']"); public static By SHARE_OPTION_BULK_ACTION_COMBOBOX = By.xpath("//span[text()=\"\u00DCbergeben\"]"); public static By REJECT_SHARED_CASE_HEADER_DE = diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index a51084a3f8c..0bcc3617f6f 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -26,6 +26,7 @@ import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.ALL_RESULTS_CHECKBOX; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_ACTIONS; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_ACTIONS_ARCHIVE; +import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_ACTIONS_DE_ARCHIVE; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_ACTIONS_VALUES; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_CREATE_QUARANTINE_ORDER; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_EDIT_INFORMATION; @@ -84,6 +85,7 @@ import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DATE_TO_COMBOBOX; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DATE_TYPE_FILTER_COMBOBOX; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DETAILED_IMPORT_BUTTON; +import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DE_ARCHIVE_EDIT_MODE_POPUP_HEADER; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DOWNLOAD_DATA_DICTIONARY_BUTTON; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DOWNLOAD_IMPORT_GUIDE_BUTTON; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.ENTER_BULK_EDIT_MODE; @@ -369,6 +371,7 @@ public CaseDirectorySteps( When( "I click on the More button on Case directory page", () -> { + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(100); webDriverHelpers.clickOnWebElementBySelector(MORE_BUTTON); }); When( @@ -1342,6 +1345,13 @@ public CaseDirectorySteps( webDriverHelpers.clickOnWebElementBySelector(BULK_ACTIONS_ARCHIVE); }); + When( + "I click on the De-Archive bulk cases on Case Directory page", + () -> { + webDriverHelpers.clickOnWebElementBySelector(BULK_ACTIONS_DE_ARCHIVE); + TimeUnit.SECONDS.sleep(5); + }); + When( "I confirm archive bulk cases and select Archive related contacts checkbox", () -> { @@ -1548,6 +1558,18 @@ public CaseDirectorySteps( webDriverHelpers.waitForPageLoadingSpinnerToDisappear(60); }); + When( + "I check if popup message for archive is {string} in Case Directory page", + (String expectedText) -> { + webDriverHelpers.waitUntilIdentifiedElementIsPresent(POPUP_NOTIFICATION_CAPTION); + softly.assertEquals( + webDriverHelpers.getTextFromPresentWebElement(POPUP_NOTIFICATION_CAPTION), + expectedText, + "Bulk archive action went wrong"); + softly.assertAll(); + webDriverHelpers.clickOnWebElementBySelector(POPUP_NOTIFICATION_CAPTION); + }); + And( "^I check that warning message appears that no cases are selected$", () -> { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 7c0ea6b5824..00b2c46b1c7 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1869,4 +1869,40 @@ Feature: Case end to end tests And I check that a bulk progress operation window appears on Case Directory page And I wait until the bulk progress operation is done and check numbers of 41 successful and 0 skipped cases And I check that total number of cases for bulk operation is 41 + And I click on close progress operation window + + @tmsLink=HSP-6240 @env_main + Scenario: Sormas - Progress window for bulk archive + Given I log in as a Admin User + Then I click on the Cases button from navbar + And I set the Relevance Status Filter to "Active cases" on Case Directory page + And I check that Relevance Status Filter is set to "Active cases" on Case Directory page + And I click on the More button on Case directory page + And I click Enter Bulk Edit Mode on Case directory page + And I click on "Yes" option in Enter bulk edit mode window + Then I click on Bulk Actions combobox on Case Directory Page + And I click on the Archive bulk cases on Case Directory page + And I check that warning message appears that no cases are selected + And I click checkboxes to choose first 2 cases from Case Directory page + Then I click on Bulk Actions combobox on Case Directory Page + And I click on the Archive bulk cases on Case Directory page + And I click on "Yes" option in Enter bulk edit mode window + Then I check if popup message for archive is "All selected entries have been archived" in Case Directory page + And I click checkboxes to choose first 41 cases from Case Directory page + And I click on Bulk Actions combobox on Case Directory Page + And I click on the Archive bulk cases on Case Directory page + And I click on "Yes" option in Enter bulk edit mode window + And I check that a bulk progress operation window appears on Case Directory page + And I wait until the bulk progress operation is done and check numbers of 41 successful and 0 skipped cases + And I click on close progress operation window + And I set the Relevance Status Filter to "Archived cases" on Case Directory page + And I check that Relevance Status Filter is set to "Archived cases" on Case Directory page + And I click on the More button on Case directory page + And I click Enter Bulk Edit Mode on Case directory page + And I click on "Yes" option in Enter bulk edit mode window + And I click checkboxes to choose first 51 cases from Case Directory page + And I click on Bulk Actions combobox on Case Directory Page + Then I click on the De-Archive bulk cases on Case Directory page + And I fill De-Archive case popup with test automation + And I wait until the bulk progress operation is done and check numbers of 51 successful and 0 skipped cases And I click on close progress operation window \ No newline at end of file From 433a55250b4f63bd46889b4b999b6a211f042509 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Wed, 20 Sep 2023 16:21:21 +0200 Subject: [PATCH 114/144] HSP-6240 Sormas - Progress window for bulk archive - refactoring --- .../steps/web/application/cases/CaseDirectorySteps.java | 5 +++-- .../src/test/resources/features/sanity/web/Case.feature | 5 +---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index 0bcc3617f6f..7a8f2c076ab 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -85,7 +85,6 @@ import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DATE_TO_COMBOBOX; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DATE_TYPE_FILTER_COMBOBOX; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DETAILED_IMPORT_BUTTON; -import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DE_ARCHIVE_EDIT_MODE_POPUP_HEADER; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DOWNLOAD_DATA_DICTIONARY_BUTTON; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.DOWNLOAD_IMPORT_GUIDE_BUTTON; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.ENTER_BULK_EDIT_MODE; @@ -371,7 +370,7 @@ public CaseDirectorySteps( When( "I click on the More button on Case directory page", () -> { - webDriverHelpers.waitForPageLoadingSpinnerToDisappear(100); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(CASE_APPLY_FILTERS_BUTTON); webDriverHelpers.clickOnWebElementBySelector(MORE_BUTTON); }); When( @@ -402,6 +401,7 @@ public CaseDirectorySteps( When( "I click Enter Bulk Edit Mode on Case directory page", () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(ENTER_BULK_EDIT_MODE); webDriverHelpers.clickOnWebElementBySelector(ENTER_BULK_EDIT_MODE); if (webDriverHelpers.isElementVisibleWithTimeout(BULK_EDIT_INFORMATION, 10)) { webDriverHelpers.clickOnWebElementBySelector(CONFIRM_POPUP); @@ -1702,6 +1702,7 @@ public CaseDirectorySteps( "^I set the Relevance Status Filter to \"([^\"]*)\" on Case Directory page$", (String status) -> { webDriverHelpers.selectFromCombobox(RELEVANT_STATUS_COMBOBOX, status); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(200); }); } diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 00b2c46b1c7..ea73b6e3b24 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1888,7 +1888,7 @@ Feature: Case end to end tests And I click on the Archive bulk cases on Case Directory page And I click on "Yes" option in Enter bulk edit mode window Then I check if popup message for archive is "All selected entries have been archived" in Case Directory page - And I click checkboxes to choose first 41 cases from Case Directory page + And I click checkboxes to choose first 2 cases from Case Directory page And I click on Bulk Actions combobox on Case Directory Page And I click on the Archive bulk cases on Case Directory page And I click on "Yes" option in Enter bulk edit mode window @@ -1897,9 +1897,6 @@ Feature: Case end to end tests And I click on close progress operation window And I set the Relevance Status Filter to "Archived cases" on Case Directory page And I check that Relevance Status Filter is set to "Archived cases" on Case Directory page - And I click on the More button on Case directory page - And I click Enter Bulk Edit Mode on Case directory page - And I click on "Yes" option in Enter bulk edit mode window And I click checkboxes to choose first 51 cases from Case Directory page And I click on Bulk Actions combobox on Case Directory Page Then I click on the De-Archive bulk cases on Case Directory page From 6cb2ad1a27efa7b92d7d1075787591ca82b1a25a Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Wed, 20 Sep 2023 16:55:48 +0200 Subject: [PATCH 115/144] HSP-6240 Sormas - Progress window for bulk archive - refactoring 2 --- .../src/test/resources/features/sanity/web/Case.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index ea73b6e3b24..9d7457374cb 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1888,7 +1888,7 @@ Feature: Case end to end tests And I click on the Archive bulk cases on Case Directory page And I click on "Yes" option in Enter bulk edit mode window Then I check if popup message for archive is "All selected entries have been archived" in Case Directory page - And I click checkboxes to choose first 2 cases from Case Directory page + And I click checkboxes to choose first 41 cases from Case Directory page And I click on Bulk Actions combobox on Case Directory Page And I click on the Archive bulk cases on Case Directory page And I click on "Yes" option in Enter bulk edit mode window From 4b7adb551d5c06c5e7f1c8a34deade0a79f47811 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Thu, 21 Sep 2023 09:25:59 +0300 Subject: [PATCH 116/144] #11570 Add a basic export to the environment and environment sample directories --- .../src/main/java/de/symeda/sormas/ui/samples/SamplesView.java | 2 +- .../main/java/de/symeda/sormas/ui/utils/ExportEntityName.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java index 3e8db2f6b81..1f145e8cad1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java @@ -99,7 +99,7 @@ public SamplesView() { StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( sampleListComponent.getGrid(), this::getSelectedEnvironmentSamples, - ExportEntityName.ENVIRONMeNT_SAMPLES); + ExportEntityName.ENVIRONMENT_SAMPLES); FileDownloader fileDownloader = new FileDownloader(streamResource); fileDownloader.extend(exportButton); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java index b463e3f897e..1b5c73b392c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java @@ -41,7 +41,7 @@ public enum ExportEntityName { DATA_PROTECTION_DICTIONARY("entityDataProtectionDictionary", "data protection dictionary"), PERSONS("entityPersons", "persons"), ENVIRONMENTS("entityEnvironments", "environments"), - ENVIRONMeNT_SAMPLES("entityEnvironmentSamples", "environment samples"),; + ENVIRONMENT_SAMPLES("entityEnvironmentSamples", "environment samples"),; private final String languageKey; private final String defaultName; From 90e3a83992ef7f693c7e560d5e495e72fdf7815e Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Thu, 21 Sep 2023 13:19:43 +0300 Subject: [PATCH 117/144] #11570 Add a basic export to the environment and environment sample directories --- .../main/java/de/symeda/sormas/ui/utils/ExportEntityName.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java index 1b5c73b392c..318543b373e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ExportEntityName.java @@ -41,7 +41,7 @@ public enum ExportEntityName { DATA_PROTECTION_DICTIONARY("entityDataProtectionDictionary", "data protection dictionary"), PERSONS("entityPersons", "persons"), ENVIRONMENTS("entityEnvironments", "environments"), - ENVIRONMENT_SAMPLES("entityEnvironmentSamples", "environment samples"),; + ENVIRONMENT_SAMPLES("entityEnvironmentSamples", "environment samples"); private final String languageKey; private final String defaultName; From 21a0a1f673f1ae7810c5f362509ebb47ee9a1546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 21 Sep 2023 14:01:00 +0200 Subject: [PATCH 118/144] #12468 - Fixed user right check --- .../java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java index fabe3308493..173f4b47c93 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java @@ -767,7 +767,7 @@ private void pullAndRemoveObsoleteUuidsSince(Date since) throws NoConnectionExce syncCallbacks.ifPresent(c -> c.getLoadNextCallback().run()); // Environment samples - if (DtoUserRightsHelper.isViewAllowed(EnvironmentSample.class)) { + if (DtoUserRightsHelper.isViewAllowed(EnvironmentSampleDto.class)) { List sampleUuids = executeUuidCall(RetroProvider.getEnvironmentSampleFacade().pullObsoleteUuidsSince(since != null ? since.getTime() : 0)); for (String sampleUuid : sampleUuids) { @@ -885,7 +885,8 @@ private void pushNewPullMissingAndDeleteInvalidData() DatabaseHelper.getEnvironmentDao().deleteInvalid(environmentUuids, syncCallbacks); //environment samples viewAllowed = DtoUserRightsHelper.isViewAllowed(EnvironmentSampleDto.class); - List environmentSampleUuids = viewAllowed ? executeUuidCall(RetroProvider.getEnvironmentSampleFacade().pullUuids()) : new ArrayList<>(); + List environmentSampleUuids = + viewAllowed ? executeUuidCall(RetroProvider.getEnvironmentSampleFacade().pullUuids()) : new ArrayList<>(); DatabaseHelper.getEnvironmentSampleDao().deleteInvalid(environmentSampleUuids, syncCallbacks); // event participants viewAllowed = DtoUserRightsHelper.isViewAllowed(EventParticipantDto.class); From 5daae93835fde6d5ed5c175dad71129e9f8916d7 Mon Sep 17 00:00:00 2001 From: Levente Gal <62599627+leventegal-she@users.noreply.github.com> Date: Thu, 21 Sep 2023 16:19:55 +0300 Subject: [PATCH 119/144] Feature #12235 environment sample create edit (#12533) * #12235 Add an edit form for environment samples in web app --- ...tityType.java => DeletableEntityType.java} | 7 +- .../EnvironmentSampleCriteria.java | 15 + .../EnvironmentSampleDto.java | 59 ++++ .../EnvironmentSampleFacade.java | 12 + .../EnvironmentSampleIndexDto.java | 22 +- .../EnvironmentSampleReferenceDto.java | 2 +- .../feature/FeatureConfigurationFacade.java | 6 +- .../sormas/api/feature/FeatureType.java | 20 +- .../de/symeda/sormas/api/i18n/Captions.java | 2 + .../de/symeda/sormas/api/i18n/Strings.java | 7 + .../sormas/api/utils/DtoCopyHelper.java | 157 +++++++++ .../src/main/resources/captions.properties | 4 +- .../src/main/resources/strings.properties | 9 +- .../backend/campaign/CampaignFacadeEjb.java | 6 +- .../backend/campaign/CampaignService.java | 3 +- .../data/CampaignFormDataFacadeEjb.java | 3 +- .../sormas/backend/caze/CaseFacadeEjb.java | 33 +- .../sormas/backend/caze/CaseService.java | 13 +- .../common/AbstractCoreAdoService.java | 5 +- .../backend/common/AbstractCoreFacadeEjb.java | 75 +--- .../common/AbstractDeletableAdoService.java | 100 +++++- .../sormas/backend/common/CronService.java | 34 +- .../backend/contact/ContactFacadeEjb.java | 19 +- .../backend/contact/ContactService.java | 13 +- .../CoreEntityDeletionService.java | 42 +-- .../DeletionConfiguration.java | 20 +- .../DeletionConfigurationService.java | 34 +- .../environment/EnvironmentFacadeEjb.java | 4 +- .../environment/EnvironmentService.java | 3 +- .../environmentsample/EnvironmentSample.java | 3 + .../EnvironmentSampleFacadeEjb.java | 41 ++- .../EnvironmentSampleService.java | 14 +- .../sormas/backend/event/EventFacadeEjb.java | 17 +- .../event/EventParticipantFacadeEjb.java | 6 +- .../event/EventParticipantService.java | 3 +- .../sormas/backend/event/EventService.java | 12 +- .../backend/feature/FeatureConfiguration.java | 10 +- .../FeatureConfigurationFacadeEjb.java | 10 +- .../feature/FeatureConfigurationService.java | 6 +- .../DirectoryImmunizationService.java | 3 +- .../immunization/ImmunizationFacadeEjb.java | 16 +- .../immunization/ImmunizationService.java | 13 +- .../AbstractInfrastructureFacadeEjb.java | 4 +- .../backend/person/PersonFacadeEjb.java | 11 +- .../backend/sample/PathogenTestService.java | 3 +- .../backend/sample/SampleFacadeEjb.java | 7 +- .../sormas/backend/sample/SampleService.java | 3 +- .../travelentry/TravelEntryFacadeEjb.java | 18 +- .../services/BaseTravelEntryService.java | 15 +- .../symeda/sormas/backend/util/DtoHelper.java | 133 ------- .../vaccination/VaccinationFacadeEjb.java | 5 +- .../sormas/backend/AbstractBeanTest.java | 20 +- .../CoreEntityDeletionServiceTest.java | 43 +-- ...lSurveillanceToolGatewayFacadeEjbTest.java | 4 +- .../FeatureConfigurationFacadeEjbTest.java | 8 +- .../backend/symptoms/SymptomsServiceTest.java | 4 +- .../sormas/backend/util/DtoHelperTest.java | 27 +- .../symeda/sormas/ui/ControllerProvider.java | 5 +- .../symeda/sormas/ui/caze/CasePersonView.java | 4 +- .../de/symeda/sormas/ui/caze/CasesView.java | 6 +- .../sormas/ui/contact/ContactPersonView.java | 10 +- .../sormas/ui/contact/ContactsView.java | 10 +- .../ui/environment/EnvironmentController.java | 1 - .../ui/environment/EnvironmentDataView.java | 10 +- .../EnvironmentSampleListComponent.java | 202 +++++++++++ .../ui/events/EventParticipantPersonView.java | 4 +- .../ui/events/EventParticipantsView.java | 7 +- .../symeda/sormas/ui/events/EventsView.java | 10 +- .../labmessage/LabMessageProcessingFlow.java | 8 +- .../labmessage/RelatedLabMessageHandler.java | 2 +- .../ExternalMessageProcessingUIHelper.java | 8 +- .../immunization/ImmunizationPersonView.java | 4 +- .../ui/immunization/ImmunizationsView.java | 10 +- .../sormas/ui/location/LocationEditForm.java | 7 + .../person/PersonSideComponentsElement.java | 20 +- .../sormas/ui/samples/AbstractSampleView.java | 1 + .../samples/EnvironmentSampleController.java | 70 ---- .../sormas/ui/samples/SampleCreateForm.java | 35 -- .../ui/samples/SampleGridComponent.java | 10 +- .../symeda/sormas/ui/samples/SamplesView.java | 3 + .../EnvironmentSampleController.java | 183 ++++++++++ .../EnvironmentSampleDataView.java | 112 ++++++ .../EnvironmentSampleEditForm.java | 324 ++++++++++++++++++ .../EnvironmentSampleGrid.java | 11 +- .../EnvironmentSampleGridComponent.java | 4 +- .../EnvironmentSampleGridFilterForm.java | 2 +- .../{ => humansample}/HumanSampleGrid.java | 13 +- .../HumanSampleGridComponent.java | 16 +- .../{ => humansample}/SampleController.java | 19 +- .../samples/humansample/SampleCreateForm.java | 51 +++ .../{ => humansample}/SampleDataView.java | 6 +- .../{ => humansample}/SampleEditForm.java | 12 +- .../SampleEditPathogenTestListHandler.java | 2 +- .../SampleGridFilterForm.java | 19 +- .../SampleSelectionField.java | 17 +- .../SampleSelectionGrid.java | 17 +- .../ui/travelentry/TravelEntriesView.java | 10 +- .../ui/travelentry/TravelEntryPersonView.java | 4 +- .../utils/CommitDiscardWrapperComponent.java | 16 +- .../de/symeda/sormas/ui/utils/CssStyles.java | 1 + .../components/NotBlankTextValidator.java | 11 +- .../sormas/backend/AbstractBeanTest.java | 20 +- .../LabMessageUiHelperUnitTest.java | 2 +- .../ui/samples/SampleControllerTest.java | 1 + 104 files changed, 1826 insertions(+), 682 deletions(-) rename sormas-api/src/main/java/de/symeda/sormas/api/common/{CoreEntityType.java => DeletableEntityType.java} (90%) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/utils/DtoCopyHelper.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentSampleListComponent.java delete mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java delete mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleCreateForm.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => environmentsample}/EnvironmentSampleGrid.java (93%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => environmentsample}/EnvironmentSampleGridComponent.java (98%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => environmentsample}/EnvironmentSampleGridFilterForm.java (99%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/HumanSampleGrid.java (97%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/HumanSampleGridComponent.java (97%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/SampleController.java (97%) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleCreateForm.java rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/SampleDataView.java (97%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/SampleEditForm.java (94%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/SampleEditPathogenTestListHandler.java (96%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/SampleGridFilterForm.java (90%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/SampleSelectionField.java (88%) rename sormas-ui/src/main/java/de/symeda/sormas/ui/samples/{ => humansample}/SampleSelectionGrid.java (71%) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/CoreEntityType.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/DeletableEntityType.java similarity index 90% rename from sormas-api/src/main/java/de/symeda/sormas/api/common/CoreEntityType.java rename to sormas-api/src/main/java/de/symeda/sormas/api/common/DeletableEntityType.java index 1643f3fa83f..29df40b50dd 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/common/CoreEntityType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/DeletableEntityType.java @@ -15,7 +15,7 @@ package de.symeda.sormas.api.common; -public enum CoreEntityType { +public enum DeletableEntityType { //ENTITY LIST CASE, @@ -25,5 +25,8 @@ public enum CoreEntityType { IMMUNIZATION, TRAVEL_ENTRY, CAMPAIGN, - ENVIRONMENT; + SAMPLE, + PATHOGEN_TEST, + ENVIRONMENT, + ENVIRONMENT_SAMPLE; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java index 0bb468ae04b..1bbd40ce12f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleCriteria.java @@ -19,6 +19,7 @@ import java.util.Date; import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.environment.EnvironmentReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; @@ -54,6 +55,7 @@ public class EnvironmentSampleCriteria extends BaseCriteria implements Serializa private DateFilterOption dateFilterOption = DateFilterOption.DATE; private Date reportDateFrom; private Date reportDateTo; + private EnvironmentReferenceDto environment; public EnvironmentSampleCriteria() { super(); @@ -184,4 +186,17 @@ public void reportDateBetween(Date reportDateFrom, Date reportDateTo, DateFilter this.reportDateTo = reportDateTo; this.dateFilterOption = dateFilterOption; } + + public EnvironmentReferenceDto getEnvironment() { + return environment; + } + + public void setEnvironment(EnvironmentReferenceDto environment) { + this.environment = environment; + } + + public EnvironmentSampleCriteria withEnvironment(EnvironmentReferenceDto environment) { + this.environment = environment; + return this; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java index 68feb319912..2616e85b00a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java @@ -25,6 +25,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.environment.EnvironmentReferenceDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Validations; @@ -48,6 +49,36 @@ public class EnvironmentSampleDto extends PseudonymizableDto { public static final long APPROXIMATE_JSON_SIZE_IN_BYTES = 2000; + public static final String I18N_PREFIX = "EnvironmentSample"; + + public static final String ENVIRONMENT = "environment"; + public static final String SAMPLE_DATE_TIME = "sampleDateTime"; + public static final String SAMPLE_MATERIAL = "sampleMaterial"; + public static final String OTHER_SAMPLE_MATERIAL = "otherSampleMaterial"; + public static final String SAMPLE_VOLUME = "sampleVolume"; + public static final String FIELD_SAMPLE_ID = "fieldSampleId"; + public static final String TURBIDITY = "turbidity"; + public static final String PH_VALUE = "phValue"; + public static final String SAMPLE_TEMPERATURE = "sampleTemperature"; + public static final String CHLORINE_RESIDUALS = "chlorineResiduals"; + public static final String LABORATORY = "laboratory"; + public static final String LABORATORY_DETAILS = "laboratoryDetails"; + public static final String REQUESTED_PATHOGEN_TESTS = "requestedPathogenTests"; + public static final String OTHER_REQUESTED_PATHOGEN_TESTS = "otherRequestedPathogenTests"; + public static final String WEATHER_CONDITIONS = "weatherConditions"; + public static final String HEAVY_RAIN = "heavyRain"; + public static final String DISPATCHED = "dispatched"; + public static final String DISPATCH_DATE = "dispatchDate"; + public static final String DISPATCH_DETAILS = "dispatchDetails"; + public static final String RECEIVED = "received"; + public static final String RECEIVAL_DATE = "receivalDate"; + public static final String LAB_SAMPLE_ID = "labSampleId"; + public static final String SPECIMEN_CONDITION = "specimenCondition"; + public static final String LOCATION = "location"; + public static final String GENERAL_COMMENT = "generalComment"; + public static final String DELETION_REASON = "deletionReason"; + public static final String OTHER_DELETION_REASON = "otherDeletionReason"; + @NotNull private EnvironmentReferenceDto environment; @NotNull @@ -104,6 +135,10 @@ public class EnvironmentSampleDto extends PseudonymizableDto { @SensitiveData @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) private String generalComment; + private boolean deleted; + private DeletionReason deletionReason; + @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) + private String otherDeletionReason; public static EnvironmentSampleDto build(EnvironmentReferenceDto environment, UserReferenceDto reportingUser) { EnvironmentSampleDto sample = new EnvironmentSampleDto(); @@ -333,4 +368,28 @@ public String getGeneralComment() { public void setGeneralComment(String generalComment) { this.generalComment = generalComment; } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public DeletionReason getDeletionReason() { + return deletionReason; + } + + public void setDeletionReason(DeletionReason deletionReason) { + this.deletionReason = deletionReason; + } + + public String getOtherDeletionReason() { + return otherDeletionReason; + } + + public void setOtherDeletionReason(String otherDeletionReason) { + this.otherDeletionReason = otherDeletionReason; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleFacade.java index 6da13f446e7..245f211c37c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleFacade.java @@ -19,8 +19,20 @@ import de.symeda.sormas.api.BaseFacade; import de.symeda.sormas.api.DeletableFacade; +import de.symeda.sormas.api.EditPermissionType; +import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; @Remote public interface EnvironmentSampleFacade extends BaseFacade, DeletableFacade { + + boolean exists(String uuid); + + boolean isEditAllowed(String uuid); + + EditPermissionType getEditPermissionType(String sampleUuid); + + DeletionInfoDto getAutomaticDeletionInfo(String sampleUuid); + + DeletionInfoDto getManuallyDeletionInfo(String sampleUuid); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java index 4b58b9d77ae..78f6c2cf80a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java @@ -19,7 +19,9 @@ import java.util.Date; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.infrastructure.facility.FacilityHelper; import de.symeda.sormas.api.location.LocationDto; +import de.symeda.sormas.api.sample.SpecimenCondition; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; @@ -59,8 +61,10 @@ public class EnvironmentSampleIndexDto extends PseudonymizableIndexDto implement private boolean dispatched; private Date dispatchDate; private boolean received; + private Date receivalDate; @SensitiveData private String laboratory; + private SpecimenCondition specimenCondition; private EnvironmentSampleMaterial sampleMaterial; @PersonalData private String otherSampleMaterial; @@ -84,7 +88,11 @@ public EnvironmentSampleIndexDto( boolean dispatched, Date dispatchDate, boolean received, - String laboratory, + Date receivalDate, + String laboratoryUuid, + String laboratoryName, + String laboratoryDetails, + SpecimenCondition specimenCondition, EnvironmentSampleMaterial sampleMaterial, String otherSampleMaterial, DeletionReason deletionReason, @@ -99,7 +107,9 @@ public EnvironmentSampleIndexDto( this.dispatched = dispatched; this.dispatchDate = dispatchDate; this.received = received; - this.laboratory = laboratory; + this.receivalDate = receivalDate; + this.laboratory = FacilityHelper.buildFacilityString(laboratoryUuid, laboratoryName, laboratoryDetails); + this.specimenCondition = specimenCondition; this.sampleMaterial = sampleMaterial; this.otherSampleMaterial = otherSampleMaterial; this.deletionReason = deletionReason; @@ -139,10 +149,18 @@ public boolean isReceived() { return received; } + public Date getReceivalDate() { + return receivalDate; + } + public String getLaboratory() { return laboratory; } + public SpecimenCondition getSpecimenCondition() { + return specimenCondition; + } + public EnvironmentSampleMaterial getSampleMaterial() { return sampleMaterial; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java index c838832244d..6ba85e3168a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java @@ -34,7 +34,7 @@ public EnvironmentSampleReferenceDto(String uuid, EnvironmentSampleMaterial samp super(uuid, buildCaption(sampleMaterial, environmentUuid)); } - private static String buildCaption(EnvironmentSampleMaterial sampleMaterial, String environmentUuid) { + public static String buildCaption(EnvironmentSampleMaterial sampleMaterial, String environmentUuid) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(DataHelper.toStringNullable(sampleMaterial)); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationFacade.java index 9203e9550b0..c6c829c5c4a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationFacade.java @@ -25,7 +25,7 @@ import javax.validation.constraints.NotNull; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.task.TaskType; import de.symeda.sormas.api.utils.SortProperty; @@ -67,9 +67,9 @@ Page getIndexPage( boolean areAllFeatureEnabled(FeatureType... featureType); - boolean isFeatureEnabled(FeatureType featureType, CoreEntityType entityType); + boolean isFeatureEnabled(FeatureType featureType, DeletableEntityType entityType); - T getProperty(FeatureType featureType, CoreEntityType entityType, FeatureTypeProperty property, Class returnType); + T getProperty(FeatureType featureType, DeletableEntityType entityType, FeatureTypeProperty property, Class returnType); /** * Checks whether the property of the specified feature type in the database equals to true. diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java index 20867fb9bd6..a0ed82c85c3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java @@ -14,12 +14,12 @@ */ package de.symeda.sormas.api.feature; -import static de.symeda.sormas.api.common.CoreEntityType.CASE; -import static de.symeda.sormas.api.common.CoreEntityType.CONTACT; -import static de.symeda.sormas.api.common.CoreEntityType.EVENT; -import static de.symeda.sormas.api.common.CoreEntityType.EVENT_PARTICIPANT; -import static de.symeda.sormas.api.common.CoreEntityType.IMMUNIZATION; -import static de.symeda.sormas.api.common.CoreEntityType.TRAVEL_ENTRY; +import static de.symeda.sormas.api.common.DeletableEntityType.CASE; +import static de.symeda.sormas.api.common.DeletableEntityType.CONTACT; +import static de.symeda.sormas.api.common.DeletableEntityType.EVENT; +import static de.symeda.sormas.api.common.DeletableEntityType.EVENT_PARTICIPANT; +import static de.symeda.sormas.api.common.DeletableEntityType.IMMUNIZATION; +import static de.symeda.sormas.api.common.DeletableEntityType.TRAVEL_ENTRY; import java.util.ArrayList; import java.util.Arrays; @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableMap; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.i18n.I18nProperties; /** @@ -345,14 +345,14 @@ public enum FeatureType { private final boolean enabledDefault; private final FeatureType[] dependentFeatures; - private final List entityTypes; + private final List entityTypes; private final Map supportedPropertyDefaults; FeatureType( boolean serverFeature, boolean enabledDefault, FeatureType[] dependentFeatures, - List entityTypes, + List entityTypes, Map supportedPropertyDefaults) { this.serverFeature = serverFeature; this.enabledDefault = enabledDefault; @@ -401,7 +401,7 @@ public Set getSupportedProperties() { return supportedPropertyDefaults.keySet(); } - public List getEntityTypes() { + public List getEntityTypes() { return entityTypes; } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index f17cb0fd902..05a0de13e19 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -1066,6 +1066,7 @@ public interface Captions { String environmentDeletedEnvironments = "environmentDeletedEnvironments"; String environmentEnvironmentsList = "environmentEnvironmentsList"; String environmentNewEnvironment = "environmentNewEnvironment"; + String EnvironmentSample = "EnvironmentSample"; String EnvironmentSample_chlorineResiduals = "EnvironmentSample.chlorineResiduals"; String EnvironmentSample_dispatchDate = "EnvironmentSample.dispatchDate"; String EnvironmentSample_dispatchDetails = "EnvironmentSample.dispatchDetails"; @@ -1099,6 +1100,7 @@ public interface Captions { String environmentSampleAllActiveAndArchivedSamples = "environmentSampleAllActiveAndArchivedSamples"; String environmentSampleArchivedSamples = "environmentSampleArchivedSamples"; String environmentSampleDeletedSamples = "environmentSampleDeletedSamples"; + String environmentSampleNewSample = "environmentSampleNewSample"; String environmentSampleNotShipped = "environmentSampleNotShipped"; String environmentSampleReceived = "environmentSampleReceived"; String environmentSampleShipped = "environmentSampleShipped"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 825c4410399..47f02bfb397 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -562,6 +562,10 @@ public interface Strings { String headingEntitiesNotSent = "headingEntitiesNotSent"; String headingEnvironmentalExposure = "headingEnvironmentalExposure"; String headingEnvironmentJurisdictionUpdated = "headingEnvironmentJurisdictionUpdated"; + String headingEnvironmentSampleLocation = "headingEnvironmentSampleLocation"; + String headingEnvironmentSampleManagement = "headingEnvironmentSampleManagement"; + String headingEnvironmentSampleMeasurements = "headingEnvironmentSampleMeasurements"; + String headingEnvironmentSampleRequestedPathogenTests = "headingEnvironmentSampleRequestedPathogenTests"; String headingEnvironmentSamplesDeleted = "headingEnvironmentSamplesDeleted"; String headingEnvironmentSamplesNotDeleted = "headingEnvironmentSamplesNotDeleted"; String headingEnvironmentSamplesNotRestored = "headingEnvironmentSamplesNotRestored"; @@ -646,6 +650,7 @@ public interface Strings { String headingIntroduction = "headingIntroduction"; String headingInvalidDateEntered = "headingInvalidDateEntered"; String headingLabMessageCorrectionThrough = "headingLabMessageCorrectionThrough"; + String headingLaboratoryEnvironmentSample = "headingLaboratoryEnvironmentSample"; String headingLaboratorySample = "headingLaboratorySample"; String headingLastReportedDistrict = "headingLastReportedDistrict"; String headingLineListing = "headingLineListing"; @@ -950,6 +955,7 @@ public interface Strings { String infoNoAdditionalTests = "infoNoAdditionalTests"; String infoNoCasesFoundStatistics = "infoNoCasesFoundStatistics"; String infoNoDiseaseSelected = "infoNoDiseaseSelected"; + String infoNoEnvironmentSamples = "infoNoEnvironmentSamples"; String infoNoEventGroups = "infoNoEventGroups"; String infoNoNetworkDiagram = "infoNoNetworkDiagram"; String infoNoPathogenTests = "infoNoPathogenTests"; @@ -1223,6 +1229,7 @@ public interface Strings { String messageEnvironmentDearchived = "messageEnvironmentDearchived"; String messageEnvironmentJurisdictionUpdated = "messageEnvironmentJurisdictionUpdated"; String messageEnvironmentSampleOutsideJurisdictionDeletionDenied = "messageEnvironmentSampleOutsideJurisdictionDeletionDenied"; + String messageEnvironmentSampleSaved = "messageEnvironmentSampleSaved"; String messageEnvironmentSamplesDeleted = "messageEnvironmentSamplesDeleted"; String messageEnvironmentSamplesRestored = "messageEnvironmentSamplesRestored"; String messageEnvironmentSaved = "messageEnvironmentSaved"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/DtoCopyHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DtoCopyHelper.java new file mode 100644 index 00000000000..306466c7350 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DtoCopyHelper.java @@ -0,0 +1,157 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.api.utils; + +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.common.collect.Maps; + +import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.ReferenceDto; + +public final class DtoCopyHelper { + + private DtoCopyHelper() { + } + + public static T copyDtoValues(T target, T source, boolean overrideValues) { + return DtoCopyHelper.copyDtoValues(target, source, overrideValues, null); + } + + /** + * @param overrideValues + * Note: Existing references are NOT overridden + */ + @SuppressWarnings({ + "unchecked", + "rawtypes" }) + public static T copyDtoValues(T target, T source, boolean overrideValues, String... skippedFields) { + + try { + PropertyDescriptor[] pds = Introspector.getBeanInfo(target.getClass(), EntityDto.class).getPropertyDescriptors(); + + for (PropertyDescriptor pd : pds) { + // Skip properties without a read or write method + if (pd.getReadMethod() == null || pd.getWriteMethod() == null || pd.getWriteMethod().isAnnotationPresent(JsonIgnore.class)) { + continue; + } + + Object targetValue = pd.getReadMethod().invoke(target); + Object sourceValue = pd.getReadMethod().invoke(source); + + if (sourceValue == null) { + continue; + } + + if (skippedFields == null || Arrays.stream(skippedFields).noneMatch(field -> field.equals(pd.getName()))) { + if (EntityDto.class.isAssignableFrom(pd.getPropertyType())) { + + if (targetValue == null) { + targetValue = sourceValue.getClass().newInstance(); + pd.getWriteMethod().invoke(target, targetValue); + } + + // If both entities have the same UUID, assign a new one to targetValue to create a new entity + if (DataHelper.equal(((EntityDto) targetValue).getUuid(), (((EntityDto) sourceValue).getUuid()))) { + ((EntityDto) targetValue).setUuid(DataHelper.createUuid()); + } + + // entity: just fill the existing one with the source + DtoCopyHelper.copyDtoValues((EntityDto) targetValue, (EntityDto) sourceValue, overrideValues); + } else { + boolean override = overrideValues && !ReferenceDto.class.isAssignableFrom(pd.getPropertyType()); + // should we write into the target property? + if (Collection.class.isAssignableFrom(pd.getPropertyType())) { + + if (targetValue == null) { + targetValue = sourceValue.getClass().newInstance(); + pd.getWriteMethod().invoke(target, targetValue); + } + + Collection targetCollection = (Collection) targetValue; + + for (Object sourceEntry : (Collection) sourceValue) { + if (sourceEntry instanceof EntityDto) { + EntityDto newEntry = ((EntityDto) sourceEntry).clone(); + newEntry.setUuid(DataHelper.createUuid()); + newEntry.setCreationDate(null); + copyDtoValues(newEntry, (EntityDto) sourceEntry, true); + targetCollection.add(newEntry); + } else if (DataHelper.isValueType(sourceEntry.getClass()) + || sourceEntry instanceof ReferenceDto + || sourceEntry instanceof JsonDataEntry) { + targetCollection.add(sourceEntry); + } else { + throw new UnsupportedOperationException( + pd.getPropertyType().getName() + " is not supported as a list entry type."); + } + } + } else if (Map.class.isAssignableFrom(pd.getPropertyType())) { + + if (targetValue == null) { + if (sourceValue.getClass() == EnumMap.class) { + // Enum map needs to be initialized with the content of the source map because it does not have an init method + targetValue = Maps.newEnumMap((EnumMap) sourceValue); + ((EnumMap) targetValue).clear(); + } else { + targetValue = sourceValue.getClass().newInstance(); + } + pd.getWriteMethod().invoke(target, targetValue); + } + + Map targetMap = (Map) targetValue; + + for (Object sourceKey : ((Map) sourceValue).keySet()) { + if (override || !targetMap.containsKey(sourceKey)) { + targetMap.put(sourceKey, ((Map) sourceValue).get(sourceKey)); + } + } + } else if (targetValue == null + || override + || (pd.getPropertyType().equals(String.class) + && StringUtils.isBlank((String) targetValue) + && StringUtils.isNotBlank((String) sourceValue)) + || (pd.getPropertyType().equals(boolean.class) && ((boolean) sourceValue) && !((boolean) targetValue))) { + if (DataHelper.isValueType(pd.getPropertyType()) || ReferenceDto.class.isAssignableFrom(pd.getPropertyType())) { + pd.getWriteMethod().invoke(target, sourceValue); + } else { + // Other objects are not supported + throw new UnsupportedOperationException(pd.getPropertyType().getName() + " is not supported as a property type."); + } + } + } + } + } + } catch (IntrospectionException + | InvocationTargetException + | IllegalAccessException + | CloneNotSupportedException + | InstantiationException e) { + throw new RuntimeException("Exception when trying to fill dto: " + e.getMessage(), e.getCause()); + } + return target; + } +} diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 744af567200..d01e62759fc 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2872,4 +2873,5 @@ environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 65be9dae5a7..f16ae41be30 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation! infoBulkProcessCancelled = Bulk process has been cancelled!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java index 5b802c3dbcd..70e9940a5b4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java @@ -35,7 +35,7 @@ import de.symeda.sormas.api.campaign.CampaignReferenceDto; import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement; import de.symeda.sormas.api.campaign.form.CampaignFormMetaReferenceDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; @@ -404,8 +404,8 @@ public static CampaignReferenceDto toReferenceDto(Campaign entity) { } @Override - protected CoreEntityType getCoreEntityType() { - return CoreEntityType.CAMPAIGN; + protected DeletableEntityType getDeletableEntityType() { + return DeletableEntityType.CAMPAIGN; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java index 25e74731a41..02bf9505bbf 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java @@ -12,6 +12,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.campaign.CampaignCriteria; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.common.AbstractDomainObject; @@ -22,7 +23,7 @@ public class CampaignService extends AbstractCoreAdoService { public CampaignService() { - super(Campaign.class); + super(Campaign.class, DeletableEntityType.CAMPAIGN); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormDataFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormDataFacadeEjb.java index 040db66fc8a..5f5b23027ba 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormDataFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormDataFacadeEjb.java @@ -67,6 +67,7 @@ import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.AccessDeniedException; +import de.symeda.sormas.api.utils.DtoCopyHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.backend.campaign.Campaign; @@ -756,7 +757,7 @@ public long count(CampaignFormDataCriteria criteria) { @Override public void overwriteCampaignFormData(CampaignFormDataDto existingData, CampaignFormDataDto newData) { - DtoHelper.copyDtoValues(existingData, newData, true); + DtoCopyHelper.copyDtoValues(existingData, newData, true); saveCampaignFormData(existingData); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 2f1c3277075..3d7142e94c8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -127,7 +127,7 @@ import de.symeda.sormas.api.clinicalcourse.ClinicalVisitCriteria; import de.symeda.sormas.api.clinicalcourse.ClinicalVisitDto; import de.symeda.sormas.api.clinicalcourse.HealthConditionsDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; @@ -137,7 +137,6 @@ import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.customizableenum.CustomizableEnumType; -import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.document.DocumentRelatedEntityType; import de.symeda.sormas.api.epidata.EpiDataDto; @@ -208,6 +207,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.DtoCopyHelper; import de.symeda.sormas.api.utils.InfoProvider; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -3404,8 +3404,8 @@ private Map cleanupReinfectionDetails(Map { private DistrictService districtService; public CaseService() { - super(Case.class); + super(Case.class, DeletableEntityType.CASE); } /** @@ -2298,4 +2300,13 @@ private void selectIndexDtoFields(CaseQueryContext caseQueryContext) { protected boolean hasLimitedChangeDateFilterImplementation() { return true; } + + @Override + protected String getDeleteReferenceField(DeletionReference deletionReference) { + if (deletionReference == DeletionReference.REPORT) { + return Case.REPORT_DATE; + } + + return super.getDeleteReferenceField(deletionReference); + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 64866b0ee12..a978c9805fd 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -39,6 +39,7 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.util.IterableHelper; @@ -50,8 +51,8 @@ public abstract class AbstractCoreAdoService elementClass) { - super(elementClass); + protected AbstractCoreAdoService(Class elementClass, DeletableEntityType entityType) { + super(elementClass, entityType); } /** diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index 4844f846fcc..b710495d202 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -24,10 +24,6 @@ import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.inject.Inject; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -35,7 +31,7 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.EntityDto; import de.symeda.sormas.api.ReferenceDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.progress.ProcessedEntity; @@ -44,7 +40,6 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.utils.AccessDeniedException; -import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.criteria.BaseCriteria; import de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration; import de.symeda.sormas.backend.deletionconfiguration.DeletionConfigurationService; @@ -102,7 +97,7 @@ public void delete(String uuid, DeletionDetails deletionDetails) { public void restore(String uuid) { ADO ado = service.getByUuid(uuid); if (ado == null) { - throw new IllegalArgumentException("Cannot restore non existing entity: [" + getCoreEntityType() + "] - " + uuid); + throw new IllegalArgumentException("Cannot restore non existing entity: [" + getDeletableEntityType() + "] - " + uuid); } service.restore(ado); } @@ -116,24 +111,7 @@ public boolean isDeleted(String uuid) { } public List getUuidsForAutomaticDeletion(DeletionConfiguration entityConfig) { - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(String.class); - Root from = cq.from(adoClass); - - Date referenceDeletionDate = DateHelper.subtractDays(new Date(), entityConfig.getDeletionPeriod()); - - Predicate filter = cb.lessThanOrEqualTo(from.get(getDeleteReferenceField(entityConfig.getDeletionReference())), referenceDeletionDate); - if (entityConfig.getDeletionReference() == DeletionReference.MANUAL_DELETION) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(DeletableAdo.DELETED))); - } - cq.where(filter); - - cq.select(from.get(DeletableAdo.UUID)); - cq.distinct(true); - - List toDeleteUuids = em.createQuery(cq).getResultList(); - return toDeleteUuids; + return service.getUuidsForAutomaticDeletion(entityConfig); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) @@ -151,36 +129,12 @@ public void doAutomaticDeletion(List toDeleteUuids, boolean deletePerman @Override public DeletionInfoDto getAutomaticDeletionInfo(String uuid) { - - DeletionConfiguration deletionConfiguration = deletionConfigurationService.getCoreEntityTypeConfig(getCoreEntityType()); - - if (deletionConfiguration == null - || deletionConfiguration.getDeletionPeriod() == null - || deletionConfiguration.getDeletionReference() == null) { - return null; - } - - Date referenceDate = getDeletionReferenceDate(uuid, deletionConfiguration); - Date deletiondate = DateHelper.addDays(referenceDate, deletionConfiguration.getDeletionPeriod()); - String deletionReferenceField = getDeleteReferenceField(deletionConfiguration.getDeletionReference()); - return new DeletionInfoDto(deletiondate, referenceDate, deletionConfiguration.getDeletionPeriod(), deletionReferenceField); + return service.getAutomaticDeletionInfo(uuid); } @Override public DeletionInfoDto getManuallyDeletionInfo(String uuid) { - - DeletionConfiguration deletionConfiguration = deletionConfigurationService.getCoreEntityTypeManualDeletionConfig(getCoreEntityType()); - - if (deletionConfiguration == null - || deletionConfiguration.getDeletionPeriod() == null - || deletionConfiguration.getDeletionReference() == null) { - return null; - } - - Date referenceDate = getDeletionReferenceDate(uuid, deletionConfiguration); - Date deletiondate = DateHelper.addDays(referenceDate, deletionConfiguration.getDeletionPeriod()); - String deletionReferenceField = getDeleteReferenceField(deletionConfiguration.getDeletionReference()); - return new DeletionInfoDto(deletiondate, referenceDate, deletionConfiguration.getDeletionPeriod(), deletionReferenceField); + return service.getManuallyDeletionInfo(uuid); } protected String getDeleteReferenceField(DeletionReference deletionReference) { @@ -197,24 +151,7 @@ protected String getDeleteReferenceField(DeletionReference deletionReference) { } } - private Date getDeletionReferenceDate(String uuid, DeletionConfiguration entityConfig) { - - if (entityConfig.getDeletionReference() == null) { - return null; - } - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Object[].class); - Root from = cq.from(adoClass); - - cq.select(from.get(getDeleteReferenceField(entityConfig.getDeletionReference()))); - cq.where(cb.equal(from.get(AbstractDomainObject.UUID), uuid)); - - Object result = em.createQuery(cq).getSingleResult(); - return (Date) result; - } - - protected abstract CoreEntityType getCoreEntityType(); + protected abstract DeletableEntityType getDeletableEntityType(); @DenyAll public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDeletableAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDeletableAdoService.java index b48aa63e234..a327ad99325 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDeletableAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDeletableAdoService.java @@ -1,7 +1,10 @@ package de.symeda.sormas.backend.common; import java.sql.Timestamp; +import java.util.Date; +import java.util.List; +import javax.ejb.EJB; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; @@ -9,12 +12,23 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; +import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; +import de.symeda.sormas.api.deletionconfiguration.DeletionReference; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration; +import de.symeda.sormas.backend.deletionconfiguration.DeletionConfigurationService; public abstract class AbstractDeletableAdoService extends AdoServiceWithUserFilterAndJurisdiction { - public AbstractDeletableAdoService(Class elementClass) { + private DeletableEntityType entityType; + @EJB + private DeletionConfigurationService deletionConfigurationService; + + public AbstractDeletableAdoService(Class elementClass, DeletableEntityType entityType) { super(elementClass); + this.entityType = entityType; } public void delete(ADO ado, DeletionDetails deletionDetails) { @@ -53,4 +67,88 @@ protected Predicate changeDateFilter(CriteriaBuilder cb, Timestamp date, Fro } return CriteriaBuilderHelper.greaterThanAndNotNull(cb, parent.get(AbstractDomainObject.CHANGE_DATE), date); } + + public DeletionInfoDto getAutomaticDeletionInfo(String uuid) { + DeletionConfiguration deletionConfiguration = deletionConfigurationService.getEntityTypeConfig(entityType); + + if (deletionConfiguration == null + || deletionConfiguration.getDeletionPeriod() == null + || deletionConfiguration.getDeletionReference() == null) { + return null; + } + + Date referenceDate = getDeletionReferenceDate(uuid, deletionConfiguration); + Date deletiondate = DateHelper.addDays(referenceDate, deletionConfiguration.getDeletionPeriod()); + String deletionReferenceField = getDeleteReferenceField(deletionConfiguration.getDeletionReference()); + return new DeletionInfoDto(deletiondate, referenceDate, deletionConfiguration.getDeletionPeriod(), deletionReferenceField); + } + + public DeletionInfoDto getManuallyDeletionInfo(String uuid) { + + DeletionConfiguration deletionConfiguration = deletionConfigurationService.getEntityTypeManualDeletionConfig(entityType); + + if (deletionConfiguration == null + || deletionConfiguration.getDeletionPeriod() == null + || deletionConfiguration.getDeletionReference() == null) { + return null; + } + + Date referenceDate = getDeletionReferenceDate(uuid, deletionConfiguration); + Date deletiondate = DateHelper.addDays(referenceDate, deletionConfiguration.getDeletionPeriod()); + String deletionReferenceField = getDeleteReferenceField(deletionConfiguration.getDeletionReference()); + return new DeletionInfoDto(deletiondate, referenceDate, deletionConfiguration.getDeletionPeriod(), deletionReferenceField); + } + + public List getUuidsForAutomaticDeletion(DeletionConfiguration entityConfig) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(String.class); + Root from = cq.from(getElementClass()); + + Date referenceDeletionDate = DateHelper.subtractDays(new Date(), entityConfig.getDeletionPeriod()); + + Predicate filter = cb.lessThanOrEqualTo(from.get(getDeleteReferenceField(entityConfig.getDeletionReference())), referenceDeletionDate); + if (entityConfig.getDeletionReference() == DeletionReference.MANUAL_DELETION) { + filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(DeletableAdo.DELETED))); + } + cq.where(filter); + + cq.select(from.get(DeletableAdo.UUID)); + cq.distinct(true); + + List toDeleteUuids = em.createQuery(cq).getResultList(); + return toDeleteUuids; + } + + private Date getDeletionReferenceDate(String uuid, DeletionConfiguration entityConfig) { + + if (entityConfig.getDeletionReference() == null) { + return null; + } + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Object[].class); + Root from = cq.from(getElementClass()); + + cq.select(from.get(getDeleteReferenceField(entityConfig.getDeletionReference()))); + cq.where(cb.equal(from.get(AbstractDomainObject.UUID), uuid)); + + Object result = em.createQuery(cq).getSingleResult(); + return (Date) result; + } + + protected String getDeleteReferenceField(DeletionReference deletionReference) { + + switch (deletionReference) { + case CREATION: + return AbstractDomainObject.CREATION_DATE; + case END: + return CoreAdo.END_OF_PROCESSING_DATE; + case MANUAL_DELETION: + return AbstractDomainObject.CHANGE_DATE; + default: + throw new IllegalArgumentException("deletion reference " + deletionReference + " not supported in " + getClass().getSimpleName()); + } + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java index c8ab37c8288..51be7fe682a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java @@ -29,7 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.importexport.ImportExportUtils; @@ -159,15 +159,15 @@ public void cleanUpTemporaryFiles() { public void archiveCases() { final int daysAfterCaseGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); final int daysAfterContactsGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CONTACT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CONTACT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); if (daysAfterCaseGetsArchived < daysAfterContactsGetsArchived) { logger.warn( "{} for {} [{}] should be <= the one for {} [{}]", FeatureTypeProperty.THRESHOLD_IN_DAYS, - CoreEntityType.CONTACT, - CoreEntityType.CASE, + DeletableEntityType.CONTACT, + DeletableEntityType.CASE, daysAfterContactsGetsArchived, daysAfterCaseGetsArchived); } @@ -180,15 +180,19 @@ public void archiveCases() { public void archiveEvents() { final int daysAfterEventsGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.EVENT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.EVENT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); final int daysAfterEventParticipantsGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.EVENT_PARTICIPANT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty( + FeatureType.AUTOMATIC_ARCHIVING, + DeletableEntityType.EVENT_PARTICIPANT, + FeatureTypeProperty.THRESHOLD_IN_DAYS, + Integer.class); if (daysAfterEventsGetsArchived < daysAfterEventParticipantsGetsArchived) { logger.warn( "{} for {} [{}] should be <= the one for {} [{}]", FeatureTypeProperty.THRESHOLD_IN_DAYS, - CoreEntityType.EVENT_PARTICIPANT, - CoreEntityType.EVENT, + DeletableEntityType.EVENT_PARTICIPANT, + DeletableEntityType.EVENT, daysAfterEventParticipantsGetsArchived, daysAfterEventsGetsArchived); } @@ -237,7 +241,7 @@ public void deleteExpiredEntities() { @Schedule(hour = "2", minute = "15", persistent = false) public void archiveContacts() { final int daysAfterContactsGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CONTACT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CONTACT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); if (daysAfterContactsGetsArchived >= 1) { contactFacade.archiveAllArchivableContacts(daysAfterContactsGetsArchived); @@ -247,7 +251,11 @@ public void archiveContacts() { @Schedule(hour = "2", minute = "20", persistent = false) public void archiveEventParticipants() { final int daysAfterEventParticipantGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.EVENT_PARTICIPANT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty( + FeatureType.AUTOMATIC_ARCHIVING, + DeletableEntityType.EVENT_PARTICIPANT, + FeatureTypeProperty.THRESHOLD_IN_DAYS, + Integer.class); if (daysAfterEventParticipantGetsArchived >= 1) { eventParticipantFacade.archiveAllArchivableEventParticipants(daysAfterEventParticipantGetsArchived); @@ -257,7 +265,7 @@ public void archiveEventParticipants() { @Schedule(hour = "2", minute = "25", persistent = false) public void archiveImmunizations() { final int daysAfterImmunizationsGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.IMMUNIZATION, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.IMMUNIZATION, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); if (daysAfterImmunizationsGetsArchived >= 1) { immunizationFacade.archiveAllArchivableImmunizations(daysAfterImmunizationsGetsArchived); @@ -267,7 +275,7 @@ public void archiveImmunizations() { @Schedule(hour = "2", minute = "30", persistent = false) public void archiveTravelEntry() { final int daysAfterTravelEntryGetsArchived = featureConfigurationFacade - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.TRAVEL_ENTRY, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.TRAVEL_ENTRY, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); if (daysAfterTravelEntryGetsArchived >= 1) { travelEntryFacade.archiveAllArchivableTravelEntries(daysAfterTravelEntryGetsArchived); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index 021ec30114b..c050e6fdbb3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -77,7 +77,7 @@ import de.symeda.sormas.api.caze.AgeAndBirthDateDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.CoreAndPersonDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.Page; @@ -103,7 +103,6 @@ import de.symeda.sormas.api.contact.MergeContactIndexDto; import de.symeda.sormas.api.contact.SimilarContactDto; import de.symeda.sormas.api.dashboard.DashboardContactDto; -import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.document.DocumentRelatedEntityType; import de.symeda.sormas.api.epidata.EpiDataDto; import de.symeda.sormas.api.epidata.EpiDataHelper; @@ -143,6 +142,7 @@ import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.DtoCopyHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.UtilDate; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -2206,7 +2206,7 @@ public void merge(String leadUuid, String otherUuid) { private void copyDtoValues(ContactDto leadContactDto, ContactDto otherContactDto) { - DtoHelper.copyDtoValues(leadContactDto, otherContactDto, false); + DtoCopyHelper.copyDtoValues(leadContactDto, otherContactDto, false); final String leadAdditionalDetails = leadContactDto.getAdditionalDetails(); final String leadFollowUpComment = leadContactDto.getFollowUpComment(); @@ -2318,8 +2318,8 @@ public long getContactCount(CaseReferenceDto caze) { } @Override - protected CoreEntityType getCoreEntityType() { - return CoreEntityType.CONTACT; + protected DeletableEntityType getDeletableEntityType() { + return DeletableEntityType.CONTACT; } private float calculateCompleteness(Contact contact) { @@ -2372,15 +2372,6 @@ public User getRandomRegionContactResponsible(Region region) { return userService.getRandomRegionUser(region, UserRight.CONTACT_RESPONSIBLE); } - @Override - protected String getDeleteReferenceField(DeletionReference deletionReference) { - if (deletionReference == DeletionReference.REPORT) { - return Contact.REPORT_DATE_TIME; - } - - return super.getDeleteReferenceField(deletionReference); - } - @LocalBean @Stateless public static class ContactFacadeEjbLocal extends ContactFacadeEjb { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java index 0e934b886b6..97f638d427b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java @@ -61,6 +61,7 @@ import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.VaccinationStatus; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.contact.ContactClassification; import de.symeda.sormas.api.contact.ContactCriteria; @@ -75,6 +76,7 @@ import de.symeda.sormas.api.contact.MapContactDto; import de.symeda.sormas.api.contact.MergeContactIndexDto; import de.symeda.sormas.api.dashboard.DashboardContactDto; +import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.document.DocumentRelatedEntityType; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; @@ -183,7 +185,7 @@ public class ContactService extends AbstractCoreAdoService { List coreEntityTypeConfigs = - deletionConfigurationService.getCoreEntityTypeConfigs(entityTypeFacadePair.coreEntityType); + deletionConfigurationService.getEntityTypeConfigs(entityTypeFacadePair.deletableEntityType); coreEntityTypeConfigs.stream().filter(c -> c.getDeletionReference() != null && c.getDeletionPeriod() != null).forEach(c -> { @@ -95,7 +95,7 @@ public void executeAutomaticDeletion() { deleteUuids, DELETE_BATCH_SIZE, batchedUuids -> entityTypeFacadePair.entityFacade - .doAutomaticDeletion(batchedUuids, supportsPermanentDeletion(entityTypeFacadePair.coreEntityType))); + .doAutomaticDeletion(batchedUuids, supportsPermanentDeletion(entityTypeFacadePair.deletableEntityType))); }); }); @@ -140,28 +140,28 @@ private void deleteOrphanEntities() { batchedUuids -> shareRequestInfoService.deletePermanentByUuids(batchedUuids)); } - private boolean supportsPermanentDeletion(CoreEntityType coreEntityType) { - return coreEntityType == CoreEntityType.IMMUNIZATION - || coreEntityType == CoreEntityType.TRAVEL_ENTRY - || coreEntityType == CoreEntityType.CASE - || coreEntityType == CoreEntityType.CONTACT - || coreEntityType == CoreEntityType.EVENT - || coreEntityType == CoreEntityType.EVENT_PARTICIPANT; + private boolean supportsPermanentDeletion(DeletableEntityType deletableEntityType) { + return deletableEntityType == DeletableEntityType.IMMUNIZATION + || deletableEntityType == DeletableEntityType.TRAVEL_ENTRY + || deletableEntityType == DeletableEntityType.CASE + || deletableEntityType == DeletableEntityType.CONTACT + || deletableEntityType == DeletableEntityType.EVENT + || deletableEntityType == DeletableEntityType.EVENT_PARTICIPANT; } @SuppressWarnings("rawtypes") private static final class EntityTypeFacadePair { - private final CoreEntityType coreEntityType; + private final DeletableEntityType deletableEntityType; private final AbstractCoreFacadeEjb entityFacade; - private EntityTypeFacadePair(CoreEntityType coreEntityType, AbstractCoreFacadeEjb entityFacade) { - this.coreEntityType = coreEntityType; + private EntityTypeFacadePair(DeletableEntityType deletableEntityType, AbstractCoreFacadeEjb entityFacade) { + this.deletableEntityType = deletableEntityType; this.entityFacade = entityFacade; } - public static EntityTypeFacadePair of(CoreEntityType coreEntityType, AbstractCoreFacadeEjb entityFacade) { - return new EntityTypeFacadePair(coreEntityType, entityFacade); + public static EntityTypeFacadePair of(DeletableEntityType deletableEntityType, AbstractCoreFacadeEjb entityFacade) { + return new EntityTypeFacadePair(deletableEntityType, entityFacade); } } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfiguration.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfiguration.java index 032dd7d112c..99d8cc1f237 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfiguration.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfiguration.java @@ -7,7 +7,7 @@ import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.backend.common.AbstractDomainObject; @@ -23,27 +23,27 @@ public class DeletionConfiguration extends AbstractDomainObject { public static final String DELETION_REFERENCE = "deletionReference"; public static final String DELETION_PERIOD = "deletionPeriod"; - private CoreEntityType entityType; + private DeletableEntityType entityType; private DeletionReference deletionReference; @Min(value = 7, message = Validations.numberTooSmall) @Max(value = Integer.MAX_VALUE, message = Validations.numberTooBig) public Integer deletionPeriod; - public static DeletionConfiguration build(CoreEntityType coreEntityType) { + public static DeletionConfiguration build(DeletableEntityType deletableEntityType) { - return build(coreEntityType, null, null); + return build(deletableEntityType, null, null); } - public static DeletionConfiguration build(CoreEntityType coreEntityType, DeletionReference deletionReference) { + public static DeletionConfiguration build(DeletableEntityType deletableEntityType, DeletionReference deletionReference) { - return build(coreEntityType, deletionReference, null); + return build(deletableEntityType, deletionReference, null); } - public static DeletionConfiguration build(CoreEntityType coreEntityType, DeletionReference deletionReference, Integer deletionPeriod) { + public static DeletionConfiguration build(DeletableEntityType deletableEntityType, DeletionReference deletionReference, Integer deletionPeriod) { DeletionConfiguration deletionConfiguration = new DeletionConfiguration(); - deletionConfiguration.setEntityType(coreEntityType); + deletionConfiguration.setEntityType(deletableEntityType); deletionConfiguration.setDeletionReference(deletionReference); deletionConfiguration.setDeletionPeriod(deletionPeriod); return deletionConfiguration; @@ -51,11 +51,11 @@ public static DeletionConfiguration build(CoreEntityType coreEntityType, Deletio @Enumerated(EnumType.STRING) @Column(nullable = false) - public CoreEntityType getEntityType() { + public DeletableEntityType getEntityType() { return entityType; } - public void setEntityType(CoreEntityType entityType) { + public void setEntityType(DeletableEntityType entityType) { this.entityType = entityType; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfigurationService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfigurationService.java index 21eb1982f36..afb58cc4ff8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfigurationService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/deletionconfiguration/DeletionConfigurationService.java @@ -15,7 +15,7 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.backend.common.BaseAdoService; @@ -29,39 +29,39 @@ public DeletionConfigurationService() { } /** - * Retrieves the deletion configuration for the specified core entity type with deletion reference != DELETION. + * Retrieves the deletion configuration for the specified deletable entity type with deletion reference != DELETION. */ - public DeletionConfiguration getCoreEntityTypeConfig(CoreEntityType coreEntityType) { + public DeletionConfiguration getEntityTypeConfig(DeletableEntityType deletableEntityType) { - return getCoreEntityTypeConfig(coreEntityType, false); + return getEntityTypeConfig(deletableEntityType, false); } /** - * Retrieves the deletion configuration for the specified core entity type with deletion reference == DELETION. + * Retrieves the deletion configuration for the specified deletable entity type with deletion reference == DELETION. */ - public DeletionConfiguration getCoreEntityTypeManualDeletionConfig(CoreEntityType coreEntityType) { + public DeletionConfiguration getEntityTypeManualDeletionConfig(DeletableEntityType deletableEntityType) { - return getCoreEntityTypeConfig(coreEntityType, true); + return getEntityTypeConfig(deletableEntityType, true); } - public List getCoreEntityTypeConfigs(CoreEntityType coreEntityType) { + public List getEntityTypeConfigs(DeletableEntityType deletableEntityType) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(getElementClass()); Root from = cq.from(getElementClass()); - cq.where(cb.equal(from.get(DeletionConfiguration.ENTITY_TYPE), coreEntityType)); + cq.where(cb.equal(from.get(DeletionConfiguration.ENTITY_TYPE), deletableEntityType)); return em.createQuery(cq).getResultList(); } - private DeletionConfiguration getCoreEntityTypeConfig(CoreEntityType coreEntityType, boolean isManualDeletionConfig) { + private DeletionConfiguration getEntityTypeConfig(DeletableEntityType deletableEntityType, boolean isManualDeletionConfig) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(getElementClass()); Root from = cq.from(getElementClass()); cq.where( cb.and( - cb.equal(from.get(DeletionConfiguration.ENTITY_TYPE), coreEntityType), + cb.equal(from.get(DeletionConfiguration.ENTITY_TYPE), deletableEntityType), isManualDeletionConfig ? cb.equal(from.get(DeletionConfiguration.DELETION_REFERENCE), DeletionReference.MANUAL_DELETION) : cb.notEqual(from.get(DeletionConfiguration.DELETION_REFERENCE), DeletionReference.MANUAL_DELETION))); @@ -75,25 +75,25 @@ private DeletionConfiguration getCoreEntityTypeConfig(CoreEntityType coreEntityT public void createMissingDeletionConfigurations() { - Map> configs = getServerDeletionConfigurations(); - Arrays.stream(CoreEntityType.values()).forEach(coreEntityType -> { - Map savedConfigurations = configs.get(coreEntityType); + Map> configs = getServerDeletionConfigurations(); + Arrays.stream(DeletableEntityType.values()).forEach(deletableEntityType -> { + Map savedConfigurations = configs.get(deletableEntityType); if (savedConfigurations == null || !savedConfigurations.containsKey(DeletionReference.MANUAL_DELETION.name())) { - DeletionConfiguration deletionConfiguration = DeletionConfiguration.build(coreEntityType, DeletionReference.MANUAL_DELETION); + DeletionConfiguration deletionConfiguration = DeletionConfiguration.build(deletableEntityType, DeletionReference.MANUAL_DELETION); ensurePersisted(deletionConfiguration); } if (savedConfigurations == null || savedConfigurations.isEmpty() || savedConfigurations.containsKey(DeletionReference.MANUAL_DELETION.name()) && savedConfigurations.size() == 1) { - DeletionConfiguration deletionConfiguration = DeletionConfiguration.build(coreEntityType); + DeletionConfiguration deletionConfiguration = DeletionConfiguration.build(deletableEntityType); ensurePersisted(deletionConfiguration); } }); } - private Map> getServerDeletionConfigurations() { + private Map> getServerDeletionConfigurations() { List deletionConfigurations = getAll(); return deletionConfigurations.stream() diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java index cbdfa9c0fed..bf1f4f9ea46 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentFacadeEjb.java @@ -27,7 +27,7 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.NotImplementedException; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.environment.EnvironmentCriteria; @@ -387,7 +387,7 @@ protected void restorePseudonymizedDto(EnvironmentDto dto, EnvironmentDto existi } @Override - protected CoreEntityType getCoreEntityType() { + protected DeletableEntityType getDeletableEntityType() { return null; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java index 3f3a4aa3549..ef3f952ba68 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java @@ -18,6 +18,7 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.RequestContextHolder; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.environment.EnvironmentCriteria; import de.symeda.sormas.api.event.EventCriteria; import de.symeda.sormas.api.user.JurisdictionLevel; @@ -42,7 +43,7 @@ public class EnvironmentService extends AbstractCoreAdoService getIndexList( from.get(EnvironmentSample.DISPATCHED), from.get(EnvironmentSample.DISPATCH_DATE), from.get(EnvironmentSample.RECEIVED), + from.get(EnvironmentSample.RECEIVAL_DATE), + joins.getLaboratory().get(Facility.UUID), joins.getLaboratory().get(Facility.NAME), + from.get(EnvironmentSample.LABORATORY_DETAILS), + from.get(EnvironmentSample.SPECIMEN_CONDITION), from.get(EnvironmentSample.SAMPLE_MATERIAL), from.get(EnvironmentSample.OTHER_SAMPLE_MATERIAL), from.get(EnvironmentSample.DELETION_REASON), @@ -291,7 +298,8 @@ private List> sortBy(List sortProperties, Environment public void validate(EnvironmentSampleDto dto) throws ValidationRuntimeException { Facility laboratory = facilityService.getByReferenceDto(dto.getLaboratory()); - if (laboratory == null || laboratory.getType() != FacilityType.LABORATORY) { + if (laboratory == null + || (!FacilityDto.OTHER_FACILITY_UUID.equals(laboratory.getUuid()) && laboratory.getType() != FacilityType.LABORATORY)) { throw new ValidationRuntimeException(I18nProperties.getString(Validations.validLaboratory)); } } @@ -392,6 +400,31 @@ public boolean isDeleted(String uuid) { return service.isDeleted(uuid); } + @Override + public boolean exists(String uuid) { + return service.exists(uuid); + } + + @Override + public boolean isEditAllowed(String uuid) { + return service.isEditAllowed(service.getByUuid(uuid)); + } + + @Override + public EditPermissionType getEditPermissionType(String sampleUuid) { + return service.getEditPermissionType(service.getByUuid(sampleUuid)); + } + + @Override + public DeletionInfoDto getAutomaticDeletionInfo(String sampleUuid) { + return service.getAutomaticDeletionInfo(sampleUuid); + } + + @Override + public DeletionInfoDto getManuallyDeletionInfo(String sampleUuid) { + return service.getManuallyDeletionInfo(sampleUuid); + } + @Override protected EnvironmentSample fillOrBuildEntity(EnvironmentSampleDto source, EnvironmentSample target, boolean checkChangeDate) { boolean targetWasNull = isNull(target); @@ -428,6 +461,9 @@ protected EnvironmentSample fillOrBuildEntity(EnvironmentSampleDto source, Envir target.setSpecimenCondition(source.getSpecimenCondition()); target.setLocation(locationFacade.fillOrBuildEntity(source.getLocation(), target.getLocation(), checkChangeDate)); target.setGeneralComment(source.getGeneralComment()); + target.setDeleted(source.isDeleted()); + target.setDeletionReason(source.getDeletionReason()); + target.setOtherDeletionReason(source.getOtherDeletionReason()); return target; } @@ -467,6 +503,9 @@ protected EnvironmentSampleDto toDto(EnvironmentSample source) { target.setSpecimenCondition(source.getSpecimenCondition()); target.setLocation(LocationFacadeEjb.toDto(source.getLocation())); target.setGeneralComment(source.getGeneralComment()); + target.setDeleted(source.isDeleted()); + target.setDeletionReason(source.getDeletionReason()); + target.setOtherDeletionReason(source.getOtherDeletionReason()); return target; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java index 2d0ab19c8c6..9a979cc96f4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java @@ -26,7 +26,9 @@ import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; +import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractDeletableAdoService; @@ -46,7 +48,7 @@ public class EnvironmentSampleService extends AbstractDeletableAdoService saveBulkEvents( } return processedEvents; } - - @Override - protected String getDeleteReferenceField(DeletionReference deletionReference) { - if (deletionReference == DeletionReference.REPORT) { - return Event.REPORT_DATE_TIME; - } - - return super.getDeleteReferenceField(deletionReference); - } - @Override - protected CoreEntityType getCoreEntityType() { - return CoreEntityType.EVENT; + protected DeletableEntityType getDeletableEntityType() { + return DeletableEntityType.EVENT; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index c1a92d82aa0..61ff5f7edb7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -64,7 +64,7 @@ import de.symeda.sormas.api.caze.BurialInfoDto; import de.symeda.sormas.api.caze.CaseExportDto; import de.symeda.sormas.api.caze.EmbeddedSampleExportDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.common.progress.ProcessedEntity; @@ -1307,8 +1307,8 @@ public List dearchive(List entityUuids, String dearchiv } @Override - protected CoreEntityType getCoreEntityType() { - return CoreEntityType.EVENT_PARTICIPANT; + protected DeletableEntityType getDeletableEntityType() { + return DeletableEntityType.EVENT_PARTICIPANT; } @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java index ecd7b8874d0..a9941a14f7e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java @@ -41,6 +41,7 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.caze.VaccinationStatus; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.event.EventParticipantCriteria; import de.symeda.sormas.api.feature.FeatureType; @@ -82,7 +83,7 @@ public class EventParticipantService extends AbstractCoreAdoService { private ExternalSurveillanceToolGatewayFacadeEjb.ExternalSurveillanceToolGatewayFacadeEjbLocal externalSurveillanceToolGatewayFacade; public EventService() { - super(Event.class); + super(Event.class, DeletableEntityType.EVENT); } @Override @@ -1161,4 +1163,12 @@ protected boolean hasLimitedChangeDateFilterImplementation() { return true; } + @Override + protected String getDeleteReferenceField(DeletionReference deletionReference) { + if (deletionReference == DeletionReference.REPORT) { + return Event.REPORT_DATE_TIME; + } + + return super.getDeleteReferenceField(deletionReference); + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfiguration.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfiguration.java index a4581dc5b53..55da483aac3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfiguration.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfiguration.java @@ -15,7 +15,7 @@ import org.hibernate.annotations.Type; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.backend.common.AbstractDomainObject; @@ -45,7 +45,7 @@ public class FeatureConfiguration extends AbstractDomainObject { private Disease disease; private Date endDate; private boolean enabled; - private CoreEntityType entityType; + private DeletableEntityType entityType; private Map properties; public static FeatureConfiguration build(FeatureType featureType, boolean enabled) { @@ -67,12 +67,12 @@ public void setFeatureType(FeatureType featureType) { } @Enumerated(EnumType.STRING) - public CoreEntityType getEntityType() { + public DeletableEntityType getEntityType() { return entityType; } - public void setEntityType(CoreEntityType coreEntityType) { - this.entityType = coreEntityType; + public void setEntityType(DeletableEntityType deletableEntityType) { + this.entityType = deletableEntityType; } @ManyToOne(cascade = {}, fetch = FetchType.LAZY) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjb.java index c1d9384fd6b..fa3f18e08f7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjb.java @@ -50,7 +50,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.audit.AuditIgnore; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.feature.FeatureConfigurationCriteria; import de.symeda.sormas.api.feature.FeatureConfigurationDto; @@ -392,7 +392,7 @@ public boolean isFeatureDisabled(FeatureType featureType) { } @Override - public boolean isFeatureEnabled(FeatureType featureType, CoreEntityType entityType) { + public boolean isFeatureEnabled(FeatureType featureType, DeletableEntityType entityType) { if (entityType == null) { throw new IllegalArgumentException("Entity type must be specified!"); @@ -412,7 +412,11 @@ public boolean isFeatureEnabled(FeatureType featureType, CoreEntityType entityTy return em.createQuery(cq).getSingleResult() > 0; } - public T getProperty(FeatureType featureType, CoreEntityType entityType, FeatureTypeProperty property, Class returnType) { + public T getProperty( + FeatureType featureType, + DeletableEntityType entityType, + FeatureTypeProperty property, + Class returnType) { if (!featureType.getSupportedProperties().contains(property)) { throw new IllegalArgumentException("Feature type " + featureType + " does not support property " + property + "."); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationService.java index a3bb93790f6..f5d3e5e913a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationService.java @@ -17,7 +17,7 @@ import org.apache.commons.lang3.ArrayUtils; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureConfigurationCriteria; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.backend.common.AbstractDomainObject; @@ -140,9 +140,9 @@ public void createMissingFeatureConfigurations() { }); } - private void createFeatureConfiguration(FeatureType featureType, CoreEntityType coreEntityType) { + private void createFeatureConfiguration(FeatureType featureType, DeletableEntityType deletableEntityType) { FeatureConfiguration configuration = FeatureConfiguration.build(featureType, featureType.isEnabledDefault()); - configuration.setEntityType(coreEntityType); + configuration.setEntityType(deletableEntityType); configuration.setProperties(featureType.getSupportedPropertyDefaults()); ensurePersisted(configuration); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java index 556d30d21e6..2d2c1fa1fe4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java @@ -25,6 +25,7 @@ import org.apache.commons.collections4.CollectionUtils; import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.immunization.ImmunizationCriteria; @@ -71,7 +72,7 @@ public class DirectoryImmunizationService extends AbstractDeletableAdoService dearchive(List entityUuids, String dearchiv return super.dearchive(entityUuids, dearchiveReason); } - @Override - protected String getDeleteReferenceField(DeletionReference deletionReference) { - if (deletionReference == DeletionReference.REPORT) { - return Immunization.REPORT_DATE; - } - - return super.getDeleteReferenceField(deletionReference); - } - @LocalBean @Stateless public static class ImmunizationFacadeEjbLocal extends ImmunizationFacadeEjb { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java index da436680365..365ffcd4d30 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java @@ -39,6 +39,8 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionType; +import de.symeda.sormas.api.common.DeletableEntityType; +import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.immunization.ImmunizationListEntryDto; @@ -92,7 +94,7 @@ public class ImmunizationService extends AbstractCoreAdoService from protected boolean hasLimitedChangeDateFilterImplementation() { return true; } + + @Override + protected String getDeleteReferenceField(DeletionReference deletionReference) { + if (deletionReference == DeletionReference.REPORT) { + return Immunization.REPORT_DATE; + } + + return super.getDeleteReferenceField(deletionReference); + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java index 302b2ffd01c..5194b416213 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/AbstractInfrastructureFacadeEjb.java @@ -26,6 +26,7 @@ import de.symeda.sormas.api.infrastructure.InfrastructureFacade; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.AccessDeniedException; +import de.symeda.sormas.api.utils.DtoCopyHelper; import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.utils.criteria.BaseCriteria; import de.symeda.sormas.backend.common.AbstractBaseEjb; @@ -34,7 +35,6 @@ import de.symeda.sormas.backend.common.InfrastructureAdo; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; import de.symeda.sormas.backend.user.User; -import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.Pseudonymizer; import de.symeda.sormas.backend.util.RightsAllowed; @@ -171,7 +171,7 @@ protected DTO persistEntity(DTO dto, ADO entityToPersist, boolean checkChangeDat protected DTO mergeAndPersist(DTO dtoToSave, List duplicates, boolean checkChangeDate, boolean allowUuidOverwrite) { ADO existingEntity = duplicates.get(0); DTO existingDto = toDto(existingEntity); - DtoHelper.copyDtoValues(existingDto, dtoToSave, true); + DtoCopyHelper.copyDtoValues(existingDto, dtoToSave, true); return persistEntity(dtoToSave, existingEntity, checkChangeDate, allowUuidOverwrite); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java index 499e3bd3e8b..969a6d1e9e1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java @@ -120,6 +120,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.DtoCopyHelper; import de.symeda.sormas.api.utils.LocationHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -1808,7 +1809,7 @@ public void mergePerson(PersonDto leadPerson, PersonDto otherPerson) { } } - DtoHelper.copyDtoValues(leadPerson, otherPerson, false, PersonDto.ADDRESS); + DtoCopyHelper.copyDtoValues(leadPerson, otherPerson, false, PersonDto.ADDRESS); processPersonAddressMerge(leadPerson, otherPerson); save(leadPerson); @@ -1844,7 +1845,7 @@ public void mergePerson( } } - DtoHelper.copyDtoValues(leadPersonDto, otherPersonDto, false, PersonDto.ADDRESS); + DtoCopyHelper.copyDtoValues(leadPersonDto, otherPersonDto, false, PersonDto.ADDRESS); processPersonAddressMerge(leadPersonDto, otherPersonDto); save(leadPersonDto); } @@ -1983,12 +1984,12 @@ private void mergeEventParticipants( private void processPersonAddressMerge(PersonDto leadPersonDto, PersonDto otherPersonDto) { if (locationFacade.areDifferentLocation(leadPersonDto.getAddress(), otherPersonDto.getAddress())) { LocationDto newAddress = LocationDto.build(); - DtoHelper.copyDtoValues(newAddress, otherPersonDto.getAddress(), true); + DtoCopyHelper.copyDtoValues(newAddress, otherPersonDto.getAddress(), true); newAddress.setAddressType(PersonAddressType.OTHER_ADDRESS); newAddress.setAddressTypeDetails(I18nProperties.getString(Strings.messagePersonMergedAddressDescription)); leadPersonDto.addAddress(newAddress); } else { - DtoHelper.copyDtoValues(leadPersonDto.getAddress(), otherPersonDto.getAddress(), false); + DtoCopyHelper.copyDtoValues(leadPersonDto.getAddress(), otherPersonDto.getAddress(), false); } } @@ -2003,7 +2004,7 @@ public void copyHomeAddress(PersonReferenceDto source, PersonReferenceDto target LocationDto sourceAddress = getByUuid(source.getUuid()).getAddress(); PersonDto targetPerson = getByUuid(target.getUuid()); LocationDto targetAddress = targetPerson.getAddress(); - targetAddress = DtoHelper.copyDtoValues(targetAddress, sourceAddress, true); + targetAddress = DtoCopyHelper.copyDtoValues(targetAddress, sourceAddress, true); targetPerson.setAddress(targetAddress); save(targetPerson); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java index 5239f8cc384..18ea1e1e2c3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java @@ -40,6 +40,7 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.sample.PathogenTestCriteria; import de.symeda.sormas.api.sample.PathogenTestResultType; @@ -62,7 +63,7 @@ public class PathogenTestService extends AbstractDeletableAdoService protected FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; public SampleService() { - super(Sample.class); + super(Sample.class, DeletableEntityType.SAMPLE); } public List findBy(SampleCriteria criteria, User user, String sortProperty, boolean ascending) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index b769a021eaf..32e9149e7b9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -23,12 +23,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; -import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -296,8 +295,8 @@ public List getEntriesList(TravelEntryListCriteria crit } @Override - protected CoreEntityType getCoreEntityType() { - return CoreEntityType.TRAVEL_ENTRY; + protected DeletableEntityType getDeletableEntityType() { + return DeletableEntityType.TRAVEL_ENTRY; } @Override @@ -452,17 +451,6 @@ protected TravelEntry fillOrBuildEntity(@NotNull TravelEntryDto source, TravelEn return target; } - @Override - protected String getDeleteReferenceField(DeletionReference deletionReference) { - if (deletionReference.equals(DeletionReference.ORIGIN)) { - return TravelEntry.DATE_OF_ARRIVAL; - } else if (deletionReference == DeletionReference.REPORT) { - return TravelEntry.REPORT_DATE; - } - - return super.getDeleteReferenceField(deletionReference); - } - @Override @RightsAllowed(UserRight._TRAVEL_ENTRY_ARCHIVE) public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/BaseTravelEntryService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/BaseTravelEntryService.java index ce335df8e11..292624801a6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/BaseTravelEntryService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/BaseTravelEntryService.java @@ -6,6 +6,8 @@ import javax.persistence.criteria.From; import javax.persistence.criteria.Predicate; +import de.symeda.sormas.api.common.DeletableEntityType; +import de.symeda.sormas.api.deletionconfiguration.DeletionReference; import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.common.ChangeDateBuilder; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; @@ -23,7 +25,7 @@ public abstract class BaseTravelEntryService extends AbstractCoreAdoService> T addChangeDates(T builder, TravelEnt return super.addChangeDates(builder, joins, includeExtendedChangeDateFilters); } + + @Override + protected String getDeleteReferenceField(DeletionReference deletionReference) { + if (deletionReference.equals(DeletionReference.ORIGIN)) { + return TravelEntry.DATE_OF_ARRIVAL; + } else if (deletionReference == DeletionReference.REPORT) { + return TravelEntry.REPORT_DATE; + } + + return super.getDeleteReferenceField(deletionReference); + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java index 88130e7f8b4..5544504e08a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java @@ -17,26 +17,11 @@ *******************************************************************************/ package de.symeda.sormas.backend.util; -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.lang.reflect.InvocationTargetException; import java.sql.Timestamp; -import java.util.Arrays; -import java.util.Collection; -import java.util.EnumMap; -import java.util.Map; import java.util.function.Supplier; -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.google.common.collect.Maps; - import de.symeda.sormas.api.EntityDto; -import de.symeda.sormas.api.ReferenceDto; import de.symeda.sormas.api.utils.DataHelper; -import de.symeda.sormas.api.utils.JsonDataEntry; import de.symeda.sormas.api.utils.OutdatedEntityException; import de.symeda.sormas.api.uuid.MismatchUuidException; import de.symeda.sormas.backend.common.AbstractDomainObject; @@ -67,124 +52,6 @@ public static void fillDto(EntityDto dto, AbstractDomainObject entity) { dto.setUuid(entity.getUuid()); } - public static T copyDtoValues(T target, T source, boolean overrideValues) { - return copyDtoValues(target, source, overrideValues, null); - } - - /** - * @param overrideValues - * Note: Existing references are NOT overridden - */ - @SuppressWarnings({ - "unchecked", - "rawtypes" }) - public static T copyDtoValues(T target, T source, boolean overrideValues, String... skippedFields) { - - try { - PropertyDescriptor[] pds = Introspector.getBeanInfo(target.getClass(), EntityDto.class).getPropertyDescriptors(); - - for (PropertyDescriptor pd : pds) { - // Skip properties without a read or write method - if (pd.getReadMethod() == null || pd.getWriteMethod() == null || pd.getWriteMethod().isAnnotationPresent(JsonIgnore.class)) { - continue; - } - - Object targetValue = pd.getReadMethod().invoke(target); - Object sourceValue = pd.getReadMethod().invoke(source); - - if (sourceValue == null) { - continue; - } - - if (skippedFields == null || Arrays.stream(skippedFields).noneMatch(field -> field.equals(pd.getName()))) { - if (EntityDto.class.isAssignableFrom(pd.getPropertyType())) { - - if (targetValue == null) { - targetValue = sourceValue.getClass().newInstance(); - pd.getWriteMethod().invoke(target, targetValue); - } - - // If both entities have the same UUID, assign a new one to targetValue to create a new entity - if (DataHelper.equal(((EntityDto) targetValue).getUuid(), (((EntityDto) sourceValue).getUuid()))) { - ((EntityDto) targetValue).setUuid(DataHelper.createUuid()); - } - - // entity: just fill the existing one with the source - copyDtoValues((EntityDto) targetValue, (EntityDto) sourceValue, overrideValues); - } else { - boolean override = overrideValues && !ReferenceDto.class.isAssignableFrom(pd.getPropertyType()); - // should we write into the target property? - if (Collection.class.isAssignableFrom(pd.getPropertyType())) { - - if (targetValue == null) { - targetValue = sourceValue.getClass().newInstance(); - pd.getWriteMethod().invoke(target, targetValue); - } - - Collection targetCollection = (Collection) targetValue; - - for (Object sourceEntry : (Collection) sourceValue) { - if (sourceEntry instanceof EntityDto) { - EntityDto newEntry = ((EntityDto) sourceEntry).clone(); - newEntry.setUuid(DataHelper.createUuid()); - newEntry.setCreationDate(null); - copyDtoValues(newEntry, (EntityDto) sourceEntry, true); - targetCollection.add(newEntry); - } else if (DataHelper.isValueType(sourceEntry.getClass()) - || sourceEntry instanceof ReferenceDto - || sourceEntry instanceof JsonDataEntry) { - targetCollection.add(sourceEntry); - } else { - throw new UnsupportedOperationException( - pd.getPropertyType().getName() + " is not supported as a list entry type."); - } - } - } else if (Map.class.isAssignableFrom(pd.getPropertyType())) { - - if (targetValue == null) { - if (sourceValue.getClass() == EnumMap.class) { - // Enum map needs to be initialized with the content of the source map because it does not have an init method - targetValue = Maps.newEnumMap((EnumMap) sourceValue); - ((EnumMap) targetValue).clear(); - } else { - targetValue = sourceValue.getClass().newInstance(); - } - pd.getWriteMethod().invoke(target, targetValue); - } - - Map targetMap = (Map) targetValue; - - for (Object sourceKey : ((Map) sourceValue).keySet()) { - if (override || !targetMap.containsKey(sourceKey)) { - targetMap.put(sourceKey, ((Map) sourceValue).get(sourceKey)); - } - } - } else if (targetValue == null - || override - || (pd.getPropertyType().equals(String.class) - && StringUtils.isBlank((String) targetValue) - && StringUtils.isNotBlank((String) sourceValue)) - || (pd.getPropertyType().equals(boolean.class) && ((boolean) sourceValue) && !((boolean) targetValue))) { - if (DataHelper.isValueType(pd.getPropertyType()) || ReferenceDto.class.isAssignableFrom(pd.getPropertyType())) { - pd.getWriteMethod().invoke(target, sourceValue); - } else { - // Other objects are not supported - throw new UnsupportedOperationException(pd.getPropertyType().getName() + " is not supported as a property type."); - } - } - } - } - } - } catch (IntrospectionException - | InvocationTargetException - | IllegalAccessException - | CloneNotSupportedException - | InstantiationException e) { - throw new RuntimeException("Exception when trying to fill dto: " + e.getMessage(), e.getCause()); - } - return target; - } - public static T fillOrBuildEntity(EntityDto source, T target, Supplier newEntity, boolean checkChangeDate) { return fillOrBuildEntity(source, target, newEntity, checkChangeDate, false); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java index 8cce57913f1..33b58a978b6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java @@ -56,6 +56,7 @@ import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.DtoCopyHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.vaccination.VaccinationCriteria; @@ -607,7 +608,7 @@ public void copyOrMergeVaccinations(ImmunizationDto immunizationDto, Immunizatio vaccinationEntities.add(vaccination); } else { VaccinationDto duplicateVaccination = duplicateLeadVaccinations.get(0); - VaccinationDto updatedVaccination = DtoHelper.copyDtoValues(duplicateVaccination, vaccinationDto, false); + VaccinationDto updatedVaccination = DtoCopyHelper.copyDtoValues(duplicateVaccination, vaccinationDto, false); save(updatedVaccination); } } @@ -649,7 +650,7 @@ private List getMergedVaccination(List vaccinati sourceVaccine = duplicateVaccine; } - VaccinationDto updatedVaccination = DtoHelper.copyDtoValues(targetVaccine, sourceVaccine, false); + VaccinationDto updatedVaccination = DtoCopyHelper.copyDtoValues(targetVaccine, sourceVaccine, false); vaccinationsWithoutDuplicates.set(duplicateIndex, updatedVaccination); } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index 29840b7c0ef..06b63bb56f3 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -57,7 +57,7 @@ import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportFacade; import de.symeda.sormas.api.clinicalcourse.ClinicalCourseFacade; import de.symeda.sormas.api.clinicalcourse.ClinicalVisitFacade; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.customizableenum.CustomizableEnumFacade; import de.symeda.sormas.api.dashboard.DashboardFacade; import de.symeda.sormas.api.dashboard.sample.SampleDashboardFacade; @@ -408,18 +408,18 @@ private void initUserRole(UserRole userRole) { } protected void createDeletionConfigurations() { - createDeletionConfigurations(CoreEntityType.CASE, DeletionReference.CREATION); - createDeletionConfigurations(CoreEntityType.CONTACT, DeletionReference.CREATION); - createDeletionConfigurations(CoreEntityType.EVENT, DeletionReference.CREATION); - createDeletionConfigurations(CoreEntityType.EVENT_PARTICIPANT, DeletionReference.CREATION); - createDeletionConfigurations(CoreEntityType.IMMUNIZATION, DeletionReference.CREATION); - createDeletionConfigurations(CoreEntityType.TRAVEL_ENTRY, DeletionReference.CREATION); + createDeletionConfigurations(DeletableEntityType.CASE, DeletionReference.CREATION); + createDeletionConfigurations(DeletableEntityType.CONTACT, DeletionReference.CREATION); + createDeletionConfigurations(DeletableEntityType.EVENT, DeletionReference.CREATION); + createDeletionConfigurations(DeletableEntityType.EVENT_PARTICIPANT, DeletionReference.CREATION); + createDeletionConfigurations(DeletableEntityType.IMMUNIZATION, DeletionReference.CREATION); + createDeletionConfigurations(DeletableEntityType.TRAVEL_ENTRY, DeletionReference.CREATION); } - protected void createDeletionConfigurations(CoreEntityType coreEntityType, DeletionReference automaticDeletionReference) { + protected void createDeletionConfigurations(DeletableEntityType deletableEntityType, DeletionReference automaticDeletionReference) { DeletionConfigurationService deletionConfigurationService = getBean(DeletionConfigurationService.class); - deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(coreEntityType, automaticDeletionReference, 3650)); - deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(coreEntityType, DeletionReference.MANUAL_DELETION, 90)); + deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(deletableEntityType, automaticDeletionReference, 3650)); + deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(deletableEntityType, DeletionReference.MANUAL_DELETION, 90)); } public ConfigFacade getConfigFacade() { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/deletionconfiguration/CoreEntityDeletionServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/deletionconfiguration/CoreEntityDeletionServiceTest.java index 2ead822dba8..7e11dec3e39 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/deletionconfiguration/CoreEntityDeletionServiceTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/deletionconfiguration/CoreEntityDeletionServiceTest.java @@ -22,7 +22,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseDataDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.contact.ContactDto; @@ -83,7 +83,7 @@ public void setupConfig() { public void testCaseAutomaticDeletion() throws IOException { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -199,7 +199,7 @@ public void testCaseAutomaticDeletion() throws IOException { public void testCaseVisitAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -261,7 +261,7 @@ public void testCaseVisitAutomaticDeletion() { public void testImmunizationAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.IMMUNIZATION); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.IMMUNIZATION); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -344,7 +344,7 @@ public void testOrphanReducedImmunizationAutomaticDeletion() { public void testEventAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.EVENT); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.EVENT); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -385,7 +385,7 @@ public void testEventAutomaticDeletion() { public void testEventParticipantWithEventSampleAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.EVENT); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.EVENT); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -424,7 +424,7 @@ public void testEventParticipantWithEventSampleAutomaticDeletion() { public void testEventParticipantWithCaseSampleAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.EVENT); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.EVENT); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -467,7 +467,7 @@ public void testEventParticipantWithCaseSampleAutomaticDeletion() { public void testTravelEntryAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.TRAVEL_ENTRY); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.TRAVEL_ENTRY); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -498,9 +498,9 @@ public void testTravelEntryAutomaticDeletion() { public void testPersonAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration caseCoreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); + DeletionConfiguration caseCoreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); DeletionConfiguration immunizationCoreEntityTypeConfig = - getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.IMMUNIZATION); + getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.IMMUNIZATION); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -554,7 +554,7 @@ public void testPersonAutomaticDeletion() { public void testAutomaticManuallyDeletedEntitiesDeletion() { createDeletionConfigurations(); - DeletionConfiguration deletionConfig = getDeletionConfigurationService().getCoreEntityTypeManualDeletionConfig(CoreEntityType.IMMUNIZATION); + DeletionConfiguration deletionConfig = getDeletionConfigurationService().getEntityTypeManualDeletionConfig(DeletableEntityType.IMMUNIZATION); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -614,7 +614,7 @@ public void testContactPermanentDeletion() { // the test is checking the permanent deletion for contacts which are more than ALLOWED_DATE_OFFSET days apart from each other so there will be no shared Visit between them // the second part tests the permanent deletion of contacts with the same person which are less than ALLOWED_DATE_OFFSET days apart createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CONTACT); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CONTACT); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -732,7 +732,7 @@ public void testContactPermanentDeletion() { @Test public void testPermanentDeletionOfVisitLinkedToMultipleContacts() throws IOException { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CONTACT); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CONTACT); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator @@ -819,19 +819,20 @@ public void testPermanentDeletionOfVisitLinkedToMultipleContacts() throws IOExce @Test public void testMinimumDeletionPeriod7Days() { - getDeletionConfigurationService().ensurePersisted(DeletionConfiguration.build(CoreEntityType.CONTACT, DeletionReference.CREATION, 7)); + getDeletionConfigurationService().ensurePersisted(DeletionConfiguration.build(DeletableEntityType.CONTACT, DeletionReference.CREATION, 7)); assertThrows( ConstraintViolationException.class, - () -> getDeletionConfigurationService().ensurePersisted(DeletionConfiguration.build(CoreEntityType.CASE, DeletionReference.CREATION, 6))); + () -> getDeletionConfigurationService() + .ensurePersisted(DeletionConfiguration.build(DeletableEntityType.CASE, DeletionReference.CREATION, 6))); } @Test public void testSormasToSormasShareRequestPermanentDeletion() { createDeletionConfigurations(); - DeletionConfiguration caseDeletionConfiguration = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); - DeletionConfiguration contactDeletionConfiguration = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CONTACT); - DeletionConfiguration eventDeletionConfiguration = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.EVENT); + DeletionConfiguration caseDeletionConfiguration = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); + DeletionConfiguration contactDeletionConfiguration = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CONTACT); + DeletionConfiguration eventDeletionConfiguration = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.EVENT); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto officer = creator.createSurveillanceOfficer(rdcf).toReference(); @@ -953,7 +954,7 @@ public void testSormasToSormasShareRequestPermanentDeletion() { public void testSormasToSormasShareInfoPermanentDeletion() { createDeletionConfigurations(); - DeletionConfiguration caseDeletionConfiguration = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); + DeletionConfiguration caseDeletionConfiguration = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserReferenceDto officer = creator.createSurveillanceOfficer(rdcf).toReference(); @@ -1007,8 +1008,8 @@ public void testSormasToSormasShareInfoPermanentDeletion() { @Test public void testReportDeletionReference() { - createDeletionConfigurations(CoreEntityType.CASE, DeletionReference.REPORT); - DeletionConfiguration caseDeletionConfiguration = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); + createDeletionConfigurations(DeletableEntityType.CASE, DeletionReference.REPORT); + DeletionConfiguration caseDeletionConfiguration = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); TestDataCreator.RDCF redcf = creator.createRDCF(); UserDto user = creator.createUser(redcf, creator.getUserRoleReference(DefaultUserRole.ADMIN)); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java index 3c6ecf8828f..2d6c2b0a909 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalsurveillancetool/ExternalSurveillanceToolGatewayFacadeEjbTest.java @@ -45,7 +45,7 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseIndexDto; import de.symeda.sormas.api.caze.InvestigationStatus; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.common.progress.ProcessedEntity; @@ -547,7 +547,7 @@ public void testCaseDeletionAndRestoration_WithoutCaseAllowedToBeSharedWithRepor public void testCaseAutomaticDeletion_WithoutCaseAllowedToBeSharedWithReportingTool(WireMockRuntimeInfo wireMockRuntime) throws IOException { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjbTest.java index 1e67e9dae31..b1829de515d 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/feature/FeatureConfigurationFacadeEjbTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test; import de.symeda.sormas.api.caze.CaseDataDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureConfigurationIndexDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; @@ -59,7 +59,7 @@ public void testGetProperty() { featureConfigurationService.createMissingFeatureConfigurations(); Integer defaultDaysForCaseArchiving = getFeatureConfigurationFacade() - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); assertEquals(90, (int) defaultDaysForCaseArchiving); } @@ -68,7 +68,7 @@ public void testGetPropertyWithWrongPropertyType() { assertThrows( IllegalArgumentException.class, () -> getFeatureConfigurationFacade() - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Boolean.class)); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Boolean.class)); } @Test @@ -76,6 +76,6 @@ public void testGetPropertyWhenFeatureTypeDoesNotContainIt() { assertThrows( IllegalArgumentException.class, () -> getFeatureConfigurationFacade() - .getProperty(FeatureType.CASE_SURVEILANCE, CoreEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Boolean.class)); + .getProperty(FeatureType.CASE_SURVEILANCE, DeletableEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Boolean.class)); } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/symptoms/SymptomsServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/symptoms/SymptomsServiceTest.java index 4e7ca03ddf5..d0becc4e324 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/symptoms/SymptomsServiceTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/symptoms/SymptomsServiceTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import de.symeda.sormas.api.caze.CaseDataDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.symptoms.SymptomState; import de.symeda.sormas.api.symptoms.SymptomsDto; @@ -29,7 +29,7 @@ public class SymptomsServiceTest extends AbstractBeanTest { public void testCaseVisitAutomaticDeletion() { createDeletionConfigurations(); - DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getCoreEntityTypeConfig(CoreEntityType.CASE); + DeletionConfiguration coreEntityTypeConfig = getDeletionConfigurationService().getEntityTypeConfig(DeletableEntityType.CASE); TestDataCreator.RDCF rdcf = creator.createRDCF(); UserDto user = creator diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/util/DtoHelperTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/util/DtoHelperTest.java index 95bcf5282d9..0e2e6673e05 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/util/DtoHelperTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/util/DtoHelperTest.java @@ -18,8 +18,6 @@ import de.symeda.sormas.api.clinicalcourse.HealthConditionsDto; import de.symeda.sormas.api.exposure.ExposureDto; import de.symeda.sormas.api.exposure.ExposureType; -import de.symeda.sormas.api.infrastructure.facility.FacilityDto; -import de.symeda.sormas.api.infrastructure.facility.FacilityType; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.api.sample.SampleDto; @@ -27,6 +25,7 @@ import de.symeda.sormas.api.symptoms.SymptomsDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.utils.DtoCopyHelper; import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; @@ -56,7 +55,7 @@ public void testFillDto() { // lead has no value, other has sourceDto.setDiabetes(YesNoUnknown.YES); - DtoHelper.copyDtoValues(targetDto, sourceDto, false); + DtoCopyHelper.copyDtoValues(targetDto, sourceDto, false); // Check no values assertNull(targetDto.getHiv()); @@ -97,7 +96,7 @@ public void testFillDto() { targetDto.setSymptoms(targetSymptomsDto); sourceDto.setSymptoms(sourceSymptomsDto); - DtoHelper.copyDtoValues(targetDto, sourceDto, false); + DtoCopyHelper.copyDtoValues(targetDto, sourceDto, false); // Check no values assertNull(targetDto.getSymptoms().getBackache()); @@ -139,14 +138,14 @@ public void testFillDto() { sourceList2.add(subDto2); // Check no values - DtoHelper.copyDtoValues(targetDto, sourceDto, false); + DtoCopyHelper.copyDtoValues(targetDto, sourceDto, false); assertTrue(targetDto.getEpiData().getExposures().isEmpty()); // Check 'lead has still same entries' targetDto.getEpiData().setExposures(targetList1); sourceDto.getEpiData().setExposures(sourceList1); String existingUuid = targetList1.get(0).getUuid(); - DtoHelper.copyDtoValues(targetDto, sourceDto, false); + DtoCopyHelper.copyDtoValues(targetDto, sourceDto, false); assertEquals(targetList1.size(), targetDto.getEpiData().getExposures().size()); assertNotNull(targetDto.getEpiData().getExposures().get(0).getUuid()); @@ -156,7 +155,7 @@ public void testFillDto() { // Check 'lead has value, other has not' targetDto.getEpiData().setExposures(targetList2); sourceDto.getEpiData().setExposures(null); - DtoHelper.copyDtoValues(targetDto, sourceDto, false); + DtoCopyHelper.copyDtoValues(targetDto, sourceDto, false); assertNotNull(targetDto.getEpiData().getExposures().get(0).getUuid()); assertEquals(targetList2.size(), targetDto.getEpiData().getExposures().size()); @@ -166,7 +165,7 @@ public void testFillDto() { // Check 'lead has no value, other has' targetDto.getEpiData().setExposures(null); sourceDto.getEpiData().setExposures(sourceList2); - DtoHelper.copyDtoValues(targetDto, sourceDto, false); + DtoCopyHelper.copyDtoValues(targetDto, sourceDto, false); assertNotNull(targetDto.getEpiData().getExposures().get(0).getUuid()); assertEquals(sourceList2.size(), targetDto.getEpiData().getExposures().size()); @@ -186,7 +185,7 @@ public void testFillDto() { sourceDto.getRequestedPathogenTests().add(PathogenTestType.NEUTRALIZING_ANTIBODIES); SampleDto targetDto = SampleDto.build(user.toReference(), targetCaseDto.toReference()); - DtoHelper.copyDtoValues(targetDto, sourceDto, false); + DtoCopyHelper.copyDtoValues(targetDto, sourceDto, false); assertEquals(2, targetDto.getRequestedPathogenTests().size()); } @@ -206,24 +205,24 @@ public void testFillDto() { // Map must not be persisted because H2 can't map it to JSON sourceCase.setReinfectionDetails(map1); - DtoHelper.copyDtoValues(targetCase, sourceCase, false); + DtoCopyHelper.copyDtoValues(targetCase, sourceCase, false); assertEquals(3, targetCase.getReinfectionDetails().size()); sourceCase.getReinfectionDetails().put(ReinfectionDetail.PREVIOUS_ASYMPTOMATIC_INFECTION, false); sourceCase.getReinfectionDetails().put(ReinfectionDetail.TESTED_NEGATIVE_AFTER_PREVIOUS_INFECTION, true); - DtoHelper.copyDtoValues(targetCase, sourceCase, false); + DtoCopyHelper.copyDtoValues(targetCase, sourceCase, false); assertEquals(4, targetCase.getReinfectionDetails().size()); assertTrue(targetCase.getReinfectionDetails().get(ReinfectionDetail.PREVIOUS_ASYMPTOMATIC_INFECTION)); - DtoHelper.copyDtoValues(targetCase, sourceCase, true); + DtoCopyHelper.copyDtoValues(targetCase, sourceCase, true); assertEquals(4, targetCase.getReinfectionDetails().size()); assertFalse(targetCase.getReinfectionDetails().get(ReinfectionDetail.PREVIOUS_ASYMPTOMATIC_INFECTION)); sourceCase.setReinfectionDetails(null); - DtoHelper.copyDtoValues(targetCase, sourceCase, false); + DtoCopyHelper.copyDtoValues(targetCase, sourceCase, false); assertEquals(4, targetCase.getReinfectionDetails().size()); - DtoHelper.copyDtoValues(targetCase, sourceCase, true); + DtoCopyHelper.copyDtoValues(targetCase, sourceCase, true); assertEquals(4, targetCase.getReinfectionDetails().size()); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java index 477199033c8..3c36d6b9066 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/ControllerProvider.java @@ -37,9 +37,9 @@ import de.symeda.sormas.ui.person.PersonController; import de.symeda.sormas.ui.reports.aggregate.AggregateReportController; import de.symeda.sormas.ui.samples.AdditionalTestController; -import de.symeda.sormas.ui.samples.EnvironmentSampleController; import de.symeda.sormas.ui.samples.PathogenTestController; -import de.symeda.sormas.ui.samples.SampleController; +import de.symeda.sormas.ui.samples.environmentsample.EnvironmentSampleController; +import de.symeda.sormas.ui.samples.humansample.SampleController; import de.symeda.sormas.ui.sormastosormas.SormasToSormasController; import de.symeda.sormas.ui.statistics.StatisticsController; import de.symeda.sormas.ui.task.TaskController; @@ -267,6 +267,7 @@ public static DeleteRestoreController getDeleteRestoreController() { public static EnvironmentController getEnvironmentController() { return get().environmentController; } + public static PermanentDeleteController getPermanentDeleteController() { return get().permanentDeleteController; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java index ff067633984..d0c380e3202 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java @@ -21,7 +21,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.person.PersonContext; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.user.UserRight; @@ -60,7 +60,7 @@ protected void initView(String params) { DetailSubComponentWrapper componentWrapper = addComponentWrapper(editComponent); CustomLayout layout = addPageLayout(componentWrapper, editComponent); setSubComponent(componentWrapper); - addSideComponents(layout, CoreEntityType.CASE, caseData.getUuid(), person.toReference(), this::showUnsavedChangesPopup, isEditAllowed()); + addSideComponents(layout, DeletableEntityType.CASE, caseData.getUuid(), person.toReference(), this::showUnsavedChangesPopup, isEditAllowed()); setEditPermission( editComponent, UserProvider.getCurrent().hasUserRight(UserRight.PERSON_EDIT), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index a86a5185139..0a8c2619daa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -61,7 +61,7 @@ import de.symeda.sormas.api.caze.CaseExportType; import de.symeda.sormas.api.caze.CaseIndexDto; import de.symeda.sormas.api.caze.InvestigationStatus; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.docgeneneration.DocumentWorkflow; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; @@ -669,9 +669,9 @@ public HorizontalLayout createStatusFilterBar() { // Show active/archived/all dropdown if (Objects.nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasUserRight(UserRight.CASE_VIEW)) { - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CASE)) { + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CASE)) { int daysAfterCaseGetsArchived = FacadeProvider.getFeatureConfigurationFacade() - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CASE, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); if (daysAfterCaseGetsArchived > 0) { relevanceStatusInfoLabel = new Label( VaadinIcons.INFO_CIRCLE.getHtml() + " " diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java index 4e7d8bd2c2b..83c018ff09c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java @@ -20,7 +20,7 @@ import com.vaadin.ui.CustomLayout; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.person.PersonContext; import de.symeda.sormas.api.person.PersonDto; @@ -61,7 +61,13 @@ protected void initView(String params) { DetailSubComponentWrapper componentWrapper = addComponentWrapper(editComponent); CustomLayout layout = addPageLayout(componentWrapper, editComponent); setSubComponent(componentWrapper); - addSideComponents(layout, CoreEntityType.CONTACT, contact.getUuid(), person.toReference(), this::showUnsavedChangesPopup, isEditAllowed()); + addSideComponents( + layout, + DeletableEntityType.CONTACT, + contact.getUuid(), + person.toReference(), + this::showUnsavedChangesPopup, + isEditAllowed()); setEditPermission( editComponent, UserProvider.getCurrent().hasUserRight(UserRight.PERSON_EDIT), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java index f45c03b65e4..0790bebd581 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java @@ -52,7 +52,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.ReferenceDto; import de.symeda.sormas.api.bagexport.BAGExportContactDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactIndexDto; import de.symeda.sormas.api.contact.ContactStatus; @@ -461,9 +461,13 @@ public HorizontalLayout createStatusFilterBar() { // Show active/archived/all dropdown if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_VIEW)) { - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CONTACT)) { + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.CONTACT)) { int daysAfterContactGetsArchived = FacadeProvider.getFeatureConfigurationFacade() - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.CONTACT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty( + FeatureType.AUTOMATIC_ARCHIVING, + DeletableEntityType.CONTACT, + FeatureTypeProperty.THRESHOLD_IN_DAYS, + Integer.class); if (daysAfterContactGetsArchived > 0) { relevanceStatusInfoLabel = new Label( VaadinIcons.INFO_CIRCLE.getHtml() + " " diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentController.java index 2648d216244..f98dfe9eda7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentController.java @@ -209,5 +209,4 @@ public TitleLayout getEnvironmentViewTitleLayout(String uuid) { private EnvironmentDto findEnvironment(String uuid) { return FacadeProvider.getEnvironmentFacade().getByUuid(uuid); } - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataView.java index cd6cd4ae34a..bc68d85b5ce 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataView.java @@ -19,6 +19,7 @@ public class EnvironmentDataView extends AbstractEnvironmentView { public static final String VIEW_NAME = ROOT_VIEW_NAME + "/data"; public static final String TASKS_LOC = "tasks"; + public static final String SAMPLES_LOC = "samples"; private CommitDiscardWrapperComponent editComponent; private EnvironmentDto environment; @@ -47,7 +48,7 @@ protected void initView(String params) { setSubComponent(container); container.setEnabled(true); - LayoutWithSidePanel layout = new LayoutWithSidePanel(editComponent, TASKS_LOC); + LayoutWithSidePanel layout = new LayoutWithSidePanel(editComponent, TASKS_LOC, SAMPLES_LOC); container.addComponent(layout); boolean isEditAllowed = isEditAllowed(); @@ -60,6 +61,13 @@ protected void initView(String params) { layout.addSidePanelComponent(taskList, TASKS_LOC); } + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.SAMPLES_LAB) + && UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_VIEW)) { + EnvironmentSampleListComponent sampleList = new EnvironmentSampleListComponent(environment, isEditAllowed, this::showUnsavedChangesPopup); + sampleList.addStyleName(CssStyles.SIDE_COMPONENT); + layout.addSidePanelComponent(sampleList, SAMPLES_LOC); + } + final String uuid = environment.getUuid(); final EditPermissionType environmentEditAllowed = FacadeProvider.getEnvironmentFacade().getEditPermissionType(uuid); final boolean deleted = FacadeProvider.getEnvironmentFacade().isDeleted(uuid); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentSampleListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentSampleListComponent.java new file mode 100644 index 00000000000..2e2216468d2 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentSampleListComponent.java @@ -0,0 +1,202 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.environment; + +import java.util.List; +import java.util.function.Consumer; + +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.environment.EnvironmentDto; +import de.symeda.sormas.api.environment.EnvironmentReferenceDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleCriteria; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.sample.SpecimenCondition; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.DateFormatHelper; +import de.symeda.sormas.ui.utils.PaginationList; +import de.symeda.sormas.ui.utils.components.sidecomponent.SideComponent; +import de.symeda.sormas.ui.utils.components.sidecomponent.SideComponentField; + +public class EnvironmentSampleListComponent extends SideComponent { + + private static final long serialVersionUID = -4946315430355463915L; + + private final EnvironmentSampleList environmentSampleList; + + public EnvironmentSampleListComponent(EnvironmentDto environment, boolean isEditAllowed, Consumer actionCallback) { + super(I18nProperties.getString(Strings.entityEnvironmentSamples), actionCallback); + + if (isEditAllowed && UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_CREATE)) { + addCreateButton( + I18nProperties.getCaption(Captions.environmentSampleNewSample), + () -> ControllerProvider.getEnvironmentSampleController().create(environment, this::reload), + UserRight.ENVIRONMENT_SAMPLE_CREATE); + } + + environmentSampleList = new EnvironmentSampleList(environment.toReference(), isEditAllowed); + addComponent(environmentSampleList); + environmentSampleList.reload(); + } + + private void reload() { + environmentSampleList.reload(); + } + + class EnvironmentSampleList extends PaginationList { + + private static final long serialVersionUID = 8811945277567228049L; + private static final int MAX_DISPLAYED_ENTRIES = 5; + + private final EnvironmentReferenceDto environmentRef; + + private final boolean isEditAllowed; + + public EnvironmentSampleList(EnvironmentReferenceDto environmentRef, boolean isEditAllowed) { + super(MAX_DISPLAYED_ENTRIES); + this.environmentRef = environmentRef; + this.isEditAllowed = isEditAllowed; + } + + public void reload() { + List samples = FacadeProvider.getEnvironmentSampleFacade() + .getIndexList(new EnvironmentSampleCriteria().withEnvironment(environmentRef), null, null, null); + + setEntries(samples); + if (!samples.isEmpty()) { + showPage(1); + } else { + listLayout.removeAllComponents(); + updatePaginationLayout(); + Label noSamplesLabel = new Label(I18nProperties.getString(Strings.infoNoEnvironmentSamples)); + listLayout.addComponent(noSamplesLabel); + } + + } + + @Override + protected void drawDisplayedEntries() { + for (EnvironmentSampleIndexDto sample : getDisplayedEntries()) { + EnvironmentSampleListEntry listEntry = new EnvironmentSampleListEntry(sample); + + String sampleUuid = sample.getUuid(); + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT) && isEditAllowed) { + listEntry.addEditButton( + "edit-environment-sample-" + sampleUuid, + (Button.ClickListener) event -> ControllerProvider.getEnvironmentSampleController().navigateToSample(sampleUuid)); + } else { + listEntry.addViewButton( + "view-environment-sample" + sampleUuid, + (Button.ClickListener) event -> ControllerProvider.getEnvironmentSampleController().navigateToSample(sampleUuid)); + } + + listEntry.setEnabled(isEditAllowed); + + listLayout.addComponent(listEntry); + } + } + } + + class EnvironmentSampleListEntry extends SideComponentField { + + private static final long serialVersionUID = -7096062233938610947L; + + public EnvironmentSampleListEntry(EnvironmentSampleIndexDto sampleIndex) { + HorizontalLayout topLayout = new HorizontalLayout(); + topLayout.setWidth(100, Unit.PERCENTAGE); + topLayout.setMargin(false); + topLayout.setSpacing(false); + addComponentToField(topLayout); + + VerticalLayout topLeftLayout = new VerticalLayout(); + + topLeftLayout.setMargin(false); + topLeftLayout.setSpacing(false); + + Label materialLabel = new Label(DataHelper.toStringNullable(sampleIndex.getSampleMaterial())); + CssStyles.style(materialLabel, CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE); + materialLabel.setWidth(50, Unit.PERCENTAGE); + topLeftLayout.addComponent(materialLabel); + + if (sampleIndex.getSpecimenCondition() == SpecimenCondition.NOT_ADEQUATE) { + Label resultLabel = new Label(); + CssStyles.style(resultLabel, CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE); + + resultLabel.setValue(DataHelper.toStringNullable(sampleIndex.getSpecimenCondition())); + resultLabel.addStyleName(CssStyles.LABEL_WARNING); + + topLeftLayout.addComponent(resultLabel); + } + + Label dispatchReceiveLabel = new Label(); + CssStyles.style(dispatchReceiveLabel, CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE); + + if (sampleIndex.isReceived()) { + dispatchReceiveLabel.setValue( + I18nProperties.getCaption(Captions.environmentSampleReceived) + " " + DateFormatHelper.formatDate(sampleIndex.getReceivalDate())); + } else if (sampleIndex.isDispatched()) { + dispatchReceiveLabel.setValue( + I18nProperties.getCaption(Captions.environmentSampleShipped) + " " + + DateFormatHelper.formatDate((sampleIndex.getDispatchDate()))); + } else { + dispatchReceiveLabel.setValue(I18nProperties.getCaption(Captions.environmentSampleNotShipped)); + } + + topLeftLayout.addComponent(dispatchReceiveLabel); + + Label dateTimeLabel = new Label( + I18nProperties.getPrefixCaption(EnvironmentSampleIndexDto.I18N_PREFIX, EnvironmentSampleIndexDto.SAMPLE_DATE_TIME) + ": " + + DateFormatHelper.formatDate(sampleIndex.getSampleDateTime())); + topLeftLayout.addComponent(dateTimeLabel); + + Label labLabel = new Label(DataHelper.toStringNullable(sampleIndex.getLaboratory())); + topLeftLayout.addComponent(labLabel); + + Label testCountLabel = new Label( + I18nProperties.getPrefixCaption(EnvironmentSampleIndexDto.I18N_PREFIX, EnvironmentSampleIndexDto.NUMBER_OF_TESTS) + ": " + + sampleIndex.getNumberOfTests()); + topLeftLayout.addComponent(testCountLabel); + + if (sampleIndex.getNumberOfTests() > 0) { + VerticalLayout latestTestLayout = new VerticalLayout(); + latestTestLayout.setMargin(false); + latestTestLayout.setSpacing(false); + + Label heading = new Label(I18nProperties.getCaption(Captions.latestPathogenTest)); + CssStyles.style(heading, CssStyles.LABEL_BOLD); + + Label testDate = new Label(sampleIndex.getLatestPathogenTest()); + latestTestLayout.addComponents(heading, testDate); + topLeftLayout.addComponent(latestTestLayout); + } + + topLayout.addComponent(topLeftLayout); + topLayout.setComponentAlignment(topLeftLayout, Alignment.TOP_LEFT); + } + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantPersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantPersonView.java index c9373272595..2d516856ced 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantPersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantPersonView.java @@ -3,7 +3,7 @@ import com.vaadin.ui.CustomLayout; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventParticipantDto; import de.symeda.sormas.api.person.PersonContext; @@ -47,7 +47,7 @@ protected void initView(String params) { setSubComponent(componentWrapper); addSideComponents( layout, - CoreEntityType.EVENT_PARTICIPANT, + DeletableEntityType.EVENT_PARTICIPANT, eventParticipant.getUuid(), person.toReference(), this::showUnsavedChangesPopup, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java index b1561f9cd06..deff2038204 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java @@ -47,7 +47,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventParticipantCriteria; import de.symeda.sormas.api.event.EventParticipantIndexDto; @@ -369,11 +369,12 @@ public HorizontalLayout createStatusFilterBar() { // Show active/archived/all dropdown if (Objects.nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_VIEW)) { - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.EVENT_PARTICIPANT)) { + if (FacadeProvider.getFeatureConfigurationFacade() + .isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.EVENT_PARTICIPANT)) { int daysAfterEventParticipantGetsArchived = FacadeProvider.getFeatureConfigurationFacade() .getProperty( FeatureType.AUTOMATIC_ARCHIVING, - CoreEntityType.EVENT_PARTICIPANT, + DeletableEntityType.EVENT_PARTICIPANT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); if (daysAfterEventParticipantGetsArchived > 0) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java index dce6137d06a..dfd151ef9aa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java @@ -53,7 +53,7 @@ import de.symeda.sormas.api.action.ActionDto; import de.symeda.sormas.api.action.ActionStatus; import de.symeda.sormas.api.caze.CaseReferenceDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.event.EventActionExportDto; import de.symeda.sormas.api.event.EventActionIndexDto; import de.symeda.sormas.api.event.EventCriteria; @@ -502,10 +502,14 @@ public HorizontalLayout createStatusFilterBar() { }); actionButtonsLayout.addComponent(groupRelevanceStatusFilter); } else { - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.EVENT)) { + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.EVENT)) { int daysAfterEventGetsArchived = FacadeProvider.getFeatureConfigurationFacade() - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.EVENT, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty( + FeatureType.AUTOMATIC_ARCHIVING, + DeletableEntityType.EVENT, + FeatureTypeProperty.THRESHOLD_IN_DAYS, + Integer.class); if (daysAfterEventGetsArchived > 0) { relevanceStatusInfoLabel = new Label( VaadinIcons.INFO_CIRCLE.getHtml() + " " diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageProcessingFlow.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageProcessingFlow.java index 7518306de40..ad3feb8c804 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageProcessingFlow.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageProcessingFlow.java @@ -75,10 +75,10 @@ import de.symeda.sormas.ui.externalmessage.processing.EntrySelectionField; import de.symeda.sormas.ui.externalmessage.processing.ExternalMessageProcessingUIHelper; import de.symeda.sormas.ui.externalmessage.processing.PickOrCreateEntryResult; -import de.symeda.sormas.ui.samples.SampleController; -import de.symeda.sormas.ui.samples.SampleCreateForm; -import de.symeda.sormas.ui.samples.SampleEditPathogenTestListHandler; -import de.symeda.sormas.ui.samples.SampleSelectionField; +import de.symeda.sormas.ui.samples.humansample.SampleController; +import de.symeda.sormas.ui.samples.humansample.SampleCreateForm; +import de.symeda.sormas.ui.samples.humansample.SampleEditPathogenTestListHandler; +import de.symeda.sormas.ui.samples.humansample.SampleSelectionField; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.VaadinUiUtil; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/RelatedLabMessageHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/RelatedLabMessageHandler.java index 56752223523..3c5eb6f2499 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/RelatedLabMessageHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/labmessage/RelatedLabMessageHandler.java @@ -54,7 +54,7 @@ import de.symeda.sormas.ui.externalmessage.labmessage.processing.LabMessageProcessingHelper; import de.symeda.sormas.ui.person.PersonEditForm; import de.symeda.sormas.ui.samples.PathogenTestForm; -import de.symeda.sormas.ui.samples.SampleEditForm; +import de.symeda.sormas.ui.samples.humansample.SampleEditForm; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.CssStyles; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java index 50e70c23ee6..cf1186bdd85 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java @@ -69,10 +69,10 @@ import de.symeda.sormas.ui.externalmessage.labmessage.processing.SampleAndPathogenTests; import de.symeda.sormas.ui.samples.AbstractSampleForm; import de.symeda.sormas.ui.samples.CollapsiblePathogenTestForm; -import de.symeda.sormas.ui.samples.SampleController; -import de.symeda.sormas.ui.samples.SampleCreateForm; -import de.symeda.sormas.ui.samples.SampleEditForm; -import de.symeda.sormas.ui.samples.SampleEditPathogenTestListHandler; +import de.symeda.sormas.ui.samples.humansample.SampleController; +import de.symeda.sormas.ui.samples.humansample.SampleCreateForm; +import de.symeda.sormas.ui.samples.humansample.SampleEditForm; +import de.symeda.sormas.ui.samples.humansample.SampleEditPathogenTestListHandler; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.CssStyles; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java index 3f29e1cb532..44eed44587a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java @@ -3,7 +3,7 @@ import com.vaadin.ui.CustomLayout; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.immunization.ImmunizationDto; import de.symeda.sormas.api.person.PersonContext; import de.symeda.sormas.api.person.PersonDto; @@ -36,7 +36,7 @@ protected void initView(String params) { setSubComponent(componentWrapper); addSideComponents( layout, - CoreEntityType.IMMUNIZATION, + DeletableEntityType.IMMUNIZATION, immunzation.getUuid(), person.toReference(), this::showUnsavedChangesPopup, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationsView.java index 1bbda4f8c3e..f26f35d19d0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationsView.java @@ -13,7 +13,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.i18n.Captions; @@ -125,10 +125,14 @@ public HorizontalLayout createStatusFilterBar() { // Show active/archived/all dropdown if (Objects.nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasUserRight(UserRight.IMMUNIZATION_VIEW)) { - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.IMMUNIZATION)) { + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.IMMUNIZATION)) { int daysAfterTravelEntryGetsArchived = FacadeProvider.getFeatureConfigurationFacade() - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.IMMUNIZATION, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty( + FeatureType.AUTOMATIC_ARCHIVING, + DeletableEntityType.IMMUNIZATION, + FeatureTypeProperty.THRESHOLD_IN_DAYS, + Integer.class); if (daysAfterTravelEntryGetsArchived > 0) { relevanceStatusInfoLabel = new Label( VaadinIcons.INFO_CIRCLE.getHtml() + " " diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/location/LocationEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/location/LocationEditForm.java index 1094f5ff6b4..d7ddb3c7eec 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/location/LocationEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/location/LocationEditForm.java @@ -711,6 +711,9 @@ public void showAddressType() { addressType.setRequired(true); } + public void setDistrictRequired() { + setFieldsRequirement(true, LocationDto.REGION, LocationDto.DISTRICT); + } public void setDistrictRequiredOnDefaultCountry(boolean required) { this.districtRequiredOnDefaultCountry = required; if (required) { @@ -727,6 +730,10 @@ public void setCountryDisabledWithHint(String hint) { getContent().addComponent(infoLabel, COUNTRY_HINT_LOC); } + public void setGpsCoordinatesRequired() { + setFieldsRequirement(true, LocationDto.LATITUDE, LocationDto.LONGITUDE); + } + @Override protected String createHtmlLayout() { return HTML_LAYOUT; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSideComponentsElement.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSideComponentsElement.java index c60213279a7..695e4fa9de7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSideComponentsElement.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSideComponentsElement.java @@ -10,7 +10,7 @@ import de.symeda.sormas.api.CountryHelper; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseListEntryDto; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.contact.ContactListEntryDto; import de.symeda.sormas.api.event.EventParticipantListEntryDto; import de.symeda.sormas.api.feature.FeatureType; @@ -86,7 +86,7 @@ default CustomLayout addPageLayout(DetailSubComponentWrapper container, CommitDi default void addSideComponents( CustomLayout layout, - CoreEntityType entityType, + DeletableEntityType entityType, String entityUuid, PersonReferenceDto person, Consumer showUnsavedChangesPopup, @@ -101,7 +101,7 @@ default void addSideComponents( && currentUser != null && currentUser.hasUserRight(UserRight.CASE_VIEW)) { caseListComponent = - new CaseListComponent(person, entityType == CoreEntityType.CASE ? entityUuid : null, showUnsavedChangesPopup, isEditAllowed); + new CaseListComponent(person, entityType == DeletableEntityType.CASE ? entityUuid : null, showUnsavedChangesPopup, isEditAllowed); layout.addComponent(new SideComponentLayout(caseListComponent), CASES_LOC); } @@ -109,7 +109,11 @@ default void addSideComponents( && currentUser != null && currentUser.hasUserRight(UserRight.CONTACT_VIEW)) { contactListComponent = - new ContactListComponent(person, entityType == CoreEntityType.CONTACT ? entityUuid : null, showUnsavedChangesPopup, isEditAllowed); + new ContactListComponent( + person, + entityType == DeletableEntityType.CONTACT ? entityUuid : null, + showUnsavedChangesPopup, + isEditAllowed); layout.addComponent(new SideComponentLayout(contactListComponent), CONTACTS_LOC); } @@ -119,7 +123,7 @@ default void addSideComponents( && currentUser.hasUserRight(UserRight.EVENTPARTICIPANT_VIEW)) { eventParticipantListComponent = new EventParticipantListComponent( person, - entityType == CoreEntityType.EVENT_PARTICIPANT ? entityUuid : null, + entityType == DeletableEntityType.EVENT_PARTICIPANT ? entityUuid : null, showUnsavedChangesPopup, isEditAllowed); layout.addComponent(new SideComponentLayout(eventParticipantListComponent), EVENT_PARTICIPANTS_LOC); @@ -163,7 +167,7 @@ && getClass().equals(PersonDataView.class)) { new SideComponentLayout( new TravelEntryListComponent( travelEntryListCriteria, - entityType == CoreEntityType.TRAVEL_ENTRY ? entityUuid : null, + entityType == DeletableEntityType.TRAVEL_ENTRY ? entityUuid : null, showUnsavedChangesPopup, isEditAllowed)), TRAVEL_ENTRIES_LOC); @@ -178,7 +182,7 @@ && getClass().equals(PersonDataView.class)) { new SideComponentLayout( new ImmunizationListComponent( () -> new ImmunizationListCriteria.Builder(person).build(), - entityType == CoreEntityType.IMMUNIZATION ? entityUuid : null, + entityType == DeletableEntityType.IMMUNIZATION ? entityUuid : null, showUnsavedChangesPopup, isEditAllowed)), IMMUNIZATION_LOC); @@ -187,7 +191,7 @@ && getClass().equals(PersonDataView.class)) { new SideComponentLayout( new VaccinationListComponent( () -> new VaccinationCriteria.Builder(person).build(), - entityType == CoreEntityType.IMMUNIZATION ? entityUuid : null, + entityType == DeletableEntityType.IMMUNIZATION ? entityUuid : null, showUnsavedChangesPopup, false, isEditAllowed)), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java index 7e819a7d1ae..ae3a8d91dd9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java @@ -35,6 +35,7 @@ import de.symeda.sormas.ui.caze.CaseDataView; import de.symeda.sormas.ui.contact.ContactDataView; import de.symeda.sormas.ui.events.EventParticipantDataView; +import de.symeda.sormas.ui.samples.humansample.SampleDataView; import de.symeda.sormas.ui.utils.AbstractDetailView; @SuppressWarnings("serial") diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java deleted file mode 100644 index 43e37b21ec2..00000000000 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleController.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package de.symeda.sormas.ui.samples; - -import java.util.Collection; -import java.util.List; -import java.util.function.Consumer; - -import org.apache.commons.collections.CollectionUtils; - -import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; -import de.symeda.sormas.ui.ControllerProvider; -import de.symeda.sormas.ui.utils.DeleteRestoreHandlers; - -public class EnvironmentSampleController { - - public EnvironmentSampleController() { - // do nothing - } - - public void deleteAllSelectedItems( - Collection selectedRows, - EnvironmentSampleGrid sampleGrid, - Runnable noEntriesRemainingCallback) { - - ControllerProvider.getDeleteRestoreController() - .deleteAllSelectedItems( - selectedRows, - DeleteRestoreHandlers.forEnvironmentSample(), - bulkOperationCallback(sampleGrid, noEntriesRemainingCallback)); - - } - - public void restoreSelectedSamples( - Collection selectedRows, - EnvironmentSampleGrid sampleGrid, - Runnable noEntriesRemainingCallback) { - - ControllerProvider.getDeleteRestoreController() - .restoreSelectedItems( - selectedRows, - DeleteRestoreHandlers.forEnvironmentSample(), - bulkOperationCallback(sampleGrid, noEntriesRemainingCallback)); - } - - private Consumer> bulkOperationCallback(EnvironmentSampleGrid sampleGrid, Runnable noEntriesRemainingCallback) { - return remainingSamples -> { - sampleGrid.reload(); - if (CollectionUtils.isNotEmpty(remainingSamples)) { - sampleGrid.asMultiSelect().selectItems(remainingSamples.toArray(new EnvironmentSampleIndexDto[0])); - } else { - noEntriesRemainingCallback.run(); - } - }; - } - -} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleCreateForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleCreateForm.java deleted file mode 100644 index bb5251bccdb..00000000000 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleCreateForm.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.symeda.sormas.ui.samples; - -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.sample.SampleDto; -import de.symeda.sormas.api.sample.SamplePurpose; -import de.symeda.sormas.ui.utils.NullableOptionGroup; - -public class SampleCreateForm extends AbstractSampleForm { - - private static final long serialVersionUID = 1L; - - public SampleCreateForm(Disease disease) { - super(SampleDto.class, SampleDto.I18N_PREFIX, disease, null); - } - - @SuppressWarnings("deprecation") - @Override - protected void addFields() { - addCommonFields(); - initializeRequestedTestFields(); - addValidators(); - setVisibilities(); - - addValueChangeListener(e -> { - defaultValueChangeListener(); - final NullableOptionGroup samplePurposeField = getField(SampleDto.SAMPLE_PURPOSE); - samplePurposeField.setValue(SamplePurpose.EXTERNAL); - }); - } - - @Override - protected String createHtmlLayout() { - return SAMPLE_COMMON_HTML_LAYOUT; - } -} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java index 171cb06f4c0..748bc2d584a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java @@ -24,11 +24,13 @@ public abstract class SampleGridComponent extends VerticalLayout { - abstract ReloadableGrid getGrid(); + private static final long serialVersionUID = 2805771019861077651L; - abstract MenuBar getBulkOperationsDropdown(); + public abstract ReloadableGrid getGrid(); - abstract C getCriteria(); + public abstract MenuBar getBulkOperationsDropdown(); + + public abstract C getCriteria(); public void reload(ViewChangeListener.ViewChangeEvent event) { String params = event.getParameters().trim(); @@ -40,5 +42,5 @@ public void reload(ViewChangeListener.ViewChangeEvent event) { getGrid().reload(); } - abstract void updateFilterComponents(); + public abstract void updateFilterComponents(); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java index fe95a12a547..65b648d1ed7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java @@ -52,6 +52,9 @@ import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.samples.environmentsample.EnvironmentSampleGridComponent; +import de.symeda.sormas.ui.samples.humansample.HumanSampleGrid; +import de.symeda.sormas.ui.samples.humansample.HumanSampleGridComponent; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java new file mode 100644 index 00000000000..e6f88dfa217 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java @@ -0,0 +1,183 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples.environmentsample; + +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; + +import org.apache.commons.collections.CollectionUtils; + +import com.vaadin.server.Sizeable; +import com.vaadin.ui.Component; +import com.vaadin.ui.Notification; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto; +import de.symeda.sormas.api.environment.EnvironmentDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleFacade; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; +import de.symeda.sormas.api.event.EventParticipantDto; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DtoCopyHelper; +import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.SormasUI; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.samples.SamplesView; +import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; +import de.symeda.sormas.ui.utils.DateFormatHelper; +import de.symeda.sormas.ui.utils.DeleteRestoreHandlers; +import de.symeda.sormas.ui.utils.VaadinUiUtil; +import de.symeda.sormas.ui.utils.components.automaticdeletion.DeletionLabel; +import de.symeda.sormas.ui.utils.components.page.title.TitleLayout; + +public class EnvironmentSampleController { + + public void deleteAllSelectedItems( + Collection selectedRows, + EnvironmentSampleGrid sampleGrid, + Runnable noEntriesRemainingCallback) { + + ControllerProvider.getDeleteRestoreController() + .deleteAllSelectedItems( + selectedRows, + DeleteRestoreHandlers.forEnvironmentSample(), + bulkOperationCallback(sampleGrid, noEntriesRemainingCallback)); + + } + + public void restoreSelectedSamples( + Collection selectedRows, + EnvironmentSampleGrid sampleGrid, + Runnable noEntriesRemainingCallback) { + + ControllerProvider.getDeleteRestoreController() + .restoreSelectedItems( + selectedRows, + DeleteRestoreHandlers.forEnvironmentSample(), + bulkOperationCallback(sampleGrid, noEntriesRemainingCallback)); + } + + private Consumer> bulkOperationCallback(EnvironmentSampleGrid sampleGrid, Runnable noEntriesRemainingCallback) { + return remainingSamples -> { + sampleGrid.reload(); + if (CollectionUtils.isNotEmpty(remainingSamples)) { + sampleGrid.asMultiSelect().selectItems(remainingSamples.toArray(new EnvironmentSampleIndexDto[0])); + } else { + noEntriesRemainingCallback.run(); + } + }; + } + + public CommitDiscardWrapperComponent getEditComponent(EnvironmentSampleDto sample) { + + EnvironmentSampleFacade environmentSampleFacade = FacadeProvider.getEnvironmentSampleFacade(); + String sampleUuid = sample.getUuid(); + DeletionInfoDto automaticDeletionInfoDto = environmentSampleFacade.getAutomaticDeletionInfo(sampleUuid); + DeletionInfoDto manuallyDeletionInfoDto = environmentSampleFacade.getManuallyDeletionInfo(sampleUuid); + + EnvironmentSampleEditForm editForm = new EnvironmentSampleEditForm(sample.isPseudonymized(), false); + editForm.setValue(sample); + editForm.setWidth(100, Sizeable.Unit.PERCENTAGE); + + CommitDiscardWrapperComponent editComponent = + new CommitDiscardWrapperComponent<>(editForm, editForm.getFieldGroup()); + editComponent.getButtonsPanel() + .addComponentAsFirst( + new DeletionLabel(automaticDeletionInfoDto, manuallyDeletionInfoDto, sample.isDeleted(), EventParticipantDto.I18N_PREFIX)); + + editComponent.addCommitListener(() -> { + if (!editForm.getFieldGroup().isModified()) { + EnvironmentSampleDto editedSample = editForm.getValue(); + FacadeProvider.getEnvironmentSampleFacade().save(editedSample); + + Notification.show(I18nProperties.getString(Strings.messageEnvironmentSampleSaved), Notification.Type.WARNING_MESSAGE); + SormasUI.refreshView(); + } + }); + + if (sample.isDeleted()) { + editComponent.getWrappedComponent().getField(EnvironmentSampleDto.DELETION_REASON).setVisible(true); + if (editComponent.getWrappedComponent().getField(EnvironmentSampleDto.DELETION_REASON).getValue() == DeletionReason.OTHER_REASON) { + editComponent.getWrappedComponent().getField(EnvironmentSampleDto.OTHER_DELETION_REASON).setVisible(true); + } + } + + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_DELETE)) { + editComponent.addDeleteWithReasonOrRestoreListener( + SamplesView.VIEW_NAME, + null, + I18nProperties.getString(Strings.entityEnvironmentSample), + sampleUuid, + FacadeProvider.getEnvironmentSampleFacade()); + } + + editComponent.restrictEditableComponentsOnEditView( + UserRight.ENVIRONMENT_SAMPLE_EDIT, + null, + UserRight.ENVIRONMENT_SAMPLE_DELETE, + null, + FacadeProvider.getEnvironmentSampleFacade().getEditPermissionType(sampleUuid), + sample.isInJurisdiction()); + + return editComponent; + } + + public Component getEditViewTitleLayout(String uuid) { + EnvironmentSampleDto sample = FacadeProvider.getEnvironmentSampleFacade().getByUuid(uuid); + + TitleLayout titleLayout = new TitleLayout(); + titleLayout.addRow(DataHelper.getShortUuid(sample.getUuid())); + titleLayout.addRow(DateFormatHelper.formatDate(sample.getSampleDateTime())); + + String mainRowText = EnvironmentSampleReferenceDto.buildCaption(sample.getSampleMaterial(), sample.getEnvironment().getUuid()); + titleLayout.addMainRow(mainRowText); + + return titleLayout; + } + + public void navigateToSample(String uuid) { + String navigationState = EnvironmentSampleDataView.VIEW_NAME + "/" + uuid; + SormasUI.get().getNavigator().navigateTo(navigationState); + } + + public void create(EnvironmentDto environment, Runnable callback) { + EnvironmentSampleEditForm createForm = new EnvironmentSampleEditForm(false, true); + EnvironmentSampleDto newSample = EnvironmentSampleDto.build(environment.toReference(), UserProvider.getCurrent().getUserReference()); + DtoCopyHelper.copyDtoValues(newSample.getLocation(), environment.getLocation(), false); + createForm.setValue(newSample); + final CommitDiscardWrapperComponent editView = new CommitDiscardWrapperComponent<>( + createForm, + UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT), + createForm.getFieldGroup()); + + editView.addCommitListener(() -> { + if (!createForm.getFieldGroup().isModified()) { + EnvironmentSampleDto dto = createForm.getValue(); + FacadeProvider.getEnvironmentSampleFacade().save(dto); + callback.run(); + } + }); + + VaadinUiUtil.showModalPopupWindow(editView, I18nProperties.getString(Strings.headingCreateNewTask)); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java new file mode 100644 index 00000000000..91b1aca4675 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java @@ -0,0 +1,112 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples.environmentsample; + +import com.vaadin.navigator.ViewChangeListener; + +import de.symeda.sormas.api.EditPermissionType; +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.SubMenu; +import de.symeda.sormas.ui.environment.EnvironmentDataView; +import de.symeda.sormas.ui.samples.SamplesView; +import de.symeda.sormas.ui.utils.AbstractDetailView; +import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; +import de.symeda.sormas.ui.utils.DetailSubComponentWrapper; +import de.symeda.sormas.ui.utils.LayoutWithSidePanel; + +public class EnvironmentSampleDataView extends AbstractDetailView { + + public static final String ROOT_VIEW_NAME = SamplesView.VIEW_NAME; + + public static final String VIEW_NAME = ROOT_VIEW_NAME + "/environment"; + private CommitDiscardWrapperComponent editComponent; + + public EnvironmentSampleDataView() { + super(VIEW_NAME); + } + + @Override + public void enter(ViewChangeListener.ViewChangeEvent event) { + + super.enter(event); + initOrRedirect(event); + } + + @Override + protected EnvironmentSampleReferenceDto getReferenceByUuid(String uuid) { + final EnvironmentSampleReferenceDto reference; + if (FacadeProvider.getEnvironmentSampleFacade().exists(uuid)) { + reference = FacadeProvider.getEnvironmentSampleFacade().getReferenceByUuid(uuid); + } else { + reference = null; + } + return reference; + } + + @Override + protected String getRootViewName() { + return ROOT_VIEW_NAME; + } + + @Override + protected void initView(String params) { + setHeightUndefined(); + + String sampleUuid = getReference().getUuid(); + EnvironmentSampleDto sample = FacadeProvider.getEnvironmentSampleFacade().getByUuid(sampleUuid); + EditPermissionType editPermission = FacadeProvider.getEnvironmentSampleFacade().getEditPermissionType(sampleUuid); + editComponent = ControllerProvider.getEnvironmentSampleController().getEditComponent(sample); + + DetailSubComponentWrapper container = new DetailSubComponentWrapper(() -> editComponent); + container.setWidth(100, Unit.PERCENTAGE); + container.setMargin(true); + + LayoutWithSidePanel layout = new LayoutWithSidePanel(editComponent); + container.addComponent(layout); + + setSubComponent(container); + + layout.disableIfNecessary(sample.isDeleted(), editPermission); + editComponent.setEnabled(isEditAllowed()); + } + + @Override + public void refreshMenu(SubMenu menu, String params) { + if (!findReferenceByParams(params)) { + return; + } + EnvironmentSampleDto sample = FacadeProvider.getEnvironmentSampleFacade().getByUuid(params); + + menu.removeAllViews(); + menu.addView(SamplesView.VIEW_NAME, I18nProperties.getCaption(Captions.sampleSamplesList)); + menu.addView(EnvironmentDataView.VIEW_NAME, I18nProperties.getString(Strings.entityEnvironment), sample.getEnvironment().getUuid(), true); + + menu.addView(VIEW_NAME, I18nProperties.getCaption(EnvironmentSampleDto.I18N_PREFIX), params); + + setMainHeaderComponent(ControllerProvider.getEnvironmentSampleController().getEditViewTitleLayout(getReference().getUuid())); + } + + private boolean isEditAllowed() { + return FacadeProvider.getEnvironmentSampleFacade().isEditAllowed(getReference().getUuid()); + } + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java new file mode 100644 index 00000000000..c8302e9402e --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java @@ -0,0 +1,324 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples.environmentsample; + +import static de.symeda.sormas.ui.utils.CssStyles.H3; +import static de.symeda.sormas.ui.utils.CssStyles.H4; +import static de.symeda.sormas.ui.utils.LayoutUtil.fluidRowLocs; +import static de.symeda.sormas.ui.utils.LayoutUtil.loc; + +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.stream.Collectors; + +import org.jetbrains.annotations.NotNull; + +import com.vaadin.ui.Component; +import com.vaadin.ui.Label; +import com.vaadin.v7.data.Validator; +import com.vaadin.v7.data.util.converter.Converter; +import com.vaadin.v7.ui.ComboBox; +import com.vaadin.v7.ui.Field; +import com.vaadin.v7.ui.OptionGroup; +import com.vaadin.v7.ui.TextArea; +import com.vaadin.v7.ui.TextField; +import com.vaadin.v7.ui.VerticalLayout; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.customizableenum.CustomizableEnum; +import de.symeda.sormas.api.customizableenum.CustomizableEnumType; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleMaterial; +import de.symeda.sormas.api.environment.environmentsample.WeatherCondition; +import de.symeda.sormas.api.event.EventDto; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.infrastructure.facility.FacilityDto; +import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; +import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.location.LocationEditForm; +import de.symeda.sormas.ui.utils.AbstractEditForm; +import de.symeda.sormas.ui.utils.CheckBoxTree; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.DateFormatHelper; +import de.symeda.sormas.ui.utils.FieldHelper; +import de.symeda.sormas.ui.utils.NullableOptionGroup; + +public class EnvironmentSampleEditForm extends AbstractEditForm { + + private static final String LABORATORY_SAMPLE_HEADING_LOC = "labeSampleHeadingLoc"; + private static final String REPORT_INFO_LOC = "reportInfoLoc"; + private static final String SAMPLE_MEASUREMENTS_HEADING_LOC = "sampleMeasurementsHeadingLoc"; + private static final String LOCATION_HEADING_LOC = "locationHeadingLoc"; + private static final String SAMPLE_MANAGEMENT_HEADING_LOC = "sampleManagementHeadingLoc"; + private static final String REQUESTED_PATHOGENS_SUBHEADING_LOC = "requestedPathogensSubheadingLoc"; + private static final String HTML_LAYOUT = loc(LABORATORY_SAMPLE_HEADING_LOC) + + fluidRowLocs(3, EnvironmentSampleDto.UUID, 3, EnvironmentSampleDto.ENVIRONMENT, 6, REPORT_INFO_LOC) + + fluidRowLocs(EnvironmentSampleDto.SAMPLE_DATE_TIME, "") + + fluidRowLocs(EnvironmentSampleDto.SAMPLE_MATERIAL, EnvironmentSampleDto.OTHER_SAMPLE_MATERIAL) + + fluidRowLocs(EnvironmentSampleDto.FIELD_SAMPLE_ID, "") + + loc(SAMPLE_MEASUREMENTS_HEADING_LOC) + + fluidRowLocs(EnvironmentSampleDto.SAMPLE_VOLUME, EnvironmentSampleDto.TURBIDITY) + + fluidRowLocs(EnvironmentSampleDto.SAMPLE_TEMPERATURE, EnvironmentSampleDto.CHLORINE_RESIDUALS) + + fluidRowLocs(EnvironmentSampleDto.PH_VALUE, "") + + fluidRowLocs(EnvironmentSampleDto.WEATHER_CONDITIONS, EnvironmentSampleDto.HEAVY_RAIN) + + loc(LOCATION_HEADING_LOC) + + loc(EnvironmentSampleDto.LOCATION) + + loc(SAMPLE_MANAGEMENT_HEADING_LOC) + + fluidRowLocs(EnvironmentSampleDto.LABORATORY, EnvironmentSampleDto.LABORATORY_DETAILS) + + fluidRowLocs(REQUESTED_PATHOGENS_SUBHEADING_LOC) + + fluidRowLocs(EnvironmentSampleDto.REQUESTED_PATHOGEN_TESTS) + + fluidRowLocs(EnvironmentSampleDto.OTHER_REQUESTED_PATHOGEN_TESTS) + + fluidRowLocs(EnvironmentSampleDto.DISPATCHED, "") + + fluidRowLocs(EnvironmentSampleDto.DISPATCH_DATE, EnvironmentSampleDto.DISPATCH_DETAILS) + + fluidRowLocs(EnvironmentSampleDto.RECEIVED, "") + + fluidRowLocs(EnvironmentSampleDto.RECEIVAL_DATE, EnvironmentSampleDto.LAB_SAMPLE_ID) + + fluidRowLocs(EnvironmentSampleDto.SPECIMEN_CONDITION, "") + + fluidRowLocs(EnvironmentSampleDto.GENERAL_COMMENT) + + fluidRowLocs(CaseDataDto.DELETION_REASON) + + fluidRowLocs(CaseDataDto.OTHER_DELETION_REASON); + + private static final List RECEIVAL_FIELDS = Arrays.asList( + EnvironmentSampleDto.RECEIVED, + EnvironmentSampleDto.RECEIVAL_DATE, + EnvironmentSampleDto.LAB_SAMPLE_ID, + EnvironmentSampleDto.SPECIMEN_CONDITION); + + private CheckBoxTree weatherConditionCheckBoxTree; + + private final boolean isCreate; + + public EnvironmentSampleEditForm(boolean isPseudonymized, boolean isCreate) { + super( + EnvironmentSampleDto.class, + EnvironmentSampleDto.I18N_PREFIX, + false, + FieldVisibilityCheckers.getNoop(), + UiFieldAccessCheckers.getDefault(isPseudonymized)); + this.isCreate = isCreate; + addFields(); + addValueChangeListener(e -> defaultValueChangeListener((EnvironmentSampleDto) e.getProperty().getValue())); + } + + @NotNull + private static Label buildHeadingLabel(String stringProperty) { + Label labSampleHeadingLabel = new Label(I18nProperties.getString(stringProperty)); + labSampleHeadingLabel.addStyleName(H3); + return labSampleHeadingLabel; + } + + @NotNull + private static Label buildSubHeadingLabel(String stringProperty) { + Label labSampleHeadingLabel = new Label(I18nProperties.getString(stringProperty)); + labSampleHeadingLabel.addStyleName(H4); + return labSampleHeadingLabel; + } + + @Override + protected String createHtmlLayout() { + return HTML_LAYOUT; + } + + @Override + protected void addFields() { + getContent().addComponent(buildHeadingLabel(Strings.headingLaboratoryEnvironmentSample), LABORATORY_SAMPLE_HEADING_LOC); + addField(EnvironmentSampleDto.UUID).setReadOnly(true); + addField(EnvironmentSampleDto.ENVIRONMENT).setReadOnly(true); + + addField(EnvironmentSampleDto.SAMPLE_DATE_TIME).setRequired(true); + addField(EnvironmentSampleDto.SAMPLE_MATERIAL).setRequired(true); + addField(EnvironmentSampleDto.OTHER_SAMPLE_MATERIAL); + FieldHelper.setVisibleWhen( + getFieldGroup(), + EnvironmentSampleDto.OTHER_SAMPLE_MATERIAL, + EnvironmentSampleDto.SAMPLE_MATERIAL, + EnvironmentSampleMaterial.OTHER, + true); + FieldHelper.setRequiredWhen( + getFieldGroup(), + EnvironmentSampleDto.SAMPLE_MATERIAL, + Collections.singletonList(EnvironmentSampleDto.OTHER_SAMPLE_MATERIAL), + Collections.singletonList(EnvironmentSampleMaterial.OTHER)); + addField(EnvironmentSampleDto.FIELD_SAMPLE_ID); + + getContent().addComponent(buildHeadingLabel(Strings.headingEnvironmentSampleMeasurements), SAMPLE_MEASUREMENTS_HEADING_LOC); + + TextField sampleVolumeField = addField(EnvironmentSampleDto.SAMPLE_VOLUME); + sampleVolumeField.setConversionError(I18nProperties.getValidationError(Validations.onlyNumbersAllowed, sampleVolumeField.getCaption())); + + TextField turbidityField = addField(EnvironmentSampleDto.TURBIDITY); + turbidityField.setConversionError(I18nProperties.getValidationError(Validations.onlyNumbersAllowed, turbidityField.getCaption())); + + TextField temperatureField = addField(EnvironmentSampleDto.SAMPLE_TEMPERATURE); + temperatureField.setConversionError(I18nProperties.getValidationError(Validations.onlyNumbersAllowed, temperatureField.getCaption())); + + TextField chlorineResidualsField = addField(EnvironmentSampleDto.CHLORINE_RESIDUALS); + chlorineResidualsField + .setConversionError(I18nProperties.getValidationError(Validations.onlyNumbersAllowed, chlorineResidualsField.getCaption())); + + TextField phValueField = addField(EnvironmentSampleDto.PH_VALUE); + phValueField.setConversionError(I18nProperties.getValidationError(Validations.onlyNumbersAllowed, phValueField.getCaption())); + + final Component weatherConditionsLayout = buildWeatherConditionComponent(); + getContent().addComponent(weatherConditionsLayout, EnvironmentSampleDto.WEATHER_CONDITIONS); + + addField(EnvironmentSampleDto.HEAVY_RAIN, NullableOptionGroup.class); + + getContent().addComponent(buildHeadingLabel(Strings.headingEnvironmentSampleLocation), LOCATION_HEADING_LOC); + LocationEditForm locationForm = addField(EnvironmentSampleDto.LOCATION, LocationEditForm.class); + locationForm.setCaption(null); + locationForm.setDistrictRequired(); + locationForm.setGpsCoordinatesRequired(); + + getContent().addComponent(buildHeadingLabel(Strings.headingEnvironmentSampleManagement), SAMPLE_MANAGEMENT_HEADING_LOC); + + ComboBox laboratoryField = addField(EnvironmentSampleDto.LABORATORY); + laboratoryField.setRequired(true); + FieldHelper.updateItems(laboratoryField, FacadeProvider.getFacilityFacade().getAllActiveLaboratories(true)); + + Field labDetailsField = addField(EnvironmentSampleDto.LABORATORY_DETAILS); + labDetailsField.setVisible(false); + laboratoryField.addValueChangeListener(event -> { + if (event.getProperty().getValue() != null + && ((FacilityReferenceDto) event.getProperty().getValue()).getUuid().equals(FacilityDto.OTHER_FACILITY_UUID)) { + labDetailsField.setVisible(true); + } else { + labDetailsField.setVisible(false); + labDetailsField.clear(); + } + }); + + getContent().addComponent(buildSubHeadingLabel(Strings.headingEnvironmentSampleRequestedPathogenTests), REQUESTED_PATHOGENS_SUBHEADING_LOC); + OptionGroup requestedPathogenTestsField = addField(EnvironmentSampleDto.REQUESTED_PATHOGEN_TESTS, OptionGroup.class); + CssStyles.style(requestedPathogenTestsField, CssStyles.OPTIONGROUP_CHECKBOXES_HORIZONTAL); + requestedPathogenTestsField.setMultiSelect(true); + List pathogens = FacadeProvider.getCustomizableEnumFacade() + .getEnumValues(CustomizableEnumType.PATHOGEN, null) + .stream() + // Remove default "OTHER" pathogen because it's covered by a separate field + .filter(pathogen -> !pathogen.getValue().equals("OTHER")) + .collect(Collectors.toList()); + requestedPathogenTestsField.addItems(pathogens); + requestedPathogenTestsField.setCaption(null); + + addField(EnvironmentSampleDto.OTHER_REQUESTED_PATHOGEN_TESTS); + + Field dispatchedField = addField(EnvironmentSampleDto.DISPATCHED); + dispatchedField.addStyleName(CssStyles.VSPACE_3); + + addField(EnvironmentSampleDto.DISPATCH_DATE); + addField(EnvironmentSampleDto.DISPATCH_DETAILS); + FieldHelper.setVisibleWhen( + getFieldGroup(), + Arrays.asList(EnvironmentSampleDto.DISPATCH_DATE, EnvironmentSampleDto.DISPATCH_DETAILS), + EnvironmentSampleDto.DISPATCHED, + true, + true); + + Field receivedField = addField(EnvironmentSampleDto.RECEIVED); + receivedField.addStyleName(CssStyles.VSPACE_3); + + addField(EnvironmentSampleDto.RECEIVAL_DATE); + addField(EnvironmentSampleDto.LAB_SAMPLE_ID); + FieldHelper.setVisibleWhen( + getFieldGroup(), + Arrays.asList(EnvironmentSampleDto.RECEIVAL_DATE, EnvironmentSampleDto.LAB_SAMPLE_ID), + EnvironmentSampleDto.RECEIVED, + true, + true); + + addField(EnvironmentSampleDto.SPECIMEN_CONDITION); + + addField(EnvironmentSampleDto.GENERAL_COMMENT, TextArea.class).setRows(3); + + addField(EventDto.DELETION_REASON); + addField(EventDto.OTHER_DELETION_REASON, TextArea.class).setRows(3); + setVisible(false, EventDto.DELETION_REASON, EventDto.OTHER_DELETION_REASON); + + initializeAccessAndAllowedAccesses(); + disableFieldsBasedOnRights(); + } + + private void disableFieldsBasedOnRights() { + boolean hasEditReceivalRight = UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL); + boolean hasEditDispatchRight = UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH); + getFieldGroup().getFields().forEach(f -> { + if (f.isEnabled()) { + String propertyId = f.getId(); + boolean isReceivalField = RECEIVAL_FIELDS.contains(propertyId); + boolean canEdit = EnvironmentSampleDto.GENERAL_COMMENT.equals(propertyId) + || (isReceivalField ? hasEditReceivalRight : isCreate || hasEditDispatchRight); + + if (!canEdit) { + f.setEnabled(false); + } + } + }); + if (!isCreate && !hasEditDispatchRight) { + weatherConditionCheckBoxTree.setEnabled(false); + } + } + + @Override + public void commit() throws SourceException, Validator.InvalidValueException { + super.commit(); + getValue().setWeatherConditions(weatherConditionCheckBoxTree.getValues()); + } + + @Override + public void setValue(EnvironmentSampleDto newFieldValue) throws ReadOnlyException, Converter.ConversionException { + super.setValue(newFieldValue); + weatherConditionCheckBoxTree.setValues(newFieldValue.getWeatherConditions()); + weatherConditionCheckBoxTree.initCheckboxes(); + } + + @NotNull + private Component buildWeatherConditionComponent() { + final VerticalLayout weatherConditionsLayout = new VerticalLayout(); + CssStyles.style(weatherConditionsLayout, CssStyles.VSPACE_3); + Label weatherConditionsLabel = + new Label(I18nProperties.getPrefixCaption(EnvironmentSampleDto.I18N_PREFIX, EnvironmentSampleDto.WEATHER_CONDITIONS)); + CssStyles.style(weatherConditionsLabel, CssStyles.VAADIN_CAPTION); + weatherConditionsLayout.addComponent(weatherConditionsLabel); + weatherConditionCheckBoxTree = new CheckBoxTree<>( + Arrays.stream(WeatherCondition.values()).map(c -> new CheckBoxTree.CheckBoxElement<>(null, c)).collect(Collectors.toList())); + weatherConditionCheckBoxTree.setValues(new EnumMap<>(WeatherCondition.class)); + weatherConditionsLayout.addComponent(weatherConditionCheckBoxTree); + return weatherConditionsLayout; + } + + protected void defaultValueChangeListener(EnvironmentSampleDto sample) { + StringBuilder reportInfoText = new StringBuilder().append(I18nProperties.getString(Strings.reportedOn)) + .append(" ") + .append(DateFormatHelper.formatLocalDateTime(sample.getReportDate())); + UserReferenceDto reportingUser = sample.getReportingUser(); + if (reportingUser != null) { + reportInfoText.append(" ").append(I18nProperties.getString(Strings.by)).append(" ").append(reportingUser.buildCaption()); + } + + Label reportInfoLabel = new Label(reportInfoText.toString()); + reportInfoLabel.setEnabled(false); + getContent().addComponent(reportInfoLabel, REPORT_INFO_LOC); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGrid.java similarity index 93% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGrid.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGrid.java index 28209295e52..98e04b91b3e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGrid.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.ui.samples; +package de.symeda.sormas.ui.samples.environmentsample; import java.util.Date; @@ -29,12 +29,16 @@ import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.samples.SamplesView; +import de.symeda.sormas.ui.samples.SamplesViewConfiguration; import de.symeda.sormas.ui.utils.BooleanRenderer; import de.symeda.sormas.ui.utils.DateFormatHelper; import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; import de.symeda.sormas.ui.utils.ReloadableGrid; +import de.symeda.sormas.ui.utils.ShowDetailsListener; import de.symeda.sormas.ui.utils.UuidRenderer; public class EnvironmentSampleGrid extends ReloadableGrid { @@ -105,6 +109,11 @@ public EnvironmentSampleGrid(EnvironmentSampleCriteria criteria) { } } + addItemClickListener( + new ShowDetailsListener<>( + EnvironmentSampleIndexDto.UUID, + e -> ControllerProvider.getEnvironmentSampleController().navigateToSample(e.getUuid()))); + if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { setCriteria(criteria); setEagerDataProvider(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGridComponent.java similarity index 98% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGridComponent.java index b53beb9bc05..390d478cf73 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGridComponent.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.ui.samples; +package de.symeda.sormas.ui.samples.environmentsample; import java.util.HashMap; @@ -35,6 +35,8 @@ import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.samples.SampleGridComponent; +import de.symeda.sormas.ui.samples.SamplesView; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.ComboBoxHelper; import de.symeda.sormas.ui.utils.CssStyles; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGridFilterForm.java similarity index 99% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridFilterForm.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGridFilterForm.java index 1ad069e055d..b922e1f68f9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/EnvironmentSampleGridFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGridFilterForm.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.ui.samples; +package de.symeda.sormas.ui.samples.environmentsample; import static de.symeda.sormas.ui.utils.LayoutUtil.filterLocs; import static de.symeda.sormas.ui.utils.LayoutUtil.loc; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGrid.java similarity index 97% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGrid.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGrid.java index c45a8ddcd88..c5693e470a4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGrid.java @@ -1,21 +1,18 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ -package de.symeda.sormas.ui.samples; + */ +package de.symeda.sormas.ui.samples.humansample; import static java.util.Objects.nonNull; @@ -39,6 +36,8 @@ import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.samples.SamplesView; +import de.symeda.sormas.ui.samples.SamplesViewConfiguration; import de.symeda.sormas.ui.utils.BooleanRenderer; import de.symeda.sormas.ui.utils.DateFormatHelper; import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGridComponent.java similarity index 97% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGridComponent.java index d6b544c105a..fce4ca16533 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/HumanSampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGridComponent.java @@ -1,21 +1,18 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ -package de.symeda.sormas.ui.samples; + */ +package de.symeda.sormas.ui.samples.humansample; import java.util.Arrays; import java.util.HashMap; @@ -35,10 +32,13 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.sample.SampleAssociationType; import de.symeda.sormas.api.sample.SampleCriteria; +import de.symeda.sormas.api.sample.SampleIndexDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.samples.SampleGridComponent; +import de.symeda.sormas.ui.samples.SamplesView; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.ComboBoxHelper; import de.symeda.sormas.ui.utils.CssStyles; @@ -46,7 +46,7 @@ import de.symeda.sormas.ui.utils.MenuBarHelper; @SuppressWarnings("serial") -public class HumanSampleGridComponent extends SampleGridComponent { +public class HumanSampleGridComponent extends SampleGridComponent { private static final String NOT_SHIPPED = "notShipped"; private static final String SHIPPED = "shipped"; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleController.java similarity index 97% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleController.java index 74e32d5f9f0..db51ea45869 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleController.java @@ -1,21 +1,18 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ -package de.symeda.sormas.ui.samples; + */ +package de.symeda.sormas.ui.samples.humansample; import static de.symeda.sormas.ui.utils.CssStyles.VSPACE_NONE; import static java.util.Objects.isNull; @@ -78,6 +75,13 @@ import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; +import de.symeda.sormas.ui.samples.AbstractSampleForm; +import de.symeda.sormas.ui.samples.CollapsiblePathogenTestForm; +import de.symeda.sormas.ui.samples.PathogenTestForm; +import de.symeda.sormas.ui.samples.SampleViewType; +import de.symeda.sormas.ui.samples.SamplesView; +import de.symeda.sormas.ui.samples.SamplesViewConfiguration; +import de.symeda.sormas.ui.samples.environmentsample.EnvironmentSampleDataView; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.ConfirmationComponent; @@ -98,6 +102,7 @@ public SampleController() { public void registerViews(Navigator navigator) { navigator.addView(SamplesView.VIEW_NAME, SamplesView.class); navigator.addView(SampleDataView.VIEW_NAME, SampleDataView.class); + navigator.addView(EnvironmentSampleDataView.VIEW_NAME, EnvironmentSampleDataView.class); } public void navigateToData(String sampleUuid) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleCreateForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleCreateForm.java new file mode 100644 index 00000000000..841d368fd98 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleCreateForm.java @@ -0,0 +1,51 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples.humansample; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.sample.SampleDto; +import de.symeda.sormas.api.sample.SamplePurpose; +import de.symeda.sormas.ui.samples.AbstractSampleForm; +import de.symeda.sormas.ui.utils.NullableOptionGroup; + +public class SampleCreateForm extends AbstractSampleForm { + + private static final long serialVersionUID = 1L; + + public SampleCreateForm(Disease disease) { + super(SampleDto.class, SampleDto.I18N_PREFIX, disease, null); + } + + @SuppressWarnings("deprecation") + @Override + protected void addFields() { + addCommonFields(); + initializeRequestedTestFields(); + addValidators(); + setVisibilities(); + + addValueChangeListener(e -> { + defaultValueChangeListener(); + final NullableOptionGroup samplePurposeField = getField(SampleDto.SAMPLE_PURPOSE); + samplePurposeField.setValue(SamplePurpose.EXTERNAL); + }); + } + + @Override + protected String createHtmlLayout() { + return SAMPLE_COMMON_HTML_LAYOUT; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleDataView.java similarity index 97% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleDataView.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleDataView.java index 57dec8fd929..ca3ccebf95f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleDataView.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2021 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -12,7 +12,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.symeda.sormas.ui.samples; +package de.symeda.sormas.ui.samples.humansample; import java.util.function.Consumer; @@ -39,6 +39,8 @@ import de.symeda.sormas.ui.caze.CaseInfoLayout; import de.symeda.sormas.ui.contact.ContactInfoLayout; import de.symeda.sormas.ui.events.EventParticipantInfoLayout; +import de.symeda.sormas.ui.samples.AbstractSampleView; +import de.symeda.sormas.ui.samples.AdditionalTestListComponent; import de.symeda.sormas.ui.samples.pathogentestlink.PathogenTestListComponent; import de.symeda.sormas.ui.sormastosormas.SormasToSormasListComponent; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditForm.java similarity index 94% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleEditForm.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditForm.java index 722693a9980..8bc11a9fc0e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditForm.java @@ -1,21 +1,18 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ -package de.symeda.sormas.ui.samples; + */ +package de.symeda.sormas.ui.samples.humansample; import static de.symeda.sormas.ui.utils.CssStyles.H3; import static de.symeda.sormas.ui.utils.LayoutUtil.loc; @@ -42,6 +39,7 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.samples.AbstractSampleForm; import de.symeda.sormas.ui.utils.FieldHelper; public class SampleEditForm extends AbstractSampleForm { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleEditPathogenTestListHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditPathogenTestListHandler.java similarity index 96% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleEditPathogenTestListHandler.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditPathogenTestListHandler.java index 1cd6943844e..bef6f496c85 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleEditPathogenTestListHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditPathogenTestListHandler.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.ui.samples; +package de.symeda.sormas.ui.samples.humansample; import java.util.ArrayList; import java.util.List; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleGridFilterForm.java similarity index 90% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridFilterForm.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleGridFilterForm.java index 696a530846b..10b029773c9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleGridFilterForm.java @@ -1,4 +1,19 @@ -package de.symeda.sormas.ui.samples; +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples.humansample; import static de.symeda.sormas.ui.utils.LayoutUtil.loc; @@ -34,7 +49,7 @@ public class SampleGridFilterForm extends AbstractFilterForm { private static final long serialVersionUID = 829016959284536683L; - protected SampleGridFilterForm() { + public SampleGridFilterForm() { super(SampleCriteria.class, SampleIndexDto.I18N_PREFIX); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleSelectionField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleSelectionField.java similarity index 88% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleSelectionField.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleSelectionField.java index b784a34d914..e794140d00a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleSelectionField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleSelectionField.java @@ -1,4 +1,19 @@ -package de.symeda.sormas.ui.samples; +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples.humansample; import java.util.List; import java.util.function.Consumer; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleSelectionGrid.java similarity index 71% rename from sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleSelectionGrid.java rename to sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleSelectionGrid.java index 99f38a947a5..2688cf0fb1f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleSelectionGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleSelectionGrid.java @@ -1,4 +1,19 @@ -package de.symeda.sormas.ui.samples; +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.ui.samples.humansample; import java.util.List; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java index 6e2483642da..2304063a458 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java @@ -19,7 +19,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.i18n.Captions; @@ -192,10 +192,14 @@ public HorizontalLayout createStatusFilterBar() { // Show active/archived/all dropdown if (Objects.nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasUserRight(UserRight.TRAVEL_ENTRY_VIEW)) { - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.TRAVEL_ENTRY)) { + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.TRAVEL_ENTRY)) { int daysAfterTravelEntryGetsArchived = FacadeProvider.getFeatureConfigurationFacade() - .getProperty(FeatureType.AUTOMATIC_ARCHIVING, CoreEntityType.TRAVEL_ENTRY, FeatureTypeProperty.THRESHOLD_IN_DAYS, Integer.class); + .getProperty( + FeatureType.AUTOMATIC_ARCHIVING, + DeletableEntityType.TRAVEL_ENTRY, + FeatureTypeProperty.THRESHOLD_IN_DAYS, + Integer.class); if (daysAfterTravelEntryGetsArchived > 0) { relevanceStatusInfoLabel = new Label( VaadinIcons.INFO_CIRCLE.getHtml() + " " diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java index 2b69c56230e..eb79eef3b63 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java @@ -3,7 +3,7 @@ import com.vaadin.ui.CustomLayout; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.person.PersonContext; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.travelentry.TravelEntryDto; @@ -42,7 +42,7 @@ protected void initView(String params) { setSubComponent(componentWrapper); addSideComponents( layout, - CoreEntityType.TRAVEL_ENTRY, + DeletableEntityType.TRAVEL_ENTRY, travelEntry.getUuid(), person.toReference(), this::showUnsavedChangesPopup, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CommitDiscardWrapperComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CommitDiscardWrapperComponent.java index 2bfaeaa0921..c937bef352e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CommitDiscardWrapperComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CommitDiscardWrapperComponent.java @@ -60,6 +60,7 @@ import com.vaadin.v7.ui.TextArea; import de.symeda.sormas.api.CoreFacade; +import de.symeda.sormas.api.DeletableFacade; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.event.EventDto; @@ -852,18 +853,23 @@ public void addDeleteWithReasonOrRestoreListener( } } - public void addDeleteWithReasonOrRestoreListener(String viewName, String details, String entityName, String entityUuid, CoreFacade coreFacade) { + public void addDeleteWithReasonOrRestoreListener( + String viewName, + String details, + String entityName, + String entityUuid, + DeletableFacade deletableFacade) { - final boolean deleted = coreFacade.isDeleted(entityUuid); + final boolean deleted = deletableFacade.isDeleted(entityUuid); if (deleteWithDetailsListeners.isEmpty()) { buttonsPanel.addComponent(getDeleteWithReasonOrRestoreButton(entityName, deleted, details), 0); } if (!deleted) { - deleteWithDetailsListeners.add((deleteDetails) -> coreFacade.delete(entityUuid, deleteDetails)); + deleteWithDetailsListeners.add((deleteDetails) -> deletableFacade.delete(entityUuid, deleteDetails)); } else { - deleteWithDetailsListeners.add((deleteDetails) -> coreFacade.restore(entityUuid)); + deleteWithDetailsListeners.add((deleteDetails) -> deletableFacade.restore(entityUuid)); } deleteWithDetailsListeners.add((deleteDetails) -> UI.getCurrent().getNavigator().navigateTo(viewName)); } @@ -1005,7 +1011,7 @@ public void restrictEditableComponentsOnEditView( if (isInJurisdiction && isUserRightAllowed(deleteEntityRight)) { addToActiveButtonsList(CommitDiscardWrapperComponent.DELETE_RESTORE); } - if (isInJurisdiction && isUserRightAllowed(archiveEntityRight)) { + if (isInJurisdiction && archiveEntityRight != null && isUserRightAllowed(archiveEntityRight)) { addToActiveButtonsList(ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java index f7c7b7cb481..de55e280646 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java @@ -80,6 +80,7 @@ private CssStyles() { public static final String INDENT_LEFT_3 = "indent-left-3"; public static final String VAADIN_LABEL = "v-label"; + public static final String VAADIN_CAPTION = "v-caption"; public static final String FIELD_WRAPPER = "fieldwrapper"; public static final String FIELD_EXTRA_INFO = "fieldextrainfo"; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/NotBlankTextValidator.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/NotBlankTextValidator.java index e3bba634357..165ea9e238b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/NotBlankTextValidator.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/NotBlankTextValidator.java @@ -4,20 +4,19 @@ import com.vaadin.v7.data.validator.AbstractValidator; -public class NotBlankTextValidator extends AbstractValidator { +public class NotBlankTextValidator extends AbstractValidator { public NotBlankTextValidator(String errorMessage) { super(errorMessage); } @Override - protected boolean isValidValue(String s) { - - return StringUtils.isNotBlank(s); + protected boolean isValidValue(Object s) { + return s != null && s.getClass().isAssignableFrom(String.class) ? StringUtils.isNotBlank((String) s) : s != null; } @Override - public Class getType() { - return String.class; + public Class getType() { + return Object.class; } } diff --git a/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index 1ac1a0f0c1d..d957575d77a 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -57,7 +57,7 @@ import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportFacade; import de.symeda.sormas.api.clinicalcourse.ClinicalCourseFacade; import de.symeda.sormas.api.clinicalcourse.ClinicalVisitFacade; -import de.symeda.sormas.api.common.CoreEntityType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.customizableenum.CustomizableEnumFacade; import de.symeda.sormas.api.dashboard.DashboardFacade; import de.symeda.sormas.api.dashboard.sample.SampleDashboardFacade; @@ -404,18 +404,18 @@ private void initUserRole(UserRole userRole) { } protected void createDeletionConfigurations() { - createDeletionConfigurations(CoreEntityType.CASE); - createDeletionConfigurations(CoreEntityType.CONTACT); - createDeletionConfigurations(CoreEntityType.EVENT); - createDeletionConfigurations(CoreEntityType.EVENT_PARTICIPANT); - createDeletionConfigurations(CoreEntityType.IMMUNIZATION); - createDeletionConfigurations(CoreEntityType.TRAVEL_ENTRY); + createDeletionConfigurations(DeletableEntityType.CASE); + createDeletionConfigurations(DeletableEntityType.CONTACT); + createDeletionConfigurations(DeletableEntityType.EVENT); + createDeletionConfigurations(DeletableEntityType.EVENT_PARTICIPANT); + createDeletionConfigurations(DeletableEntityType.IMMUNIZATION); + createDeletionConfigurations(DeletableEntityType.TRAVEL_ENTRY); } - private void createDeletionConfigurations(CoreEntityType coreEntityType) { + private void createDeletionConfigurations(DeletableEntityType deletableEntityType) { DeletionConfigurationService deletionConfigurationService = getBean(DeletionConfigurationService.class); - deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(coreEntityType, DeletionReference.CREATION, 3650)); - deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(coreEntityType, DeletionReference.MANUAL_DELETION, 90)); + deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(deletableEntityType, DeletionReference.CREATION, 3650)); + deletionConfigurationService.ensurePersisted(DeletionConfiguration.build(deletableEntityType, DeletionReference.MANUAL_DELETION, 90)); } public ConfigFacade getConfigFacade() { diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageUiHelperUnitTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageUiHelperUnitTest.java index aae24455ac0..475421b61a9 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageUiHelperUnitTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/LabMessageUiHelperUnitTest.java @@ -31,7 +31,7 @@ import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.sample.SampleDto; import de.symeda.sormas.api.user.UserReferenceDto; -import de.symeda.sormas.ui.samples.SampleCreateForm; +import de.symeda.sormas.ui.samples.humansample.SampleCreateForm; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; public class LabMessageUiHelperUnitTest { diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/samples/SampleControllerTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/samples/SampleControllerTest.java index 3ee76081543..61e27cae154 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/samples/SampleControllerTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/samples/SampleControllerTest.java @@ -20,6 +20,7 @@ import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.ui.AbstractUiBeanTest; +import de.symeda.sormas.ui.samples.humansample.SampleController; public class SampleControllerTest extends AbstractUiBeanTest { From 791b8ad5beaecc377d464da25e1121f2f438a026 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 21 Sep 2023 15:38:53 +0200 Subject: [PATCH 120/144] HSP-6250 Stabilize - Automate "Bulk sending cases from SORMAS to "Meldesoftware" -changed user --- .../src/test/resources/features/sanity/web/DemisWeb.feature | 2 +- .../src/test/resources/features/sanity/web/Survnet.feature | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature index 575bfbff6df..97ef51966c6 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature @@ -645,7 +645,7 @@ Scenario: Create and send laboratory request via Demis Scenario: Demis - Process a Physician Report[2] Given API : Login to DEMIS server When I create and send Laboratory Notification for physician report - And I log in as a Admin User + And I log in as a S2SUser And I click on the Messages button from navbar And I click on fetch messages button And I filter by last created person via API in Messages Directory diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature index 22907e73452..21ca78ed93f 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Survnet.feature @@ -54,7 +54,7 @@ Feature: Survnet tests @tmsLink=SORQA-1011 Scenario: Automate "Bulk sending cases from SORMAS to "Meldesoftware" - Given I log in as a Admin User + Given I log in as a Survnet When I click on the Cases button from navbar And I click on the NEW CASE button And I create a new case with mandatory data only and specific sex for Survnet DE From 0510894b215394cd2c15d1122ab08b41fdbc5546 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Thu, 21 Sep 2023 16:40:37 +0300 Subject: [PATCH 121/144] #11566 Add an environment sample grid to the web app - change caption --- .../src/main/java/de/symeda/sormas/api/i18n/Captions.java | 2 +- sormas-api/src/main/resources/captions.properties | 2 +- .../src/main/java/de/symeda/sormas/ui/samples/SamplesView.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index 05a0de13e19..f1db298d0aa 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -1513,6 +1513,7 @@ public interface Captions { String HealthConditions_otherConditions = "HealthConditions.otherConditions"; String HealthConditions_sickleCellDisease = "HealthConditions.sickleCellDisease"; String HealthConditions_tuberculosis = "HealthConditions.tuberculosis"; + String humanSampleViewType = "humanSampleViewType"; String Immunization = "Immunization"; String Immunization_additionalDetails = "Immunization.additionalDetails"; String Immunization_ageAndBirthDate = "Immunization.ageAndBirthDate"; @@ -2117,7 +2118,6 @@ public interface Captions { String sampleSamplesList = "sampleSamplesList"; String sampleShipped = "sampleShipped"; String sampleSpecimenNotAdequate = "sampleSpecimenNotAdequate"; - String sampleViewType = "sampleViewType"; String selectOtherSample = "selectOtherSample"; String selectSimilarSample = "selectSimilarSample"; String sex = "sex"; diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index d01e62759fc..ee7780443bc 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -2872,6 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample +humanSampleViewType=Human environmentSampleViewType=Environment environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java index 65b648d1ed7..537fb5e541f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SamplesView.java @@ -127,7 +127,7 @@ private void addViewSwitch() { CssStyles.OPTIONGROUP_HORIZONTAL_PRIMARY, CssStyles.VSPACE_TOP_3); viewViewSwitch.addItem(SampleViewType.HUMAN); - viewViewSwitch.setItemCaption(SampleViewType.HUMAN, I18nProperties.getCaption(Captions.sampleViewType)); + viewViewSwitch.setItemCaption(SampleViewType.HUMAN, I18nProperties.getCaption(Captions.humanSampleViewType)); viewViewSwitch.addItem(SampleViewType.ENVIRONMENT); viewViewSwitch.setItemCaption(SampleViewType.ENVIRONMENT, I18nProperties.getCaption(Captions.environmentSampleViewType)); From a42e660fcf569b3f14b1c12a3753e2e94096f2b5 Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Thu, 21 Sep 2023 13:51:24 +0000 Subject: [PATCH 122/144] [GitHub Actions] Update openAPI spec files --- sormas-rest/swagger.json | 12 ++++++++++++ sormas-rest/swagger.yaml | 15 +++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index 0744f8cbae9..e2573d61ee2 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -16050,6 +16050,13 @@ "type" : "string", "format" : "date-time" }, + "deleted" : { + "type" : "boolean" + }, + "deletionReason" : { + "type" : "string", + "enum" : [ "GDPR", "DELETION_REQUEST", "CREATED_WITH_NO_LEGAL_REASON", "TRANSFERRED_RESPONSIBILITY", "DUPLICATE_ENTRIES", "OTHER_REASON" ] + }, "dispatchDate" : { "type" : "string", "format" : "date-time" @@ -16098,6 +16105,11 @@ "location" : { "$ref" : "#/components/schemas/LocationDto" }, + "otherDeletionReason" : { + "type" : "string", + "maxLength" : 1000000, + "minLength" : 0 + }, "otherRequestedPathogenTests" : { "type" : "string", "maxLength" : 1000000, diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index c351f9209b4..ce80baa20bd 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -14112,6 +14112,17 @@ components: creationDate: type: string format: date-time + deleted: + type: boolean + deletionReason: + type: string + enum: + - GDPR + - DELETION_REQUEST + - CREATED_WITH_NO_LEGAL_REASON + - TRANSFERRED_RESPONSIBILITY + - DUPLICATE_ENTRIES + - OTHER_REASON dispatchDate: type: string format: date-time @@ -14151,6 +14162,10 @@ components: minLength: 0 location: $ref: '#/components/schemas/LocationDto' + otherDeletionReason: + type: string + maxLength: 1000000 + minLength: 0 otherRequestedPathogenTests: type: string maxLength: 1000000 From d39dd89fa190201aaf732e3420e7c5f869d63496 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 21 Sep 2023 16:03:04 +0200 Subject: [PATCH 123/144] HSP-6250 Stabilize - Automate "Bulk sending cases from SORMAS to "Meldesoftware" -updated user name --- .../src/test/resources/features/sanity/web/DemisWeb.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature index 97ef51966c6..46738a89c90 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature @@ -645,7 +645,7 @@ Scenario: Create and send laboratory request via Demis Scenario: Demis - Process a Physician Report[2] Given API : Login to DEMIS server When I create and send Laboratory Notification for physician report - And I log in as a S2SUser + And I log in as a S2S And I click on the Messages button from navbar And I click on fetch messages button And I filter by last created person via API in Messages Directory From b1cf308247a601c52eed2293f90908e0eb3f7990 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Thu, 21 Sep 2023 18:17:45 +0300 Subject: [PATCH 124/144] #12467 - Add pathogen tests to environment samples --- .../EnvironmentSampleDto.java | 4 + .../EnvironmentSampleIndexDto.java | 6 + .../EnvironmentSampleReferenceDto.java | 9 ++ .../sormas/api/sample/PathogenTestDto.java | 35 +++++- .../sormas/api/sample/PathogenTestFacade.java | 3 + .../app/backend/common/DatabaseHelper.java | 7 +- .../EnvironmentSampleDtoHelper.java | 9 ++ .../app/backend/sample/PathogenTest.java | 25 +++- .../backend/sample/PathogenTestCriteria.java | 12 ++ .../app/backend/sample/PathogenTestDao.java | 17 +++ .../backend/sample/PathogenTestDtoHelper.java | 19 ++- .../EnvironmentSampleSection.java | 3 +- .../edit/EnvironmentSampleEditActivity.java | 10 +- ...entSampleEditPathogenTestListFragment.java | 109 ++++++++++++++++++ .../read/EnvironmentSampleReadActivity.java | 3 + ...entSampleReadPathogenTestListFragment.java | 98 ++++++++++++++++ .../edit/PathogenTestEditActivity.java | 81 +++++++------ .../edit/PathogenTestEditFragment.java | 11 +- .../edit/PathogenTestNewActivity.java | 97 ++++++++++------ .../list/PathogenTestListViewModel.java | 9 ++ .../sormas/app/rest/SynchronizeDataAsync.java | 60 +++++----- .../de/symeda/sormas/app/util/Bundler.java | 14 ++- .../environmentsample/EnvironmentSample.java | 14 +++ .../EnvironmentSampleFacadeEjb.java | 43 +++++++ .../EnvironmentSampleService.java | 13 +++ .../sormas/backend/sample/PathogenTest.java | 13 ++- .../backend/sample/PathogenTestFacadeEjb.java | 60 +++++++--- .../backend/sample/PathogenTestService.java | 27 ++++- .../src/main/resources/sql/sormas_schema.sql | 9 ++ .../rest/resources/PathogenTestResource.java | 6 +- .../ui/samples/PathogenTestController.java | 69 ++++++++++- .../sormas/ui/samples/PathogenTestForm.java | 34 +++++- .../EnvironmentSampleDataView.java | 11 +- .../pathogentestlink/PathogenTestList.java | 19 ++- .../PathogenTestListComponent.java | 17 +++ 35 files changed, 820 insertions(+), 156 deletions(-) create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditPathogenTestListFragment.java create mode 100644 sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadPathogenTestListFragment.java diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java index 2616e85b00a..16654a782d3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleDto.java @@ -392,4 +392,8 @@ public String getOtherDeletionReason() { public void setOtherDeletionReason(String otherDeletionReason) { this.otherDeletionReason = otherDeletionReason; } + + public EnvironmentSampleReferenceDto toReference() { + return new EnvironmentSampleReferenceDto(getUuid()); + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java index 78f6c2cf80a..33d71afb3b6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java @@ -97,6 +97,7 @@ public EnvironmentSampleIndexDto( String otherSampleMaterial, DeletionReason deletionReason, String otherDeletionReason, + int numberOfTests, boolean isInJurisdiction) { super(uuid); this.fieldSampleId = fieldSampleId; @@ -114,6 +115,7 @@ public EnvironmentSampleIndexDto( this.otherSampleMaterial = otherSampleMaterial; this.deletionReason = deletionReason; this.otherDeletionReason = otherDeletionReason; + this.numberOfTests = numberOfTests; setInJurisdiction(isInJurisdiction); } @@ -181,6 +183,10 @@ public long getNumberOfTests() { return numberOfTests; } + public void setNumberOfTests(long numberOfTests) { + this.numberOfTests = numberOfTests; + } + public DeletionReason getDeletionReason() { return deletionReason; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java index 6ba85e3168a..1f4a9c74bb5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java @@ -26,10 +26,19 @@ public class EnvironmentSampleReferenceDto extends ReferenceDto { private static final long serialVersionUID = -2590392329041969693L; + public EnvironmentSampleReferenceDto() { + + } + public EnvironmentSampleReferenceDto(String uuid) { super(uuid); } + public EnvironmentSampleReferenceDto(String uuid, String caption) { + setUuid(uuid); + setCaption(caption); + } + public EnvironmentSampleReferenceDto(String uuid, EnvironmentSampleMaterial sampleMaterial, String environmentUuid) { super(uuid, buildCaption(sampleMaterial, environmentUuid)); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java index c5c5ad2d3b7..d6f8037ada2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java @@ -26,6 +26,8 @@ import de.symeda.sormas.api.ImportIgnore; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.disease.DiseaseVariant; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto; @@ -92,8 +94,8 @@ public class PathogenTestDto extends PseudonymizableDto { public static final String PRESCRIBER_CITY = "prescriberCity"; public static final String PRESCRIBER_COUNTRY = "prescriberCountry"; - @NotNull(message = Validations.validSample) private SampleReferenceDto sample; + private EnvironmentSampleReferenceDto environmentSample; @NotNull(message = Validations.validDisease) private Disease testedDisease; private DiseaseVariant testedDiseaseVariant; @@ -214,6 +216,28 @@ public static PathogenTestDto build(SampleReferenceDto sample, UserReferenceDto return pathogenTest; } + public static PathogenTestDto build(EnvironmentSampleDto environmentSample, UserDto currentUser) { + PathogenTestDto pathogenTest = new PathogenTestDto(); + pathogenTest.setUuid(DataHelper.createUuid()); + pathogenTest.setEnvironmentSample(environmentSample.toReference()); + + pathogenTest.setLab(currentUser.getLaboratory()); + if (pathogenTest.getLab() == null) { + pathogenTest.setLab(environmentSample.getLaboratory()); + pathogenTest.setLabDetails(environmentSample.getLaboratoryDetails()); + } + pathogenTest.setLabUser(currentUser.toReference()); + return pathogenTest; + } + + public static PathogenTestDto build(EnvironmentSampleReferenceDto environmentSample, UserReferenceDto currentUser) { + PathogenTestDto pathogenTest = new PathogenTestDto(); + pathogenTest.setUuid(DataHelper.createUuid()); + pathogenTest.setEnvironmentSample(environmentSample); + pathogenTest.setLabUser(currentUser); + return pathogenTest; + } + @ImportIgnore public SampleReferenceDto getSample() { return sample; @@ -223,6 +247,15 @@ public void setSample(SampleReferenceDto sample) { this.sample = sample; } + @ImportIgnore + public EnvironmentSampleReferenceDto getEnvironmentSample() { + return environmentSample; + } + + public void setEnvironmentSample(EnvironmentSampleReferenceDto environmentSample) { + this.environmentSample = environmentSample; + } + public Disease getTestedDisease() { return testedDisease; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestFacade.java index 199fb059622..87e537c11e0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestFacade.java @@ -25,6 +25,7 @@ import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -35,6 +36,8 @@ public interface PathogenTestFacade { List getAllBySample(SampleReferenceDto sampleRef); + List getAllByEnvironmentSample(EnvironmentSampleReferenceDto environmentSampleRef); + PathogenTestDto getByUuid(String uuid); PathogenTestDto savePathogenTest(@Valid PathogenTestDto dto); diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java index c58df05e54d..1b99f053178 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/DatabaseHelper.java @@ -190,7 +190,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public static final String DATABASE_NAME = "sormas.db"; // any time you make changes to your database objects, you may have to increase the database version - public static final int DATABASE_VERSION = 352; + public static final int DATABASE_VERSION = 353; private static DatabaseHelper instance = null; @@ -3132,6 +3132,11 @@ public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int currentVersion = 351; getDao(EnvironmentSample.class).executeRaw("ALTER TABLE environmentSamples ADD COLUMN reportDate TIMESTAMP;"); + case 352: + currentVersion = 352; + getDao(PathogenTest.class) + .executeRaw("ALTER TABLE pathogentest ADD COLUMN environmentSample_id BIGINT REFERENCES environmentSamples(id);"); + // ATTENTION: break should only be done after last version break; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java index 7397e3abf1a..a3c2955e57f 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/environment/environmentsample/EnvironmentSampleDtoHelper.java @@ -4,6 +4,7 @@ import de.symeda.sormas.api.PostResponse; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.app.backend.common.AdoDtoHelper; import de.symeda.sormas.app.backend.common.DatabaseHelper; import de.symeda.sormas.app.backend.environment.EnvironmentDtoHelper; @@ -117,4 +118,12 @@ protected void fillInnerFromAdo(EnvironmentSampleDto target, EnvironmentSample s protected long getApproximateJsonSizeInBytes() { return EnvironmentSampleDto.APPROXIMATE_JSON_SIZE_IN_BYTES; } + + public static EnvironmentSampleReferenceDto toReferenceDto(EnvironmentSample ado) { + if (ado == null) { + return null; + } + + return new EnvironmentSampleReferenceDto(ado.getUuid()); + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTest.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTest.java index f3bbf6c6f45..297530a5aae 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTest.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTest.java @@ -18,12 +18,6 @@ import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_BIG; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_DEFAULT; -import com.j256.ormlite.field.DataType; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; - -import org.apache.commons.lang3.StringUtils; - import java.util.Date; import javax.persistence.Column; @@ -32,6 +26,12 @@ import javax.persistence.Enumerated; import javax.persistence.Transient; +import org.apache.commons.lang3.StringUtils; + +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.customizableenum.CustomizableEnumType; import de.symeda.sormas.api.disease.DiseaseVariant; @@ -40,6 +40,7 @@ import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.app.backend.common.DatabaseHelper; import de.symeda.sormas.app.backend.common.PseudonymizableAdo; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.app.backend.facility.Facility; import de.symeda.sormas.app.backend.user.User; import de.symeda.sormas.app.util.DateFormatHelper; @@ -55,10 +56,14 @@ public class PathogenTest extends PseudonymizableAdo { public static final String TEST_DATE_TIME = "testDateTime"; public static final String SAMPLE = "sample"; + public static final String ENVIRONMENT_SAMPLE = "environmentSample"; @DatabaseField(foreign = true, foreignAutoRefresh = true) private Sample sample; + @DatabaseField(foreign = true, foreignAutoRefresh = true) + private EnvironmentSample environmentSample; + @Enumerated(EnumType.STRING) private PathogenTestType testType; @@ -129,6 +134,14 @@ public void setSample(Sample sample) { this.sample = sample; } + public EnvironmentSample getEnvironmentSample() { + return environmentSample; + } + + public void setEnvironmentSample(EnvironmentSample environmentSample) { + this.environmentSample = environmentSample; + } + public PathogenTestType getTestType() { return testType; } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestCriteria.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestCriteria.java index 09c2ece61b5..74b16c4d3bd 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestCriteria.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestCriteria.java @@ -17,9 +17,12 @@ import java.io.Serializable; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; + public class PathogenTestCriteria implements Serializable { private Sample sample; + private EnvironmentSample environmentSample; public PathogenTestCriteria sample(Sample sample) { this.sample = sample; @@ -29,4 +32,13 @@ public PathogenTestCriteria sample(Sample sample) { public Sample getSample() { return sample; } + + public PathogenTestCriteria environmentSample(EnvironmentSample environmentSample) { + this.environmentSample = environmentSample; + return this; + } + + public EnvironmentSample getEnvironmentSample() { + return environmentSample; + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDao.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDao.java index 45e3092725b..ef09917a236 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDao.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDao.java @@ -30,6 +30,7 @@ import de.symeda.sormas.app.backend.common.AbstractAdoDao; import de.symeda.sormas.app.backend.common.AbstractDomainObject; import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.app.util.DiseaseConfigurationCache; public class PathogenTestDao extends AbstractAdoDao { @@ -65,6 +66,18 @@ public PathogenTest build(Sample associatedSample) { return pathogenTest; } + public PathogenTest build(EnvironmentSample environmentSample) { + PathogenTest pathogenTest = super.build(); + pathogenTest.setEnvironmentSample(environmentSample); + pathogenTest.setTestDateTime(new Date()); + pathogenTest.setLabUser(ConfigProvider.getUser()); + Disease defaultDisease = DiseaseConfigurationCache.getInstance().getDefaultDisease(); + if (defaultDisease != null) { + pathogenTest.setTestedDisease(defaultDisease); + } + return pathogenTest; + } + public PathogenTest queryMostRecentBySample(Sample sample) { if (sample == null) { return null; @@ -141,6 +154,10 @@ private QueryBuilder buildQueryBuilder(PathogenTestCriteria where.and().eq(PathogenTest.SAMPLE + "_id", criteria.getSample().getId()); } + if (criteria.getEnvironmentSample() != null) { + where.and().eq(PathogenTest.ENVIRONMENT_SAMPLE + "_id", criteria.getEnvironmentSample().getId()); + } + queryBuilder.setWhere(where); return queryBuilder; } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDtoHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDtoHelper.java index 516b36303c3..9f5613464f0 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDtoHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/sample/PathogenTestDtoHelper.java @@ -21,6 +21,8 @@ import de.symeda.sormas.api.sample.PathogenTestDto; import de.symeda.sormas.app.backend.common.AdoDtoHelper; import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSampleDtoHelper; import de.symeda.sormas.app.backend.facility.Facility; import de.symeda.sormas.app.backend.facility.FacilityDtoHelper; import de.symeda.sormas.app.backend.user.User; @@ -42,7 +44,7 @@ protected Class getDtoClass() { } @Override - protected Call> pullAllSince(long since, Integer size, String lastSynchronizedUuid) throws NoConnectionException { + protected Call> pullAllSince(long since, Integer size, String lastSynchronizedUuid) throws NoConnectionException { return RetroProvider.getSampleTestFacade().pullAllSince(since, size, lastSynchronizedUuid); } @@ -60,6 +62,7 @@ protected Call> pushAll(List pathogenTestDto protected void fillInnerFromDto(PathogenTest target, PathogenTestDto source) { target.setSample(DatabaseHelper.getSampleDao().getByReferenceDto(source.getSample())); + target.setEnvironmentSample(DatabaseHelper.getEnvironmentSampleDao().getByReferenceDto(source.getEnvironmentSample())); target.setTestDateTime(source.getTestDateTime()); target.setTestResult(source.getTestResult()); target.setTestType(source.getTestType()); @@ -92,6 +95,12 @@ protected void fillInnerFromAdo(PathogenTestDto target, PathogenTest source) { } else { target.setSample(null); } + if (source.getEnvironmentSample() != null) { + EnvironmentSample environmentSample = DatabaseHelper.getEnvironmentSampleDao().queryForId(source.getEnvironmentSample().getId()); + target.setEnvironmentSample(EnvironmentSampleDtoHelper.toReferenceDto(environmentSample)); + } else { + target.setEnvironmentSample(null); + } target.setTestDateTime(source.getTestDateTime()); target.setTestResult(source.getTestResult()); target.setTestType(source.getTestType()); @@ -129,8 +138,8 @@ protected void fillInnerFromAdo(PathogenTestDto target, PathogenTest source) { target.setPseudonymized(source.isPseudonymized()); } - @Override - protected long getApproximateJsonSizeInBytes() { - return PathogenTestDto.APPROXIMATE_JSON_SIZE_IN_BYTES; - } + @Override + protected long getApproximateJsonSizeInBytes() { + return PathogenTestDto.APPROXIMATE_JSON_SIZE_IN_BYTES; + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java index 4ff9231831a..d396eacc0a1 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/EnvironmentSampleSection.java @@ -24,7 +24,8 @@ public enum EnvironmentSampleSection implements StatusElaborator { - ENVIRONMENT_SAMPLE_INFO(R.string.caption_environment_sample_information, R.drawable.ic_drawer_environment_sample_blue_24dp); + ENVIRONMENT_SAMPLE_INFO(R.string.caption_environment_sample_information, R.drawable.ic_drawer_environment_sample_blue_24dp), + PATHOGEN_TESTS(R.string.heading_pathogen_tests_list, R.drawable.ic_petri_dish_fill_blue_24); private final int friendlyNameResourceId; private final int iconResourceId; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java index bcf3d31cd91..6623b32523d 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditActivity.java @@ -38,6 +38,7 @@ import de.symeda.sormas.app.core.async.TaskResultHolder; import de.symeda.sormas.app.core.notification.NotificationHelper; import de.symeda.sormas.app.environmentsample.EnvironmentSampleSection; +import de.symeda.sormas.app.pathogentest.edit.PathogenTestNewActivity; import de.symeda.sormas.app.sample.ShipmentStatus; public class EnvironmentSampleEditActivity extends BaseEditActivity { @@ -78,6 +79,9 @@ protected BaseEditFragment buildEditFragment(PageMenuItem menuItem, EnvironmentS case ENVIRONMENT_SAMPLE_INFO: fragment = EnvironmentSampleEditFragment.newInstance(activityRootData); break; + case PATHOGEN_TESTS: + fragment = EnvironmentSampleEditPathogenTestListFragment.newInstance(activityRootData); + break; default: throw new IndexOutOfBoundsException(DataHelper.toStringNullable(section)); } @@ -153,9 +157,9 @@ protected void onPostExecute(AsyncTaskResult taskResult) { public void goToNewView() { EnvironmentSampleSection activeSection = EnvironmentSampleSection.fromOrdinal(getActivePage().getPosition()); -// if (activeSection == SampleSection.PATHOGEN_TESTS) { -// PathogenTestNewActivity.startActivity(getContext(), getRootUuid()); -// } + if (activeSection == EnvironmentSampleSection.PATHOGEN_TESTS) { + PathogenTestNewActivity.startActivityForEnvironmentSample(getContext(), getRootUuid()); + } } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditPathogenTestListFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditPathogenTestListFragment.java new file mode 100644 index 00000000000..c16d9aa5f84 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/edit/EnvironmentSampleEditPathogenTestListFragment.java @@ -0,0 +1,109 @@ +package de.symeda.sormas.app.environmentsample.edit; + +import java.util.List; + +import android.content.res.Resources; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.app.BaseEditFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.config.ConfigProvider; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.backend.sample.PathogenTest; +import de.symeda.sormas.app.core.adapter.databinding.OnListItemClickListener; +import de.symeda.sormas.app.databinding.FragmentFormListLayoutBinding; +import de.symeda.sormas.app.pathogentest.list.PathogenTestListAdapter; +import de.symeda.sormas.app.pathogentest.list.PathogenTestListViewModel; +import de.symeda.sormas.app.pathogentest.read.PathogenTestReadActivity; + +public class EnvironmentSampleEditPathogenTestListFragment + extends BaseEditFragment, EnvironmentSample> + implements OnListItemClickListener { + + public static final String TAG = EnvironmentSampleEditPathogenTestListFragment.class.getSimpleName(); + + private PathogenTestListAdapter adapter; + + public static EnvironmentSampleEditPathogenTestListFragment newInstance(EnvironmentSample activityRootData) { + return newInstance(EnvironmentSampleEditPathogenTestListFragment.class, null, activityRootData); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ((EnvironmentSampleEditActivity) getActivity()).showPreloader(); + adapter = new PathogenTestListAdapter(); + PathogenTestListViewModel model = new ViewModelProvider(this).get(PathogenTestListViewModel.class); + model.initializeViewModel(getActivityRootData()); + model.getPathogenTests().observe(this, contacts -> { + ((EnvironmentSampleEditActivity) getActivity()).hidePreloader(); + adapter.submitList(contacts); + updateEmptyListHint(contacts); + }); + } + + @Override + public final View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { + adapter.setOnListItemClickListener(this); + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + protected String getSubHeadingTitle() { + Resources r = getResources(); + return r.getString(R.string.heading_pathogen_tests_list); + } + + @Override + public int getRootEditLayout() { + return R.layout.fragment_root_list_form_layout; + } + + @Override + public int getEditLayout() { + return R.layout.fragment_form_list_layout; + } + + @Override + public List getPrimaryData() { + throw new UnsupportedOperationException("Sub list fragments don't hold their data"); + } + + @Override + protected void prepareFragmentData() { + + } + + @Override + protected void onLayoutBinding(FragmentFormListLayoutBinding contentBinding) { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false); + contentBinding.recyclerViewForList.setLayoutManager(linearLayoutManager); + contentBinding.recyclerViewForList.setAdapter(adapter); + } + + @Override + public void onListItemClick(View view, int position, Object item) { + PathogenTest contact = (PathogenTest) item; + PathogenTestReadActivity.startActivity(getActivity(), contact.getUuid()); + } + + @Override + public boolean isShowSaveAction() { + return false; + } + + @Override + public boolean isShowNewAction() { + return ConfigProvider.hasUserRight(UserRight.PATHOGEN_TEST_CREATE); + } +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java index 850b3a5f7ce..588689577c8 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadActivity.java @@ -74,6 +74,9 @@ protected BaseReadFragment buildReadFragment(PageMenuItem menuItem, EnvironmentS case ENVIRONMENT_SAMPLE_INFO: fragment = EnvironmentSampleReadFragment.newInstance(activityRootData); break; + case PATHOGEN_TESTS: + fragment = EnvironmentSampleReadPathogenTestListFragment.newInstance(activityRootData); + break; default: throw new IndexOutOfBoundsException(DataHelper.toStringNullable(section)); } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadPathogenTestListFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadPathogenTestListFragment.java new file mode 100644 index 00000000000..eb0fe12a1c4 --- /dev/null +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environmentsample/read/EnvironmentSampleReadPathogenTestListFragment.java @@ -0,0 +1,98 @@ +package de.symeda.sormas.app.environmentsample.read; + +import java.util.List; + +import android.content.res.Resources; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import de.symeda.sormas.app.BaseReadFragment; +import de.symeda.sormas.app.R; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.app.backend.sample.PathogenTest; +import de.symeda.sormas.app.core.adapter.databinding.OnListItemClickListener; +import de.symeda.sormas.app.databinding.FragmentFormListLayoutBinding; +import de.symeda.sormas.app.pathogentest.list.PathogenTestListAdapter; +import de.symeda.sormas.app.pathogentest.list.PathogenTestListViewModel; +import de.symeda.sormas.app.pathogentest.read.PathogenTestReadActivity; + +public class EnvironmentSampleReadPathogenTestListFragment + extends BaseReadFragment, EnvironmentSample> + implements OnListItemClickListener { + + public static final String TAG = EnvironmentSampleReadPathogenTestListFragment.class.getSimpleName(); + + private PathogenTestListAdapter adapter; + + public static EnvironmentSampleReadPathogenTestListFragment newInstance(EnvironmentSample activityRootData) { + return newInstance(EnvironmentSampleReadPathogenTestListFragment.class, null, activityRootData); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ((EnvironmentSampleReadActivity) getActivity()).showPreloader(); + adapter = new PathogenTestListAdapter(); + PathogenTestListViewModel model = new ViewModelProvider(this).get(PathogenTestListViewModel.class); + model.initializeViewModel(getActivityRootData()); + model.getPathogenTests().observe(this, contacts -> { + ((EnvironmentSampleReadActivity) getActivity()).hidePreloader(); + adapter.submitList(contacts); + updateEmptyListHint(contacts); + }); + } + + @Override + public final View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { + adapter.setOnListItemClickListener(this); + + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + protected void prepareFragmentData(Bundle savedInstanceState) { + + } + + @Override + protected void onLayoutBinding(FragmentFormListLayoutBinding contentBinding) { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false); + contentBinding.recyclerViewForList.setLayoutManager(linearLayoutManager); + contentBinding.recyclerViewForList.setAdapter(adapter); + } + + @Override + protected String getSubHeadingTitle() { + Resources r = getResources(); + return r.getString(R.string.heading_pathogen_tests_list); + } + + @Override + public int getReadLayout() { + return R.layout.fragment_form_list_layout; + } + + @Override + public List getPrimaryData() { + throw new UnsupportedOperationException("Sub list fragments don't hold their data"); + } + + @Override + public int getRootReadLayout() { + return R.layout.fragment_root_list_form_layout; + } + + @Override + public void onListItemClick(View view, int position, Object item) { + PathogenTest rec = (PathogenTest) item; + PathogenTestReadActivity.startActivity(getActivity(), rec.getUuid()); + } +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java index 82713fc8234..9c7486cec7c 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java @@ -38,6 +38,7 @@ import de.symeda.sormas.app.backend.common.DaoException; import de.symeda.sormas.app.backend.common.DatabaseHelper; import de.symeda.sormas.app.backend.sample.PathogenTest; +import de.symeda.sormas.app.backend.sample.Sample; import de.symeda.sormas.app.component.dialog.ConfirmationDialog; import de.symeda.sormas.app.component.menu.PageMenuItem; import de.symeda.sormas.app.component.validation.FragmentValidator; @@ -92,39 +93,43 @@ public void saveData() { } final PathogenTest pathogenTestToSave = getStoredRootEntity(); - final Case associatedCase = pathogenTestToSave.getSample().getAssociatedCase(); - - if (associatedCase != null) { - DiseaseVariant caseDiseaseVariant = associatedCase.getDiseaseVariant(); - DiseaseVariant newDiseaseVariant = pathogenTestToSave.getTestedDiseaseVariant(); - if (pathogenTestToSave.getTestResult() == PathogenTestResultType.POSITIVE - && pathogenTestToSave.getTestResultVerified() - && !DataHelper.equal(newDiseaseVariant, caseDiseaseVariant)) { - - String heading = I18nProperties.getString(Strings.headingUpdateCaseWithNewDiseaseVariant); - String subHeading = I18nProperties.getString(Strings.messageUpdateCaseWithNewDiseaseVariant); - int positiveButtonTextResId = R.string.yes; - int negativeButtonTextResId = R.string.no; - - ConfirmationDialog dlg = new ConfirmationDialog(this, heading, subHeading, positiveButtonTextResId, negativeButtonTextResId); - dlg.setCancelable(false); - dlg.setNegativeCallback(() -> { - save(pathogenTestToSave, associatedCase); - }); - dlg.setPositiveCallback(() -> { - associatedCase.setDiseaseVariant(newDiseaseVariant); - try { - DatabaseHelper.getCaseDao().updateOrCreate(associatedCase); - } catch (SQLException | java.sql.SQLException e) { - Log.e(getClass().getSimpleName(), "Could not update case: " + associatedCase.getUuid()); - throw new RuntimeException(e); - } + if (pathogenTestToSave.getSample() != null) { + final Case associatedCase = pathogenTestToSave.getSample().getAssociatedCase(); + + if (associatedCase != null) { + DiseaseVariant caseDiseaseVariant = associatedCase.getDiseaseVariant(); + DiseaseVariant newDiseaseVariant = pathogenTestToSave.getTestedDiseaseVariant(); + if (pathogenTestToSave.getTestResult() == PathogenTestResultType.POSITIVE + && pathogenTestToSave.getTestResultVerified() + && !DataHelper.equal(newDiseaseVariant, caseDiseaseVariant)) { + + String heading = I18nProperties.getString(Strings.headingUpdateCaseWithNewDiseaseVariant); + String subHeading = I18nProperties.getString(Strings.messageUpdateCaseWithNewDiseaseVariant); + int positiveButtonTextResId = R.string.yes; + int negativeButtonTextResId = R.string.no; + + ConfirmationDialog dlg = new ConfirmationDialog(this, heading, subHeading, positiveButtonTextResId, negativeButtonTextResId); + dlg.setCancelable(false); + dlg.setNegativeCallback(() -> { + save(pathogenTestToSave, associatedCase); + }); + dlg.setPositiveCallback(() -> { + associatedCase.setDiseaseVariant(newDiseaseVariant); + try { + DatabaseHelper.getCaseDao().updateOrCreate(associatedCase); + } catch (SQLException | java.sql.SQLException e) { + Log.e(getClass().getSimpleName(), "Could not update case: " + associatedCase.getUuid()); + throw new RuntimeException(e); + } + save(pathogenTestToSave, associatedCase); + }); + dlg.show(); + } else { save(pathogenTestToSave, associatedCase); - }); - dlg.show(); - } else { - save(pathogenTestToSave, associatedCase); + } } + } else if (pathogenTestToSave.getEnvironmentSample() != null) { + save(pathogenTestToSave, null); } } @@ -148,9 +153,11 @@ protected void onPostExecute(AsyncTaskResult taskResult) { super.onPostExecute(taskResult); if (taskResult.getResultStatus().isSuccess()) { - if (Boolean.TRUE == pathogenTestToSave.getTestResultVerified() + Sample sampleOfPathogenTestToSave = pathogenTestToSave.getSample(); + if (sampleOfPathogenTestToSave != null + && Boolean.TRUE == pathogenTestToSave.getTestResultVerified() && pathogenTestToSave.getTestedDisease() == associatedCase.getDisease() - && pathogenTestToSave.getTestResult() != pathogenTestToSave.getSample().getPathogenTestResult()) { + && pathogenTestToSave.getTestResult() != sampleOfPathogenTestToSave.getPathogenTestResult()) { final ConfirmationDialog confirmationDialog = new ConfirmationDialog( getActiveActivity(), R.string.heading_change_laboratory_result, @@ -159,9 +166,13 @@ protected void onPostExecute(AsyncTaskResult taskResult) { R.string.no); confirmationDialog.setPositiveCallback(() -> { - pathogenTestToSave.getSample().setPathogenTestResult(pathogenTestToSave.getTestResult()); + if (sampleOfPathogenTestToSave != null) { + sampleOfPathogenTestToSave.setPathogenTestResult(pathogenTestToSave.getTestResult()); + } try { - DatabaseHelper.getSampleDao().saveAndSnapshot(pathogenTestToSave.getSample()); + if (sampleOfPathogenTestToSave != null) { + DatabaseHelper.getSampleDao().saveAndSnapshot(sampleOfPathogenTestToSave); + } } catch (DaoException e) { NotificationHelper.showNotification( getActiveActivity().getRootView(), diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditFragment.java index 2a1d04f5972..499a81a930b 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditFragment.java @@ -18,13 +18,12 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; -import android.view.View; - -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import android.view.View; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.customizableenum.CustomizableEnumType; import de.symeda.sormas.api.disease.DiseaseVariant; @@ -101,7 +100,7 @@ record = getActivityRootData(); } List diseaseVariants = - DatabaseHelper.getCustomizableEnumValueDao().getEnumValues(CustomizableEnumType.DISEASE_VARIANT, record.getTestedDisease()); + DatabaseHelper.getCustomizableEnumValueDao().getEnumValues(CustomizableEnumType.DISEASE_VARIANT, record.getTestedDisease()); diseaseVariantList = DataUtils.toItems(diseaseVariants); if (record.getTestedDiseaseVariant() != null && !diseaseVariants.contains(record.getTestedDiseaseVariant())) { diseaseVariantList.add(DataUtils.toItem(record.getTestedDiseaseVariant())); @@ -202,7 +201,7 @@ public void onChange(ControlPropertyField field) { contentBinding.pathogenTestReportDate.initializeDateField(getFragmentManager()); contentBinding.pathogenTestTestDateTime.initializeDateTimeField(getFragmentManager()); - if (sample.getSamplePurpose() == SamplePurpose.INTERNAL) { + if (sample != null && sample.getSamplePurpose() == SamplePurpose.INTERNAL) { contentBinding.pathogenTestLab.setRequired(false); } } @@ -210,7 +209,7 @@ public void onChange(ControlPropertyField field) { private void updateDiseaseVariantsField(FragmentPathogenTestEditLayoutBinding contentBinding) { DiseaseVariant selectedVariant = (DiseaseVariant) contentBinding.pathogenTestTestedDiseaseVariant.getValue(); List diseaseVariants = - DatabaseHelper.getCustomizableEnumValueDao().getEnumValues(CustomizableEnumType.DISEASE_VARIANT, record.getTestedDisease()); + DatabaseHelper.getCustomizableEnumValueDao().getEnumValues(CustomizableEnumType.DISEASE_VARIANT, record.getTestedDisease()); diseaseVariantList.clear(); diseaseVariantList.addAll(DataUtils.toItems(diseaseVariants)); contentBinding.pathogenTestTestedDiseaseVariant.setSpinnerData(diseaseVariantList); diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java index 2a8defc981b..70b3ef2293e 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java @@ -39,6 +39,7 @@ import de.symeda.sormas.app.backend.caze.Case; import de.symeda.sormas.app.backend.common.DaoException; import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.app.backend.sample.PathogenTest; import de.symeda.sormas.app.backend.sample.Sample; import de.symeda.sormas.app.component.dialog.ConfirmationDialog; @@ -56,16 +57,26 @@ public class PathogenTestNewActivity extends BaseEditActivity { private String sampleUuid = null; + private String environmentSampleUuid = null; + private AsyncTask saveTask; public static void startActivity(Context context, String sampleUuid) { - BaseEditActivity.startActivity(context, PathogenTestNewActivity.class, buildBundle(sampleUuid)); + BaseEditActivity.startActivity(context, PathogenTestNewActivity.class, buildBundleForSample(sampleUuid)); + } + + public static void startActivityForEnvironmentSample(Context context, String environmentSampleUuid) { + BaseEditActivity.startActivity(context, PathogenTestNewActivity.class, buildBundleForEnvironmentSample(environmentSampleUuid)); } - public static Bundler buildBundle(String caseUuid) { + public static Bundler buildBundleForSample(String caseUuid) { return buildBundle(null, 0).setCaseUuid(caseUuid); } + public static Bundler buildBundleForEnvironmentSample(String environmentSampleUuid) { + return buildBundle(null, 0).setEnvironmentSampleuuid(environmentSampleUuid); + } + @Override public Enum getPageStatus() { return null; @@ -75,12 +86,13 @@ public Enum getPageStatus() { protected void onCreateInner(Bundle savedInstanceState) { super.onCreateInner(savedInstanceState); sampleUuid = new Bundler(savedInstanceState).getCaseUuid(); + environmentSampleUuid = new Bundler(savedInstanceState).getEnvironmentSampleUuid(); } @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - new Bundler(outState).setCaseUuid(sampleUuid); + new Bundler(outState).setCaseUuid(sampleUuid).setEnvironmentSampleuuid(environmentSampleUuid); } @Override @@ -91,8 +103,16 @@ protected PathogenTest queryRootEntity(String recordUuid) { @Override protected PathogenTest buildRootEntity() { // basic instead of reference, because we want to have at least the related person - Sample associatedSample = DatabaseHelper.getSampleDao().queryUuid(sampleUuid); - return DatabaseHelper.getSampleTestDao().build(associatedSample); + + if (sampleUuid != null) { + Sample associatedSample = DatabaseHelper.getSampleDao().queryUuid(sampleUuid); + return DatabaseHelper.getSampleTestDao().build(associatedSample); + } + if (environmentSampleUuid != null) { + EnvironmentSample associatedEnvironmentSample = DatabaseHelper.getEnvironmentSampleDao().queryUuid(environmentSampleUuid); + return DatabaseHelper.getSampleTestDao().build(associatedEnvironmentSample); + } + throw new RuntimeException("not valid pathogen test can be created. Missing sample and environmentSample links."); } @Override @@ -128,39 +148,44 @@ public void saveData() { } final PathogenTest pathogenTestToSave = getStoredRootEntity(); - final Case associatedCase = pathogenTestToSave.getSample().getAssociatedCase(); - - if (associatedCase != null) { - DiseaseVariant caseDiseaseVariant = associatedCase.getDiseaseVariant(); - DiseaseVariant newDiseaseVariant = pathogenTestToSave.getTestedDiseaseVariant(); - if (pathogenTestToSave.getTestResult() == PathogenTestResultType.POSITIVE - && pathogenTestToSave.getTestResultVerified() - && !DataHelper.equal(newDiseaseVariant, caseDiseaseVariant)) { - - String heading = I18nProperties.getString(Strings.headingUpdateCaseWithNewDiseaseVariant); - String subHeading = I18nProperties.getString(Strings.messageUpdateCaseWithNewDiseaseVariant); - int positiveButtonTextResId = R.string.yes; - int negativeButtonTextResId = R.string.no; - - ConfirmationDialog dlg = new ConfirmationDialog(this, heading, subHeading, positiveButtonTextResId, negativeButtonTextResId); - dlg.setCancelable(false); - dlg.setNegativeCallback(() -> { - save(pathogenTestToSave); - }); - dlg.setPositiveCallback(() -> { - associatedCase.setDiseaseVariant(newDiseaseVariant); - try { - DatabaseHelper.getCaseDao().updateOrCreate(associatedCase); - } catch (SQLException | java.sql.SQLException e) { - Log.e(getClass().getSimpleName(), "Could not update case: " + associatedCase.getUuid()); - throw new RuntimeException(e); - } + + if (pathogenTestToSave.getSample() != null) { + final Case associatedCase = pathogenTestToSave.getSample().getAssociatedCase(); + + if (associatedCase != null) { + DiseaseVariant caseDiseaseVariant = associatedCase.getDiseaseVariant(); + DiseaseVariant newDiseaseVariant = pathogenTestToSave.getTestedDiseaseVariant(); + if (pathogenTestToSave.getTestResult() == PathogenTestResultType.POSITIVE + && pathogenTestToSave.getTestResultVerified() + && !DataHelper.equal(newDiseaseVariant, caseDiseaseVariant)) { + + String heading = I18nProperties.getString(Strings.headingUpdateCaseWithNewDiseaseVariant); + String subHeading = I18nProperties.getString(Strings.messageUpdateCaseWithNewDiseaseVariant); + int positiveButtonTextResId = R.string.yes; + int negativeButtonTextResId = R.string.no; + + ConfirmationDialog dlg = new ConfirmationDialog(this, heading, subHeading, positiveButtonTextResId, negativeButtonTextResId); + dlg.setCancelable(false); + dlg.setNegativeCallback(() -> { + save(pathogenTestToSave); + }); + dlg.setPositiveCallback(() -> { + associatedCase.setDiseaseVariant(newDiseaseVariant); + try { + DatabaseHelper.getCaseDao().updateOrCreate(associatedCase); + } catch (SQLException | java.sql.SQLException e) { + Log.e(getClass().getSimpleName(), "Could not update case: " + associatedCase.getUuid()); + throw new RuntimeException(e); + } + save(pathogenTestToSave); + }); + dlg.show(); + } else { save(pathogenTestToSave); - }); - dlg.show(); - } else { - save(pathogenTestToSave); + } } + } else { + save(pathogenTestToSave); } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/list/PathogenTestListViewModel.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/list/PathogenTestListViewModel.java index 60fd58d693c..1345b4a5650 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/list/PathogenTestListViewModel.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/list/PathogenTestListViewModel.java @@ -27,6 +27,7 @@ import androidx.paging.PositionalDataSource; import de.symeda.sormas.app.backend.common.DatabaseHelper; +import de.symeda.sormas.app.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.app.backend.sample.PathogenTest; import de.symeda.sormas.app.backend.sample.PathogenTestCriteria; import de.symeda.sormas.app.backend.sample.Sample; @@ -44,6 +45,14 @@ public void initializeViewModel(Sample sample) { initializeList(); } + public void initializeViewModel(EnvironmentSample environmentSample) { + pathogenTestDataFactory = new PathogenTestDataFactory(); + PathogenTestCriteria pathogenTestCriteria = new PathogenTestCriteria(); + pathogenTestCriteria.environmentSample(environmentSample); + pathogenTestDataFactory.setPathogenTestCriteria(pathogenTestCriteria); + initializeList(); + } + public LiveData> getPathogenTests() { return pathogenTests; } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java index 173f4b47c93..2f25de40c0d 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/rest/SynchronizeDataAsync.java @@ -294,11 +294,11 @@ public static boolean hasAnyUnsynchronizedData() { || DatabaseHelper.getPersonDao().isAnyModified() || DatabaseHelper.getEventDao().isAnyModified() || DatabaseHelper.getEventParticipantDao().isAnyModified() + || DatabaseHelper.getEnvironmentDao().isAnyModified() + || DatabaseHelper.getEnvironmentSampleDao().isAnyModified() || DatabaseHelper.getSampleDao().isAnyModified() || DatabaseHelper.getSampleTestDao().isAnyModified() || DatabaseHelper.getAdditionalTestDao().isAnyModified() - || DatabaseHelper.getEnvironmentDao().isAnyModified() - || DatabaseHelper.getEnvironmentSampleDao().isAnyModified() || DatabaseHelper.getTaskDao().isAnyModified() || DatabaseHelper.getVisitDao().isAnyModified() || DatabaseHelper.getWeeklyReportDao().isAnyModified() @@ -317,11 +317,11 @@ private void pushNewData() throws ServerCommunicationException, ServerConnection new ImmunizationDtoHelper().pushEntities(true, syncCallbacks); new EventDtoHelper().pushEntities(true, syncCallbacks); new EventParticipantDtoHelper().pushEntities(true, syncCallbacks); + new EnvironmentDtoHelper().pushEntities(true, syncCallbacks); + new EnvironmentSampleDtoHelper().pushEntities(true, syncCallbacks); new SampleDtoHelper().pushEntities(true, syncCallbacks); new PathogenTestDtoHelper().pushEntities(true, syncCallbacks); new AdditionalTestDtoHelper().pushEntities(true, syncCallbacks); - new EnvironmentDtoHelper().pushEntities(true, syncCallbacks); - new EnvironmentSampleDtoHelper().pushEntities(true, syncCallbacks); new ContactDtoHelper().pushEntities(true, syncCallbacks); new VisitDtoHelper().pushEntities(true, syncCallbacks); new TaskDtoHelper().pushEntities(true, syncCallbacks); @@ -344,11 +344,11 @@ private void synchronizeChangedData() throws DaoException, NoConnectionException ImmunizationDtoHelper immunizationDtoHelper = new ImmunizationDtoHelper(); EventDtoHelper eventDtoHelper = new EventDtoHelper(); EventParticipantDtoHelper eventParticipantDtoHelper = new EventParticipantDtoHelper(); + EnvironmentDtoHelper environmentDtoHelper = new EnvironmentDtoHelper(); + EnvironmentSampleDtoHelper environmentSampleDtoHelper = new EnvironmentSampleDtoHelper(); SampleDtoHelper sampleDtoHelper = new SampleDtoHelper(); PathogenTestDtoHelper pathogenTestDtoHelper = new PathogenTestDtoHelper(); AdditionalTestDtoHelper additionalTestDtoHelper = new AdditionalTestDtoHelper(); - EnvironmentDtoHelper environmentDtoHelper = new EnvironmentDtoHelper(); - EnvironmentSampleDtoHelper environmentSampleDtoHelper = new EnvironmentSampleDtoHelper(); ContactDtoHelper contactDtoHelper = new ContactDtoHelper(); VisitDtoHelper visitDtoHelper = new VisitDtoHelper(); TaskDtoHelper taskDtoHelper = new TaskDtoHelper(); @@ -369,11 +369,11 @@ private void synchronizeChangedData() throws DaoException, NoConnectionException boolean immunizationsNeedPull = immunizationDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean eventsNeedPull = eventDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean eventParticipantsNeedPull = eventParticipantDtoHelper.pullAndPushEntities(context, syncCallbacks); + boolean environmentsNeedPull = environmentDtoHelper.pullAndPushEntities(context, syncCallbacks); + boolean environmentSamplesNeedPull = environmentSampleDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean samplesNeedPull = sampleDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean sampleTestsNeedPull = pathogenTestDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean additionalTestsNeedPull = additionalTestDtoHelper.pullAndPushEntities(context, syncCallbacks); - boolean environmentsNeedPull = environmentDtoHelper.pullAndPushEntities(context, syncCallbacks); - boolean environmentSamplesNeedPull = environmentSampleDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean contactsNeedPull = contactDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean visitsNeedPull = visitDtoHelper.pullAndPushEntities(context, syncCallbacks); boolean tasksNeedPull = taskDtoHelper.pullAndPushEntities(context, syncCallbacks); @@ -389,15 +389,15 @@ private void synchronizeChangedData() throws DaoException, NoConnectionException boolean eventsVisible = DtoUserRightsHelper.isViewAllowed(EventDto.class) && DtoFeatureConfigHelper.isFeatureConfigForEventsEnabled(); boolean eventParticipantsVisible = DtoUserRightsHelper.isViewAllowed(EventParticipantDto.class) && DtoFeatureConfigHelper.isFeatureConfigForEventParticipantsEnabled(); + boolean environmentsVisible = + DtoUserRightsHelper.isViewAllowed(EnvironmentDto.class) && DtoFeatureConfigHelper.isFeatureConfigForEnvironmentEnabled(); + boolean environmentSamplesVisible = + DtoUserRightsHelper.isViewAllowed(EnvironmentSampleDto.class) && DtoFeatureConfigHelper.isFeatureConfigForEnvironmentEnabled(); boolean samplesVisible = DtoUserRightsHelper.isViewAllowed(SampleDto.class) && DtoFeatureConfigHelper.isFeatureConfigForSampleEnabled(); boolean sampleTestsVisible = DtoUserRightsHelper.isViewAllowed(PathogenTestDto.class) && DtoFeatureConfigHelper.isFeatureConfigForSampleTestsEnabled(); boolean additionalTestsVisible = DtoUserRightsHelper.isViewAllowed(AdditionalTestDto.class) && DtoFeatureConfigHelper.isFeatureConfigForAdditionalTestsEnabled(); - boolean environmentsVisible = - DtoUserRightsHelper.isViewAllowed(EnvironmentDto.class) && DtoFeatureConfigHelper.isFeatureConfigForEnvironmentEnabled(); - boolean environmentSamplesVisible = - DtoUserRightsHelper.isViewAllowed(EnvironmentSampleDto.class) && DtoFeatureConfigHelper.isFeatureConfigForEnvironmentEnabled(); boolean contactsVisible = DtoUserRightsHelper.isViewAllowed(ContactDto.class) && DtoFeatureConfigHelper.isFeatureConfigForContactsEnabled(); boolean visitsVisible = DtoUserRightsHelper.isViewAllowed(VisitDto.class) && DtoFeatureConfigHelper.isFeatureConfigForVisitsEnabled(); boolean tasksVisible = DtoUserRightsHelper.isViewAllowed(TaskDto.class) && DtoFeatureConfigHelper.isFeatureConfigForTasksEnabled(); @@ -443,6 +443,18 @@ private void synchronizeChangedData() throws DaoException, NoConnectionException eventParticipantDtoHelper.pullEntities(true, context, syncCallbacks, false); } } + if (environmentsVisible) { + syncCallbacks.ifPresent(c -> c.getLoadNextCallback().run()); + if (environmentsNeedPull) { + environmentDtoHelper.pullEntities(true, context, syncCallbacks, false); + } + } + if (environmentSamplesVisible) { + syncCallbacks.ifPresent(c -> c.getLoadNextCallback().run()); + if (environmentSamplesNeedPull) { + environmentSampleDtoHelper.pullEntities(true, context, syncCallbacks, false); + } + } if (samplesVisible) { syncCallbacks.ifPresent(c -> c.getLoadNextCallback().run()); if (samplesNeedPull) { @@ -461,18 +473,6 @@ private void synchronizeChangedData() throws DaoException, NoConnectionException additionalTestDtoHelper.pullEntities(true, context, syncCallbacks, false); } } - if (environmentsVisible) { - syncCallbacks.ifPresent(c -> c.getLoadNextCallback().run()); - if (environmentsNeedPull) { - environmentDtoHelper.pullEntities(true, context, syncCallbacks, false); - } - } - if (environmentSamplesVisible) { - syncCallbacks.ifPresent(c -> c.getLoadNextCallback().run()); - if (environmentSamplesNeedPull) { - environmentSampleDtoHelper.pullEntities(true, context, syncCallbacks, false); - } - } if (contactsVisible) { syncCallbacks.ifPresent(c -> c.getLoadNextCallback().run()); if (contactsNeedPull) { @@ -551,11 +551,11 @@ private void repullData() throws DaoException, NoConnectionException, ServerConn ImmunizationDtoHelper immunizationDtoHelper = new ImmunizationDtoHelper(); EventDtoHelper eventDtoHelper = new EventDtoHelper(); EventParticipantDtoHelper eventParticipantDtoHelper = new EventParticipantDtoHelper(); + EnvironmentDtoHelper environmentDtoHelper = new EnvironmentDtoHelper(); + EnvironmentSampleDtoHelper environmentSampleDtoHelper = new EnvironmentSampleDtoHelper(); SampleDtoHelper sampleDtoHelper = new SampleDtoHelper(); PathogenTestDtoHelper pathogenTestDtoHelper = new PathogenTestDtoHelper(); AdditionalTestDtoHelper additionalTestDtoHelper = new AdditionalTestDtoHelper(); - EnvironmentDtoHelper environmentDtoHelper = new EnvironmentDtoHelper(); - EnvironmentSampleDtoHelper environmentSampleDtoHelper = new EnvironmentSampleDtoHelper(); ContactDtoHelper contactDtoHelper = new ContactDtoHelper(); VisitDtoHelper visitDtoHelper = new VisitDtoHelper(); TaskDtoHelper taskDtoHelper = new TaskDtoHelper(); @@ -579,11 +579,11 @@ private void repullData() throws DaoException, NoConnectionException, ServerConn immunizationDtoHelper.repullEntities(context, syncCallbacks); eventDtoHelper.repullEntities(context, syncCallbacks); eventParticipantDtoHelper.repullEntities(context, syncCallbacks); + environmentDtoHelper.repullEntities(context, syncCallbacks); + environmentSampleDtoHelper.repullEntities(context, syncCallbacks); sampleDtoHelper.repullEntities(context, syncCallbacks); pathogenTestDtoHelper.repullEntities(context, syncCallbacks); additionalTestDtoHelper.repullEntities(context, syncCallbacks); - environmentDtoHelper.repullEntities(context, syncCallbacks); - environmentSampleDtoHelper.repullEntities(context, syncCallbacks); contactDtoHelper.repullEntities(context, syncCallbacks); visitDtoHelper.repullEntities(context, syncCallbacks); taskDtoHelper.repullEntities(context, syncCallbacks); @@ -939,11 +939,11 @@ private void pushNewPullMissingAndDeleteInvalidData() new ImmunizationDtoHelper().pullMissing(caseUuids, syncCallbacks); new EventDtoHelper().pullMissing(eventUuids, syncCallbacks); new EventParticipantDtoHelper().pullMissing(eventParticipantUuids, syncCallbacks); + new EnvironmentDtoHelper().pullMissing(environmentUuids, syncCallbacks); + new EnvironmentSampleDtoHelper().pullMissing(environmentSampleUuids, syncCallbacks); new SampleDtoHelper().pullMissing(sampleUuids, syncCallbacks); new PathogenTestDtoHelper().pullMissing(sampleTestUuids, syncCallbacks); new AdditionalTestDtoHelper().pullMissing(additionalTestUuids, syncCallbacks); - new EnvironmentDtoHelper().pullMissing(environmentUuids, syncCallbacks); - new EnvironmentSampleDtoHelper().pullMissing(environmentSampleUuids, syncCallbacks); new ContactDtoHelper().pullMissing(contactUuids, syncCallbacks); new VisitDtoHelper().pullMissing(visitUuids, syncCallbacks); new TaskDtoHelper().pullMissing(taskUuids, syncCallbacks); diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java index 1f1c4606fd9..366c5af0d02 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java @@ -29,8 +29,8 @@ public class Bundler { private static final String IMMUNIZATION_UUID = "immunizationUuid"; private static final String CONTACT_UUID = "contactUuid"; private static final String EVENT_UUID = "eventUuid"; - private static final String ENVIRONMENT_UUID = "environmentUuid"; + private static final String ENVIRONMENT_SAMPLE_UUID = "environmentSampleUuid"; private static final String CAMPAIGN_UUID = "campaignUuid"; private static final String CAMPAIGN_FROM_META_UUID = "campaignFormMetaUuid"; private static final String EVENT_PARTICIPANT_UUID = "eventParticipantUuid"; @@ -203,6 +203,18 @@ public String getEnvironmentUuid() { return null; } + public Bundler setEnvironmentSampleuuid(String environmentSampleUuid) { + bundle.putString(ENVIRONMENT_SAMPLE_UUID, environmentSampleUuid); + return this; + } + + public String getEnvironmentSampleUuid() { + if (bundle.containsKey(ENVIRONMENT_SAMPLE_UUID)) { + return bundle.getString(ENVIRONMENT_SAMPLE_UUID); + } + return null; + } + public Bundler setEventParticipantUuid(String eventParticipantUuid) { bundle.putString(EVENT_PARTICIPANT_UUID, eventParticipantUuid); return this; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java index 5c4028b15ea..89f3d15e419 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSample.java @@ -18,6 +18,7 @@ import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_TEXT; import java.util.Date; +import java.util.List; import java.util.Map; import java.util.Set; @@ -29,6 +30,7 @@ import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.persistence.Temporal; import javax.persistence.TemporalType; @@ -43,6 +45,7 @@ import de.symeda.sormas.backend.environment.Environment; import de.symeda.sormas.backend.infrastructure.facility.Facility; import de.symeda.sormas.backend.location.Location; +import de.symeda.sormas.backend.sample.PathogenTest; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.ModelConstants; @@ -95,6 +98,8 @@ public class EnvironmentSample extends DeletableAdo { private Location location; private String generalComment; + private List pathogenTests; + @ManyToOne(optional = false) public Environment getEnvironment() { return environment; @@ -346,4 +351,13 @@ public String getGeneralComment() { public void setGeneralComment(String generalComment) { this.generalComment = generalComment; } + + @OneToMany(mappedBy = PathogenTest.ENVIRONMENT_SAMPLE, fetch = FetchType.LAZY) + public List getPathogenTests() { + return pathogenTests; + } + + public void setPathogenTests(List pathogenTests) { + this.pathogenTests = pathogenTests; + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java index 1d2f80bdaf2..44f688e852b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java @@ -31,11 +31,13 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; import javax.persistence.criteria.Join; +import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Order; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; +import javax.persistence.criteria.Subquery; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -77,6 +79,7 @@ import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.location.LocationFacadeEjb; import de.symeda.sormas.backend.location.LocationFacadeEjb.LocationFacadeEjbLocal; +import de.symeda.sormas.backend.sample.PathogenTest; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.IterableHelper; @@ -171,6 +174,12 @@ public List getIndexList( EnvironmentSampleQueryContext queryContext = new EnvironmentSampleQueryContext(cb, cq, from, joins); Join location = joins.getLocation(); + // Tests count subquery + Subquery numberOfTests = cq.subquery(Long.class); + Root numberOfTestsRoot = numberOfTests.from(PathogenTest.class); + numberOfTests.where(cb.equal(numberOfTestsRoot.get(PathogenTest.ENVIRONMENT_SAMPLE), from), cb.isFalse(numberOfTestsRoot.get(PathogenTest.DELETED))); + numberOfTests.select(cb.countDistinct(numberOfTestsRoot.get(PathogenTest.ID))); + cq.multiselect( from.get(EnvironmentSampleIndexDto.UUID), from.get(EnvironmentSampleIndexDto.FIELD_SAMPLE_ID), @@ -193,6 +202,7 @@ public List getIndexList( from.get(EnvironmentSample.OTHER_SAMPLE_MATERIAL), from.get(EnvironmentSample.DELETION_REASON), from.get(EnvironmentSample.OTHER_DELETION_REASON), + numberOfTests.getSelection(), JurisdictionHelper.booleanSelector(cb, service.inJurisdictionOrOwned(queryContext))); cq.where(from.get(EnvironmentSample.ID).in(batchedIds)); @@ -200,6 +210,13 @@ public List getIndexList( sortBy(sortProperties, queryContext); indexList.addAll(QueryHelper.getResultList(em, cq, null, null)); + +// indexList.forEach(environmentSampleIndexDto -> { +// if (environmentSampleIndexDto.getEnvironment() != null) { +// final Long noOfPathogenTests = getPathogenTests(environmentSampleIndexDto); +// environmentSampleIndexDto.setNumberOfTests(noOfPathogenTests); +// } +// }); }); Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); @@ -208,6 +225,20 @@ public List getIndexList( return indexList; } +// private Long getPathogenTests(EnvironmentSampleIndexDto environmentSampleIndexDto) { +// CriteriaBuilder cb = em.getCriteriaBuilder(); +// final CriteriaQuery numberOfPathogenTestsQuery = cb.createQuery(Long.class); +// final Root pathogenTestRoot = numberOfPathogenTestsQuery.from(PathogenTest.class); +// Join pathogenTestEnvironmentSampleJoin = +// pathogenTestRoot.join(PathogenTest.ENVIRONMENT_SAMPLE, JoinType.LEFT); +// +// numberOfPathogenTestsQuery.select(pathogenTestRoot.get(PathogenTest.ID)); +// numberOfPathogenTestsQuery +// .where(cb.equal(pathogenTestEnvironmentSampleJoin.get(EnvironmentSample.UUID), environmentSampleIndexDto.getUuid())); +// +// return Long.valueOf(em.createQuery(numberOfPathogenTestsQuery).getResultList().size()); +// } + private List getIndexListIds(EnvironmentSampleCriteria criteria, Integer first, Integer max, List sortProperties) { CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -510,6 +541,18 @@ protected EnvironmentSampleDto toDto(EnvironmentSample source) { return target; } + public static EnvironmentSampleReferenceDto toReferenceDto(EnvironmentSample environmentSample) { + + if (environmentSample == null) { + return null; + } + + return new EnvironmentSampleReferenceDto( + environmentSample.getUuid(), + environmentSample.getSampleMaterial(), + environmentSample.getEnvironment().getUuid()); + } + @Override protected EnvironmentSampleReferenceDto toRefDto(EnvironmentSample environmentSample) { return new EnvironmentSampleReferenceDto( diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java index 9a979cc96f4..ab928e6d236 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleService.java @@ -23,6 +23,7 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; +import javax.persistence.criteria.Join; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; @@ -65,6 +66,18 @@ public Predicate createDefaultFilter(CriteriaBuilder cb, From root = environmentSampleQueryContext.getRoot(); + final CriteriaBuilder cb = environmentSampleQueryContext.getCriteriaBuilder(); + final EnvironmentSampleJoins joins = environmentSampleQueryContext.getJoins(); + + final Join environment = joins.getEnvironment(); + + Predicate predicate = cb.and(cb.isFalse(environment.get(Environment.ARCHIVED)), cb.isFalse(environment.get(Environment.DELETED))); + + return cb.and(predicate, cb.isFalse(root.get(EnvironmentSample.DELETED))); + } + public boolean isEditAllowed(EnvironmentSample sample) { return getEditPermissionType(sample) == EditPermissionType.ALLOWED; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTest.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTest.java index 69a7cb40d4d..fab3fce94c9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTest.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTest.java @@ -41,6 +41,7 @@ import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.backend.common.DeletableAdo; import de.symeda.sormas.backend.disease.DiseaseVariantConverter; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.backend.infrastructure.country.Country; import de.symeda.sormas.backend.infrastructure.facility.Facility; import de.symeda.sormas.backend.user.User; @@ -53,6 +54,7 @@ public class PathogenTest extends DeletableAdo { public static final String TABLE_NAME = "pathogentest"; public static final String SAMPLE = "sample"; + public static final String ENVIRONMENT_SAMPLE = "environmentSample"; public static final String TESTED_DISEASE = "testedDisease"; public static final String TESTED_DISEASE_VARIANT = "testedDiseaseVariant"; public static final String TESTED_DISEASE_VARIANT_DETAILS = "testedDiseaseVariantDetails"; @@ -87,6 +89,7 @@ public class PathogenTest extends DeletableAdo { public static final String PRESCRIBER_COUNTRY = "prescriberCountry"; private Sample sample; + private EnvironmentSample environmentSample; private Disease testedDisease; @Convert(converter = DiseaseVariantConverter.class) private DiseaseVariant testedDiseaseVariant; @@ -127,7 +130,6 @@ public class PathogenTest extends DeletableAdo { private Country prescriberCountry; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(nullable = false) public Sample getSample() { return sample; } @@ -136,6 +138,15 @@ public void setSample(Sample sample) { this.sample = sample; } + @ManyToOne(fetch = FetchType.LAZY) + public EnvironmentSample getEnvironmentSample() { + return environmentSample; + } + + public void setEnvironmentSample(EnvironmentSample environmentSample) { + this.environmentSample = environmentSample; + } + @Enumerated(EnumType.STRING) public Disease getTestedDisease() { return testedDisease; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java index 7b9f5bd895f..8defe73ab3d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java @@ -43,6 +43,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.sample.PathogenTestCriteria; @@ -65,6 +66,8 @@ import de.symeda.sormas.backend.common.messaging.NotificationDeliveryFailedException; import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.contact.ContactFacadeEjb.ContactFacadeEjbLocal; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleFacadeEjb; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleService; import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; import de.symeda.sormas.backend.event.EventParticipant; import de.symeda.sormas.backend.event.EventParticipantFacadeEjb.EventParticipantFacadeEjbLocal; @@ -104,6 +107,8 @@ public class PathogenTestFacadeEjb implements PathogenTestFacade { @EJB private SampleService sampleService; @EJB + private EnvironmentSampleService environmentSampleService; + @EJB private FacilityService facilityService; @EJB private UserService userService; @@ -210,6 +215,20 @@ public List getAllBySample(SampleReferenceDto sampleRef) { return toPseudonymizedDtos(entities); } + @Override + public List getAllByEnvironmentSample(EnvironmentSampleReferenceDto environmentSampleRef) { + if (environmentSampleRef == null) { + return Collections.emptyList(); + } + + List entities = environmentSampleService.getByUuid(environmentSampleRef.getUuid()) + .getPathogenTests() + .stream() + .filter(p -> !p.isDeleted()) + .collect(Collectors.toList()); + return toPseudonymizedDtos(entities); + } + @Override public List getDeletedUuidsSince(Date since) { User user = userService.getCurrentUser(); @@ -243,13 +262,17 @@ public PathogenTestDto savePathogenTest(@Valid PathogenTestDto dto, boolean chec pathogenTestService.ensurePersisted(pathogenTest); onPathogenTestChanged(existingSampleTestDto, pathogenTest); - handleAssociatedEntityChanges(pathogenTest, syncShares); return convertToDto(pathogenTest, Pseudonymizer.getDefault(userService::hasRight)); } private void handleAssociatedEntityChanges(PathogenTest pathogenTest, boolean syncShares) { + + if (pathogenTest.getSample() == null) { + return; + } + // Update case classification if necessary final Case associatedCase = pathogenTest.getSample().getAssociatedCase(); if (associatedCase != null && userService.hasRight(UserRight.CASE_EDIT)) { @@ -343,18 +366,22 @@ public Date getLatestPathogenTestDate(String sampleUuid) { public List getPositiveOrLatest(List sampleUuids) { Collection dtos = toPseudonymizedDtos(pathogenTestService.getBySampleUuids(sampleUuids, true)).stream() - .collect(Collectors.toMap(s -> s.getSample().getUuid(), s -> s, (s1, s2) -> { - - // keep the positive one - if (s1.getTestResult() == PathogenTestResultType.POSITIVE) { - return s1; - } else if (s2.getTestResult() == PathogenTestResultType.POSITIVE) { - return s2; - } - - // ordered by creation date by default, so always keep the first one - return s1; - })) + .collect( + Collectors.toMap( + s -> s.getSample().getUuid(), + s -> s, + (s1, s2) -> { + + // keep the positive one + if (s1.getTestResult() == PathogenTestResultType.POSITIVE) { + return s1; + } else if (s2.getTestResult() == PathogenTestResultType.POSITIVE) { + return s2; + } + + // ordered by creation date by default, so always keep the first one + return s1; + })) .values(); return new ArrayList<>(dtos); } @@ -368,6 +395,7 @@ public static PathogenTestDto toDto(PathogenTest source) { DtoHelper.fillDto(target, source); target.setSample(SampleFacadeEjb.toReferenceDto(source.getSample())); + target.setEnvironmentSample(EnvironmentSampleFacadeEjb.toReferenceDto(source.getEnvironmentSample())); target.setTestedDisease(source.getTestedDisease()); target.setTestedDiseaseVariant(source.getTestedDiseaseVariant()); target.setTestedDiseaseDetails(source.getTestedDiseaseDetails()); @@ -452,6 +480,7 @@ public PathogenTest fillOrBuildEntity(@NotNull PathogenTestDto source, PathogenT target = DtoHelper.fillOrBuildEntity(source, target, PathogenTest::new, checkChangeDate); target.setSample(sampleService.getByReferenceDto(source.getSample())); + target.setEnvironmentSample(environmentSampleService.getByReferenceDto(source.getEnvironmentSample())); target.setTestedDisease(source.getTestedDisease()); target.setTestedDiseaseVariant(source.getTestedDiseaseVariant()); target.setTestedDiseaseDetails(source.getTestedDiseaseDetails()); @@ -499,6 +528,11 @@ public PathogenTest fillOrBuildEntity(@NotNull PathogenTestDto source, PathogenT } private void onPathogenTestChanged(PathogenTestDto existingPathogenTest, PathogenTest newPathogenTest) { + + if (existingPathogenTest.getSample() == null) { + return; + } + // Send an email to all responsible supervisors when a new non-pending sample test is created or the status of // a formerly pending test result has changed final String sampleUuid = newPathogenTest.getSample().getUuid(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java index 18ea1e1e2c3..8596dc4da8c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java @@ -51,6 +51,10 @@ import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.common.DeletableAdo; import de.symeda.sormas.backend.contact.Contact; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSample; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleJoins; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleQueryContext; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleService; import de.symeda.sormas.backend.event.EventParticipant; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.QueryHelper; @@ -61,6 +65,8 @@ public class PathogenTestService extends AbstractDeletableAdoService getAllActiveUuids(User user) { cq.where(filter); cq.select(from.get(PathogenTest.UUID)); - return em.createQuery(cq).getResultList(); + final List resultList = em.createQuery(cq).getResultList(); + return resultList; } public List getIndexList(PathogenTestCriteria pathogenTestCriteria, Integer first, Integer max, List sortProperties) { @@ -304,10 +311,13 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From samplePath = sampleTestPath.join(PathogenTest.SAMPLE); - Predicate filter = sampleService.createUserFilter(new SampleQueryContext(cb, cq, samplePath), null); + Join samplePath = sampleTestPath.join(PathogenTest.SAMPLE, JoinType.LEFT); + Predicate sampleUserfilter = sampleService.createUserFilter(new SampleQueryContext(cb, cq, samplePath), null); - return filter; + Join environmentSampleJoin = sampleTestPath.join(PathogenTest.ENVIRONMENT_SAMPLE, JoinType.LEFT); + Predicate environmentSampleUserFilter = environmentSampleService.createUserFilter(cb, cq, environmentSampleJoin); + + return cb.or(sampleUserfilter, environmentSampleUserFilter); } @Override @@ -324,7 +334,14 @@ public void delete(PathogenTest pathogenTest, DeletionDetails deletionDetails) { private Predicate createActiveTestsFilter(CriteriaBuilder cb, CriteriaQuery cq, From root) { Join sample = root.join(PathogenTest.SAMPLE, JoinType.LEFT); - return sampleService.createActiveSamplesFilter(new SampleQueryContext(cb, cq, sample)); + Join environmentSample = root.join(PathogenTest.ENVIRONMENT_SAMPLE, JoinType.LEFT); + + Predicate activeEnvironmentSamplesFilter = environmentSampleService.createActiveEnvironmentSamplesFilter( + new EnvironmentSampleQueryContext(cb, cq, environmentSample, new EnvironmentSampleJoins(environmentSample))); + + final Predicate activeSamplesFilter = sampleService.createActiveSamplesFilter(new SampleQueryContext(cb, cq, sample)); + + return cb.or(activeEnvironmentSamplesFilter, activeSamplesFilter); } /** diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 98e5e0f5887..521659f7521 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12714,4 +12714,13 @@ ALTER TABLE externalmessage ADD CONSTRAINT fk_externalmessage_personfacility_id INSERT INTO schema_version (version_number, comment) VALUES (526, 'Add person facility to external messages #12366'); +-- 2023-09-11 Add pathogen tests to environment samples #12467 +ALTER TABLE pathogentest ADD COLUMN environmentsample_id bigint; +ALTER TABLE pathogentest_history ADD COLUMN environmentsample_id bigint; +ALTER TABLE pathogentest ADD CONSTRAINT fk_pathogentest_environmentsample_id FOREIGN KEY (environmentsample_id) REFERENCES environmentsamples(id); +ALTER TABLE pathogentest ALTER sample_id drop not null; +ALTER TABLE pathogentest_history ALTER sample_id drop not null; + +INSERT INTO schema_version (version_number, comment) VALUES (527, 'Add pathogen tests to environment samples #12467'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** \ No newline at end of file diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PathogenTestResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PathogenTestResource.java index 93e7b0366d6..a6287f44f1d 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PathogenTestResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PathogenTestResource.java @@ -60,7 +60,8 @@ public List getAllPathogenTests( @POST @Path("/query") public List getByUuids(List uuids) { - return FacadeProvider.getPathogenTestFacade().getByUuids(uuids); + final List byUuids = FacadeProvider.getPathogenTestFacade().getByUuids(uuids); + return byUuids; } @POST @@ -72,7 +73,8 @@ public List getBySampleUuids(List sampleUuids) { @GET @Path("/uuids") public List getAllActiveUuids() { - return FacadeProvider.getPathogenTestFacade().getAllActiveUuids(); + final List allActiveUuids = FacadeProvider.getPathogenTestFacade().getAllActiveUuids(); + return allActiveUuids; } @GET diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java index 21da9d80bf9..537341ab678 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java @@ -46,6 +46,8 @@ import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.contact.ContactStatus; import de.symeda.sormas.api.disease.DiseaseVariant; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventParticipantDto; import de.symeda.sormas.api.event.EventParticipantReferenceDto; @@ -76,6 +78,10 @@ public List getPathogenTestsBySample(SampleReferenceDto sampleR return facade.getAllBySample(sampleRef); } + public List getPathogenTestsByEnvironmentSample(EnvironmentSampleReferenceDto sampleRef) { + return facade.getAllByEnvironmentSample(sampleRef); + } + public void create(SampleReferenceDto sampleRef, int caseSampleCount) { SampleDto sampleDto = FacadeProvider.getSampleFacade().getSampleByUuid(sampleRef.getUuid()); final CommitDiscardWrapperComponent editView = getPathogenTestCreateComponent(sampleDto, caseSampleCount, null, false); @@ -83,6 +89,14 @@ public void create(SampleReferenceDto sampleRef, int caseSampleCount) { VaadinUiUtil.showModalPopupWindow(editView, I18nProperties.getString(Strings.headingCreatePathogenTestResult)); } + public void create(EnvironmentSampleReferenceDto sampleRef) { + EnvironmentSampleDto sampleDto = FacadeProvider.getEnvironmentSampleFacade().getByUuid(sampleRef.getUuid()); + + final CommitDiscardWrapperComponent editView = getPathogenTestCreateComponent(sampleDto); + + VaadinUiUtil.showModalPopupWindow(editView, I18nProperties.getString(Strings.headingCreatePathogenTestResult)); + } + public CommitDiscardWrapperComponent getPathogenTestCreateComponent( SampleDto sampleDto, int caseSampleCount, @@ -110,6 +124,27 @@ public CommitDiscardWrapperComponent getPathogenTestCreateComp return editView; } + public CommitDiscardWrapperComponent getPathogenTestCreateComponent(EnvironmentSampleDto sampleDto) { + + PathogenTestForm createForm = new PathogenTestForm(sampleDto, true, false, true); // Valid because jurisdiction doesn't matter for entities that are about to be created + createForm.setValue(PathogenTestDto.build(sampleDto, UserProvider.getCurrent().getUser())); + + final CommitDiscardWrapperComponent editView = new CommitDiscardWrapperComponent<>( + createForm, + UserProvider.getCurrent().hasUserRight(UserRight.PATHOGEN_TEST_CREATE), + createForm.getFieldGroup()); + + editView.addCommitListener(() -> { + if (!createForm.getFieldGroup().isModified()) { + PathogenTestDto pathogenTest = createForm.getValue(); + savePathogenTestForEnvironmentSample(pathogenTest); + + SormasUI.refreshView(); + } + }); + return editView; + } + public void edit(String pathogenTestUuid, Runnable doneCallback, boolean isEditAllowed, boolean isDeleteAllowed) { final CommitDiscardWrapperComponent editView = getPathogenTestEditComponent(pathogenTestUuid, doneCallback, isEditAllowed, isDeleteAllowed); @@ -140,8 +175,16 @@ public CommitDiscardWrapperComponent getPathogenTestEditCompon // get fresh data PathogenTestDto pathogenTest = facade.getByUuid(pathogenTestUuid); - SampleDto sample = FacadeProvider.getSampleFacade().getSampleByUuid(pathogenTest.getSample().getUuid()); - PathogenTestForm form = new PathogenTestForm(sample, false, 0, pathogenTest.isPseudonymized(), pathogenTest.isInJurisdiction()); + final PathogenTestForm form; + if (pathogenTest.getSample() != null) { + SampleDto sample = FacadeProvider.getSampleFacade().getSampleByUuid(pathogenTest.getSample().getUuid()); + form = new PathogenTestForm(sample, false, 0, pathogenTest.isPseudonymized(), pathogenTest.isInJurisdiction()); + } else { + EnvironmentSampleDto environmentSample = + FacadeProvider.getEnvironmentSampleFacade().getByUuid(pathogenTest.getEnvironmentSample().getUuid()); + form = new PathogenTestForm(environmentSample, false, pathogenTest.isPseudonymized(), pathogenTest.isInJurisdiction()); + } + form.setValue(pathogenTest); boolean isEditOrDeleteAllowed = isEditAllowed || isDeleteAllowed; @@ -151,7 +194,15 @@ public CommitDiscardWrapperComponent getPathogenTestEditCompon if (isEditOrDeleteAllowed) { editView.addCommitListener(() -> { if (!form.getFieldGroup().isModified()) { - savePathogenTest(form.getValue(), false); + PathogenTestDto editedPathogenTest = form.getValue(); + if (editedPathogenTest.getSample() != null) { + savePathogenTest(form.getValue(), false); + } + + if (editedPathogenTest.getEnvironmentSample() != null) { + savePathogenTestForEnvironmentSample(form.getValue()); + } + doneCallback.run(); SormasUI.refreshView(); } @@ -211,6 +262,18 @@ public void savePathogenTest(PathogenTestDto dto, boolean suppressNavigateToCase savePathogenTests(Collections.singletonList(dto), dto.getSample(), suppressNavigateToCase); } + public void savePathogenTestForEnvironmentSample(PathogenTestDto dto) { + savePathogenTestsForEnvironmentSample(Collections.singletonList(dto), dto.getEnvironmentSample()); + } + + public void savePathogenTestsForEnvironmentSample(List pathogenTests, EnvironmentSampleReferenceDto sampleRef) { + pathogenTests.forEach(p -> { + p.setEnvironmentSample(sampleRef); + facade.savePathogenTest(p); + }); + Notification.show(I18nProperties.getString(Strings.messagePathogenTestsSavedShort), TRAY_NOTIFICATION); + } + public void savePathogenTests(List pathogenTests, SampleReferenceDto sampleRef, boolean suppressNavigateToCase) { final SampleDto sample = FacadeProvider.getSampleFacade().getSampleByUuid(sampleRef.getUuid()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java index f4b20c0e69a..86e6ea35e03 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java @@ -46,6 +46,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.customizableenum.CustomizableEnumType; import de.symeda.sormas.api.disease.DiseaseVariant; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; @@ -109,6 +110,7 @@ public class PathogenTestForm extends AbstractEditForm { //@formatter:on private SampleDto sample; + private EnvironmentSampleDto environmentSample; private AbstractSampleForm sampleForm; private final int caseSampleCount; private final boolean create; @@ -138,6 +140,16 @@ public PathogenTestForm(SampleDto sample, boolean create, int caseSampleCount, b } } + public PathogenTestForm(EnvironmentSampleDto sample, boolean create, boolean isPseudonymized, boolean inJurisdiction) { + + this(create, 0, isPseudonymized, inJurisdiction); + this.environmentSample = sample; + addFields(); + if (create) { + hideValidationUntilNextCommit(); + } + } + public PathogenTestForm(boolean create, int caseSampleCount, boolean isPseudonymized, boolean inJurisdiction) { super( PathogenTestDto.class, @@ -165,11 +177,26 @@ private static void setCqValueVisibility(TextField cqValueField, PathogenTestTyp } private Date getSampleDate() { - return sample != null ? sample.getSampleDateTime() : (Date) sampleForm.getField(SampleDto.SAMPLE_DATE_TIME).getValue(); + if (sample != null) { + return sample.getSampleDateTime(); + } + if (sampleForm != null) { + return (Date) sampleForm.getField(SampleDto.SAMPLE_DATE_TIME).getValue(); + } + if (environmentSample != null) { + return environmentSample.getSampleDateTime(); + } + return null; } private SamplePurpose getSamplePurpose() { - return sample != null ? sample.getSamplePurpose() : (SamplePurpose) sampleForm.getField(SampleDto.SAMPLE_PURPOSE).getValue(); + if (sample != null) { + return sample.getSamplePurpose(); + } + if (sampleForm != null) { + return (SamplePurpose) sampleForm.getField(SampleDto.SAMPLE_PURPOSE).getValue(); + } + return null; } @Override @@ -218,8 +245,7 @@ protected void addFields() { Validations.afterDateWithDate, sampleTestDateField.getCaption(), I18nProperties.getPrefixCaption(SampleDto.I18N_PREFIX, SampleDto.SAMPLE_DATE_TIME), - DateFormatHelper.formatDate( - sample != null ? sample.getSampleDateTime() : (Date) sampleForm.getField(SampleDto.SAMPLE_DATE_TIME).getValue())))); + DateFormatHelper.formatDate(getSampleDate())))); ComboBox lab = addInfrastructureField(PathogenTestDto.LAB); lab.addItems(FacadeProvider.getFacilityFacade().getAllActiveLaboratories(true)); TextField labDetails = addField(PathogenTestDto.LAB_DETAILS, TextField.class); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java index 91b1aca4675..0232e4cf48c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleDataView.java @@ -28,16 +28,21 @@ import de.symeda.sormas.ui.SubMenu; import de.symeda.sormas.ui.environment.EnvironmentDataView; import de.symeda.sormas.ui.samples.SamplesView; +import de.symeda.sormas.ui.samples.pathogentestlink.PathogenTestListComponent; import de.symeda.sormas.ui.utils.AbstractDetailView; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.DetailSubComponentWrapper; import de.symeda.sormas.ui.utils.LayoutWithSidePanel; +import de.symeda.sormas.ui.utils.components.sidecomponent.SideComponentLayout; public class EnvironmentSampleDataView extends AbstractDetailView { public static final String ROOT_VIEW_NAME = SamplesView.VIEW_NAME; public static final String VIEW_NAME = ROOT_VIEW_NAME + "/environment"; + + public static final String PATHOGEN_TESTS_LOC = "pathogenTests"; + private CommitDiscardWrapperComponent editComponent; public EnvironmentSampleDataView() { @@ -80,9 +85,13 @@ protected void initView(String params) { container.setWidth(100, Unit.PERCENTAGE); container.setMargin(true); - LayoutWithSidePanel layout = new LayoutWithSidePanel(editComponent); + LayoutWithSidePanel layout = new LayoutWithSidePanel(editComponent, PATHOGEN_TESTS_LOC); container.addComponent(layout); + PathogenTestListComponent pathogenTestListComponent = + new PathogenTestListComponent(getReferenceByUuid(sample.getUuid()), this::showUnsavedChangesPopup, isEditAllowed()); + layout.addSidePanelComponent(new SideComponentLayout(pathogenTestListComponent), PATHOGEN_TESTS_LOC); + setSubComponent(container); layout.disableIfNecessary(sample.isDeleted(), editPermission); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestList.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestList.java index fed09fc99cd..b44d6cd49b5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestList.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestList.java @@ -22,6 +22,7 @@ import com.vaadin.ui.Label; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.sample.PathogenTestDto; @@ -37,7 +38,8 @@ public class PathogenTestList extends PaginationList { private static final int MAX_DISPLAYED_ENTRIES = 5; - private final SampleReferenceDto sampleRef; + private SampleReferenceDto sampleRef; + private EnvironmentSampleReferenceDto environmentSampleRef; private final Consumer actionCallback; private final boolean isEditable; @@ -49,9 +51,22 @@ public PathogenTestList(SampleReferenceDto sampleRef, Consumer actionC this.isEditable = isEditAllowed; } + public PathogenTestList(EnvironmentSampleReferenceDto environmentSampleRef, Consumer actionCallback, boolean isEditAllowed) { + super(MAX_DISPLAYED_ENTRIES); + + this.environmentSampleRef = environmentSampleRef; + this.actionCallback = actionCallback; + this.isEditable = isEditAllowed; + } + @Override public void reload() { - List pathogenTests = ControllerProvider.getPathogenTestController().getPathogenTestsBySample(sampleRef); + List pathogenTests = null; + if (sampleRef != null) { + pathogenTests = ControllerProvider.getPathogenTestController().getPathogenTestsBySample(sampleRef); + } else if (environmentSampleRef != null) { + pathogenTests = ControllerProvider.getPathogenTestController().getPathogenTestsByEnvironmentSample(environmentSampleRef); + } setEntries(pathogenTests); if (!pathogenTests.isEmpty()) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListComponent.java index 3a6973f5e3d..cc6790a9e3e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListComponent.java @@ -19,6 +19,7 @@ import java.util.function.Consumer; +import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -46,4 +47,20 @@ public PathogenTestListComponent(SampleReferenceDto sampleRef, Consumer actionCallback, boolean isEditAllowed) { + super(I18nProperties.getString(Strings.headingTests), actionCallback); + + if (isEditAllowed) { + addCreateButton( + I18nProperties.getCaption(Captions.pathogenTestNewTest), + () -> ControllerProvider.getPathogenTestController().create(sampleRef), + UserRight.PATHOGEN_TEST_CREATE); + } + + PathogenTestList pathogenTestList = new PathogenTestList(sampleRef, actionCallback, isEditAllowed); + addComponent(pathogenTestList); + pathogenTestList.reload(); + + } + } From 60eade312da29aab37d0b07124d92d4f86749041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 22 Sep 2023 10:29:19 +0200 Subject: [PATCH 125/144] #11262 - Fix invalid epi week selection end of year --- .../app/report/aggregate/AggregateReportsFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java index cd54f8b9f1f..593af533915 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java @@ -97,8 +97,12 @@ protected void onAfterLayoutBinding(FragmentReportsAggregateLayoutBinding conten private void setupControls() { EpiWeek previousEpiWeek = DateHelper.getPreviousEpiWeek(new Date()); EpiWeek currentEpiWeek = DateHelper.getEpiWeek(new Date()); + List yearList = DateHelper.getYearsToNow(); + if (currentEpiWeek.getYear() > previousEpiWeek.getYear()) { + yearList.add(currentEpiWeek.getYear()); + } - contentBinding.aggregateReportsYear.initializeSpinner(DataUtils.toItems(DateHelper.getYearsToNow()), previousEpiWeek.getYear(), field -> { + contentBinding.aggregateReportsYear.initializeSpinner(DataUtils.toItems(yearList), previousEpiWeek.getYear(), field -> { Integer year = (Integer) field.getValue(); if (year != null) { if (year.equals(currentEpiWeek.getYear())) { From 6f5e8067bfa198d76ec343b890cb0bbc66d398cb Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Fri, 22 Sep 2023 11:50:22 +0300 Subject: [PATCH 126/144] #12467 - Add pathogen tests to environment samples - review changesa and tests fix --- .../environmentsample/EnvironmentSampleIndexDto.java | 2 +- .../environmentsample/EnvironmentSampleReferenceDto.java | 3 +++ .../app/pathogentest/edit/PathogenTestNewActivity.java | 2 +- .../symeda/sormas/backend/sample/PathogenTestFacadeEjb.java | 2 +- .../de/symeda/sormas/backend/sample/PathogenTestService.java | 5 +++-- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java index 33d71afb3b6..5b5b51e6fa2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java @@ -97,7 +97,7 @@ public EnvironmentSampleIndexDto( String otherSampleMaterial, DeletionReason deletionReason, String otherDeletionReason, - int numberOfTests, + Long numberOfTests, boolean isInJurisdiction) { super(uuid); this.fieldSampleId = fieldSampleId; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java index 1f4a9c74bb5..a903aef3f04 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleReferenceDto.java @@ -15,6 +15,8 @@ package de.symeda.sormas.api.environment.environmentsample; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.utils.DependingOnFeatureType; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.ReferenceDto; @@ -22,6 +24,7 @@ import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.utils.DataHelper; +@DependingOnFeatureType(featureType = FeatureType.ENVIRONMENT_MANAGEMENT) public class EnvironmentSampleReferenceDto extends ReferenceDto { private static final long serialVersionUID = -2590392329041969693L; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java index 70b3ef2293e..617f5ae74a2 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java @@ -112,7 +112,7 @@ protected PathogenTest buildRootEntity() { EnvironmentSample associatedEnvironmentSample = DatabaseHelper.getEnvironmentSampleDao().queryUuid(environmentSampleUuid); return DatabaseHelper.getSampleTestDao().build(associatedEnvironmentSample); } - throw new RuntimeException("not valid pathogen test can be created. Missing sample and environmentSample links."); + throw new RuntimeException("Not valid pathogen test can be created. Missing sample and environmentSample links."); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java index 8defe73ab3d..6c1d62b4ee9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java @@ -529,7 +529,7 @@ public PathogenTest fillOrBuildEntity(@NotNull PathogenTestDto source, PathogenT private void onPathogenTestChanged(PathogenTestDto existingPathogenTest, PathogenTest newPathogenTest) { - if (existingPathogenTest.getSample() == null) { + if (newPathogenTest.getSample() == null) { return; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java index 8596dc4da8c..55671fa8f85 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java @@ -288,7 +288,8 @@ public List getDeletedUuidsSince(Date since) { cq.where(filter); cq.select(pathogenTest.get(PathogenTest.UUID)); - return em.createQuery(cq).getResultList(); + final List resultList = em.createQuery(cq).getResultList(); + return resultList; } public List getPathogenTestResultsForCase(long caseId) { @@ -317,7 +318,7 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From environmentSampleJoin = sampleTestPath.join(PathogenTest.ENVIRONMENT_SAMPLE, JoinType.LEFT); Predicate environmentSampleUserFilter = environmentSampleService.createUserFilter(cb, cq, environmentSampleJoin); - return cb.or(sampleUserfilter, environmentSampleUserFilter); + return CriteriaBuilderHelper.or(cb, sampleUserfilter, environmentSampleUserFilter); } @Override From edd9a5d8386aa6d59aafca69f1c43242d46270e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 22 Sep 2023 12:59:41 +0200 Subject: [PATCH 127/144] New Crowdin updates (#12557) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (French, Congo) * New translations strings.properties (French, Tunisia) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations captions.properties (German) * New translations strings.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations enum.properties (Romanian) * New translations enum.properties (French) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (French, Congo) * New translations enum.properties (French, Tunisia) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations enum.properties (Czech) * New translations enum.properties (Spanish, Cuba) * New translations strings.properties (French) * New translations validations.properties (Romanian) * New translations validations.properties (French) * New translations validations.properties (Spanish) * New translations validations.properties (Arabic) * New translations validations.properties (Czech) * New translations validations.properties (German) * New translations validations.properties (Finnish) * New translations validations.properties (Italian) * New translations validations.properties (Japanese) * New translations validations.properties (Dutch) * New translations validations.properties (Norwegian) * New translations validations.properties (Polish) * New translations validations.properties (Portuguese) * New translations validations.properties (Russian) * New translations validations.properties (Swedish) * New translations validations.properties (Turkish) * New translations validations.properties (Ukrainian) * New translations validations.properties (Chinese Simplified) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Croatian) * New translations validations.properties (Hindi) * New translations validations.properties (Filipino) * New translations validations.properties (Fijian) * New translations validations.properties (Swahili) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Nepali) * New translations validations.properties (French, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations validations.properties (Dari) * New translations validations.properties (Pashto) * New translations validations.properties (Spanish, Cuba) * New translations validations.properties (English, Afghanistan) * New translations validations.properties (English, Nigeria) * New translations validations.properties (English, Ghana) * New translations validations.properties (French, Congo) * New translations validations.properties (French, Tunisia) * New translations strings.xml (Romanian) * New translations strings.xml (French) * New translations strings.xml (Spanish) * New translations strings.xml (Arabic) * New translations strings.xml (Czech) * New translations strings.xml (German) * New translations strings.xml (Finnish) * New translations strings.xml (Italian) * New translations strings.xml (Japanese) * New translations strings.xml (Dutch) * New translations strings.xml (Norwegian) * New translations strings.xml (Polish) * New translations strings.xml (Portuguese) * New translations strings.xml (Russian) * New translations strings.xml (Swedish) * New translations strings.xml (Turkish) * New translations strings.xml (Ukrainian) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Urdu (Pakistan)) * New translations strings.xml (Croatian) * New translations strings.xml (Hindi) * New translations strings.xml (Filipino) * New translations strings.xml (Fijian) * New translations strings.xml (Swahili) * New translations strings.xml (German, Switzerland) * New translations strings.xml (Nepali) * New translations strings.xml (French, Switzerland) * New translations strings.xml (Italian, Switzerland) * New translations strings.xml (Dari) * New translations strings.xml (Pashto) * New translations strings.xml (Spanish, Cuba) * New translations strings.xml (English, Afghanistan) * New translations strings.xml (English, Nigeria) * New translations strings.xml (English, Ghana) * New translations strings.xml (French, Congo) * New translations strings.xml (French, Tunisia) * New translations captions.properties (Czech) * New translations strings.properties (Czech) * New translations validations.properties (Czech) * New translations strings.xml (Czech) * New translations captions.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations strings.xml (Spanish, Cuba) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (French, Congo) * New translations strings.properties (French, Tunisia) * New translations captions.properties (Czech) * New translations strings.properties (Czech) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) --- sormas-api/src/main/resources/captions_ar-SA.properties | 6 ++++-- sormas-api/src/main/resources/captions_cs-CZ.properties | 6 ++++-- sormas-api/src/main/resources/captions_de-CH.properties | 6 ++++-- sormas-api/src/main/resources/captions_de-DE.properties | 6 ++++-- sormas-api/src/main/resources/captions_en-AF.properties | 6 ++++-- sormas-api/src/main/resources/captions_en-GH.properties | 6 ++++-- sormas-api/src/main/resources/captions_en-NG.properties | 6 ++++-- sormas-api/src/main/resources/captions_es-CU.properties | 6 ++++-- sormas-api/src/main/resources/captions_es-ES.properties | 6 ++++-- sormas-api/src/main/resources/captions_fa-AF.properties | 6 ++++-- sormas-api/src/main/resources/captions_fi-FI.properties | 6 ++++-- sormas-api/src/main/resources/captions_fil-PH.properties | 6 ++++-- sormas-api/src/main/resources/captions_fj-FJ.properties | 6 ++++-- sormas-api/src/main/resources/captions_fr-CD.properties | 6 ++++-- sormas-api/src/main/resources/captions_fr-CH.properties | 6 ++++-- sormas-api/src/main/resources/captions_fr-FR.properties | 6 ++++-- sormas-api/src/main/resources/captions_fr-TN.properties | 6 ++++-- sormas-api/src/main/resources/captions_hi-IN.properties | 6 ++++-- sormas-api/src/main/resources/captions_hr-HR.properties | 6 ++++-- sormas-api/src/main/resources/captions_it-CH.properties | 6 ++++-- sormas-api/src/main/resources/captions_it-IT.properties | 6 ++++-- sormas-api/src/main/resources/captions_ja-JP.properties | 6 ++++-- sormas-api/src/main/resources/captions_ne-NP.properties | 6 ++++-- sormas-api/src/main/resources/captions_nl-NL.properties | 6 ++++-- sormas-api/src/main/resources/captions_no-NO.properties | 6 ++++-- sormas-api/src/main/resources/captions_pl-PL.properties | 6 ++++-- sormas-api/src/main/resources/captions_ps-AF.properties | 6 ++++-- sormas-api/src/main/resources/captions_pt-PT.properties | 6 ++++-- sormas-api/src/main/resources/captions_ro-RO.properties | 6 ++++-- sormas-api/src/main/resources/captions_ru-RU.properties | 6 ++++-- sormas-api/src/main/resources/captions_sv-SE.properties | 6 ++++-- sormas-api/src/main/resources/captions_sw-KE.properties | 6 ++++-- sormas-api/src/main/resources/captions_tr-TR.properties | 6 ++++-- sormas-api/src/main/resources/captions_uk-UA.properties | 6 ++++-- sormas-api/src/main/resources/captions_ur-PK.properties | 6 ++++-- sormas-api/src/main/resources/captions_zh-CN.properties | 6 ++++-- sormas-api/src/main/resources/strings_ar-SA.properties | 9 +++++++-- sormas-api/src/main/resources/strings_cs-CZ.properties | 9 +++++++-- sormas-api/src/main/resources/strings_de-CH.properties | 9 +++++++-- sormas-api/src/main/resources/strings_de-DE.properties | 9 +++++++-- sormas-api/src/main/resources/strings_en-AF.properties | 9 +++++++-- sormas-api/src/main/resources/strings_en-GH.properties | 9 +++++++-- sormas-api/src/main/resources/strings_en-NG.properties | 9 +++++++-- sormas-api/src/main/resources/strings_es-CU.properties | 9 +++++++-- sormas-api/src/main/resources/strings_es-ES.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fa-AF.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fi-FI.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fil-PH.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fj-FJ.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fr-CD.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fr-CH.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fr-FR.properties | 9 +++++++-- sormas-api/src/main/resources/strings_fr-TN.properties | 9 +++++++-- sormas-api/src/main/resources/strings_hi-IN.properties | 9 +++++++-- sormas-api/src/main/resources/strings_hr-HR.properties | 9 +++++++-- sormas-api/src/main/resources/strings_it-CH.properties | 9 +++++++-- sormas-api/src/main/resources/strings_it-IT.properties | 9 +++++++-- sormas-api/src/main/resources/strings_ja-JP.properties | 9 +++++++-- sormas-api/src/main/resources/strings_ne-NP.properties | 9 +++++++-- sormas-api/src/main/resources/strings_nl-NL.properties | 9 +++++++-- sormas-api/src/main/resources/strings_no-NO.properties | 9 +++++++-- sormas-api/src/main/resources/strings_pl-PL.properties | 9 +++++++-- sormas-api/src/main/resources/strings_ps-AF.properties | 9 +++++++-- sormas-api/src/main/resources/strings_pt-PT.properties | 9 +++++++-- sormas-api/src/main/resources/strings_ro-RO.properties | 9 +++++++-- sormas-api/src/main/resources/strings_ru-RU.properties | 9 +++++++-- sormas-api/src/main/resources/strings_sv-SE.properties | 9 +++++++-- sormas-api/src/main/resources/strings_sw-KE.properties | 9 +++++++-- sormas-api/src/main/resources/strings_tr-TR.properties | 9 +++++++-- sormas-api/src/main/resources/strings_uk-UA.properties | 9 +++++++-- sormas-api/src/main/resources/strings_ur-PK.properties | 9 +++++++-- sormas-api/src/main/resources/strings_zh-CN.properties | 9 +++++++-- 72 files changed, 396 insertions(+), 144 deletions(-) diff --git a/sormas-api/src/main/resources/captions_ar-SA.properties b/sormas-api/src/main/resources/captions_ar-SA.properties index 9268bfe2a00..417d9c24941 100644 --- a/sormas-api/src/main/resources/captions_ar-SA.properties +++ b/sormas-api/src/main/resources/captions_ar-SA.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index 105e1064ac4..e43533f7c9d 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= Nové prostředí environmentEnvironmentsList=Seznam prostředí # EnvironmentSample +EnvironmentSample = Vzorek prostředí EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Prostředí EnvironmentSample.sampleDateTime = Datum odběru vzorků @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Aktivní vzorky prostředí environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Vzorek -environmentSampleViewType=Prostředí \ No newline at end of file +humanSampleViewType=Lidský +environmentSampleViewType=Prostředí +environmentSampleNewSample=Nový vzorek \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index 6a59eaba143..65cab01ef10 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_de-DE.properties b/sormas-api/src/main/resources/captions_de-DE.properties index 24ae122a7d7..b769d813174 100644 --- a/sormas-api/src/main/resources/captions_de-DE.properties +++ b/sormas-api/src/main/resources/captions_de-DE.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= Neue Umgebungen environmentEnvironmentsList=Liste der Umgebungen # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Proben-ID EnvironmentSample.environment = Umgebung EnvironmentSample.sampleDateTime = Datum der Probenentnahme @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Aktive Umgebungs Proben environmentSampleArchivedSamples=Archivierte Umgebungs Proben environmentSampleAllActiveAndArchivedSamples=Alle aktiven und archivierten Umgebungs Proben environmentSampleDeletedSamples=Gelöschte Umgebungs Proben -sampleViewType=Probe -environmentSampleViewType=Umgebung \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Umgebung +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_en-AF.properties b/sormas-api/src/main/resources/captions_en-AF.properties index bb5dc6fdcff..e126cc1f795 100644 --- a/sormas-api/src/main/resources/captions_en-AF.properties +++ b/sormas-api/src/main/resources/captions_en-AF.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_en-GH.properties b/sormas-api/src/main/resources/captions_en-GH.properties index 02c073039d1..5ed9a3c9071 100644 --- a/sormas-api/src/main/resources/captions_en-GH.properties +++ b/sormas-api/src/main/resources/captions_en-GH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_en-NG.properties b/sormas-api/src/main/resources/captions_en-NG.properties index 77f9953d63b..af1858409f7 100644 --- a/sormas-api/src/main/resources/captions_en-NG.properties +++ b/sormas-api/src/main/resources/captions_en-NG.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_es-CU.properties b/sormas-api/src/main/resources/captions_es-CU.properties index e55fc3e5516..4dbc978e77c 100644 --- a/sormas-api/src/main/resources/captions_es-CU.properties +++ b/sormas-api/src/main/resources/captions_es-CU.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= Nuevo ambiente environmentEnvironmentsList=Lista de ambientes # EnvironmentSample +EnvironmentSample = Muestra ambiental EnvironmentSample.uuid = Id de la muestra EnvironmentSample.environment = Ambiente EnvironmentSample.sampleDateTime = Fecha de la muestra @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Muestras ambientales activas environmentSampleArchivedSamples=Muestras ambientales archivadas environmentSampleAllActiveAndArchivedSamples=Todas las muestras ambientales activas y archivadas environmentSampleDeletedSamples=Muestras ambientales eliminadas -sampleViewType=Muestra -environmentSampleViewType=Ambiente \ No newline at end of file +humanSampleViewType=Humano +environmentSampleViewType=Ambiente +environmentSampleNewSample=Nueva muestra \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_es-ES.properties b/sormas-api/src/main/resources/captions_es-ES.properties index 912d39c6055..496d4de16af 100644 --- a/sormas-api/src/main/resources/captions_es-ES.properties +++ b/sormas-api/src/main/resources/captions_es-ES.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fa-AF.properties b/sormas-api/src/main/resources/captions_fa-AF.properties index 2677a4d2c08..4ed254e5794 100644 --- a/sormas-api/src/main/resources/captions_fa-AF.properties +++ b/sormas-api/src/main/resources/captions_fa-AF.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fi-FI.properties b/sormas-api/src/main/resources/captions_fi-FI.properties index e88363ff3fb..3024da3c6f4 100644 --- a/sormas-api/src/main/resources/captions_fi-FI.properties +++ b/sormas-api/src/main/resources/captions_fi-FI.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fil-PH.properties b/sormas-api/src/main/resources/captions_fil-PH.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_fil-PH.properties +++ b/sormas-api/src/main/resources/captions_fil-PH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fj-FJ.properties b/sormas-api/src/main/resources/captions_fj-FJ.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_fj-FJ.properties +++ b/sormas-api/src/main/resources/captions_fj-FJ.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-CD.properties b/sormas-api/src/main/resources/captions_fr-CD.properties index 3aac86b13ee..f70fbf00a5a 100644 --- a/sormas-api/src/main/resources/captions_fr-CD.properties +++ b/sormas-api/src/main/resources/captions_fr-CD.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-CH.properties b/sormas-api/src/main/resources/captions_fr-CH.properties index 3b9423d332f..c0fb43d2ef1 100644 --- a/sormas-api/src/main/resources/captions_fr-CH.properties +++ b/sormas-api/src/main/resources/captions_fr-CH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index 9a5d82bb4f8..72e4816164e 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_fr-TN.properties b/sormas-api/src/main/resources/captions_fr-TN.properties index 0d0498e7fee..8f1fa4a6248 100644 --- a/sormas-api/src/main/resources/captions_fr-TN.properties +++ b/sormas-api/src/main/resources/captions_fr-TN.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_hi-IN.properties b/sormas-api/src/main/resources/captions_hi-IN.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_hi-IN.properties +++ b/sormas-api/src/main/resources/captions_hi-IN.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_hr-HR.properties b/sormas-api/src/main/resources/captions_hr-HR.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_hr-HR.properties +++ b/sormas-api/src/main/resources/captions_hr-HR.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_it-CH.properties b/sormas-api/src/main/resources/captions_it-CH.properties index 2e057321e0b..3f4db27c91e 100644 --- a/sormas-api/src/main/resources/captions_it-CH.properties +++ b/sormas-api/src/main/resources/captions_it-CH.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_it-IT.properties b/sormas-api/src/main/resources/captions_it-IT.properties index 39a09b8d15d..1bbffe88fe7 100644 --- a/sormas-api/src/main/resources/captions_it-IT.properties +++ b/sormas-api/src/main/resources/captions_it-IT.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ja-JP.properties b/sormas-api/src/main/resources/captions_ja-JP.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_ja-JP.properties +++ b/sormas-api/src/main/resources/captions_ja-JP.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ne-NP.properties b/sormas-api/src/main/resources/captions_ne-NP.properties index 9268bfe2a00..417d9c24941 100644 --- a/sormas-api/src/main/resources/captions_ne-NP.properties +++ b/sormas-api/src/main/resources/captions_ne-NP.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_nl-NL.properties b/sormas-api/src/main/resources/captions_nl-NL.properties index 5e8097ac00c..65e412038e3 100644 --- a/sormas-api/src/main/resources/captions_nl-NL.properties +++ b/sormas-api/src/main/resources/captions_nl-NL.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_no-NO.properties b/sormas-api/src/main/resources/captions_no-NO.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_no-NO.properties +++ b/sormas-api/src/main/resources/captions_no-NO.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index 3ee78198407..c926caf6405 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ps-AF.properties b/sormas-api/src/main/resources/captions_ps-AF.properties index 35c8b3ffeb7..b24c2fdb72d 100644 --- a/sormas-api/src/main/resources/captions_ps-AF.properties +++ b/sormas-api/src/main/resources/captions_ps-AF.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_pt-PT.properties b/sormas-api/src/main/resources/captions_pt-PT.properties index beb4eb8e94f..2cb92c92ca6 100644 --- a/sormas-api/src/main/resources/captions_pt-PT.properties +++ b/sormas-api/src/main/resources/captions_pt-PT.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ro-RO.properties b/sormas-api/src/main/resources/captions_ro-RO.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_ro-RO.properties +++ b/sormas-api/src/main/resources/captions_ro-RO.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ru-RU.properties b/sormas-api/src/main/resources/captions_ru-RU.properties index c9e2374e890..ebfa807713a 100644 --- a/sormas-api/src/main/resources/captions_ru-RU.properties +++ b/sormas-api/src/main/resources/captions_ru-RU.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_sv-SE.properties b/sormas-api/src/main/resources/captions_sv-SE.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_sv-SE.properties +++ b/sormas-api/src/main/resources/captions_sv-SE.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_sw-KE.properties b/sormas-api/src/main/resources/captions_sw-KE.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_sw-KE.properties +++ b/sormas-api/src/main/resources/captions_sw-KE.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_tr-TR.properties b/sormas-api/src/main/resources/captions_tr-TR.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_tr-TR.properties +++ b/sormas-api/src/main/resources/captions_tr-TR.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_uk-UA.properties b/sormas-api/src/main/resources/captions_uk-UA.properties index 94c9546a71c..6f74d6a5480 100644 --- a/sormas-api/src/main/resources/captions_uk-UA.properties +++ b/sormas-api/src/main/resources/captions_uk-UA.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index e2b0ee24b36..6a6de5bafb6 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= نیا ماحول environmentEnvironmentsList=ماحولیات کی فہرست # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = ماحول EnvironmentSample.sampleDateTime = نمونے لینے کی تاریخ @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_zh-CN.properties b/sormas-api/src/main/resources/captions_zh-CN.properties index 8dc75d0e6e4..eea1dcb08a4 100644 --- a/sormas-api/src/main/resources/captions_zh-CN.properties +++ b/sormas-api/src/main/resources/captions_zh-CN.properties @@ -1132,6 +1132,7 @@ environmentNewEnvironment= New environment environmentEnvironmentsList=Environments list # EnvironmentSample +EnvironmentSample = Environment Sample EnvironmentSample.uuid = Sample ID EnvironmentSample.environment = Environment EnvironmentSample.sampleDateTime = Date of sampling @@ -2871,5 +2872,6 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -sampleViewType=Sample -environmentSampleViewType=Environment \ No newline at end of file +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index 090f660aaa7..435ea2b70fd 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 8e758724fd3..64266a3ce12 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratorní vzorek +headingEnvironmentSampleMeasurements = Měření vzorku +headingEnvironmentSampleLocation = Umístění místa odběru vzorků +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Požadované patogeny k testování # Info texts infoActivityAsCaseInvestigation = Prosím zdokumentujte VŠECHNY relevantní aktivity po infekci\: infoAddTestsToSample = Pro přidání výsledku testu k tomuto vzorku musí být nejprve označen jako přijatý. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Hromadný proces byl zrušen, protože pro tuto operaci nejsou žádné způsobilé položky\! infoBulkProcessCancelled = Hromadný proces byl zrušen\!
Všechny vybrané položky až do zpracování tohoto bodu. Nyní můžete toto okno zavřít. Budou vybrány všechny dosud nezpracované položky. infoBulkUnresponsiveWindowHint = Tip\: Pokud se ukazatel průběhu zdá být nereagující a po chvíli není vidět žádný průběh zkuste kliknout na toto vyskakovací okno nebo změnit velikost okna prohlížeče. - +infoNoEnvironmentSamples = Pro toto prostředí nebyly vytvořeny žádné vzorky # Messages messageActionOutsideJurisdictionDeletionDenied = Akce mimo jurisdikci uživatele nemůže být odstraněna messageActivateAccount = Účet musí být aktivován @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Vzorek prostředí uložen # Notifications notificationCaseClassificationChanged = Klasifikace případu %s se změnila na %s. diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index ef223b3917b..4fbf9885135 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Bitte dokumentieren Sie ALLE relevanten Aktivitäten nach der Infektion\: infoAddTestsToSample = Um ein Testergebnis zu dieser Probe hinzuzufügen, muss es zuerst als empfangen markiert werden. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Konto muss aktiviert werden @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index 7e5d57ecc60..629b0bebf40 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Bitte dokumentieren Sie ALLE relevanten Betreuungen, Unterbringungen und Tätigkeiten in Einrichtungen\: infoAddTestsToSample = Um ein Testergebnis zu dieser Probe hinzuzufügen, muss es zuerst als empfangen markiert werden. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Massenverarbeitung wurde abgebrochen\!
Alle ausgewählten Einträge bis zu diesem Punkt verarbeitet. Sie können dieses Fenster nun schließen. Alle noch nicht bearbeiteten Einträge werden weiterhin ausgewählt. infoBulkUnresponsiveWindowHint = Tipp\: Wenn der Fortschrittsbalken nicht reagiert und nach einer Weile kein Fortschritt sichtbar ist versuchen Sie auf dieses Popup-Fenster zu klicken oder die Größe Ihres Browserfensters zu verändern. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = Die Aktion außerhalb der Zuständigkeit des Benutzers kann nicht gelöscht werden messageActivateAccount = Konto muss aktiviert werden @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index 607112e63f3..943d7d7832f 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index 92e4b36ce9b..5229bdd6896 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index 156b6779031..8d9b3b864a5 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 916136c5f1a..c97df9bfff4 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Muestras ambientales eliminadas headingEnvironmentSamplesNotDeleted = Ninguna de las muestras ambientales fue eliminada headingEnvironmentSamplesNotRestored = Ninguna de las muestras ambientales fue restaurada headingEnvironmentSamplesRestored = Muestras ambientales restauradas - +headingLaboratoryEnvironmentSample = Muestra de laboratorio +headingEnvironmentSampleMeasurements = Medidas de muestra +headingEnvironmentSampleLocation = Ubicación del sitio de la muestra +headingEnvironmentSampleManagement = Gestión de muestras +headingEnvironmentSampleRequestedPathogenTests = Pruebas de patógeno solicitadas # Info texts infoActivityAsCaseInvestigation = Por favor, documente TODAS las actividades relevantes después de la infección\: infoAddTestsToSample = Para añadir un resultado de prueba a esta muestra, se tiene que marcar como recibida primero. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = ¡El proce infoBulkProcessNoEligibleEntries = ¡El proceso masivo se ha cancelado porque no hay entradas elegibles para esta operación\! infoBulkProcessCancelled = ¡El proceso masivo se canceló\!
Todas las entradas seleccionadas hasta este punto han sido procesadas. Ahora puede cerrar esta ventana. Todas las entradas aún no procesadas seguirán seleccionadas. infoBulkUnresponsiveWindowHint = Sugerencia\: Si la barra de progreso parece no responder y no hay progreso visible por algún tiempo, pruebe hacer clic en esta ventana emergente o cambiar el tamaño de la ventana de su navegador. - +infoNoEnvironmentSamples = No se han creado muestras para este ambiente # Messages messageActionOutsideJurisdictionDeletionDenied = La acción fuera de la jurisdicción del usuario no puede ser eliminada messageActivateAccount = La cuenta debe ser activada @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = Todas las muestras ambientales elegibles sele messageCountEnvironmentSamplesNotDeleted = %s muestras ambientales no eliminadas\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s muestras ambientales no eliminadas por no estar en jurisdicción o posesión\: %s messageEnvironmentSamplesRestored = Todas las muestras ambientales seleccionadas fueron restauradas +messageEnvironmentSampleSaved = Se guardó la muestra ambiental # Notifications notificationCaseClassificationChanged = La clasificación del caso %s se cambió a %s. diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index dded50c4061..33e43f42953 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = Jotta näytteeseen voidaan lisätä tuloksia, se täytyy ensin merkitä otetuksi. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = Potilaan %s luokitus on muuttunut luokkaan %s. diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fr-CD.properties b/sormas-api/src/main/resources/strings_fr-CD.properties index 5770f77b0b1..75729e0f8a7 100644 --- a/sormas-api/src/main/resources/strings_fr-CD.properties +++ b/sormas-api/src/main/resources/strings_fr-CD.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index aa33e4b063f..f0370ffc9ac 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = Pour ajouter un résultat de test à cet échantillon, il doit d'abord être marqué comme reçu. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Le compte doit être activé @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index 6ae860bf9d7..6d77b4131dd 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Veuillez documenter toutes les activités pertinentes après l'infection \: infoAddTestsToSample = Pour ajouter un résultat de test à cet échantillon, il doit d'abord être marqué comme reçu. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Le processus en lot a été annulé car il n'y a pas d'entrées éligibles pour cette opération \! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Le compte doit être activé @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. diff --git a/sormas-api/src/main/resources/strings_fr-TN.properties b/sormas-api/src/main/resources/strings_fr-TN.properties index 52bdcb1ce34..53e3bb4f19c 100644 --- a/sormas-api/src/main/resources/strings_fr-TN.properties +++ b/sormas-api/src/main/resources/strings_fr-TN.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Veuillez documenter toutes les activités pertinentes après l'infection \: infoAddTestsToSample = Pour ajouter un résultat de test à cet échantillon, il doit d'abord être marqué comme reçu. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Le compte doit être activé @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index 664a2562228..53518d32651 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = Per essere aggiunto a questo campione, il il risultato del test deve dapprima essere contrassegnato come ricevuto. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = L'account deve essere attivato @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = La classificazione del caso %s è cambiata in %s. diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index 642ce218806..57d82e83f7f 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = Per essere aggiunto a questo campione, il il risultato del test deve dapprima essere contrassegnato come ricevuto. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = La classificazione del caso %s è cambiata in %s. diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index 090f660aaa7..435ea2b70fd 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index fcbe8b39016..0c0518ef5cb 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index 55d87216316..075abf79743 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index bc21c15dc6b..2ebc595ac56 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 2920385ad2e..96b74f8b0d7 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 8c133c256f4..684297c64f4 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = براہ کرم انفیکشن کے بعد تمام متعلقہ سرگرمیوں کو دستاویز کریں\: infoAddTestsToSample = اس نمونے میں ٹیسٹ کا نتیجہ شامل کرنے کے لیے، اسے پہلے موصول ہونے کے بطور نشان زد کرنا ہوگا۔ @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = بڑی تعداد میں عمل کو منسوخ کر دیا گیا ہے کیونکہ اس آپریشن کے لیے کوئی اہل اندراجات نہیں ہیں\! infoBulkProcessCancelled = بلک پروسیس کو منسوخ کر دیا گیا ہے\!
اس پوائنٹ پر کارروائی ہونے تک تمام منتخب اندراجات۔ اب آپ اس ونڈو کو بند کر سکتے ہیں۔ تمام ابھی تک پروسیس شدہ اندراجات کا انتخاب نہیں کیا جائے گا۔ infoBulkUnresponsiveWindowHint = اشارہ\: اگر پروگریس بار غیر جوابی لگتا ہے اور تھوڑی دیر کے بعد کوئی پیش رفت نظر نہیں آتی ہے، تو اس پاپ اپ ونڈو پر کلک کرنے کی کوشش کریں یا اپنی براؤزر ونڈو کا سائز تبدیل کریں۔ - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر کی کارروائی کو حذف نہیں کیا جا سکتا messageActivateAccount = اکاؤنٹ ایکٹیویٹ کرنا ہوگا @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = کیس %s کی درجہ بندی %s میں تبدیل ہو گئی ہے۔ diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index 86b74c02bd0..435eaf47553 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -848,7 +848,11 @@ headingEnvironmentSamplesDeleted = Environment samples deleted headingEnvironmentSamplesNotDeleted = None of the environment samples were deleted headingEnvironmentSamplesNotRestored = None of the environment samples were restored headingEnvironmentSamplesRestored = Environment samples restored - +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested # Info texts infoActivityAsCaseInvestigation = Please document ALL relevant activities after infection\: infoAddTestsToSample = To add a test result to this sample, it has to be marked as received first. @@ -1045,7 +1049,7 @@ infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = Bulk proce infoBulkProcessNoEligibleEntries = Bulk process has been cancelled because there are no eligible entries for this operation\! infoBulkProcessCancelled = Bulk process has been cancelled\!
All selected entries up until this point have been processed. You can now close this window. All not yet processed entries will still be selected. infoBulkUnresponsiveWindowHint = Hint\: If the progress bar seems to be unresponsive and no progress is visible after a while, try to click this popup window or resize your browser window. - +infoNoEnvironmentSamples = No samples have been created for this environment # Messages messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted messageActivateAccount = Account has to be activated @@ -1457,6 +1461,7 @@ messageEnvironmentSamplesDeleted = All selected eligible environment samples hav messageCountEnvironmentSamplesNotDeleted = %s environment samples not deleted\: %s messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s environment samples not deleted because they are not in jurisdiction or owned\: %s messageEnvironmentSamplesRestored = All selected environment samples have been restored +messageEnvironmentSampleSaved = Environment sample saved # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. From 3547dbfae02f7bfa8e87c2f5657e292389215c81 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Fri, 22 Sep 2023 16:22:47 +0300 Subject: [PATCH 128/144] #12467 - Add pathogen tests to environment samples - review changes --- .../EnvironmentSampleIndexDto.java | 4 ---- .../edit/PathogenTestEditActivity.java | 2 +- .../edit/PathogenTestNewActivity.java | 10 ++++----- .../de/symeda/sormas/app/util/Bundler.java | 2 +- .../EnvironmentSampleFacadeEjb.java | 21 ------------------- .../backend/sample/PathogenTestService.java | 6 +++++- .../ui/samples/PathogenTestController.java | 6 +++--- 7 files changed, 15 insertions(+), 36 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java index 5b5b51e6fa2..692f9404cd1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/environment/environmentsample/EnvironmentSampleIndexDto.java @@ -183,10 +183,6 @@ public long getNumberOfTests() { return numberOfTests; } - public void setNumberOfTests(long numberOfTests) { - this.numberOfTests = numberOfTests; - } - public DeletionReason getDeletionReason() { return deletionReason; } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java index 9c7486cec7c..9145a5023e3 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestEditActivity.java @@ -128,7 +128,7 @@ public void saveData() { save(pathogenTestToSave, associatedCase); } } - } else if (pathogenTestToSave.getEnvironmentSample() != null) { + } else { save(pathogenTestToSave, null); } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java index 617f5ae74a2..5d6690f763f 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/pathogentest/edit/PathogenTestNewActivity.java @@ -69,12 +69,12 @@ public static void startActivityForEnvironmentSample(Context context, String env BaseEditActivity.startActivity(context, PathogenTestNewActivity.class, buildBundleForEnvironmentSample(environmentSampleUuid)); } - public static Bundler buildBundleForSample(String caseUuid) { - return buildBundle(null, 0).setCaseUuid(caseUuid); + public static Bundler buildBundleForSample(String sampleUuid) { + return buildBundle(null, 0).setCaseUuid(sampleUuid); } public static Bundler buildBundleForEnvironmentSample(String environmentSampleUuid) { - return buildBundle(null, 0).setEnvironmentSampleuuid(environmentSampleUuid); + return buildBundle(null, 0).setEnvironmentSampleUuid(environmentSampleUuid); } @Override @@ -92,7 +92,7 @@ protected void onCreateInner(Bundle savedInstanceState) { @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - new Bundler(outState).setCaseUuid(sampleUuid).setEnvironmentSampleuuid(environmentSampleUuid); + new Bundler(outState).setCaseUuid(sampleUuid).setEnvironmentSampleUuid(environmentSampleUuid); } @Override @@ -112,7 +112,7 @@ protected PathogenTest buildRootEntity() { EnvironmentSample associatedEnvironmentSample = DatabaseHelper.getEnvironmentSampleDao().queryUuid(environmentSampleUuid); return DatabaseHelper.getSampleTestDao().build(associatedEnvironmentSample); } - throw new RuntimeException("Not valid pathogen test can be created. Missing sample and environmentSample links."); + throw new RuntimeException("Pathogen test cannot be created. Missing sample or environmentSample links"); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java index 366c5af0d02..17990e14885 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/Bundler.java @@ -203,7 +203,7 @@ public String getEnvironmentUuid() { return null; } - public Bundler setEnvironmentSampleuuid(String environmentSampleUuid) { + public Bundler setEnvironmentSampleUuid(String environmentSampleUuid) { bundle.putString(ENVIRONMENT_SAMPLE_UUID, environmentSampleUuid); return this; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java index 44f688e852b..08efd9f1b5d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/environmentsample/EnvironmentSampleFacadeEjb.java @@ -210,13 +210,6 @@ public List getIndexList( sortBy(sortProperties, queryContext); indexList.addAll(QueryHelper.getResultList(em, cq, null, null)); - -// indexList.forEach(environmentSampleIndexDto -> { -// if (environmentSampleIndexDto.getEnvironment() != null) { -// final Long noOfPathogenTests = getPathogenTests(environmentSampleIndexDto); -// environmentSampleIndexDto.setNumberOfTests(noOfPathogenTests); -// } -// }); }); Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); @@ -225,20 +218,6 @@ public List getIndexList( return indexList; } -// private Long getPathogenTests(EnvironmentSampleIndexDto environmentSampleIndexDto) { -// CriteriaBuilder cb = em.getCriteriaBuilder(); -// final CriteriaQuery numberOfPathogenTestsQuery = cb.createQuery(Long.class); -// final Root pathogenTestRoot = numberOfPathogenTestsQuery.from(PathogenTest.class); -// Join pathogenTestEnvironmentSampleJoin = -// pathogenTestRoot.join(PathogenTest.ENVIRONMENT_SAMPLE, JoinType.LEFT); -// -// numberOfPathogenTestsQuery.select(pathogenTestRoot.get(PathogenTest.ID)); -// numberOfPathogenTestsQuery -// .where(cb.equal(pathogenTestEnvironmentSampleJoin.get(EnvironmentSample.UUID), environmentSampleIndexDto.getUuid())); -// -// return Long.valueOf(em.createQuery(numberOfPathogenTestsQuery).getResultList().size()); -// } - private List getIndexListIds(EnvironmentSampleCriteria criteria, Integer first, Integer max, List sortProperties) { CriteriaBuilder cb = em.getCriteriaBuilder(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java index 55671fa8f85..f23db4db7c3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestService.java @@ -383,7 +383,11 @@ public List getInJurisdictionIds(List entities) { } private Predicate inJurisdictionOrOwned(CriteriaBuilder cb, CriteriaQuery query, From from) { + final Predicate samplePredicate = sampleService.inJurisdictionOrOwned(new SampleQueryContext(cb, query, from.join(PathogenTest.SAMPLE, JoinType.LEFT))); + final Join environmentSampleJoin = from.join(PathogenTest.ENVIRONMENT_SAMPLE, JoinType.LEFT); + final Predicate environmentSamplePredicate = environmentSampleService.inJurisdictionOrOwned( + new EnvironmentSampleQueryContext(cb, query, environmentSampleJoin, new EnvironmentSampleJoins(environmentSampleJoin))); - return sampleService.inJurisdictionOrOwned(new SampleQueryContext(cb, query, from.join(PathogenTest.SAMPLE))); + return CriteriaBuilderHelper.or(cb, samplePredicate, environmentSamplePredicate); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java index 537341ab678..e20d169e4cf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java @@ -112,7 +112,7 @@ public CommitDiscardWrapperComponent getPathogenTestCreateComp editView.addCommitListener(() -> { if (!createForm.getFieldGroup().isModified()) { PathogenTestDto pathogenTest = createForm.getValue(); - savePathogenTest(pathogenTest, suppressNavigateToCase); + savePathogenTestForSample(pathogenTest, suppressNavigateToCase); if (onSavedPathogenTest != null) { onSavedPathogenTest.accept(pathogenTest); @@ -196,7 +196,7 @@ public CommitDiscardWrapperComponent getPathogenTestEditCompon if (!form.getFieldGroup().isModified()) { PathogenTestDto editedPathogenTest = form.getValue(); if (editedPathogenTest.getSample() != null) { - savePathogenTest(form.getValue(), false); + savePathogenTestForSample(form.getValue(), false); } if (editedPathogenTest.getEnvironmentSample() != null) { @@ -258,7 +258,7 @@ public static void showCaseUpdateWithNewDiseaseVariantDialog( }).bringToFront(); } - public void savePathogenTest(PathogenTestDto dto, boolean suppressNavigateToCase) { + public void savePathogenTestForSample(PathogenTestDto dto, boolean suppressNavigateToCase) { savePathogenTests(Collections.singletonList(dto), dto.getSample(), suppressNavigateToCase); } From a40591b62d84734e2df9e56b10a5c5daa76fb3da Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Fri, 22 Sep 2023 15:59:48 +0000 Subject: [PATCH 129/144] [GitHub Actions] Update openAPI spec files --- sormas-rest/swagger.json | 18 +++++++++++++++++- sormas-rest/swagger.yaml | 13 ++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index e2573d61ee2..fbd69153a34 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -16191,6 +16191,19 @@ }, "required" : [ "environment", "laboratory", "reportDate", "reportingUser", "sampleDateTime", "sampleMaterial" ] }, + "EnvironmentSampleReferenceDto" : { + "type" : "object", + "properties" : { + "caption" : { + "type" : "string" + }, + "uuid" : { + "type" : "string", + "pattern" : "^[0-9a-zA-Z-]*$" + } + }, + "required" : [ "uuid" ] + }, "EpiDataDto" : { "type" : "object", "properties" : { @@ -20468,6 +20481,9 @@ "type" : "string", "enum" : [ "GDPR", "DELETION_REQUEST", "CREATED_WITH_NO_LEGAL_REASON", "TRANSFERRED_RESPONSIBILITY", "DUPLICATE_ENTRIES", "OTHER_REASON" ] }, + "environmentSample" : { + "$ref" : "#/components/schemas/EnvironmentSampleReferenceDto" + }, "externalId" : { "type" : "string", "maxLength" : 512, @@ -20617,7 +20633,7 @@ "type" : "boolean" } }, - "required" : [ "lab", "sample", "testResult", "testResultVerified", "testType", "testedDisease" ] + "required" : [ "lab", "testResult", "testResultVerified", "testType", "testedDisease" ] }, "PeriodDto" : { "type" : "object", diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index ce80baa20bd..703324d124a 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -14239,6 +14239,16 @@ components: - reportingUser - sampleDateTime - sampleMaterial + EnvironmentSampleReferenceDto: + type: object + properties: + caption: + type: string + uuid: + type: string + pattern: "^[0-9a-zA-Z-]*$" + required: + - uuid EpiDataDto: type: object properties: @@ -19689,6 +19699,8 @@ components: - TRANSFERRED_RESPONSIBILITY - DUPLICATE_ENTRIES - OTHER_REASON + environmentSample: + $ref: '#/components/schemas/EnvironmentSampleReferenceDto' externalId: type: string maxLength: 512 @@ -19893,7 +19905,6 @@ components: type: boolean required: - lab - - sample - testResult - testResultVerified - testType From 053738d75bd1448e1d8193f2a34684f4418ceb2e Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 25 Sep 2023 10:10:11 +0200 Subject: [PATCH 130/144] HSP-6262 Stabilize - Demis - Actions on Messages directory[2] -updated user name --- .../src/test/resources/features/sanity/web/DemisWeb.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature index 46738a89c90..9752dca2134 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/DemisWeb.feature @@ -719,7 +719,7 @@ Scenario: Create and send laboratory request via Demis Scenario: Demis - Actions on Messages directory[2] Given API : Login to DEMIS server When I create and send Laboratory Notification for physician report - And I log in as a Admin User + And I log in as a S2S And I click on the Messages button from navbar And I click on fetch messages button And I filter by last created person via API in Messages Directory From 2e49224dbc7f3c4f93b4df468fdb82d8cc508f00 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 25 Sep 2023 11:03:47 +0200 Subject: [PATCH 131/144] HSP-6263 Stabilize - Check automatic deletion NOT of IMMUNIZATION created 3645 days ago - changed a status code from 200 to 204 --- .../src/test/resources/features/sanity/web/Immunization.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature index 535b3eff137..5d3c8e4036e 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature @@ -387,4 +387,4 @@ Feature: Immunization end to end tests Then I click on Execute Automatic Deletion button And I wait 30 seconds for system reaction Then I check if created immunization is available in API - And API: I check that GET call status code is 200 \ No newline at end of file + And API: I check that GET call status code is 204 \ No newline at end of file From 3cccda44d78c366935a12b0ffe4c67e13a314bd1 Mon Sep 17 00:00:00 2001 From: Razvan Date: Mon, 25 Sep 2023 17:59:04 +0300 Subject: [PATCH 132/144] HSP-5531 : added tests --- .../web/application/cases/EditCaseSteps.java | 19 +++++++++++ .../contacts/EditContactSteps.java | 31 +++++++++++++++++ .../messages/MessagesDirectorySteps.java | 16 ++++----- .../web/application/survnet/SurvNetSteps.java | 2 +- .../features/sanity/web/Case.feature | 33 ++++++++++++++++++- .../features/sanity/web/Contacts.feature | 12 ++++++- 6 files changed, 102 insertions(+), 11 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index c1d0d02faf5..7e09b6a49eb 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -2990,6 +2990,25 @@ public EditCaseSteps( webDriverHelpers.clickOnWebElementBySelector(NOSOCOMIAL_OUTBRAKE_LABEL); }); + When( + "I check if Follow up until date is ([^\"]*) days after last created API case report date", + (Integer days) -> { + TimeUnit.SECONDS.sleep(3); + String date = webDriverHelpers.getValueFromWebElement(FOLLOW_UP_UNTIL_DATE); + softly.assertEquals( + DateTimeFormatter.ofPattern("dd.MM.yyyy") + .format( + apiState + .getCreatedCase() + .getReportDate() + .toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate() + .plusDays(days)), + date); + softly.assertAll(); + }); + And( "^I select \"([^\"]*)\" from the infection settings on Edit Case page$", (String infectionOption) -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java index 32c4d85f9bb..c4aaff246a7 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java @@ -1387,6 +1387,37 @@ public EditContactSteps( webDriverHelpers.clearWebElement(LAST_CONTACT_DATE); }); + When( + "I check if Follow up until date is ([^\"]*) days after last contact date of recently created contact", + (Integer days) -> { + TimeUnit.SECONDS.sleep(3); + String date = webDriverHelpers.getValueFromWebElement(FOLLOW_UP_UNTIL_DATE); + softly.assertEquals( + DateTimeFormatter.ofPattern("dd.MM.yyyy") + .format(EditContactSteps.collectedContact.getDateOfLastContact().plusDays(days)), + date); + softly.assertAll(); + }); + + When( + "I check if Follow up until date is ([^\"]*) days after last created API contact report date", + (Integer days) -> { + TimeUnit.SECONDS.sleep(3); + String date = webDriverHelpers.getValueFromWebElement(FOLLOW_UP_UNTIL_DATE); + softly.assertEquals( + DateTimeFormatter.ofPattern("dd.MM.yyyy") + .format( + apiState + .getCreatedContact() + .getReportDateTime() + .toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate() + .plusDays(days)), + date); + softly.assertAll(); + }); + And( "I check if vaccination name for vaccine number {int} in the vaccination card is {string}", (Integer vaccineNumber, String elementStatus) -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java index 270bf415a54..2ed9f2762ef 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/messages/MessagesDirectorySteps.java @@ -536,14 +536,14 @@ public MessagesDirectorySteps( Then( "I collect {string} Date from Message", (String dateOption) -> { - String localDiagnosedAt = - String.format( - webDriverHelpers - .getTextFromWebElement(DIAGNOSED_AT_DATE) - .substring(0, 10) - .replace(".", "-")); - diagnosedAt = - convertStringToChosenFormatDate("dd-MM-yyyy", "yyyy-MM-dd", localDiagnosedAt); + String localDiagnosedAt = + String.format( + webDriverHelpers + .getTextFromWebElement(DIAGNOSED_AT_DATE) + .substring(0, 10) + .replace(".", "-")); + diagnosedAt = + convertStringToChosenFormatDate("dd-MM-yyyy", "yyyy-MM-dd", localDiagnosedAt); }); Then( diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java index 30b41e0869f..a18840aa782 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/survnet/SurvNetSteps.java @@ -717,7 +717,7 @@ public SurvNetSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { () -> { softly.assertEquals( getValueFromSpecificNotificationFieldByName(singleXmlFile, "NotificationViaDEMIS"), - CheckboxViaDemisValue, + CheckboxViaDemisValue, "checkbox has incorrect value!"); softly.assertAll(); }); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 7c0ea6b5824..2c158d84795 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1869,4 +1869,35 @@ Feature: Case end to end tests And I check that a bulk progress operation window appears on Case Directory page And I wait until the bulk progress operation is done and check numbers of 41 successful and 0 skipped cases And I check that total number of cases for bulk operation is 41 - And I click on close progress operation window \ No newline at end of file + And I click on close progress operation window + + @tmsLink=SOR-4713 @env_de + Scenario: Test Extend the follow-up until date calculation for Cases + Given API: I create a new person + And API: I check that POST call status code is 200 + Given API: I create a new case + And API: I check that POST call status code is 200 + Given I log in as a National User + Then I navigate to the last created case via the url + And I check if Follow up until date is 14 days after last created API case report date + When I click on New Sample in German + Then I create a new Sample with positive test result for DE version + And I select the German words for Antigen Detection Test as Type of Test in the Create New Sample popup + And I set date of sample collection to 5 day ago in Sample form + And I set Final Laboratory Result to "Positiv" on Create new Sample page + And I save the created sample + And I check if Follow up until date is 9 days after last created API case report date + And I navigate to symptoms tab + When I check Yes Option for Soar Throat on Symptoms tab page + And I select sore throat option + And I set date of symptoms to 6 day ago from Symptoms tab + And I click on save button from Edit Case page + Then I navigate to the last created case via the url + And I check if Follow up until date is 8 days after last created API case report date + When I click on New Sample in German + Then I create a new Sample with positive test result for DE version + And I select the German words for Antigen Detection Test as Type of Test in the Create New Sample popup + And I set date of sample collection to 7 day ago in Sample form + And I set Final Laboratory Result to "Positiv" on Create new Sample page + And I save the created sample + And I check if Follow up until date is 8 days after last created API case report date \ No newline at end of file diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature index 9e0e0b7560c..3d0d64324e4 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature @@ -1164,4 +1164,14 @@ Feature: Contacts end to end tests And API: I check that GET call status code is 200 And I click on the Contacts button from navbar And I filter with last created contact using contact UUID - And I check that number of displayed contact results is 1 \ No newline at end of file + And I check that number of displayed contact results is 1 + + @tmsLink=SOR-4713 @env_de + Scenario: Test Extend the follow-up until date calculation for Contacts + Given API: I create a new person + And API: I check that POST call status code is 200 + Then API: I create a new contact + And API: I check that POST call status code is 200 + Given I log in as a National User + Then I open the last created contact via API from "de" + And I check if Follow up until date is 14 days after last created API contact report date \ No newline at end of file From 612d9c0a208c45c5325168c828ac68ae4bb56f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 26 Sep 2023 09:27:28 +0200 Subject: [PATCH 133/144] #12257 - Fix bulk progress window counts (#12565) * #12257 - Fix bulk progress window counts * #12257 - Include failed sendings --- .../sormas/backend/caze/CaseService.java | 32 ++++++++++++------- .../common/AbstractCoreAdoService.java | 22 ++++++------- .../sormas/backend/event/EventService.java | 32 ++++++++++++------- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 866dc18a779..6006b55e1e9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -1118,30 +1118,38 @@ public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { @Override public List archive(List entityUuids) { - List processedCases = updateArchiveFlagInExternalSurveillanceTool(entityUuids, true); - List remainingUuidsToBeProcessed = - getEntitiesToBeProcessed(entityUuids, processedCases).stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + List updatedInExternalSurveillanceTool = updateArchiveFlagInExternalSurveillanceTool(entityUuids, true); + List uuidsWithoutFailure = getEntitiesWithoutFailure(entityUuids, updatedInExternalSurveillanceTool).stream() + .map(AbstractDomainObject::getUuid) + .collect(Collectors.toList()); - if (remainingUuidsToBeProcessed.size() > 0) { - processedCases.addAll(super.archive(remainingUuidsToBeProcessed)); + List resultList = + updatedInExternalSurveillanceTool.stream().filter(e -> !uuidsWithoutFailure.contains(e.getEntityUuid())).collect(Collectors.toList()); + + if (uuidsWithoutFailure.size() > 0) { + resultList.addAll(super.archive(uuidsWithoutFailure)); } - return processedCases; + return resultList; } @Override public List dearchive(List entityUuids, String dearchiveReason) { - List processedCases = updateArchiveFlagInExternalSurveillanceTool(entityUuids, false); - List remainingUuidsToBeProcessed = - getEntitiesToBeProcessed(entityUuids, processedCases).stream().map(caze -> caze.getUuid()).collect(Collectors.toList()); + List updatedInExternalSurveillanceTool = updateArchiveFlagInExternalSurveillanceTool(entityUuids, false); + List uuidsWithoutFailure = getEntitiesWithoutFailure(entityUuids, updatedInExternalSurveillanceTool).stream() + .map(AbstractDomainObject::getUuid) + .collect(Collectors.toList()); - if (remainingUuidsToBeProcessed.size() > 0) { - processedCases.addAll(super.dearchive(remainingUuidsToBeProcessed, dearchiveReason)); + List resultList = + updatedInExternalSurveillanceTool.stream().filter(e -> !uuidsWithoutFailure.contains(e.getEntityUuid())).collect(Collectors.toList()); + + if (uuidsWithoutFailure.size() > 0) { + resultList.addAll(super.dearchive(uuidsWithoutFailure, dearchiveReason)); } - return processedCases; + return resultList; } private List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index a978c9805fd..64cd301a30c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -17,7 +17,6 @@ import java.sql.Timestamp; import java.time.Instant; -import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -37,9 +36,9 @@ import javax.persistence.criteria.Root; import de.symeda.sormas.api.EditPermissionType; +import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; -import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.util.IterableHelper; @@ -139,7 +138,7 @@ public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public List archive(List entityUuids) { - List processedEntities = new ArrayList<>(); + IterableHelper.executeBatched( entityUuids, ARCHIVE_BATCH_SIZE, @@ -157,14 +156,12 @@ public List archive(List entityUuids) { em.createQuery(cu).executeUpdate(); })); - processedEntities.addAll(buildProcessedEntities(entityUuids, ProcessedEntityStatus.SUCCESS)); - - return processedEntities; + return buildProcessedEntities(entityUuids, ProcessedEntityStatus.SUCCESS); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public List dearchive(List entityUuids, String dearchiveReason) { - List processedEntities = new ArrayList<>(); + IterableHelper.executeBatched(entityUuids, ARCHIVE_BATCH_SIZE, batchedUuids -> { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaUpdate cu = cb.createCriteriaUpdate(getElementClass()); @@ -180,9 +177,7 @@ public List dearchive(List entityUuids, String dearchiv em.createQuery(cu).executeUpdate(); }); - processedEntities.addAll(buildProcessedEntities(entityUuids, ProcessedEntityStatus.SUCCESS)); - - return processedEntities; + return buildProcessedEntities(entityUuids, ProcessedEntityStatus.SUCCESS); } public EditPermissionType getEditPermissionType(ADO entity) { @@ -209,12 +204,13 @@ public boolean inJurisdictionOrOwned(ADO entity) { return fulfillsCondition(entity, this::inJurisdictionOrOwned); } - public List getEntitiesToBeProcessed(List entityUuids, List processedEntities) { - List failedUuids = processedEntities.stream() + public List getEntitiesWithoutFailure(List entityUuids, List updatedInExternalSurveillanceTool) { + + List failedUuids = updatedInExternalSurveillanceTool.stream() .filter( entity -> entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.ACCESS_DENIED_FAILURE) || entity.getProcessedEntityStatus().equals(ProcessedEntityStatus.EXTERNAL_SURVEILLANCE_FAILURE)) - .map(entity -> entity.getEntityUuid()) + .map(ProcessedEntity::getEntityUuid) .collect(Collectors.toList()); List entities = getByUuids(entityUuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index 48301eefa95..210e9e0b7b8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -302,30 +302,38 @@ public ProcessedEntity archive(String entityUuid, Date endOfProcessingDate) { @Override public List archive(List entityUuids) { - List processedEvents = updateArchiveFlagInExternalSurveillanceTool(entityUuids, true); - List remainingUuidsToBeProcessed = - getEntitiesToBeProcessed(entityUuids, processedEvents).stream().map(event -> event.getUuid()).collect(Collectors.toList()); + List updatedInExternalSurveillanceTool = updateArchiveFlagInExternalSurveillanceTool(entityUuids, true); + List uuidsWithoutFailure = getEntitiesWithoutFailure(entityUuids, updatedInExternalSurveillanceTool).stream() + .map(AbstractDomainObject::getUuid) + .collect(Collectors.toList()); - if (remainingUuidsToBeProcessed.size() > 0) { - processedEvents.addAll(super.archive(remainingUuidsToBeProcessed)); + List resultList = + updatedInExternalSurveillanceTool.stream().filter(e -> !uuidsWithoutFailure.contains(e.getEntityUuid())).collect(Collectors.toList()); + + if (uuidsWithoutFailure.size() > 0) { + resultList.addAll(super.archive(uuidsWithoutFailure)); } - return processedEvents; + return resultList; } @Override public List dearchive(List entityUuids, String dearchiveReason) { - List processedEvents = updateArchiveFlagInExternalSurveillanceTool(entityUuids, false); - List remainingUuidsToBeProcessed = - getEntitiesToBeProcessed(entityUuids, processedEvents).stream().map(event -> event.getUuid()).collect(Collectors.toList()); + List updatedInExternalSurveillanceTool = updateArchiveFlagInExternalSurveillanceTool(entityUuids, false); + List uuidsWithoutFailure = getEntitiesWithoutFailure(entityUuids, updatedInExternalSurveillanceTool).stream() + .map(AbstractDomainObject::getUuid) + .collect(Collectors.toList()); - if (remainingUuidsToBeProcessed.size() > 0) { - processedEvents.addAll(super.dearchive(remainingUuidsToBeProcessed, dearchiveReason)); + List resultList = + updatedInExternalSurveillanceTool.stream().filter(e -> !uuidsWithoutFailure.contains(e.getEntityUuid())).collect(Collectors.toList()); + + if (uuidsWithoutFailure.size() > 0) { + resultList.addAll(super.dearchive(uuidsWithoutFailure, dearchiveReason)); } - return processedEvents; + return resultList; } private List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { From 0fdf35174119b462ceb337d5a28e2ad8743f4b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 26 Sep 2023 10:12:05 +0200 Subject: [PATCH 134/144] #11262 - Avoid crash on sync without epi week --- .../report/aggregate/AggregateReportsFragment.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java index 593af533915..b9a1fcdc65d 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/report/aggregate/AggregateReportsFragment.java @@ -185,9 +185,7 @@ private void updateByEpiWeek() { contentBinding.reportSelector.setValue(filterOption); } - if (epiWeek != null) { - fillReportsDropdown(); - } + fillReportsDropdown(); } public void refreshAggregateReports() { @@ -198,6 +196,8 @@ public void refreshAggregateReports() { private void fillReportsDropdown() { if (contentBinding.aggregateReportsWeek.getValue() == null) { + contentBinding.reportContent.removeAllViews(); + contentBinding.submitReport.setEnabled(false); contentBinding.aggregateReportsReport.setSpinnerData(new ArrayList<>()); return; } @@ -220,6 +220,11 @@ private void showReportData() { contentBinding.reportContent.removeAllViews(); + if (contentBinding.aggregateReportsWeek.getValue() == null || contentBinding.aggregateReportsReport.getValue() == null) { + contentBinding.submitReport.setEnabled(false); + return; + } + Date latestLocalChangeDate = null; User user = ConfigProvider.getUser(); boolean triggerDuplicateWarning = false; From b4924aabad0a01c0c2b4e3110a0ff0606f81a7fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 26 Sep 2023 10:38:23 +0200 Subject: [PATCH 135/144] #12366 - Map facility type --- .../sormas/ui/externalmessage/ExternalMessageMapper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java index 3811abe9705..bc1c9961454 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageMapper.java @@ -113,10 +113,12 @@ public List mapToLocation(LocationDto location) { RegionReferenceDto region = null; DistrictReferenceDto district = null; + FacilityType facilityType = null; if (externalMessage.getPersonFacility() != null) { FacilityDto facility = FacadeProvider.getFacilityFacade().getByUuid(externalMessage.getPersonFacility().getUuid()); region = facility.getRegion(); district = facility.getDistrict(); + facilityType = facility.getType(); } return map( @@ -138,6 +140,7 @@ public List mapToLocation(LocationDto location) { Mapping.of(location::setCountry, location.getCountry(), externalMessage.getPersonCountry(), PersonDto.ADDRESS, LocationDto.COUNTRY), Mapping.of(location::setRegion, location.getRegion(), region, PersonDto.ADDRESS, LocationDto.REGION), Mapping.of(location::setDistrict, location.getDistrict(), district, PersonDto.ADDRESS, LocationDto.DISTRICT), + Mapping.of(location::setFacilityType, location.getFacilityType(), facilityType, PersonDto.ADDRESS, LocationDto.FACILITY_TYPE), Mapping.of( location::setFacility, location.getFacility(), From 6757f2592b114f45c47cb7dd96dd6531b7fbf6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 27 Sep 2023 10:01:11 +0200 Subject: [PATCH 136/144] #12366 - Fix NPE with missing address fields --- .../backend/infrastructure/facility/FacilityService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java index f249fab972b..648655f878f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/facility/FacilityService.java @@ -32,6 +32,8 @@ import javax.persistence.criteria.Root; import javax.validation.constraints.NotNull; +import org.apache.commons.lang3.StringUtils; + import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto; import de.symeda.sormas.api.infrastructure.facility.FacilityCriteria; @@ -200,6 +202,10 @@ public List getFacilitiesByNameAndType( public Facility getByAddress(String street, String postalCode, String city) { + if (StringUtils.isAnyBlank(street, postalCode, city)) { + return null; + } + CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(getElementClass()); Root from = cq.from(getElementClass()); From ea66fc4f5a367bba0b60c6e4efdc6327121f3d80 Mon Sep 17 00:00:00 2001 From: Razvan Date: Wed, 27 Sep 2023 11:43:15 +0300 Subject: [PATCH 137/144] SOR-4724 : adjusted code and linked test mapping --- .../entities/services/EventService.java | 2 +- .../features/sanity/web/Event.feature | 50 ++----------------- 2 files changed, 4 insertions(+), 48 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/EventService.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/EventService.java index a026d51c191..7981dcabe7a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/EventService.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/EventService.java @@ -98,7 +98,7 @@ public Event buildGeneratedEvent() { String timestamp = String.valueOf(System.currentTimeMillis()); return Event.builder() .eventStatus("EVENT") - .investigationStatus("INVESTIGATION PENDING") // change back to ongoing after bug fix 5547 + .investigationStatus("INVESTIGATION PENDING") .eventManagementStatus("ONGOING") .disease("COVID-19") .diseaseVariant("B.1.617.3") diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index e6e6132061c..0985f3e5740 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -2,7 +2,7 @@ Feature: Create events @env_main - Scenario: Create a new event + Scenario: Create a new event only with mandatory fields Given I log in as a National User And I click on the Events button from navbar And I click on the NEW EVENT button @@ -34,8 +34,8 @@ Feature: Create events And I search for specific event in event directory Then I check if it appears under Dropped filter in event directory - @env_main - Scenario: Create and check a new event data + @env_main @tmsLink=@SOR-4724 + Scenario: Create new event by filling all data Given I log in as a National User And I click on the Events button from navbar And I click on the NEW EVENT button @@ -103,7 +103,6 @@ Feature: Create events @env_main Scenario: Add a New action from event and verify the fields Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User Then I open the last created event via api @@ -116,7 +115,6 @@ Feature: Create events @tmsLink=SORDEV-5520 @env_main Scenario: Add a New action from Event Actions tab and verify the fields. Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User Then I navigate to Event Action tab for created Event @@ -131,7 +129,6 @@ Feature: Create events @env_main Scenario: Add a New action for an Event and verify the Action in EventActions table Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User Then I navigate to Event Action tab for created Event @@ -146,7 +143,6 @@ Feature: Create events @tmsLink=SORDEV-5476 @env_main Scenario: Add a Task from event and verify the fields Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User When I am accessing the event tab using the created event via api @@ -195,7 +191,6 @@ Feature: Create events @tmsLink=SORDEV-5571 @env_main Scenario: Event group screen from Event Directory Page Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User And I click on the Events button from navbar @@ -210,7 +205,6 @@ Feature: Create events @tmsLink=SORDEV-5571 @env_main Scenario: Event group screen using Group Id on Edit Event Page Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User And I click on the Events button from navbar @@ -336,7 +330,6 @@ Feature: Create events @tmsLink=SORDEV-5569 @env_main Scenario: Testing Event groups view filters with sorting actions Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User When I am accessing the event tab using the created event via api @@ -462,7 +455,6 @@ Feature: Create events @tmsLink=SORDEV-7461 @env_main Scenario: Testing bulk edit of Events Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a Admin User And I click on the Events button from navbar @@ -490,7 +482,6 @@ Feature: Create events @tmsLink=SORDEV-5967 @env_de Scenario: Add evidence fields for event clusters Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User Then I open the last created event via api @@ -536,13 +527,10 @@ Feature: Create events @tmsLink=SORDEV-9477 @env_main Scenario: Add a person search option on creation forms Given API: I create a new event - And API: I check that POST call status code is 200 Then API: I create a new person - And API: I check that POST call status code is 200 Then API: I create a new case - And API: I check that POST call status code is 200 And I log in as a National User Then I open the last created event via api @@ -568,13 +556,10 @@ Feature: Create events @env_main @#8555 Scenario: Add back a person to an event who was previously deleted as event participant Given API: I create a new person - And API: I check that POST call status code is 200 Given API: I create a new case - And API: I check that POST call status code is 200 Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User When I am accessing the event tab using the created event via api @@ -671,13 +656,10 @@ Feature: Create events @tmsLink=SORDEV-9786 @env_main Scenario: Test The "urine p.m." enum value should be hidden when Covid19 is selected as disease Given API: I create a new person - And API: I check that POST call status code is 200 Given API: I create a new case - And API: I check that POST call status code is 200 Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User Then I open the last created event via api @@ -730,7 +712,6 @@ Feature: Create events @tmsLink=SORDEV-8667 @env_main Scenario: Test Adjustments to the jurisdiction definition process of event participants Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a Admin User Then I open the last created event via api @@ -785,7 +766,6 @@ Feature: Create events @tmsLink=SORDEV-9788 @env_de Scenario: Test Hide country specific fields in the 'Person search option' pop-up in Event Participant directory Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User When I open the last created event via api @@ -855,13 +835,10 @@ Feature: Create events @env_main @#8556 Scenario: Add two positive Pathogen Test Result of different diseases to a Sample of an Event Participant Given API: I create a new event - And API: I check that POST call status code is 200 Given API: I create a new person - And API: I check that POST call status code is 200 Given API: I create a new case - And API: I check that POST call status code is 200 Given I log in as a National User When I am accessing the event tab using the created event via api @@ -887,7 +864,6 @@ Feature: Create events @env_main @#8565 Scenario: Check an archived event if its read only Given API: I create a new event - And API: I check that POST call status code is 200 Then I log in as a Admin User Then I am accessing the event tab using the created event via api @@ -916,7 +892,6 @@ Feature: Create events @tmsLink=SORDEV-7095 @env_main Scenario: Test Addition of a Variant field in the "EVENT" part Given API: I create a new event - And API: I check that POST call status code is 200 When I log in as a National User And I click on the Events button from navbar @@ -968,7 +943,6 @@ Feature: Create events @tmsLink=SORDEV-11455 @env_main Scenario: Add reason for deletion to confirmation dialogue Given API: I create a new event - And API: I check that POST call status code is 200 When I log in as a National User And I click on the Events button from navbar @@ -1023,7 +997,6 @@ Feature: Create events @tmsLink=SORQA-7093 @env_main Scenario: Allow the admin surveillance supervisor to archive events Given API: I create a new event - And API: I check that POST call status code is 200 Given I navigate to SORMAS login page Then I log in as a Admin Surveillance Supervisor @@ -1171,7 +1144,6 @@ Feature: Create events @tmsLink=SORDEV-10227 @env_de Scenario: Test Permanent deletion for Person for Event Participant Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a Admin User Then I open the last created event via api @@ -1199,7 +1171,6 @@ Feature: Create events @tmsLink=SORDEV-5565 @env_de Scenario: Document Templates create quarantine order for Event Participant bulk DE Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a Admin User Then I open the last created event via api @@ -1264,7 +1235,6 @@ Feature: Create events @tmsLink=SORDEV-12439 @env_main Scenario: Test set 'All Event Participants' as the default value when an event is active Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a Admin User When I am accessing the event tab using the created event via api @@ -1274,7 +1244,6 @@ Feature: Create events @tmsLink=SORDEV-12439 @env_main Scenario: Test set 'Active event participants' as the default value when an event is archived Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a Admin User When I am accessing the event tab using the created event via api @@ -1286,7 +1255,6 @@ Feature: Create events @env_main @#7750 Scenario: Check the map functionality in the Edit Event Page Given API: I create a new event - And API: I check that POST call status code is 200 Then I log in as a National User Then I am accessing the event tab using the created event via api @@ -1299,7 +1267,6 @@ Feature: Create events @env_main @#8559 Scenario: Confirm navigation' pop-up is triggered when a user creates a new entry for 'Contact information' and tries to navigate to another page Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User When I open the last created event via api @@ -1315,7 +1282,6 @@ Feature: Create events @tmsLink=SORDEV-12441 @env_de Scenario: Hide citizenship and country of birth on Edit Event Participant Person Page Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a Admin User Then I open the last created event via api @@ -1327,10 +1293,8 @@ Feature: Create events Given API: I create a new person And API: I check that POST call status code is 200 Then API: I create a new event - And API: I check that POST call status code is 200 Then API: I create a new event participant with creation date 1826 days ago - And API: I check that POST call status code is 200 Then I log in as a Admin User Then I open the last created event via api @@ -1368,10 +1332,8 @@ Feature: Create events Given API: I create a new person And API: I check that POST call status code is 200 Then API: I create a new event - And API: I check that POST call status code is 200 Then API: I create a new event participant with creation date 1820 days ago - And API: I check that POST call status code is 200 Then I log in as a Admin User Then I open the last created event via api @@ -1424,13 +1386,10 @@ Feature: Create events @#5762 @env_main Scenario: Link Event to a Case Given API: I create a new person - And API: I check that POST call status code is 200 Then API: I create a new case - And API: I check that POST call status code is 200 Given API: I create a new event - And API: I check that POST call status code is 200 Given I log in as a National User And I open the last created Case via API @@ -1445,13 +1404,10 @@ Feature: Create events @tmsLink=SORDEV-10280 @env_main Scenario Outline: Test Allow "surveillance supervisor" and "contact supervisor" profiles to access the batch edit mode of the directory of participating events Given API: I create a new person - And API: I check that POST call status code is 200 Then API: I create a new event - And API: I check that POST call status code is 200 Then API: I create a new event participant with creation date 2 days ago - And API: I check that POST call status code is 200 Then I log in as a Then I open the last created event via api From 459899e182061de492ffdecb3c916c16e14e3fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 27 Sep 2023 14:15:53 +0200 Subject: [PATCH 138/144] #12572 - Delete samples alongside environments --- .../sormas/backend/environment/Environment.java | 14 ++++++++++++++ .../backend/environment/EnvironmentService.java | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/Environment.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/Environment.java index 112f40b2b4e..97ee9fc0fa1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/Environment.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/Environment.java @@ -4,7 +4,9 @@ import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_DEFAULT; import java.util.Date; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -14,6 +16,7 @@ import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Temporal; import javax.persistence.TemporalType; @@ -26,6 +29,7 @@ import de.symeda.sormas.api.environment.WaterType; import de.symeda.sormas.api.environment.WaterUse; import de.symeda.sormas.backend.common.CoreAdo; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSample; import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.ModelConstants; @@ -67,6 +71,7 @@ public class Environment extends CoreAdo { private Map waterUse; private String otherWaterUse; private Location location; + private Set environmentSamples = new HashSet<>(); @Temporal(TemporalType.TIMESTAMP) @Column(nullable = false) @@ -210,4 +215,13 @@ public Location getLocation() { public void setLocation(Location location) { this.location = location; } + + @OneToMany(mappedBy = EnvironmentSample.ENVIRONMENT, fetch = FetchType.LAZY) + public Set getEnvironmentSamples() { + return environmentSamples; + } + + public void setEnvironmentSamples(Set environmentSamples) { + this.environmentSamples = environmentSamples; + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java index ef3f952ba68..59228d88168 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/environment/EnvironmentService.java @@ -19,6 +19,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.common.DeletableEntityType; +import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.environment.EnvironmentCriteria; import de.symeda.sormas.api.event.EventCriteria; import de.symeda.sormas.api.user.JurisdictionLevel; @@ -28,6 +29,7 @@ import de.symeda.sormas.backend.common.ChangeDateFilterBuilder; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.common.DeletableAdo; +import de.symeda.sormas.backend.environment.environmentsample.EnvironmentSampleService; import de.symeda.sormas.backend.infrastructure.community.Community; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.region.Region; @@ -41,6 +43,8 @@ public class EnvironmentService extends AbstractCoreAdoService getAllActiveUuids(User user) { return em.createQuery(cq).getResultList(); } + + @Override + public void delete(Environment environment, DeletionDetails deletionDetails) { + environment.getEnvironmentSamples().forEach(s -> environmentSampleService.delete(s, deletionDetails)); + super.delete(environment, deletionDetails); + } } From 0b778ff7ecdb95d3839da9010bb7ae504897d4f8 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Wed, 27 Sep 2023 15:24:04 +0300 Subject: [PATCH 139/144] #12062 Replace context.xml with warName property in sormas-rest maven war plugin config --- docs/EXTERNAL_MESSAGES_ADAPTER.md | 26 +++---------------- sormas-rest/pom.xml | 12 ++------- .../src/main/webapp/META-INF/context.xml | 3 --- 3 files changed, 6 insertions(+), 35 deletions(-) delete mode 100644 sormas-rest/src/main/webapp/META-INF/context.xml diff --git a/docs/EXTERNAL_MESSAGES_ADAPTER.md b/docs/EXTERNAL_MESSAGES_ADAPTER.md index 055bee1b5a9..9fdd21540e1 100644 --- a/docs/EXTERNAL_MESSAGES_ADAPTER.md +++ b/docs/EXTERNAL_MESSAGES_ADAPTER.md @@ -13,9 +13,6 @@ A minimal maven project structure for an external message adapter module is show | | | | |-- MyExternalMessageFacadeEjb.java | | |-- resources | | | |-- version.txt - | | |-- webapp - | | | |-- META-INF - | | | | |-- context.xml | |-- test | | |-- java | | | |-- my.project @@ -90,14 +87,6 @@ Example: ${project.name} ${project.version} ``` -### context.xml -This xml is used to configure the context path of your external message adapter module. -```xml - - - -``` - ### pom.xml This is the maven project configuration file. @@ -114,7 +103,7 @@ Example with default dependencies for java-ee, sormas-api, logging and testing: 1.85.0 - /my-message-adapter + my-message-adapter 8.0 1.7.30 @@ -171,7 +160,7 @@ Example with default dependencies for java-ee, sormas-api, logging and testing: 1.85.0 - /my-message-adapter + my-message-adapter 4.13.1 3.6.0 @@ -297,22 +286,15 @@ Example with default dependencies for java-ee, sormas-api, logging and testing: - org.apache.maven.plugins maven-war-plugin 3.2.3 + ${warName} + true - - src/main/webapp/META-INF - - context.xml - - /META-INF - true - src/main/webapp / diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 030ef6bb665..a9bffb43a74 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -8,7 +8,7 @@ - /sormas-rest + sormas-rest sormas-rest @@ -119,20 +119,12 @@ ${project.artifactId} - maven-war-plugin + ${warName} true - - src/main/webapp/META-INF - - context.xml - - /META-INF - true - src/main/webapp / diff --git a/sormas-rest/src/main/webapp/META-INF/context.xml b/sormas-rest/src/main/webapp/META-INF/context.xml deleted file mode 100644 index b6e6646a57d..00000000000 --- a/sormas-rest/src/main/webapp/META-INF/context.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - From a56730330f161db420a8d800f8d4b5dbd11f9fa6 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Wed, 27 Sep 2023 21:27:20 +0300 Subject: [PATCH 140/144] #12505 Archiving cases does not work with external surveillance tool configured --- .../sormas/backend/caze/CaseService.java | 29 +++-- .../sormas/backend/TestDataCreator.java | 5 + .../CaseExternalSurveillanceToolTest.java | 123 ++++++++++++++++++ 3 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseExternalSurveillanceToolTest.java diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 6006b55e1e9..85e89768303 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -64,7 +64,6 @@ import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseCriteria; -import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseListEntryDto; import de.symeda.sormas.api.caze.CaseLogic; import de.symeda.sormas.api.caze.CaseMergeIndexDto; @@ -1155,7 +1154,7 @@ public List dearchive(List entityUuids, String dearchiv private List updateArchiveFlagInExternalSurveillanceTool(List entityUuids, boolean archived) { List processedEntities = new ArrayList<>(); - List sharedCaseUuids = getEligibleUuidsForSharingWithExternalSurveillanceTool(entityUuids); + List sharedCaseUuids = getUuidsForSharingWithExternalSurvTool(entityUuids); if (!sharedCaseUuids.isEmpty()) { processedEntities = externalSurveillanceToolGatewayFacade.sendCasesInternal(sharedCaseUuids, archived); } @@ -1163,18 +1162,17 @@ private List updateArchiveFlagInExternalSurveillanceTool(List getEligibleUuidsForSharingWithExternalSurveillanceTool(List entityUuids) { + private List getUuidsForSharingWithExternalSurvTool(List entityUuids) { List sharedCaseUuids = new ArrayList<>(); - List uuidsAllowedToBeShared = getEntityUuidsAllowedToBeShared(entityUuids); - if (!uuidsAllowedToBeShared.isEmpty()) { - sharedCaseUuids = getSharedCaseUuids(uuidsAllowedToBeShared); + List idsAllowedToBeShared = getEntityIdsAllowedToBeShared(entityUuids); + if (!idsAllowedToBeShared.isEmpty()) { + sharedCaseUuids = getSharedCaseUuids(idsAllowedToBeShared); } return sharedCaseUuids; } - public List getSharedCaseUuids(List entityUuids) { - List caseIds = getCaseIds(entityUuids); + private List getSharedCaseUuids(List caseIds) { List sharedCaseUuids = new ArrayList<>(); List caseShareInfos = externalShareInfoService.getShareCountAndLatestDate(caseIds, ExternalShareInfo.CAZE); @@ -1193,11 +1191,18 @@ public List getCaseIds(List entityUuids) { return caseIds; } - public List getEntityUuidsAllowedToBeShared(List entityUuids) { - List casesAllowedToBeShare = - caseFacade.getByUuids(entityUuids).stream().filter(c -> !c.isDontShareWithReportingTool()).collect(Collectors.toList()); + private List getEntityIdsAllowedToBeShared(List entityUuids) { + if (entityUuids == null || entityUuids.isEmpty()) { + return Collections.emptyList(); + } - return casesAllowedToBeShare.stream().map(CaseDataDto::getUuid).collect(Collectors.toList()); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root from = cq.from(Case.class); + cq.where(from.get(Case.UUID).in(entityUuids), cb.isFalse(from.get(Case.DONT_SHARE_WITH_REPORTING_TOOL))); + cq.select(from.get(Case.ID)); + + return em.createQuery(cq).getResultList(); } @Override diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java index 8e80b30b520..a36f5d5c8df 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java @@ -273,6 +273,11 @@ public UserDto createUser(RDCF rdcf, UserRoleReferenceDto... roles) { roles); } + public UserDto createUser(RDCF rdcf, DefaultUserRole defaultUserRole) { + UserRoleReferenceDto userRole = getUserRoleReference(defaultUserRole); + return createUser(rdcf.region.getUuid(), rdcf.district.getUuid(), rdcf.facility.getUuid(), userRole.getCaption(), "User", userRole); + } + public UserDto createUser(RDCF rdcf, String firstName, String lastName, UserRoleReferenceDto... roles) { return createUser( rdcf.region.getUuid(), diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseExternalSurveillanceToolTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseExternalSurveillanceToolTest.java new file mode 100644 index 00000000000..b0d6b04d179 --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseExternalSurveillanceToolTest.java @@ -0,0 +1,123 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2023 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.symeda.sormas.backend.caze; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.containing; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasSize; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.http.HttpStatus; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; + +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.common.progress.ProcessedEntity; +import de.symeda.sormas.api.common.progress.ProcessedEntityStatus; +import de.symeda.sormas.api.share.ExternalShareStatus; +import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.backend.AbstractBeanTest; +import de.symeda.sormas.backend.MockProducer; +import de.symeda.sormas.backend.TestDataCreator; + +@WireMockTest(httpPort = 8888) +public class CaseExternalSurveillanceToolTest extends AbstractBeanTest { + + private UserReferenceDto reportingUser; + private TestDataCreator.RDCF rdcf; + + @Override + public void init() { + super.init(); + rdcf = creator.createRDCF(); + reportingUser = creator.createUser(rdcf, DefaultUserRole.SURVEILLANCE_OFFICER).toReference(); + } + + @BeforeEach + public void setup(WireMockRuntimeInfo wireMockRuntime) { + configureExternalSurvToolUrlForWireMock(wireMockRuntime); + } + + @AfterEach + public void teardown() { + clearExternalSurvToolUrlForWireMock(); + } + + @Test + public void testArchiveCasesSharedWithExternalSurvTool() { + CaseDataDto caseNotShared = creator.createCase(reportingUser, creator.createPerson().toReference(), rdcf); + + CaseDataDto caseShared = creator.createCase(reportingUser, creator.createPerson().toReference(), rdcf); + creator.createExternalShareInfo(caseShared.toReference(), reportingUser, ExternalShareStatus.SHARED, null); + + CaseDataDto caseMarkedToNotShare = + creator.createCase(reportingUser, creator.createPerson().toReference(), rdcf, c -> c.setDontShareWithReportingTool(true)); + + CaseDataDto caseSharedThenMarkedToNotShare = + creator.createCase(reportingUser, creator.createPerson().toReference(), rdcf, c -> c.setDontShareWithReportingTool(true)); + creator.createExternalShareInfo(caseSharedThenMarkedToNotShare.toReference(), reportingUser, ExternalShareStatus.SHARED, null); + + CaseDataDto caseSharedThenDeletedInExternalSurvTool = creator.createCase(reportingUser, creator.createPerson().toReference(), rdcf); + creator.createExternalShareInfo(caseSharedThenDeletedInExternalSurvTool.toReference(), reportingUser, ExternalShareStatus.SHARED, null); + creator.createExternalShareInfo(caseSharedThenDeletedInExternalSurvTool.toReference(), reportingUser, ExternalShareStatus.DELETED, null); + + CaseDataDto caseReShared = creator.createCase(reportingUser, creator.createPerson().toReference(), rdcf); + creator.createExternalShareInfo(caseReShared.toReference(), reportingUser, ExternalShareStatus.SHARED, null); + creator.createExternalShareInfo(caseReShared.toReference(), reportingUser, ExternalShareStatus.DELETED, null); + creator.createExternalShareInfo(caseReShared.toReference(), reportingUser, ExternalShareStatus.SHARED, null); + + stubFor( + post(urlEqualTo("/export")) + .withRequestBody(containing("caseUuids").and(containing(caseShared.getUuid())).and(containing(caseReShared.getUuid()))) + .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); + + List result = getCaseFacade().archive( + Arrays.asList( + caseNotShared.getUuid(), + caseShared.getUuid(), + caseMarkedToNotShare.getUuid(), + caseSharedThenMarkedToNotShare.getUuid(), + caseSharedThenDeletedInExternalSurvTool.getUuid(), + caseReShared.getUuid())); + + assertThat(result, hasSize(6)); + assertThat( + result.stream().map(ProcessedEntity::getProcessedEntityStatus).collect(Collectors.toSet()), + containsInAnyOrder(ProcessedEntityStatus.SUCCESS)); + } + + private void configureExternalSurvToolUrlForWireMock(WireMockRuntimeInfo wireMockRuntime) { + MockProducer.getProperties().setProperty("survnet.url", String.format("http://localhost:%s", wireMockRuntime.getHttpPort())); + } + + private void clearExternalSurvToolUrlForWireMock() { + MockProducer.getProperties().setProperty("survnet.url", ""); + } + +} From a0cc3bee52cde4e0866bf981cd80bef06f7e3140 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Thu, 28 Sep 2023 08:53:02 +0300 Subject: [PATCH 141/144] #12235 Add an edit form for environment samples in web app - fixed creation dialog heading --- sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java | 1 + sormas-api/src/main/resources/strings.properties | 1 + .../samples/environmentsample/EnvironmentSampleController.java | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 47f02bfb397..e196abe8e36 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -491,6 +491,7 @@ public interface Strings { String headingCreateNewContact = "headingCreateNewContact"; String headingCreateNewContactIssue = "headingCreateNewContactIssue"; String headingCreateNewEnvironment = "headingCreateNewEnvironment"; + String headingCreateNewEnvironmentSample = "headingCreateNewEnvironmentSample"; String headingCreateNewEvent = "headingCreateNewEvent"; String headingCreateNewEventGroup = "headingCreateNewEventGroup"; String headingCreateNewEventParticipant = "headingCreateNewEventParticipant"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index f16ae41be30..899a4382b3c 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java index e6f88dfa217..c183ea7dfff 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleController.java @@ -178,6 +178,6 @@ public void create(EnvironmentDto environment, Runnable callback) { } }); - VaadinUiUtil.showModalPopupWindow(editView, I18nProperties.getString(Strings.headingCreateNewTask)); + VaadinUiUtil.showModalPopupWindow(editView, I18nProperties.getString(Strings.headingCreateNewEnvironmentSample)); } } From ea6730a91d87c5198851f294b0559e09f635a25d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 28 Sep 2023 10:18:13 +0200 Subject: [PATCH 142/144] New Crowdin updates (#12587) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (French, Congo) * New translations enum.properties (French, Tunisia) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations enum.properties (Czech) * New translations enum.properties (Spanish, Cuba) * New translations strings.properties (French) * New translations validations.properties (Romanian) * New translations validations.properties (French) * New translations validations.properties (Spanish) * New translations validations.properties (Arabic) * New translations validations.properties (Czech) * New translations validations.properties (German) * New translations validations.properties (Finnish) * New translations validations.properties (Italian) * New translations validations.properties (Japanese) * New translations validations.properties (Dutch) * New translations validations.properties (Norwegian) * New translations validations.properties (Polish) * New translations validations.properties (Portuguese) * New translations validations.properties (Russian) * New translations validations.properties (Swedish) * New translations validations.properties (Turkish) * New translations validations.properties (Ukrainian) * New translations validations.properties (Chinese Simplified) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Croatian) * New translations validations.properties (Hindi) * New translations validations.properties (Filipino) * New translations validations.properties (Fijian) * New translations validations.properties (Swahili) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Nepali) * New translations validations.properties (French, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations validations.properties (Dari) * New translations validations.properties (Pashto) * New translations validations.properties (Spanish, Cuba) * New translations validations.properties (English, Afghanistan) * New translations validations.properties (English, Nigeria) * New translations validations.properties (English, Ghana) * New translations validations.properties (French, Congo) * New translations validations.properties (French, Tunisia) * New translations strings.xml (Romanian) * New translations strings.xml (French) * New translations strings.xml (Spanish) * New translations strings.xml (Arabic) * New translations strings.xml (Czech) * New translations strings.xml (German) * New translations strings.xml (Finnish) * New translations strings.xml (Italian) * New translations strings.xml (Japanese) * New translations strings.xml (Dutch) * New translations strings.xml (Norwegian) * New translations strings.xml (Polish) * New translations strings.xml (Portuguese) * New translations strings.xml (Russian) * New translations strings.xml (Swedish) * New translations strings.xml (Turkish) * New translations strings.xml (Ukrainian) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Urdu (Pakistan)) * New translations strings.xml (Croatian) * New translations strings.xml (Hindi) * New translations strings.xml (Filipino) * New translations strings.xml (Fijian) * New translations strings.xml (Swahili) * New translations strings.xml (German, Switzerland) * New translations strings.xml (Nepali) * New translations strings.xml (French, Switzerland) * New translations strings.xml (Italian, Switzerland) * New translations strings.xml (Dari) * New translations strings.xml (Pashto) * New translations strings.xml (Spanish, Cuba) * New translations strings.xml (English, Afghanistan) * New translations strings.xml (English, Nigeria) * New translations strings.xml (English, Ghana) * New translations strings.xml (French, Congo) * New translations strings.xml (French, Tunisia) * New translations captions.properties (Czech) * New translations strings.properties (Czech) * New translations validations.properties (Czech) * New translations strings.xml (Czech) * New translations captions.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations strings.xml (Spanish, Cuba) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (French, Congo) * New translations strings.properties (French, Tunisia) * New translations captions.properties (Czech) * New translations strings.properties (Czech) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (French, Congo) * New translations strings.properties (French, Tunisia) --- sormas-api/src/main/resources/strings_ar-SA.properties | 1 + sormas-api/src/main/resources/strings_cs-CZ.properties | 1 + sormas-api/src/main/resources/strings_de-CH.properties | 1 + sormas-api/src/main/resources/strings_de-DE.properties | 1 + sormas-api/src/main/resources/strings_en-AF.properties | 1 + sormas-api/src/main/resources/strings_en-GH.properties | 1 + sormas-api/src/main/resources/strings_en-NG.properties | 1 + sormas-api/src/main/resources/strings_es-CU.properties | 1 + sormas-api/src/main/resources/strings_es-ES.properties | 1 + sormas-api/src/main/resources/strings_fa-AF.properties | 1 + sormas-api/src/main/resources/strings_fi-FI.properties | 1 + sormas-api/src/main/resources/strings_fil-PH.properties | 1 + sormas-api/src/main/resources/strings_fj-FJ.properties | 1 + sormas-api/src/main/resources/strings_fr-CD.properties | 1 + sormas-api/src/main/resources/strings_fr-CH.properties | 1 + sormas-api/src/main/resources/strings_fr-FR.properties | 1 + sormas-api/src/main/resources/strings_fr-TN.properties | 1 + sormas-api/src/main/resources/strings_hi-IN.properties | 1 + sormas-api/src/main/resources/strings_hr-HR.properties | 1 + sormas-api/src/main/resources/strings_it-CH.properties | 1 + sormas-api/src/main/resources/strings_it-IT.properties | 1 + sormas-api/src/main/resources/strings_ja-JP.properties | 1 + sormas-api/src/main/resources/strings_ne-NP.properties | 1 + sormas-api/src/main/resources/strings_nl-NL.properties | 1 + sormas-api/src/main/resources/strings_no-NO.properties | 1 + sormas-api/src/main/resources/strings_pl-PL.properties | 1 + sormas-api/src/main/resources/strings_ps-AF.properties | 1 + sormas-api/src/main/resources/strings_pt-PT.properties | 1 + sormas-api/src/main/resources/strings_ro-RO.properties | 1 + sormas-api/src/main/resources/strings_ru-RU.properties | 1 + sormas-api/src/main/resources/strings_sv-SE.properties | 1 + sormas-api/src/main/resources/strings_sw-KE.properties | 1 + sormas-api/src/main/resources/strings_tr-TR.properties | 1 + sormas-api/src/main/resources/strings_uk-UA.properties | 1 + sormas-api/src/main/resources/strings_ur-PK.properties | 1 + sormas-api/src/main/resources/strings_zh-CN.properties | 1 + 36 files changed, 36 insertions(+) diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index 435ea2b70fd..290dd35c0c4 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 64266a3ce12..4e9c05e8694 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Vytvořit novou léčbu headingCreateNewUser = Vytvořit nového uživatele headingCreateNewUserRole = Vytvořit novou uživatelskou roli headingCreateNewVisit = Vytvořit novou návštěvu +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Vytvořit nový výsledek testu patogenu headingDatabaseExportFailed = Export databáze selhal headingDearchiveCampaign = Vyjmout z archivu kampaň diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index 4fbf9885135..9bbb0b45206 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Neue Behandlung erstellen headingCreateNewUser = Neuen Benutzer erstellen headingCreateNewUserRole = Neue Benutzerrolle erstellen headingCreateNewVisit = Neuen Anruf erstellen +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Neues Erregertestergebnis erstellen headingDatabaseExportFailed = Datenbank-Export fehlgeschlagen headingDearchiveCampaign = Kampagne de-archivieren diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index 629b0bebf40..fd17a9e7e4d 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Neue Behandlung erstellen headingCreateNewUser = Neuen Benutzer erstellen headingCreateNewUserRole = Neue Benutzerrolle erstellen headingCreateNewVisit = Neuen Anruf erstellen +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Neues Erregertestergebnis erstellen headingDatabaseExportFailed = Datenbank-Export fehlgeschlagen headingDearchiveCampaign = Kampagne de-archivieren diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index 943d7d7832f..acba8ff9f89 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index 5229bdd6896..588cf27f6a3 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index 8d9b3b864a5..06187f3d386 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index c97df9bfff4..c2c0fbbc92b 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Crear nuevo tratamiento headingCreateNewUser = Crear nuevo usuario headingCreateNewUserRole = Crear nuevo rol de usuario headingCreateNewVisit = Crear nueva visita +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Crear un nuevo resultado de prueba de patógeno headingDatabaseExportFailed = Falló la exportación de la base de datos headingDearchiveCampaign = Desarchivar campaña diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index 33e43f42953..3245d2c6bd7 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Lisää uusi hoito headingCreateNewUser = Luo uusi käyttäjä headingCreateNewUserRole = Create new user role headingCreateNewVisit = Luo uusi käynti +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Lisää uusi patogeenitestin tulos headingDatabaseExportFailed = Tietokannan vienti epäonnistui headingDearchiveCampaign = Palauta kampanja arkistosta diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_fr-CD.properties b/sormas-api/src/main/resources/strings_fr-CD.properties index 75729e0f8a7..0fedc55bca2 100644 --- a/sormas-api/src/main/resources/strings_fr-CD.properties +++ b/sormas-api/src/main/resources/strings_fr-CD.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index f0370ffc9ac..70b201f789f 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Créer un nouveau traitement headingCreateNewUser = Créer un nouvel utilisateur headingCreateNewUserRole = Create new user role headingCreateNewVisit = Créer de nouvelles visites +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new sample test result headingDatabaseExportFailed = Échec de l'exportation de base de données headingDearchiveCampaign = Désarchiver cette campagne diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index 6d77b4131dd..aa66d77f6bf 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Créer un nouveau traitement headingCreateNewUser = Créer nouvel utilisateur headingCreateNewUserRole = Créer nouveau rôle d'utilisateur headingCreateNewVisit = Créer de nouvelles visites +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new sample test result headingDatabaseExportFailed = Échec de l'exportation de base de données headingDearchiveCampaign = Désarchiver cette campagne diff --git a/sormas-api/src/main/resources/strings_fr-TN.properties b/sormas-api/src/main/resources/strings_fr-TN.properties index 53e3bb4f19c..be164a13d7b 100644 --- a/sormas-api/src/main/resources/strings_fr-TN.properties +++ b/sormas-api/src/main/resources/strings_fr-TN.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Créer un nouveau traitement headingCreateNewUser = Créer nouvel utilisateur headingCreateNewUserRole = Créer nouveau rôle d'utilisateur headingCreateNewVisit = Créer de nouvelles visites +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new sample test result headingDatabaseExportFailed = Échec de l'exportation de base de données headingDearchiveCampaign = Désarchiver cette campagne diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index 53518d32651..3d6acbe0a25 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Crea nuovo trattamento headingCreateNewUser = Crea nuovo utente headingCreateNewUserRole = Create new user role headingCreateNewVisit = Crea nuova visita +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Crea nuovo risultato di test patogeno headingDatabaseExportFailed = Esportazione della banca dati non riuscita headingDearchiveCampaign = Disarchivia campagna diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index 57d82e83f7f..0f7b6aad4da 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Crea nuovo trattamento headingCreateNewUser = Crea nuovo utente headingCreateNewUserRole = Create new user role headingCreateNewVisit = Crea nuova visita +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Crea nuovo risultato di test patogeno headingDatabaseExportFailed = Esportazione della banca dati non riuscita headingDearchiveCampaign = Disarchivia campagna diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index 435ea2b70fd..290dd35c0c4 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index 0c0518ef5cb..63e0f4d3b9d 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index 075abf79743..ab0aa8bef24 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index 2ebc595ac56..f577c7990de 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 96b74f8b0d7..973a8e9140e 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 684297c64f4..5d7024f3cbe 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = نیاعلاج لکھیں headingCreateNewUser = نیا صارف بنائیں headingCreateNewUserRole = نیا صارف کردار بنائیں headingCreateNewVisit = نئے دورے بنائیں +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = نئے پیتھوجین ٹیسٹ کا نتیجہ بنائیں headingDatabaseExportFailed = ڈیٹا بیس ایکسپورٹ ناکام ہو گیا headingDearchiveCampaign = مہمات کو ڈی آرکائیو کريں diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index 435eaf47553..3428f2d20ea 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -497,6 +497,7 @@ headingCreateNewTreatment = Create new treatment headingCreateNewUser = Create new user headingCreateNewUserRole = Create new user role headingCreateNewVisit = Create new visit +headingCreateNewEnvironmentSample = Create new environment sample headingCreatePathogenTestResult = Create new pathogen test result headingDatabaseExportFailed = Database export failed headingDearchiveCampaign = De-Archive campaign From aa7c3b4e47b6a2779a8cad54113234abeee783c1 Mon Sep 17 00:00:00 2001 From: jen kins Date: Thu, 28 Sep 2023 13:54:01 +0200 Subject: [PATCH 143/144] Updated version number --- .../resources/doc/SORMAS_Data_Dictionary.xlsx | Bin 272628 -> 273328 bytes .../main/resources/doc/SORMAS_User_Roles.xlsx | Bin 34234 -> 34228 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx b/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx index 11d151e3970158cb7a00032c21c356ac40dc0467..0c99f50a5cca0372f71e05f2515a3607bca2b9a1 100644 GIT binary patch delta 101946 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 ihk8wffnn^<@9f-l-rTc+ zKpp$pTi}XKJP7Cx6I(oAa+ix)^<zViC7{Q& z@ckuvj4{Aey#rN}xH$$p|GPZ#Nl$kky!?$;L*ob@TM&G65_$LV;#}ge?9&SnFxx`x zI@`3&J1x2YU1IoLRGi!(fCHG)=$LDcWTwPHRkwylcGG41ZWp4%i(55E3T?k*jXlMw zefd*V04*N}3jE~)pzssD=&2HY4#x>bv&vbyRrSc>dHMVU%Iz=Ramql(ToJeuA9f-0 z`84}iaSTbc1pb%VJok0t{5cUi{#mS*Q-udv}Z|7VI6D#7yUFDR#0Wmrsg)lci>n&AWO##;q3 zohzjofJk&LLOIn2EjP~?UcG2VV`9j}sr2Wd@h6J~`s632)=+63C6e?doRB$>78=~I zhIvXhXpZ$YT!-LVAr;V!cZhZx=Ss;Ur4L>h%Yd-{uNm4bwk_T}CALT{^l#AL@9Xgn zTjrY9(0|WbWxX>9!oSNL&s=f`x8?D&21rzja&I|ogvKgH2bx1Acnqlz30P$l3H;on z!^W3Hq+>AuPMX)aj+-O?#H{9+Sq3xMU^Ct3=HIVmXrP9Y;sz@(KxE?>5h&HH6cEdf z(H1s7zO#(!!`luQ<{%B57A@vnVHe3a3_#dQ$+9)W?=sz0^Sn8OOx6&U7HbZuA5%cF z^i8R9oP_Kk4ByXb4{WO?rwOqDGK}0lMGB{zvxRT9{SfRuCbAD2;+EKu{}P`QTK zx97MskZQPBI}i`>4Q+SSU#QiK)ou2s!KgTa9*{Ng+ee6dc2N%*ygqV(W7ERV9*G2R z%wz1UL^dvFv2;l*sm6RdY+j9#q*?+FA(yhz;Ra008r>^-9BVybn3&)PL%?9p5-7g; z+-0)}(bj@fH8KisJh6m_QK(}jKZpS&v~Qu*e3!E=`|oBS@*VTjtY+k*8x~PYb^4ec>uY}l&|HAio6bke>&)=(W=-E&i``4a zC26r)U`y^smw)>EUJ%-w&uAd;sAU`M?Vbcz=#m&ug1kK9v=G9tH#dHDY}3?}-HJzT zdV#Pu?feWZ_-6xFYxVpnZ=;k$)z8JUN-X(O#|jhQ z#}11&VABT#wh0fGod=m%bRGO9eCdCf#IETg7p5)XR(X;k-NGT3UurJzTtKA$=I`vDZEYpbzDLum zpKou=LDdOGJf|Ej}S~vKjBAisoBJpCM02;WonH+B9tot5z5@fL32NChs3x;icmOofjpyp z5G3dx&@@H*qDAlvWvkBPFHnbo8{xm`WC5K);Q+`m;}+1c&C?B0Lai+~2S)z^*}be^ zn4bR)UQ751xQp!Z&bFbm>`)*`<~;upd>R?&lTivMPJCdBFXl5R`C37Eiu2 zsF4Hc0uCE;DTFb8^iI^>X;SlVDmJpnk>|gS$46GR&nn4^L-ypr+a9%kvi4hU*e)(d zFrl=qw%PAWYRik$oc`N13ym!+|4R61n_JwUJ}@zy%2zky2)?mxXg%I15Q#@Zrb-oh zgh&HUjPPO;q=v7XaM{cAK!nD}s*StNOsWBtB7dWp#>xn6bkql~VA-{?qC2*1tXf%| zZ9}4?r4|ht!fBQEbyhIZavA7WIW4*OxZbx?8mT#$r_#hqruDPZEVGw6mzLb~QMaQ) z&0Difac;nNc4ac$U(%>7m0D99G{4iLy*_nT&xmWf@Ao(GO!nt-Uc2f4_;J zVwZDqOXy&<@f#c>3gd85ugpvlI+}4%O2XF}_} z)q93>dU|F**fzebIryHS1e+tyD;>TmB&fy+V*{7P;s{d!i26q7QpDf69`;M4*$~c< z#80?Cc1fEt|I+M{=8|b}>6Px%HJ`Z)_l0UT_V^4F_6GhV6YcT@j&KG79hk}odZ2AR zVStfCkt!D281*}O{ZA+{>PTR5Oh4C5T!Mj|RgkCLpPb7%;k$6!GpnL?69ueTQ_c&R z;|%zsg@?Y+gdpl*cB+aH1bq2RFgKKokvp^O((AM*Orc5-%iO+8eX(1@cmO#_<4RcN zg`z;F7#|wq-ri{k5gEQOyek~x?)0b=%EGHjJ+1mrM&%ijQ~TiP9*P6DqV-_NlSbt! z=giBEUbEP}YC|QhP9ZOw`rg)Y$MXl#Y z_(?oan>hhIw!XDIR!3}tBx_yJZz&Vb3o`Ie8IC2j3VIq1kbTWv!<@gwyO4s8OW66K zmMPZlj>?IyDmcKO2$3d9lPsNmdzpHb6s$axMonK}M*02Nz!ov2gaF#OlOfWFSj1(>N@42lx^6%I={h*c!w=W52wj?z+dpC5 zsWNsgLrludu5`zzVgpF6*}DVliU?Z^9v6d0k)67=d)ouNqx0utGCm%Z?OFFxIGXkK zF`ugnRcmEm)5r1%K@HJtZ?u3LM@8rV{NQ(eW29J}V$pXUOr*^UDM53$&ycvY!ZO4-r7$hiQi6QqM+jI zi-b}8u#Q(T!nvJv3XW6WixD_YUtC zYMQuT(iJegz9VZkM$+)6>@!3&%r}E6M6Ns{bX*`iy zmu?b-#6OId4!%E&;P)!G;%oB1UH~`bhT5s>MoosC%;x}pNf+SB@8F*622#pwU{C9Q zO=)f@-wmNx2~JI_V`A~OU}^+sZkR4&03SbUTVte9s9*fKn276v|jbzL*qVrh` zyj0K-UpTq>Lck4{Zs^}*PPxv4<^hR+Op0>_bSYz;Y_j&6}InO3})pk^dEk7tld~Scm^r;XfrzQ18o$`qa?^e%=mhh)C zz~*t`qarq4K+B@DkUMS>qcy=-tf;rVGgOQhtO#y$$U zAF~dCv89KnUdwO3o!%=hkdq9xHcn!CHXrG2P;UD6^Tzw_Iiz77FJLZ?O}_UVc5U}6 zZ@OZ07Y=2m3zi>qX%3!n@m){DMz=djeNIDYOa8_5LpxVnMKBG$lhM7R>vgF=$5u|u zWm_}~7`%&#x;B`1PS($jbR1-h0le5es@nuW?kB2I3G(%+!3Mz)oHCsg`O{*q=is=$ z*)*fAFKKhDpZHvPyMFX`&dECnpkZ;0wJn)*IQ7Vua!ojqug|J_*ca%3re~E+&T+i? zWQYo0y@JtyqrKG<>3Ep5qPBaeRXj=yo_(>%B=72@7pIc9x}=Y_D!iOT%DaUJNCzbV zP$)W&n27zTz)($2vrV^pCzD}K`W~_jvceP?fq3e0jYgtUrk6^Sg_K5@8YJ=kmP>@$ z3sc))pceZ@0490n}=s=GqRn{aUYefr(rk)Fock-iN@G+?0Jm1;`QPe;*3JuQ-`sz-Bau? zz@reuFz@}bNt<%IO91oN_v}^lVeuX}eP0*^vu8s*aAQU``_Z^9>#9 z1Xkwn1-~rv;U6L<@`%pq&z+1)FNg;RkS}-b`91X~3t!K%h+?p)NA@%po1MYM4`Jxb zmTX>IT=wDrkQ&H`e#FH6IdLnX3&xsF41+Ggxor5vzvr$%zStH3cSiOZAmetdJdn6- zPGy2zagd3^0#dEMDboh!EmAe_#gHVaaS?vwbFv{yuJJQ+ywqlpwZy|9rDI5!+4oEu z94H{BRES43iHTMDVlJ_9(n`Xt`tvdh8w4YP-wa1th_Jz_FwVd@K`Z<$?1IGPml!k* zVeyMz-NNPC!CC51#2mU#0RIJ-MM|$oXJWH`5~85tWfNDtC4|%c$0rA2oFI~t1sty$ z_MO=!DSguC8)aDCb6Z}g8faO^Fbn+z2rO&m# zI-{vAnztx*=Jpvj40EHK@F+4IkBdKe%T`?m52>xQJH2gmYtawOs;<+A3ahOGE7*R3 z-!qdYymOW+R?ur`=9|%Ox@SX=7axQxXIoA9z8C<7BY{~AXP-qkkWp|yjcdf#BrTH| z?T_{-vD>)2@iVK;0mg`xMVZfL+-2C+R|n?a?2jVy16Buy^Mpz+-tK06nG#JGfKl_> z4M80kn^BB}s$-zbWZ)&&feVeTMqjKkV4LEIO=g>90#t+@4tbly24Lo0Ba+z= zBB^qb!zP-${MJE4qfw1SzmOS^Ub)vH43~c?umpMmtB>Hbb;!MAZ8U*p z$}1a2(SubQ2(ZaSYT5P`ucc2X{y8Lo_i)4z0J9rN4n0drZ70HF4~(~%7Z-nyEZIn@ zNzAj;F)hOgQui1E&)Hb_ZE|W6)U`*{_?~|fwtW3P?3!jKxpML{HZ1Pb{JFKodq0t4 zr3b-0(wGhYAnWG?Q-52w@x<6+1w}kG3gNdx$jvO4aKK)~)S1Lw(DyDqN7s8>$Vf&u z;do%TG`ODWHlwC|M1*usz$t70;FPjTq#S&WSfYNo($kXI$O`No zOI+KyCM#Xzl?JhNvQdL1n2X8^I?%w!8asE+f)CSqgxwza^CWfg;Jgh=3wGuO1HDQD zIs+%D(svds2d_3~k7msVgjzbA7!}#hPl#}9!}FXaXC?#~;lllpJ={n8y?4vE#6-Bm zyQq=5%3E)3klccoFVeT4monJa4r!{x(cmz&${^R1+?19K-8dzQV|nFpMCq)-clv=9 zN2U%oRC>gcNa0w(y33*8zMheM`a&q!%?s7sd+S6A?aBj{E|XGOnr^GmKYnORj_z_# zwjZPT&?U-qDdUr&5St~3kK}{}r!onO4+o;obD03OiR2$UA%_nbqmP=u9&GSlmp8}( zkXAe5b=zC1?0C4mDpU8mZ;xdfFP9<+utP8elAcx|s9d3&&cm%XG;*RR_~bq`M|&tT z^DeRkWFs+$N*d$95gpW<_PPe@L9hJ$wl->>+8DxJ#HPYyEnTqE>f+Q`pr3-aEYad5 zH2<*)%>HLsVae0S+s&kBH8!mnNPjsj+=OZ!s7l^8-C*+JtFDqu&I!M%Cr!8CeLDy_ z5me6!5fd2BP5~UE3snz zMRR{utviWpcTRt2>IqO#d5YgE3NB`A)N}FrSiGM!#XKp9J(2$epns8?kz*6H;RO2B zV@Pw&KGL-L3t|zh#{$<(dxKxG%^7`9u9S4gNQv)lO<1@UT}!8qikRW*wy4+r!3mr~_Syx;+PhVbTv# z@oU%A1P*ds2`%al0AOx+u7|viMBG56z!x9i;RXE~=j35St@87*18j_OVUUNa;M>Ls zWn>ge=*xMSj`eQN;DZZ!2??jPAu_xb=X%<{h%t$TbJCSB!x+85+xT9?Rs~k1>%J7Y z7A1oR(10r3*AC!&>vkEGH2G|dt)B#~*8?rXTt$Eo^3NROfcWLA>X1t7Hg{i!bONP! zzfvb_a2^bsxUd=r6HcqXj7FTR&Gi7K41LJDLFhKd^?)@JA&u|QUJ7KDG9^8Y9>Vcm z>Ddtsc+92k%W)_CGd~c@@DH>XxwVuTr2ADzHhKaS(Y8gojVsOVcEg=M+r@1P;(h&C zHsXQu^wk!}1kesqm5p@R_jBuFt`d?OLCGsY+uBx)DQw0a@_kxd&-Y@r>aW})vy~x5&N-?g8Wg!|QCg1xM>C-F*&tN$P#YhSJTNB6=Q2=x$88rMSanWOhL8(b zp$ig8$}f5x@v?hrmHG_g`Zy+Xv{H&xmO0xfyu6v75Q8TnFs{u z;kG+Y@cmwwf44(~K|dX~nSJ76|Nc1lY@&%(L>2yZ*fsb%uC#ouDb2=!kl*WY-e1n8 z&cW{~U7z6z)%XOW>xYH;bux2Xhg6&OHW>B9k1e`)7I*agtLk9TP}3?f3dzvi_+*=V zzahVnc7RbvG2{)!WQ1pYlFO$aupGwhjJVW`uQCB}iY4PXD z&dh4IysFNS>~l6|68k1D`(byDbO+uZvZJ1c@q|A{N{b~vtL2U$28V;XmP1p`aGFNJ zhp6DV)yo_oB1ASd+zs8G=itUpp{dF%0-L28Qvh7Wj2|`J_RHKSNZPILj4_IChnS2Z zNh-e1(kS&dOyw2`-v3$8z$Mr}iYUUK=S@LfCUV0r2AGE z3u^yH9$$b*mTc$&NZC89@vF77npi!eP|>O38W06OSa(Y2FsXuuZw!aGxmH`bCz4&# zUHp;3YV>~S^Nn4vHQ?&qhCiLC*R;n^_}0+z zFaoNqo_dBuGM6^s*VDPW8A{tUd%QKxB7Gkz)fK> zRg(CNGK5B}qij!a7P81p12DN2yy;=-AzB?--_bUbq;mc5J8k!9@44P{6Y16sj7XO% z>K)>y{W2}DEaO0~ar|>8mckR(WDBg^ocoRmI`}%P`$7h*E}g{?z5w~NhOQaRnDF%b z3}^7AJOICOflnPHbE@$7Z&R}+^?ThTBgLywp(3?Crlv+oVFi`VQxc`!qu0(Dv09Jv znmw`n=szqt8VD?$OgE+);YVsUp;oK+yY`k0BmD~IxnL=w7=?|%Z79;9aHj|EknH&$aPpSZ4rBr#G$IsJyfi>xPIOeNR zbrYo3;Pyno6FKx0Y$0$VkvXjdD~VsmXuCG0%P^@ZZ1}{ z?-Z0GD}Bpv1KQhDVPoyhGIl9WD5tJ=HunIS14Kfus!;D?ll_~?+)5ol7uASy zj2PF)*Qv;RJZ~ZJ5@@X=MKl@r3HT+6E#8Ssw6J29A7X3z10Hc5^WyW#DN56l^^SYj z6Z6;{?RE!lUERX*P-d0%AV*tN6Ct_0*mZLt{8x#;{tBUIa54P9NUr!!isNF!e(8E zmyeFFV00w8Vj5kgw^}}!H@7Syziv#$uUO}&*Oh+bu(oWr#VWI*oB%2SdcXKI z67%Hl20B2>rmNK$b9{&akj!4!=cow=UjUl{nacN`YB@61_I(+-a0rmHI(I+qtQzwo zn2xlbfm5Txwa>x0_8$i=J;*4V0%c^z0hEJeHfJO zzv*JJn+j-ra9oZ`vQD zeQNkU`}$g2_)cY-72kEm`Ou>0{NvY5k5_G7$-6|rslV*i;YpFpfuUJ@k>v|C;ovd1 z_A*HrJsEQBd_51~K|EOp2wm~M!R)NRt&rpA#^m$jEbB~d#5iggH@2^7Kz4G7gGdj~ zSUMSQgTez}ZLo=Okffl{n9?UmOXOb~20PP2^yrGA(H+-4Xs_CY^W}Si7g&qFRz1fs zTR~(|+?*=FVyF5o+a$k!DBt(=*kcj<>am`pvaeu_te+tRU_ENaoQL<4l3PVktv8e^%xiXFM6Hj zPAc~C-z0PaN}#bGv}1)$4(3LB&T1qWf_3H|zvRGQD>Sxo(@;ug1T>htcs=4Pdyd3M zxZnax$Qds!G z$kGFQp($&Fd_bn)wmbHVMj7AWXoGh!o^L(;JBig00Fz`bykvJ@5!e5W&%qe68yx$g zb1l`DTxHTaJbkU{wb-i^`}}8MVG=~yz`VG~Cj8`>^1Flf&6_!`!(&zM1P0_DHWMJ7~`sxH&ysMBN2Rf>K zIHVi)fcwTyF|Im1p1YYM9!!BqmS)p5;;S9!1FvG9%$-kQaGf@{Vl^S1y~p3cmqFCs zJ|o?411%I|Ptks}3#qA`5x;aO;ili!nL`&pi&{5r>0;j3A~jqmiLoVz_VkVYF;JT3 zZ2va)(?~J2?p+Nt1Vt&EA_~|(tAz)HwSD&c9iR(FgICnp%7`EmGvX_(!Bnzce^eE< zAz*VO;AuKEgreL5HLW7Nvuauyn%oxiXSU6th|=~5uhvDWu?z;Z^6mV2i;xB~mCz2h zkDd6>yHUL%O-Y@PXIwQL#{7G_h$LHz8{VUP*mf00ixM?k@pW(-h4?Ar1Dn$r6o~w4 z>D><#ghT1b}g zvZLVyMyEPHECGbgTvUb!bEa(?2_44P)!+=KrNAP@;@4J1I(l&{Iqe!t)WFF|xVV*k zOds!|@MC0!TXa4^!%!PXW8xL8FE>w}jsWnuchOo0jv0_9&Va*tcv$Z%2rwj*z4xgH zXbbn0DIz)w!;uQB9WmAl#?;Q9-PXO(EQBx51v{z)BDd^Mf_?({wM?-VoRkyf`lwB? zV2;Vkv8l&ZJ!I?8?|w0D<3ca7H7d*?@U*G?7oW3c3r+dKVQtZDN!qyK0pPioz*Y$|Ke#n>gL{P5HX| zHHyX2Hype+;Wt=O(a#NfSx1baEon!K$>JdeIL_k=#%bSwj?`SMpr}veMMvFj)Wz&# zi&Emh?Kz^V(H#Dqi|r@+`BRbChaWJYkwy{f6=N$VE3}z7Ji#-?1u|37F%+y<2W)S- zM({FwlzQZ)v66RfH*nKy<{R$R=WP%NFSNe90VS>6Cjm%AFZF)P+%I&XQ)*dt`&sS-510aplAhc^!p64P zcXgCHLB5~^(3x4zh%peVR0umQwQM+HX5>y3giw9cfd+k_1m|!HHF}Y-@ffmCN52&l z&FcJI84tTOeyQL=Q10r+YI*?7(*A6hX?SQbdwk98csrjlt%ogLpudV1+))kuDPd{l zOw#7;il`{0ELLzbhj#p4mfr8Tu&~IpNho4E%37_AhhJI)@Vvt zlF5L7N8K-|NFye53QQ>~KfN->`O@A&0&&EC-QHjcA2<}j&3}K71$P99v38)J z{x-Qn5y*_?!uK_Ee8Z~HBmF!lXZQx?T2=pfGf~{<5_!rPcUhG7#LyK6(&plTqEOo@ zPs`HX<_5%Yjpl_9c|1iskpbS`+~!7wwdknsQHES_+{$cT+GQ~2T`OXGCI!lvV8{9l z?kGne-@K90y%A@5U&|9v$K=&K(aP5Ht|jx>?L^Twm7J|y=_`1k_wia-loe)>N-fkt z$H(hhe4C44d6yR;lQs9J^Oaxkfxwbdu3o6XXR&*iyyI5!tHsNp=k4~ytIeu@9z3Qt zukN+iP5f||!=!Iz&2x^2YU(LBXx&ARufX-|M(&)u%+`#Q%)YgNjVd6$n|)(1#~rc- zriyP|pAhb0_lq}qQvJ70i*9`jdOk%%d~=2fMpb4{&^2^yf|8G zXgv9~w6$&<>`I3hpf6_Z2Q|f0QhD@AWeKvy(c}rDYKj!blG(%Xo`fSRYsvy{YmLE zE-acBlHVZ3w?vxXQE&WMuzJJnzBefP^Q%v>8z;J$1Il8!b(P*}mr;DMB9^5KU0sC} zF}iPV(OCdPPcWZ-p|tQ9&Nd$!ZwxlnDiq!i=fCt9zROs=tp|bE%~WSA6G-=f-jZUs z=onNUjq4mtEUx2p7_FYkxy}LZ;=o6^e}-IJ2VE<_rn37a1yCen+Xct@&dtw zkuEza0N9eOLkWz7GGZDR&8UUKgi>|bJ6HuP>*j%-2Z7Qw6E;hyQt8slm|^^)vtBDm zHUxK+9^C}<=Bslt4$JCa2ZGA!tL7>gZhy+TF5#P60bzDYYjh6Iy|dc_@LI&v9bd6M zBRIwn*pFuum!t}jl4tDIu3s6Xv^p_u(J>i105fTx1g#>jwW7I(ue(Gie#UHJvTaKP zWlXdd4zEnbh=&roHI!YwS&4<3=#zh9xq!ZoUt4rj?XH*+3b~w`_-da5rvB_X>>9%Et?qacgF0!$cUSn)IoQ-;~Fs|Be!H#H6y)b4qlOd z0GYv+B|wu^^j)a!%#``8c z`9UnV!KXEf!CP&TW9q4tNi9GFQ$Xted+?J6sQ|5j=OnsJ)j_Ql8MV^Ao+9m0jeiFS z&Q}=(u|^IjMO-uiJywd7CSL8@tzz9Wz?HBU9dMdnt6U)F8j3@w3f>^Q4nwJ21p!Yr zKVv(Dinf=M>oDu3*m#ybdH>ltMGp;Jr`@{Gz{5CBb1U#2Na?ghRS7~c1cgD56P!rv zDM4ga#=6lNl?mo6FR2l|{DC66<2UJ4;}^S6Mha&RymVo*aXo{G^;I*t`?&fa`=@{$ z9t~kj#b~|ZUJ1uSV8>0!_p@M=L!(@CC1F^j5{+@FpIXD{iW(Sa*^GHY81!vJVzkwU1Kgs27Ct-*DEXfLm?)^<8C&h=sR zT={g;e4|HopwyDqS`}XC@=!3*f)x_eDPPy<5sKgSo|LCpCQZ?Hh*bBh0c05AL6pe> z6q2HF)JV-lK#K}Ug9A{Acj`}6$?UEnh~n8K(NzYj86!z4VUa|A$qXa|?ShPn*^AST zgxW-f6j5xH^XqX&m61IZWs};xj>f<$`0!)7g%Z4a5bue#wZ4&-fgw5ak95{)Yd|zp zxFn`@V$_PMN5$x^mihcR1%OXF$C!szl;K8HH@&6>eII->1^Kw^=TOV&OV=a0kUhWG zqZ+p60i4hqKos4wQo~MbTQ?K7SgQGytk*<9bxK?(2OP#!Sc+)K?F z0tPJgTGY8%WzO+xQ5@F~If2$KnEJ}o)&jj2we6(am&6o4@6Oa!T|p2az4bv2lCn8li5>KH4&=c*SR1RCi=1S_7|;wWKu+*Y9(`2ZES4rp zs)^09F)4FU;}!))xmeoA8SZi)0skiEBELlna-BW}Mf+X@J3@Ko7osL&z`6!a!FiAy zV5*BPasbRQ-UZMVW`A#b?oKKzqNdW3UW)OPfn1Ay4xz>Teox#{Vq06qqCKuwtbe`~d34x^xN}KwTL2tbOwUxnKZfX(E)G`4JBLk- zO;{te#ube=PW@V0nzLXF!QE1xS_;+wqRYj!v}VpqG1LXMbUK{nwOf4<;7g`oL+y($ zo{?!ZD7pK2!6iU?omz7Zj#*L3mx+x;;fFHYo4V#K0v1$#Xf>wrL=e=@TDLm!>SOsq z$d>FEA_zcTer?qEk>gWf5cynJ9+gi-e$WwC+!PYnHL!l8y&>!<2b1U9mudM*)DXET z>0-;pn`1Tc@Kblf!b@>FrDvZ83|3A1Yk98~XLk`--i4Dx;-vfpgWFors;7)HWqL&j zAav8UYt_+(U3;DRq9B49ziczBX_8SB_Zbi=wKD=pw+lFV1kTx8kB(0BG%hsQ3j7mr z8+FSL9)eLul=_Tt&&4W@*=!O<5aAQ_x7?5nI2)uQ2av~;LOn8+;`UZSmVbui*@VA( z15F~@V6-5f$h?0oR7qb(m@W%p+WidGS8?hC?n8Y~H_A|U^XPq)Pjt+((C!J0)+c|7 z(n17Sx7EJ|r01nrX9ibj$0DV=!bV>w>{?=fkGx}nyG|e&f>UZ;e&xNFdlNuh_2AuQ zPdB~vtuF!bo#Wg((M6*b=r*0B^PFbWtI{#E?Ed@-qkV0e)VbC@ff|>PjW@&k@rQ~3 zry5S^K5`*6&=(z!@={wijwo({!LjkUFPWVHHQN2`46*6BL;P)FPNqfBtLsbN zGpGCv;b|YS61?fN?hdif|+R7e9`ju5+Q zx+ON{Q_c|(cmC~4+Qpby{)qHA85(z%RCE0ZAt@G4XwV}LtlB>#BcDto*VCsL*jR8* zlwbv(Y{=8|%IULC04-$Of&^~NmujLu3LBvcD!e{CAq6xHpWSPG zDK?(KM%tMx1%zG`Msv^17FLcmeL{5w4p&A)E+noEKtfL+_!;I<6#b1 zje?U*zJj^^uq$-LgX;3fvNH30z)P{YXi`*?@jA$$5CcqICQ_pMq=%!+mHfHZPa}(; zy`*Eff!FGBw4fAI(wh}D&B53F#FLSFNg?^}Wwzat#R$w{)wGVLc=PCe=-o>W8szSN z%_Gr9vo6iw4f*mW>f#S!Q8<2BYO--ia-B6JNmJ-MP)}7Ol^duGXbbOa06ZLYhNS{s z=Uw<+Qx=WK3BwsYXYb&f=1r6O07@hgaXchXRp*4BcxFPv9M&-i4#4ziO;l`*K6_*! zOU2sNAlMz8uVkD;IhV^Fw`NCQT`{4FTvA#QatTZ-JB5{a_YhoYar8H1>2fK(vJ+bE z#D6i05C;XW4%|lP>{NY}A8Hv)b&-#meHR#&Q-Cx|jMlHytt?4b!lEM*ZQ}TRP*M~7 zDj*k{KB|73|9K|7FOhQuVfW(>s7i7KE#aL6&wk=8V^?211~+IgAj=f7r=hVulgnva zM6cGnk+Cb@li0Fzpa$0GwTEJhC-3aJRgy2*EPM)4(YfLnxsn5=5b(PCV|(RL#^z(= zI2y%U1T>L$rtvZS^b@MLN+XS^?gsXk$nggHcQ;!7Fe>}NPZr`lz#Uj`z*mm-c1AJ{9y0;QuUIFNn3Ah*BkfQ81BJ`Osm{&sRr zR?4eTW>MR`jICF`OSZO`s;ZP@?L)JL4i!tw-xa3ZheVCz5~AyoBi5GT{nZ{vqFRT@ z!GKC_#f#zNStI}`UbeyEoeYWij`ljb8lKicLSnBKZ6Dsl1vOuHiH6bJ2vsE}C`LgT zvz5+pa4Dox?@MjrWCB<49uLU`TpwKM_xSq-rRRF5=C{r8nF8d>UiGpS3`dEL(C>bTX zV9_u!eCmBVlATz87e4{JS^)1NYr3^c=jiolvX22YY**5&xSl)wOnM@yvb24EIqmAX<5EPump9Pgz&urz_s-;iYXm0J681yc-{s#P@{H;BY z?x+yZ^$E4iGM%e)Gqg;~$@(6M9K0j80T&7p?uXHa@qQ8i)*4M%K`;s(3B}VUct)re z&1)@f=~%KI`}d>3vcdTyZItw*7OO3u4KgvZGxK#1H~2g|p^$XKw5K7ZFyxbd6FJKp zCLc!ne79H(X=GR4!)Q_I2K$&PE{|!1EeAvZ%#_-%$iY1YqA$X+8+j8ie6qJc9-D1W zg5-<}U~Sa>mW*O=G%30bsr$dT$WW6eO6Jm7D9GUW1}d4!eEfmb*$!?JTw(?%JJHkY zZ8T)QHS{y zLX4X_a?NCqhUzumDZbj3F!Vr05G<@SU`8AqHYeXU1DSN}*{G_t;0>#{Bz@JY-Y}rJ zcycDL0jsg6#n45SWf&gB(ugtL4R<5D_MGaO2%k5@A-7prvLw)7>gNSW(P|mCjj%ST-U0D~RenabY>4W#V5422U^MAW z!VbKD>{1(GYW$K}BkU68ws0azFBkvlb7j)8;c?%IWPWO#^>MjIl}AI*73Bp9teTn; za%#r)b$(TO2!(?~ryT4qS5P86&8@Q_ncslNWaKyVAtF0Zk7i0$;cEB z(&QBrN2@g_uys5P6b9ZUk=t97EU|Pf1~82A9(fw7D+oRY%m%%FlTSh1uO=VA6lntRXwD)8JeFAvU$n<(ONvdrkO=2>kpdxrL)@TLg*Q7m zrH`Zjc_RQ_kS!#*FjAMmw63a=ytv^dpK+w?Vn+A()OZ3u`v?Ml zRF_-!%E6@j48iOjn*2$CvRor{K`@TLjnpGr@XWnp5L2s9Ddashhy}(BQVeN*Wyms8 zGJ2cTJc;qza zTq=jVIOI$uVJxHm1e^NEoH&(1Dj9U1o^>uIwb$oL)IiT9;owm0`78>nZ3RzueId9Z zWJouYP})9t+d-Qqs^=o6F`0oLY=@g!lI8sB9Ho=ONY!_6fRk#P^A}g=#lnvFmR0F> z=M#lysw)grxlzrlzSS8}d^~~{I+$ucSsM*)fOx9}9Qws|4B#n7sWBiqlGR_~DUHMg zgzGLZkRnafCSZpy4{dwj^N{apg74?A_nV}h%Jfo7)vSr~Qd7HQzT7hu(0=BtkWQI5 zXRIfoS8Oz3fR|nB^?AbOonyvm`bbp7<&MdfS$C#1%dSY;m2N2s9WW0p7E0Sd0L-mq zPos7FcV>*m2IWK5w+RCROhU6S_Fhj~($>(zr-@2jO8s_IpQig~^RsF@O>%`(L`1_4 zKVM<95Fei*MXBwEMxyQYP0TiFqrvqA?UTjV`^?VU0PdRoHjQ#w9OO)6J;~f!AauQ? z>~>I59Y2qa=-u@R+Nb=$!;|%I*lC2%HeR<0faOyG8PfqySnaE3a4lGZ`)Evbad7wX z=k0Tp5cC3$U}FQtWzhE8X?tYrjP;>!8~!pv#5oqJX3y=POr0k&Et31Bann4)4|L;L ztF|Tq(0@*EoxdT4!MFp-gSUVUT2iO<_w%1U$m!lFIzumHtU^i!9Rz}#H`Eu*lY}MF z_0z7yyJ>w?)zBKKqdj>a6VAu?&xz!3g|wSc3Z+o#5M`PN*u1L#tSCt64=By$aY>Fd zTKid>NRLuhplp$D*cQ2y!8K~v{D7&zP4tTbz@~-ErF{6#Axl86)-C){bn>$34F^`k&DYO0s>)+WU(b;B zKiz9d<}`&;&m@Tu;`uurTB$KxInt4C%@&A&nr!g~PzqiNnS(2u#x)#lcsRYk)UaEl zUpW}#E@1@rTvh%8{ipV*pBd?-qazT|h%w0jxAv$q(7!)551x^~Yq#oz5GE2VgM!yo zc)9-9QX}cZ_6Owqa{d7z{(o6C0{H$|+5>t10Q}&u|AHEwkRSiGCep2b9Oy9g{}{aQ z2x|nwd4HS#0l5+Ue*k3E|Iz(pF^U%cW0{B%{0}5{u7N_-aK#1u*HW_^FZKt>CQAGP ztx4X0fOZP|e;^TI`zv(<*8ikVV&=&Q%gM%HGcUa5_ow6O_Fwu)@BTR%YHIfWM45Pg`oThY z@Ta9F@G$HT3+u7eACQ0Y7r)fU4zz#kIscQACFg(Tg4g*6CE_K=|I9=+7FYlA6V=RJ z{}&5U4fpNu#HjJU)BDdqaq{Bh3IO-;-vEeetRDZHL86+Or~gumsD}0BFH6enACO3J z^}z!A{yXMGU@%~!n$lmt&-#B+0|qegU&e+G5a8du4IjQg{*C6hpC35z?~MHok05}5 zpWDA-6cq69q5g(vpMZbI{Ts@{0RNt|->?!E_;;oz+ModwH)z5G{|@*!>_!0g`hDDg ztwu<|zcv1C9Y6;Dow>gu!$$$Vf1MjXoOS-{_JIDs2>xYJ!~9?L|H4kJ{|_l4&R-D_ zHTdEF)t9JYAMdZeM2Ykdpb!mm1i-(qS^tDV)KEzX{QC^}4Y7!Uf6wS|2q5{JKJn}0 z2f-03u-kv(5;X*o|4+Yv`SvLOijSy4i0Xg(dDDIfmj4;p^LO8Wp%@MD?@La@2h{wn z#@3hrP2RsQ2K4_otBL=@A%_1&|1YFu`d_&J!bs--rN9&muFcD{Y*H$V94n3onB_C1jl5SQRf|Kd_d|vdy=>GA0fu@^S%x!)gNic*gUi__z}2|6c*} z#D9hcVEp22VICeOC)q=fII!`Cy0xyk|6Ni4C@S2CUa0<~D%n{bT%Ndi#ki*%sAlLk zzWeAePp7A~^7$X(NSV97j^De+%;9~^&!H`-!7B$&pYi99=0dJ|q9%of5?~NBB)}uZ zudAfbzoK&1LcAE6i*>=+o_+p#A?3|9S~swPwV{(LnE>YC+!ri6448x9--XUOG;9cALYhlb6t4Qbk^CHO`+aAWe)AsT*3kE z&%d0`cm|3P4lTj#9pD~_vD3zd$L=Y0HF(-$$LXb@vq@2Yi}TNCsmW0kO1uvlX+i#< zGBW)mqet|b1SkWd$c0CU!MVjVwOR`8v>IYaQ2F|BBUj5O{aCW(y8AQfCCg%!wo$eN zU#8fl*HXqIil?mfc>2RTBBInLjTQOs6GsORn44SE{zo0kDHkCT5;1Nxk_mQ25`V*}6Z= z`z@pF^CQ_9^j2+jAfcJU9Kqr^Qd=aoim5O8Gf5i=#x(W+^!xNWxT3^ae%4No*x{`M z*_v(g1vxiDMSJYZFEPnxfQCw6>(`Jpr)6&10VvTp8wWaTE8DFx%tBLUcik5>VbQ&; zRm*&j&3el0uXgM=L_c==9{bK%apx#KL0|Th>Nia$um2}yCfxTmq7Ny#|DRGOM)3ke z0{+g&c?T3M$v`Q{ZbX|I<>0frPygnlhg&X-ppB1J)2}ypPbXEH4YeMvDaf-jFLP#y zfO`A*`f#s-wdYslguW%8-BA95(x6=hZG1CeWmVSX4Sg5*vgvH5YikO1RBJl%CWtd8 zoh-%EZ8xVw#H2R_R6w~oVpdQy$3eE@;xN4}-tuB`x)oX9G#j@)z5yC4ab19H{|?N$ zghjT>V8*H%j=)4{7hq3nW4TjeK^>Xim*A;N^ZI3Wv%^~)BqQ%g7TJaP`_EkGIfYSX zh6PNC%3r&N!7HB+j(j&a*q*Q#r@J=G%QbEJ0&vzSLx%aA-uTpBzV>8!sik-cwntO! zKsId1EA~9X?Y>mn14V{=^O>Su{F9XK>goie@14aRy_7sQZ3l@Ot45}11 zAg|1@M$yG69K5$pEoZZLm6BRz2>$=*`pU4lmZj_9F2UVhf^R^e znvF{HAHQwdIC~?79a+g;h>b%a(smpmS$LL7B+>9Ff~QZI%H? zZvACZ`=ditK(PubZ5zbU6Sj;CC%jqk10eiTo!!ic;B6G=vdSBr_xm^&L|*SSdZA;& zcQ)70V)2U@j2!1(m=@w%CS-wy*d21D)srG%u8j zlEl$P9UrdkvOqy@;66T0t*$u?5fjf-VM5zWngs7Zjz$M!@x%XOkpu9QlQ&N`?W-WV za8TC0JTFUTu1X78Z5#!7RB9b?)%8Y)wmt+mMESW!1r1rbYCFV$3yWBQ|*Mv;RTNeOw^K zTN`>LjtE4ioE06G0l*G%Ou>7!gJJXLq10uo2TJLozr!p9E37w|JCzqJ3*VgAs@wX| ziv}6v+``aiZ5hOHQ${{O{UEVooy_o+z1vnV@w2J%Vof*AYw2l))-!IC)I`m1e2Ich z?>FifVD2coZ)77OG<~f(crV-{^=Bb?x}6S zTweml52gG^+CBHuo|K|et5VD*oDfV5%28tiwT_yPw+g$4oe*!~M3!wwAaJJ2O{0Mq)t z_MpGW8nPY#u=FB=JO4{GaQU+?FTEYEe^Q?p(c;s;l)tKQZ%* zc<=p(AjMFS8D^jVD8Gm!K7ZJJ5#RcO{Z0jeFJhMepH%8ad>{D78DGSLpg#k>h{z#- ztrC^usMLMi)QArl(d4jU*DN?)Y{?RJ9-{%4*XEJuZ6Kr z#CVPD?iKznm(?&k_-vN*6T!Oq19O#AA6OMbr~Vo$(kK5_-*X4%ZW=>zd-spy@MI5Q zy<_0aXbtkS;)$@pnPL`FD#onrd}>Ts;6Pq^p|iX;05ykwY$*O!{RYL+O;B#O%$l39 zB|UmCqZt~PuSx7|0y9lQU8S5?uq_&Pn-D#v{x`PTM8gYWcv});7PFA!_dY0Y7Czi{ z7_^LxxigH@eF6wz#q-)HdD}B*%4|qFS2MR$SdtuU0 zGP49M0WFR;UiVctmtn$^)TLGLYk0r95VaC3>)_W1ErMUnURXZ%roUwneWU5vycUa@ z=L|1Hivl;<%Ng)`gx0l2cSHIBsbX7yvzgBB#=_Yvf>RG@b}Og$fbe{}U+X+E8-Y&u z_y3)I{Z)Ylm0^J%m|$1{Ru-1$3?d*#R=$fFG4S*u^tQ2 zr&UVwS0oVGq5;|orVr1?F-OztTJrH5ilL?VdoY-J896{Ze>efia|jtdQTj%lqe<7u^|;UZs$f#rve=d#c9PQ71Sp-;a*W{L${eT z#TiH`vo7JiLU*z~g15oNeBi@1HLPl|gic?|t#ygVwx0xZQKSrTm`qAK$8X{pv5FsTxlZ?`4jHzs=X+hvqPqzTg@5VH4Y9&R!ws4CyHOjdh1~&NkD> z0qSR3_1g}AJ!cRS|L3Op;?`eZL&5-@V>;wssN@sd;+0;shRw=DUr6+4e_PqXUu%O; zD_cBge003O$KyjI@#~2JV2?F8x)6$jXw<5VDo=*G$C`ovfzEB&w%k@fNrzGWt0o53 zhv;s&;LicR_Zkj2s1nMkOFQ%9q4HLXtRL|=)QJ2<_$A3zM)M`fVkLdcuQII z)yzYl0F=6&a>Tq`s?3oh;jM-56rnaoWf6W(S(?}QhPZw*9vuk{*2j`Y?arlo$X_pP zAKg$Fi18tRVoO4=$u7FYCn9%CaV@1;hbJKo;n5=O=-LR_wS0#Wczv-eJp#ci@X^yL zfOv^%eI_2$^}EW?u3pFuZ+-=#tmFNm0?!hOO>DrNeL>(dmz~+DIf@P*KVV$y>r3n= zq{78T1mcnTfAR=&%9pg(IYwK)lNsaP>Lcc`7tn@89FCBMCIs$oZS1Cb*;@9ls@4_! z*UAA-$LA=1elC9N-LSOrBLpvn5qL=nIOf^_`h+s5R$H}M*UJ9#9ST7XR#kYM0(3nh zdN34o)-?XS0scy*0JXu#5_Xz3D3NH6okj?gQAxg005lkqBJU<21`-~wc)1w9E8T8H zZsQLQlrjm8z?b}iqG?;44q;x)WlK#8-97!vSh|4M5Q1LI^!+!Cr?b@)r{MV`O-S!I z;V|nW2PfGqxZ!zLwC%H$yC!x-EEqbEhq5qCwy6cgeiA%iW8VIjs$3Xx zBAf5(>9--S{J`moAg(e)a-Hv9iUTGm#u|`@u$l%6Xz1+XWA}Aw^(ja4HEfulJm~Wv$=#b)Q|D8e*iryI zDV};1=&j(~IKsXH2ugd^J>6UI;tq)KyM;T-;vL+XwjpDe6s)gK z-t(%Q1&cO!?*{v)V|VNV0vA_F&woW}qRYe6fyx7r#+W>^ehN9Z)MCMMj`!htnLODb zw=^>CF?-vJC5Ml)FT+LfrI%Ga#$_Z-4}X_-KzLK51JZlzUc8!X@yG)593SWETT1<~ z#zrwUR`UvwyDQvd2bnf(2NV!H9@2?EQFWWgb#*4YVi9}3cE5RV*vM+!Q^u;Q-@+c# zsHvi0COx-J@5Sj2x5&|8F_-RR=qSm1_IB?!N9_*kna+||Llxv8Iz|3}baMQr^TjCx zPeD%E1gxgDfPHaFH1a*K`H>l_NA(4^7{IAfxSlA}ef#M9bVr^f?~h#q%%aC>pN*Iy z1K->PxFmdTxO%ui&Y$n`-|8iq4EW5B3x=Q$-zXoucy1U=^$niTlH66=T=5%QFAcq? z;>vn;6+Qs*P&?w=(pT%l_3T$-DpA}~O~Uk>-)8p~@_%$lS!85wR3X!Z6`~H{r6UJ% zElC}dr1S?qXyJE$s~K_Iku}sdYO*DO!|90f{3<^YcFb{WOLFYvYMxxvttvlcBzsIa z$}-D;`S~Tkm~sR;pcndsQ(V`#P#5S7t$mMYI>!>S)wt=trX8Xd;bSOBp;rxJUsydH zG|*d2S3W|+50f5$GaNscC_8$&1*xg9^gq)n^grnYM%96;EfIg8mD{|73spY(dFXg4 zptDk8jp$=TL_C%1QT6dLoKxC6#E={SAX0!gY`dLhoY#F~L@HRqFnDaIe5^k9?4q@) z)yLSqO7F^qc_P4{B3)>!D&7vCI_@WrTsbKnd!0BTk*XgWQM9CL;|iO5$xzjhy1fMI zJOIGlF%avY+?0kO^eG}DJH~Q6P;TEd=WTpD+LXHr)O7F?PE2?o+c=Fisdi!HvUti_ ztE9($0-LrW?RRZcjZO^jE!~zLzm>}@F;Ml&=#@^w{s>x}k9yIUF4<9*4-k$)@g9%V zT!f9KF6n}B=U#D}?|NbUZt9)PZ917z{ZGB%2XD~OXcR=> zVPe3+DZ=eFu?_^PJ6p}JoLyc!!&QaCN{o6Rrd_$Qb7T4vd{ZwslIc=QL5mKNY63kb z>c|Tq8XLGZ_qU?{e8!%yI9Jg94r{W(uJOo;_I=Z|Z`y~_&xtl28$hr!L?yCQN-luh zLgG%aI}Rl0K$c#89=qg+fp}V+=A3yLHGI9IVX#V6p(&diUtjz8edKD{$&NmHzV^me z#iAOL(rBtuPMV@W^6kzEXIyp&M5VCU@Rmfzk)}kQ9@I>cWZyMFn;_zji<4695jBK( z70uI5MkS_yMX@rt6)D$sw7jKl@(~Bz_~Cu*IA`M0tG5sNAXsZ)g^p2gd63hcCVkj~ zd&%^5PI^0Bl?C@{O)aD2p7wR#HcX>6?30A|@#>n!H(`@v%^qLtS<)_J6oD!d200DYRB=Z7DEh7j$BQi- zvI?bc+`l{_R)-iq5R2Ei{t)`BCI%|a&MSR$Y;H>JqH9u*^_=Wid85ad3~{Lr+n6+j z!>CPpesm^yBbsSRd zTQcZxy^Bk6St<`T~ucyYE(5AQ{+~$`KlCkV`0UE{B+LlUuKfQ0=gQpAt{n0E?*G?83l9ETSOQVX zKsX%i$IR5RmE}ZK9zXie8>~L8kVLon8$Rk!E0aGrCe5yW1ZYg55Z%4>%#?w&ny_y3 zWuQnZMr-(eyQL8wIx~Tc&!-`%rHF!>paEF*eBr$9_4jxfm0j;_iRgFtHI()N@U?wr zepxfMyehDua$>j*CoD}!G43uY<9Pp=Bj&=}fi$kzjY(`i6(VCSDN)vBl>0|GE+q}g zoocEErR1^8T=OcYW=_t^sp&6};p+^)PTuYjL_M==<@2HFFsxfvn!#A?ydIdSIJjge z*>)F)->_64-UnjUG;XrSh|*|~)TQVqJa#Dy9d(b9yK1G5(ft@ihf zVjSVC@7e|Okmiu^+9##jUt%hl#_~_k)kM|*$trLa9TEoU-U5aKylMq|4}jRH+_D2w zTm~6IE0VUUZk$ozZB>fM+aj0Q|7cwxl27W<`ofBhaq?O67Yc&Tf@5LGQ7TKu>>R8h zE0%L&d@qM@=eX*SW>EGS2N_3b&!&AR9w|pI!g#EPwAh~d0*5;8H0OdulR1ZdVrSID zlr1X`5d-)=QaAq@or*_HBVa!yp|XG#J8?0+Ng{*yCpFh`Qz^2%GsWBu)owsIGCZ-f zxjX3n=KaO_nMam2y3)Hvnp+C++f{>H8wRZ$_u;;Hfwm;G>66F=(1e0!c`qd`Tp~rk z=Zc`>e>3oR(gVtSP(c6O8u;76*1?}YW^N$u0K5L3g~zOcQ2@^{AfXyWy1?%7UwVaB z!DN3|ML@myP|s~ZP#Ya^ej9B2MWbT}tOn`tb_*;>cwos7u>F^&XUK+@E3i_Q|7bMC zQ-eweNOPie~ik6143u!17H06dRBgLSLpv-51bJJKlr@CD>F5q$Mow*k~y_>cDd zOz@+>A)B+nx&G04MgSU_wh(;%Zw=NW@OIe$3<@Ny24DNTld=XJndm>A4SM6?On+Mh zv?T(~t#tw%@SB~JmMf)2m`WzhhZzRCWNtKYM>9{D4 z7O;Brq3}ohYiQS8s{-(`>dH>Fy!z{lQuW%rP~&DAs*zFMSS5D9r;&GEKB#kMMU?I6DZr)0R!~Qa&%0GqaEb4!@@M^1^Dm|h&c&dV<)@6rQS7MI`oomP zO>q?6Hx~>gOhh&(U(*GRZ|zfJ4KMd6AN#H>F3)d*u4b2&V~_6!hiyi$&rhBfH-ENp zHQe0)a>)eLYXjUpo@(yx9aO!&&rgQ!SAVtX0sx3l0=xv@D*!3Own2dK2HVjZh#%l{ zgX9sq^`;Gn@?2j5^N*I7j}~6Pe%drtfL`NipA(hB6xH{O-=k3wfYhrfLy>!KbIjMZSkq+S8B@ek}p}S?FarJZ=4RrDg#qKM`Jmw{L zpGxkGOL+84c0K`0c8uwPm8$oxs`u5Z_jlsUm*UHV;>K5ZYH#ij8BD1aotQoZedW7| zKYnT!&`Pgf?wREH)av_zt0l$Nwm#+5bg@gUN#6Z-bNBJ-X7+6J=ltgS0^nvR%5^>^ zOb|ImfZUyIiGT$)X7n{ZSt$1g|Lbi6`}d+85}qX4>Ez{rV6&azm|&O4TbS3&1on({ zCZRlV!4(HRPYi9T#Shym+YAOX$voF+MpE4VBsWf-9}zxok8;0x;t`WcOF7UE?S{Va z(MT;?O<2C{uN_IpY#FXYk`dBVTieL{7Eqkl)b9?*Iyo`AdNAY6qWXaG!_RREVieL!;A_OPZ5gl4*sRZ(7W6ul7+q ztAVOp)LQ(eA_foo#pPPHAfsMaCZQcX+=E$!kBhzlR(orSKFZ6Di`q{WR(cp)RvgEi zvz*M+F&3Om(^e{3Ly;hK34Zp94>eWO7$MpwJ2BE!;@s97^!PYXyqa<^^Oem_J(lLy zbbe=YcR<-M11B<=b8-}4X<;p7Y*8~!seCH5qvfSXB^keb-``DBy}YvkozJPXb&}T) zNaK<8z$X#9=FC)1V8)&;t`YlEH0-0p%2EC?<@P(YIF*pli$TsYzRg1^;WC7=s$L=0 zt|MKDm`SjrRJ>vBvmP}K;0CrH@whU?$c3MZUgKigsw1>abC4C zYg90c@SoezY1*1r=%=+*PaB``7X#|2>*gy^amA?AW^J4!`Z2_JrmqBs;G(v*3`^*b zlr-mYJI5F1?t>Hj(BqmcHMR0rCTrD%ayvy4!E^eD9lBykS(_4R9aj>#*TYh`=Mbja zm&zC$?6?#85<}vGmQvaj(LLz3(&yRqw5Kr1ayBB|yV6Nn17be4wTU=(k^`ESR*cNz z+Xn5Ngd);{)W|Rq}xx@Nisd=U&e|E6kjw8JcpE{1oQF z1A|^rV_1&GIkKHtk`y)xSDMy89NM+?tls9hvdX=_oZ2Sm9?|I(t9LF+rL*i{n<&@V z(21ESxAuq%VrdHh8h{cr(1VzHi9AM&uBOKmLnA}|-6U(R(ub$1j*;vqk+D};e-8q| zwE|iLRFIIUkpoNEUaN%D_gu`GuVxrF^6}fk9s20b4nwowX|NiFs-C%|l-1Nx7ZIhx zW(yi=5h*y*@L7BvK(}t}4<_QA6ml7~gx?xookQ7*Xhlv2cwvN_3}mwFP@C&ef;|2C zf=Kq+iXTyFwd-P&v(~AzO-U3P*Q(byYBJVPKF@iujNtzGK2L)aFN1QekLJWK7V%yS zNs~TR^=BbG4PJAk4mI_5A;IBfD3%Do;Qm~VdqwUF*E48&?!NEscGEQX6C4FlhHXEQ z<#$G`0d2}FoAXN_p4AVBxm-P+3)CeJkIM|pOAP~>M6#J($9$_+X6)K#n^;_#xek$1 zg8OMMDpx8)f@NZzYgblycD`dQm=d*#>kDKd7`B~z%kTDj#;#$++{4ExZt1tJW4unH zI5cZ(^B78StcfCZ4=Fxwlaxd0b?@RmSh@y`h-{g(okOGkR!09z`I(54<3+WI>IzLq zcjg)VQy6EP`(9O$?mGHwTrr{8ex1=w`mj=rRr&pz*xNR)k>eAMrF^ex(NL!%AM!VyaJQYo4Q;Dh zunPXqu&w8HBUN6r)N9GdODC02=6)3Z{~Qj)L&J zE?NK?>j1pi;c1#dR%-TiwN4JRE48Nu9c$H7XW)7yQwI-LWh4lf?EvKvgiDW6_LVCt zz`^D^E>|a~^b>9Mf<21HwPwmzGA; zFqF}tA?EdWvyt3DBT1emLh(_NjDcDF^k>!%<4~Em z5a7z2lSEaZO0LhbsF6x;)eclWdd&MTH16Q7=L`vlHG_)o5!GZ0@bW?EBv=R=kilXh z*M=9;Rcz_6a1=$w#qg+KiDUeA0XJg;ch3fHL^YiPJdC+urEUUq0of;GK;K&4chH%b z_Pn=Cxt3_j;z}iJS2_%M&Q)_6>p!pI+k$o0$w^|a?|Qu-XfgLl_wX4w4%+a8TsJ68 zAMHZ_0XHQod8c_ZvEqMCX)EmLp#uYVz>t?5?~C$zH~wMS%KUWjPH9{K=VF)=pIe=&(mOXm(QAL{i0JPl#ReZbZYnS9Vs*0U;SmJuF*7^e_l0~)6LjFB z(@a*rRyX{NaVsi0N?rb7FjDX05l!L|0E=qQWUy1(CZOW7b4br}*?}sJI+Nf2q;k>r ztv1H^CIRq9eSTNli!vRfQ(P)Ktp+lEq_&JRp&QV_?!0<=0VndsdGz0cxkW5OyEfNq70{+;YUy~ zpJlE9nFGLPxtu=JVYNIQxl0aJUEt{VgPdQdd8fySE@tz=q9TgpM->*K$x-o^knfQx z8Mx@e{++sqS7}xh2WCk(t07$VDjFQBMu}()c6%LmKOVS-a1ZY4*(i;qg@j;Q|i4(Hce!chQFXI@cz5c`RZ?>jV4dU-39n+Dn+0Zch%NUF8FNvj zWhi00ScHgyESFDII>h*UhU6FsmK>D*$P!@ShsHyxb-+I83&0%gc1;N{3|w`W;^%%I zZ6bW8D5R~b*S-O&$!JD|5wBvd$V^5SN(>>Kt^9T7om2fFxd(ZK2!Sk)GdcwL!G`2c zDD>>g@94qE4xQ|+THkV__KEMMYu|B8qBbK?20zbfAG zg)FJf49NjTqvdx56#dQ2&j8j|t(=@=z2as$+N0bw(b^+TXe8Bgv%S5Rh7i_P{zvne z8GexZ>{MnT*p<@nmWBwR5B`qk>z;APL5tQFo>X(aFei+!N$TP9xJx4B!VZtBQDA9! zSXULmSucEDX`$?UWQOqqI`e!v0CatV3p-u3w)kITy)=Vb^?UMPK#kJMBg$rbu@>gw z=W9yHVcn> zSu}qOm3=fxcrT>2R_~ApqPz7`W<**vzh^bmi}~tIhM+CR=`z+U*H6?Q2qfXfg9ZjAUC55g#_!&udz*%I>(if(I_cZIR$Q~qHI6liTlhjJbVfyOJp!9iTC0x zy!ho;q{H_t-#{Ytk*T4tDRi$Gtdg}bBbJk?xArjdS}UTyPn+QCA~x~mKsvrG~AbF;C2pSDx%ahjRW;hG3EQkOIs z6af8bk~pKeGK=x9`dW@7e%PNx5@$CRgIg0iY1IIB3NcOIqX4ho6 z>k&jr@Je=@@~{}&{XLTiWFWW1H^_VRAp@c(ROsPsi|M3u2`zR+$H>oc*VJ=8ncRgU ztAi^=y+GXdR}tTscVQFt0KPNOWt@b~l7MTux|kui%^ZE4x)&Skgf^vu(!<-7WpUX& zU*q}MPvx5(v-Ve_)M61LdlY;mFi~g6`DZH<1js-}lk2c)Qt-_}+3^MAXnkTc#=Fxi zxjLkwTTKeQUd5E`xRz{_tWa)HK#(T7x0!3T|7O%qluQ8x``e{UnerY{w;#g@AO_i}Zkb z%@v(4GY^jNE;6y9FG4%P;4C5tIV(j(pd7Oz&|W<^c>a0zTkmR<*YgspOLel`%-h;4 zbxs)F&7p>EQ_U7Sbu$hqOE)$7kh&T_FsG&(M{{StV;aNGbIoQ6MgN+dqwmH=qUZYv z=l;6Zz4WBDua`^H`|Qwq0I7uxB|ed%@hZ`-u^Q11kgFWYkBRP_am|Hs0=BsEfTDT?IJDQM zxa_9HPEp(s*7JjrthdQj;9csH<~Wzn%x;A<8m8`TR2M+8%rFPrORXk;co*nJVroUW zDawTnG}I3CJqM0pN=3^n)P(i5T)8(i&o8%nTpsUS-eqttj^5}Jk9sd3xugU=ng|kL zg?KGkxf~v^>v{k}nlx9J+8;It?gJ%)lb_dEgqn9 z(c+UE;Qrc^ccmG(x9?K2HMo0FvNg2(P_mV~n@M;AdzEW(H8Q~c2Jrj|!7Qa>2o3tH zS5D#o_0apjD!CM|fT%nW_`qXgQ0XoK8shq;Oy|Q3K?z`f{sbW*S<^8^62l)3po4xlFS%}@fK=&b=C?&;O3&rkjH#UqZvubB7jj1f|RH#l}4C2mUv z1-Xrb>3~Vct2pg18L`#wDS{e3j_Fj3mXrHt=8M;5$_{T+xPtCI!zJn$35h0EuWucs zMz@D4nks^rLRCmGceT&t&7( zH@4ZwOSMc&VYP>cH0@ixoXeCyXlv^%Z?}~UR88aPiTo1#jPQ-(QvRXb6o491O;$*#(J#?_`YoeF#9NXc2UY#0)M%G;@jM`qi zK@WUE#celyLxp-x=OMj7P3I}Su$s(WXfURb?l}y7zE_X9B%*Kx)ccfTRqebTrTrZx zb7aNE=pRa`^I)Ps$1sZ)p%4^mC+dQ(F3|v0b%8%-d|4y~a;$>`f@LvuAdcqsNKY`_ z?RjKVBQdC#zDNt@V)X8heWtdvEGIxzW)Cdqz*kN+BQPK}Ko3Rt;8YJz^Le{WCHEl| zJ@#WLS>lzSG(@@R8AXK_qDo~wp_a&8GPu|#D#Gg&h0M8{4&ftY$O8@^cO^CEg*+O7 z?>L{EA@~)uLdSwjrsePq1`S@2dhnb-cuzVKmVqsa!dJK{V6|_Z2W^PmmG@a6T!Ph&A%{i3?wObJ{sEne4Mn~7m4 zdV~mrsFkq2!6-Dsxe>`oW(Zp}fXbh~kfsxp-HmtT)h0&7xxMMX744Z(cWXl&>11JN z6 zn&33W-4?J}DuW7AzBCaYbc)++`Naiz-@m+-x>id(hK(hA8NO>CO;(ZeMD1?A{#_o0 zxSm zb*qqaBijc7v9ld3xXQv8Gg+`y4LC$KihCF+NiiHol+5DSx~9ZvPYdU+CHh7q05Fs%{tifX5Zm^;1=4op%eOEPNgyjd6e-n2 ze&l_8P(lN1>esD?2a|~)VHSg>@*wwvTS;Y9#8D;d2&$n(&5O#`}(0o7a% zNzdyDRHTgUm3;aCWqFP=Kkdo|Rr>nNAwj+F`HtpxA^4tn`lnQ(V2Ddxc~2Lr`>lFj z0hrB%*z{Cy6KpY@+zv4LNozs2s`q$B>5{4rkBbp6o9>%E0v+BB6UU={1HN2@W>MY_ zk{$=ylGb-RKJQo+_7i}vh0SI?4}kw7l`juK^>cDv3rDx6dPq)naXGgc%2h)x|L3;$ z73A@x(PArie#=EMYsAAfjPmTP@wL{CS`AZNMc)tUSfJQ$UCb(Ry(3#xeQ|;L;oV)L zOG?=e$|TnB@3|kJoN_8cgTCiZ^K5JV!o?V<> z%=*brgnTf2f82FQ|P-DUwqyobXlms`)btzJYC*EgeA zCUw7Ry-IXbGWcvL>3KV5Fv7rq`JOm`KH?-(2PZ93Izl<9)r9UyRew>2jqP=0zi zfBm$W@6F#zJwMG&}<`Vl$CZ+;kx!)>+8C46KULLl&H>~7!`A)Te9;TZzYI}F){dSJ{ z{%LvmrsaHi@4jjuH-@dVJJ|O%r}z-gx^1z@sl}arwaA*x}gMY`nLJqFgr@J6x5?5 zbXkuSg&4@RetSoIAR=5fj0TZlNy^@YnoJ{{wV>sjnM|hWg>^T~ASA4MfC#;rs*IkM z=;q@S8;6=TX95WEp))6)(uKV`@W~9?Li6XJx>RmqLEKG}5axEC6tOSHDvD8f1|N7I ztYB5s{cc+mR+h;>Ka?J)unDq58M|mN3l}Y!EQ^&xhTBn2*564V8`_AajdCl;(Mw-#@~pX~Cuy!gP`{ z3BBE-_8o%@oq&W(D6;P#oN9cxDUD+*={eZ0^cS#j*IA3pN8BBDA z3#(9y!Krs6smjU~J>3Y1@u~i>J)F{rDw9~k!*Ab)Rk`KTHX($N1+nC3o15?(7|1!> z-~ccjV^Y*HlL~hyc7bGUin3*2FpA2_Sr$JC$f+~%iV;rIU{u3S_tulv8{7PVA>*ov zXu`&z6(icg(qyDn(v~o=@jGYz{!_-@VT>k~F#JMCIh6=8i7Abc8a5_vzGn#`G@cBl zMmjKzEWx}6bOOI2mjU8W@{uaC%U71Irvs$RrFZi`We1&R|5kOBUI`^C`M@u)DWnc%W5q?1W9e;Kj>hXj7bq{0>#Oj z)De(G%9bA|AH78667Il6qZG;~^G1U;R3(2nK56ZHc%_&PpO^zC{LKP9IUpRx#s&An zn1}16CwOUyQG+cszF2(Y%Mz{_-Q>=w46~W|TMAPX1w>hVe#G(sR>vYZ@mJHJ+P ze>XjwgAEzmr0hxrXmXCWRC8S94{>Zn`(Fw%_D#4b_NZVA;!GvEs7;$$ZhXn|`n$Gb zO>-oT7qn8~>W5)hx6URV01?S#O`W*od_ujlJN1pLBo1s1Tgx;`#dsl_)wUQ#GATYa z9p5zcGYC$^cku#vQNENZ_;sdR4s`Axy;Tf8@;vzbdp!h9NV>#hzSrY&;v=SDx(sNf zVzI*)Knn3mq=XF(G0by3uLqm73&>>a8p~_IL8^>8WsoWeTQmAg1S;Dg zwQ*`n(y^nGxLU-s$wL?OIK+{48XWkg$*ST58^to&1m)k!RPbwzrbTT`>Vp(>hF;c~ zO&TFN~h|>h({=ju0g;l||A0&iYj4 zS+vTqE%>)n|?`*<>=Q^qRy@c8_j;|+)KOz zX|bvPJdvX7;)U<*mmdQLp!6LmWaQq<`4S1`*!55|>pC$CC zCDoUT-*Vg1%(0Wh22KAfGi8S})n4I+D7Q=$0#igMR5-|nw8X{}l0vw<1U|(lq&AH# zMYm{LkQLNa<@W~w6H=mutq>*Qs1{GOgpEdwXA~VOAtv;RK~Y+LsZFJ9Gp*~f!Ds8n z2K|4qDoRPZMsS4o8l$uw^>#bMw8=;^q38L##Wao4-~su6R6iT`gO#*RCLV3WctJSl zzb_B|;EE8^S<=krv(bEi2*^Wm-+#~4rX<{IscD80DeaTp+yYv3AtwI)ybn^rA3h>P zblN|g3uycCpGHLZ|J%r=^FK6iEJ0)4*Zv+W?`!j!ocn$P+D5?KAG-k0^OBZ-Zk_0j z79Vds$^tHf_{s#P|Cm5{%zhLBv-qB`OT9<>++Vk@ zLigW|`9g1$V+U2>NLOwc+2I>XAVUvMp6P0mdH+V4(%((Gag1iE9E}F>jF2znqQtV_ z<(=g_)?V;xeTj^u@w7;w*m{)>2`~P;mwankmO|tkT1$+_W?2;NgWm2@G$&e0ZK;Hf zHI8-R9J|if&xX9o`|$Ntv^k!xr-ObVKz!Yw{FyavsV>Nj(0xqa$j@i5^iYvr1&+N! zC7$Ma)oGPcJV^)0<-w*gJYy(VXhLh{;zy_PCVj*tL4c2r0XH(Rk>87~7hms`$t--? zKnkD3F-VlZMnsr?40y-koC6LE+KReh)q07ntTIWJ!f?xrGc>6*P@#t>wu#l5TDZ9R zGU{27wsP2b0qA)kPvl3O+&hS(Xe~=W0F=APAI?4k)()@j=4_HpGOA6Qy_RfHu1;>X z<1U(X__f+U6%nIQPuW#^{AwX7s6bh4a0IFTs(Ss!q9rFZk`(T;a10fnm5 zztK9R<%`<{n&32Z^BV)FpS*8ef5ALgPWZrxAV0vrdUYrEUm@vB9`~w`}`CW^KHAyhxLhNFNS?C+0v zTTno6S-H5r06g8_t-1mM9yhkOPmL|VuGS}yk2ib#e_fwlUrYivH*HsSwfP?&_OB0z zyIftrE_=7a^$h2?-ML@>T-?qeYX8b~Zhv#W zxtn2&;wt#->FRoMGehpg_UjU#+_-?}-NRznb_*A=fc&px+J~_F#VA{*UqtQ1oAu4D z?l(I>mww&;3EER@W6k zU@Q3RV&DF|(&h4{kl?Dcs@PccWo}u z{<@$1;r8qPc(4jUgsB@DS`t~T6IrZAsQQ&awSuSk6L+zOGeG6uLFL|EMbmETdb{xW zP%&$*aCuO%Wj4oU5aw7HdEqOO3fG`Sz_9Mu3lr7g^{bOa+bDI1CEXi|V9Gx2$4~MC zs~tfpeV`|sPEMa18v)I<)CKZ@2QQvqPAGy}I(&S~_opilm&-fD(}EeuUZ8@bzp|*j zD4!TXaG~65K>(^^23dKC8R$>6@pQ6CQ7ie^5U*R5y8)NeegdOmx-pC$KH>vzKi-) z5y--lnp@*8Yii7z_f^?c$o};du^tmDuL>fufi?%aW*07~8 zzN^rMr7JSV_RI->+!#&6b=J85$61F8-AN9#;>aiqoIOamX~UHgeJfTtYhCn(W`tP% zISoKGVpqE}T!P2rn1%4Z`{H+bXW7yIf;;|V{Y>;N<>whx4R1N#Cy$m%Cm`;O_-@7C zF@mpHa5f~%9;)~85|XDK+!hA<$VJQX@3i6dT2rO9%sQPcLG8P_W=i$l+i<7x$`&{? zaBL(;#>hE)s&u`hmMkE;)Ir*O6F2f`3E;Uo@y+#g#-gCiT1^?(dH??H5l7Zc-2>vR zQ-pu`JLC6qYWw? zzCEfEu@@x{K@DmU$Dx&OsGIJsiE_>Y8s-KvhtCp}W7#WtyXSdUfc{ zka?&cUt>gWKrE)o7fb>_i?hO*Le!f=cq7)KH*Q~|-tAWR-uQ!)_=RN)RwEHt!!EZ_ z2$Ra9WEApV?`@I*I3Hvs>mh#BAc7gL7O_46H=H;hYwB6MUn6l|!|q4ncwYb!6sr(; z_dU+T&^>etjh@*Vhz(}%M9oTe_1@@BbNe0h@$*{fK^Uw6&{w;%v4o~dZTSva+nWMk zOW+YUz>~NsSLVX&2cJ-%D}ZOBvJXB=>cBYUKD)ctdyi4{X7$@W$QOD- z9voD|2MxHPu}z_|3Arrm;PI#8!Mp-JeBFmn}(_%}9SL4K#?41Qs+o1lXHjKjH+u}zV& z3H>Y*x^SnQ9-EWVk$8n|_TM+Hp*&gLz3WVkn1?R#GqzJCUtDvl3}@-v-x%7@2E8uE z1OqDoR}8EmY|Uxr28%7!cbn~2ppz9xaEK9y@R^n7w`|ROILlaU@FHITbPNxoB9V03 zJ=~&pJg0=t*`KF6Za`Cfwz>0}lz=d{fUw9;YiHd494A7WSYlZk75M14Al0nTJuj-a z`Ys(Cdboy>Jv~W1VtrZldv;g>Km9aK77d5P_zbWTE4JQ~2Tt_Cr|;A1N9=IhEv#pEek0ym1W5!lsJ`u{#c|pAouxL76(MTk zr-*9hmYPp5NEI{u6mHtWrRo5*;@P4u9gBLnB?Pu5CM#;(EA^A}NfO8GEl?#knCdAv zWvZYr(H=aC*C5RNrM&R0Y*`XJ3&16`Ts#c#$oYZW4Mzvmw&Og-w`HHW@$aOM(6a{F zA!USJiu8r0F4e@<#5%#y+GD$$C{LcM1bjx#rw(@&iRcVxR{0f8OXjn(Bn5UY(wD05 z$oMXxnHycA~2NA8`!ahQymn>E;lOKVF4Ns2cQ9OHk zlKKhHW_?Ypm+6vQZ<;B0y4omTnG3`Fn*?X*x=EJBS&DZu3}(sp!`)b=xgD3F?E$#e zHxL@v!#yMrD=`gKil-(Tt7&`YJcbVh#S9 zngx4u?Sm6OsU}<5l`gJ)%Q3c70{&9aZ_55T#s9%Z44d}+2_Jlm$1vy>>9}vFGEG-_ zo7KSt{Z0X(lj6MV$Ty>db%xtpZSk|m%Sv!9zwA$^%@dn#hbHiD zf}rg$Kg0xD;G7WNCTclXwb9lx`&QY8A0XzG*8+3Rga@<%X5W@tT^W0NdAZd6nma%T z#*!ftXm^=qkL-9*IYy8>&IN2M-pw_z&>KVm zP2|j;NtOu2j%lkQk+mn=qMrA&i_{?Pzzpsgj2QEdliF)3a7j561sE9A51#MjV}v-D zvsrGY?&ssdZA(i1kff0m7DMaOcid0MHQ2-}i#oV$HvWF5r#i37cpW@!C|+J?Y|R*Na)hy9al72oAv=z8P}f zbKm=|yB5D{RaZatRPEk-=;~?(!|Z}qheMQWR*4*kkxIq#p|_*r8t{Z!c{p#NsvySm z8a7><52};Hd}%_mg{qBn1Z1`2vZO&cj^iG)hXf~6Q82m?B#OeqNRAkZ6~iSLHEi5A zA6UAmDEz*c>JJ!dmru=t3A9${bPPP%>M{bMi|!WA6gpJ*vWAVta`-_D%bMhS)rwEF zn(!9aLq{5&8^60d#<^o#4QRr<{vFrytnai({75j06lkA##8|G(^ruW6kMyAyTV2WD z_CXUTUMRnAq*f2BJZBE58WRZFwAn8|)zm8>k<-k@wZya^J*&wmGYHx|^g zM*$v0d{!-8vDpc%cC!C-pyj!vkkI;j;j>D1$+m&QjnE4)Z_N5>YMtd7zNE=Vvlj8a zdkOfS`cWgf&7Xv`YQ)%1+UGt+6LkX~K~|2`vmF_D*P26?OW(>MNR#ZW@BI0lj~Nl> zKkiEHu;eR_PJ4l@LyK09;X4hb(E}Mt@oN95%p0cm$7qQvq=^%#AS_6DL{0EmDLe=j z=c8z@jC?Q%dspr>rFso_K?KJ!4Sr|9Od6=O#fGs=*SB9A=m^hnr~$xnMhT74mdBsI zTwZE%{;l7bW~lpm1M&!o_GO?qT*o(DyL?MoO(CP_YV`vdydsQ#X8=3?`cN)`u)V3_ z&xy=Y;Fy)Ug4rvN_+u&#nkR~FF9WV?-w$`~BP?hr`hGn4j!X`?j^Oj;$$E3|N?3t; zd{x+YdSMfsF3dE&x+C(=-`+0zrXMb0eO*pn@`%TAheTrgjcHOaf2wdXSF`VzHB5hB zX$1IEZdGT{+6XqN&pk{vZNw+<9wB!sOF;_xd%N3Ep~b}#%$3D!5B1m@x=W&5+u02C zYc~j&Z07R^o0)d@H!y$FaB|M&-U?4`ADRfLKRljo(!T9jwig`R(evirmP=^5zy4OZ z`Z?xaPief0%@o3$ z9!{tDZ>e4t46NA5c708TGgQI3$T`OwUrtY*m|VrYu98&NJmCMc(wR}}{Dt{V+pE}J zkO(H9`(%}5zV6)7hQcJre$GUP%-?NPIvdQ#8&skUzEnIMfIc6}_cD01EGAGe4rhq) zJ$%&oPuZ|@n5fRWmG_|)NmvEtk`!ZH849CRP64@?Q4_hCVMd4Bw(K^TsE5O6upD6> zL%o?dnc>^!R#!F+1F~}z;7P(+>-ZRF5RTfx$TL5zpH`V~3UPk3OMq8!d8#6mB ztntN;5T@6}z+cqZkM&WN1`ds*?PDlQE*f}`p=ycVNO1bMyWrbTA+!ZJ0pNX*Lb#VG zxpZ5QVXK%gc%PY}0KVsB6Az9^CxlzOHX~0z{R?rTkA(4#L7u!e;I3NaG@mwKkMwZ` zmfvIy?%L_C=TIfoKFSbKU#?yFjt|ZgKLh!=>&=6dDSV*WT5C`Hu6lLl1uPu;>IwMP zM6f-G`5pyjxV>HGf?iAW4utxuf6=9*;OwpU7%QwX8;zyuj?kH5VNQaOU@NlN^-8>Q z7-SoUrrVo{q9R|vM@x^X5--xwZ-c8MF)93TzH*yAh8az*OJ`P<2icnBL%gq{243>5 zgBp4|kds#sqX}6~s#%eCj32hEoS7Nx5otdT;oDmp8JCU_CoVd>NszfgGC6*7h_@)4 zw0|iq`;VrzoP5GyA2S0BGf2es$A>U!_g+P8ef;FMC)Sg62Z25Wh5lWWjOu-OEK^u) zM{*Vr5QfRZAoa&)J}aK)8lL_~(R5x_IsBa{K3-_7?`a=5S}eU(0h+%-(;C2rP*whj zjTt}*%Qjw?!4C={vh^9W!u=s^)5R3+2Gvj5RgX@mdmJH4-{6Lufj=O8u>z4+R{`ZY z1Zk_0<@jpW#f|t-LF=4_@8)_(^ zhU)K7z{5?aG3qN|Whs-5%yFya#?`H4If6bqeW5uY{2`F3BR_GF!8Hd*J&BMa7zMM= zMT7N#v=J9f1dnj%)PYF4KU8u}vm_4RGlvSfue5`S;urXJtefr^DL?eq3mO!2Kh}!R z>hs;yx+pM?x?fnmeh6v+1YT=Tbp0sG*^&M$iRIU+jr)W7gI>sAnx#{CQ?LL?7?B_J z_@2oldGhC^o6w13^R_h4oLhAFPe*2i1gDOHroG~fYnqia$`6OU5=Qd7c-8HVYk(<7 zxiOFUR5lSC>;BxO_TRsXq? zq9KoGQbjkUXr_JeI8$e=vAtp=jO!N~tmbbC^rs;vNqnW2I|)a&rNaK07QC zyM#NSYZ2XJ?d!;tfuhM`!y?I?fXmJVt0t^u!sJ6PV`mj$@PSyV6OPS67K_VKdmLTK z{-h!8egNg`LapD!v7;b%>P9A4+@U=2V&)lC35=z5>c_|A`V>k^WZlP|`f$P6RjHLKKx-A*!=V9TLzo*Q*7ph#FI4 zTiL;GwP>;_2);vl0&BAL(+e&mE=Fap0?2!CW#g7SnM?D0>o3QLWIP?>N^%7yW3Nd2N;SJm@xZKiB}+y7V(s6AAjK<$_$vf4 z>ufc~$(3woHR)TocR}Fjg<2hQ9y-O)>*}? z*txjYMpOOe?~#R=nJwZD#fcZw|D7+ND+?UkB3hWS^+Md86`AZAl(-Mda14;7)L`5L z6+u>O$ZUl`%y4#z2;Fc0;|V0zWlCWbcn;A7bP@j}gt*r&0W&QDj(J ztya3*E25G)$}ly`U<|gx+r|pf^>w8X*H9PiZynTWPJJVdY><`?eRM?`#n@-SLjoxFF(s$+i z1TfYoJ;%gMOA^dXGN@L!Y85k9+?Au$VnT*Swb;XXre!b1Gpsj@Sq=4fxA&7jrsss# zwM~hfb70xH1^~VYE8Xxfy_R*B!a0v7$)yt=NS#rZ*Ob+Oibu%+$;)=|=~zuw=P zzL72v330sdo>H;j`mE-w0qmZw(6R0;W%K#XY1_9&S}GI=5#vc%-N^`@K%`D!{%B>N z=X^)ru2Zdj3(MUZKMs~;vV>%^1wbpW+>wzRb~0l{4u?w?laFV{AjeG@7D6GDLm}g+#YA{GJlOu%BVM8tvNGM}bSPp{ z@suQ?x(dPPodCK2y;3O*$tVr8lr7dXYH3jRF(s3sxytSbBZ(Kbp7Al--vNY&vd%#kr>T}PG>qIaOx{cgewoe|ldnLY z9f?sDIpG%y3S12k014YT^>XBYlq)i{@XRDBvzQ@S!f*Kn5D+4kX^IrqHP^{3O@|Sn z`6^8;J-8DX3hD$x?m!9%P&|NCV^dcCQ#XqlX81k=^ZP{cE_^Txvb3os?zRK-YqQ{{ z3|)!w0Smqz86WDaOc#a7USXAlhqWTkX=)(n=KmLndOZ85P)NM4CWQBBVMT-(p)*Qe zNU~+q$T(UtG1d~A7|;|z(Se}w%pmaOj&gef{r+oVoO+m{GDUPYw|tuf)>w$q((L7{ zZip;3Wip-xZaPy#L0W6xZOrm8WJB5!QX>w29|$*{p`d{J@|xFHz`9Mc5Y@TBULEPw zI($3OuAm@IVTdF6RaCMr`z3sg&i)V(paRO+|8NxVA0l^<+w(K}1q9{`pTps?|HyYB z(ZEBp3ZWT-k;sz&uGwRz*6=Yvp3W5F#(zGOJ|yp|XflU~{oKL_gei5z@w(J{DoVNg zDSx$eDw9g`U6=eBV0azumqKhV+9%;}NETq273T@Ey!|xL^_RC0NboY@W8?($IBiY! zoM5c)x*Z)x&u_>j6g0h)(8%a>7`b2^R74d5-(yacs=Y zZ_r>xXvR&T>jdRdcr3#>O^%GA@2m%&t5*okAT%%w_@bIw;}V5h%UF}<25Xm;l?*TW zZys+NB1UP7gxtK+)qWuDuL*g@c}JdV(Ql0y1H)46SI-DYMECOov3cXkfYm6ZJ>vQ!)4M#|Gj@(_3StE1P-e z=-o76Hir@iPr&Z`p=NR;#bon%iwp*zE%(?fG1Pbq3dy|B@Wbt0W03zhs3^Q(`CS0U zjG&R6HZoU({A^Ij@~edWIEyn|bL9O(o=_nF84%P{c~{M+?X5wP*3s|oA0Y?gK@OWc zPxAGBh)0No*ba@g6Y7YuxDd!I7xZR8Ih%ipJQLSCUx!614`K)>w266`!Aq-QLJ zzDK7Y5Q11ca2>0Pg5>M!qW*0!dN--f zzjw1+XOl<6L9-ywhR2(m@W$r)=Z8TM_u+gtU!O@`dPrRcNL_|WUB*dWrb%7q zNnMsnUDiomwpm=ZPj7#hO%QJEM>XB+r`vbBJflIk!yVevOzVgs-ShV$+uXSmmu&l1Ys!l9tR-`&^BT{}UpuU$YSa_n=Fp;l zuUfujd!*}aMuHyq7Ox@mp3Omifhl`3)7HU#szs|RuTs#^fJKe1x3kPD&H3frL-Dcl zQOb;oBf;IO?UPoT7iT2ftr}o8N2nNGn6A^^?3{hnN=h&Pz1!WhQ`0XlFjad>cGaPAsj z@^_@@71bimT)RTYI+gFT7b0JH%oH+SvGMg4;J_ZROqPHzTLoj8KVl$T|Gh@u|HvF& z9^6SOID!egr)jX3H`%Z!VFyO8cs0Rq!sbM?4*!OO<=dFN(1JsT-VTFoU}Yq@0{4@1 zXQc^<e+qQ(8}{3Cons5Xor3YGR@Et@}qimX8Dsk?*v7ej#H zlCuKm_c&sp{~djZ$1M8Fi+yg#pYJV~F0r)+C>nm98#ykGrm0T8ei9veVd_VQ*`n5^%w1zfdUW29SY}RBOj1CEWraTXry51rdoDo zvW1PwO5$n1#-ZYZDgz;h0-x4Q{x)l8*%9b6Ys^22b|o_O21*OkF20>|^l>jkDxN2| zu&5%DTP!4z<&Qf9lZ7Octx!bQAuS@$yT=1ud z1cY4z22rOObz6W(?PB)!^R#c8_sx5X5JL!?&Ff^Jfe^t;0sSP zp*R)ZIe|*8PrG}i3;ZWuJ7=*Xai*vEWWhB=;*aDCNN^CLSKvf)M9c;j1|!)HX}ePA zHkTO%x}~?EZ2Td#Uhf|xooNg2)PME5$4$Qn<@|Vcjh&wk)T8A(GI7Jem7u6`4ikFb z8jAmCnOK`()yjym8Pn3!_WN%do6d;7dBsYzMU;DE~*+8b8FL$7-rQhe4Q6{fb6g{wfQ4VYgu1{`d?jp`33u` z8r-W_Dj)uTMMVGV+9iZwUs_)!K}&}~FHJ_FN3AwKp+k#@>K|HJVo?GC%p8HtuBU3U zkfT=fh*S!&pG-f;-QHRU8)tv}F0E&laqiUQMA1mu@prIndFD3dPY=~%l#bJ^Lz?4r zJR{frPR#x2YSrrfanh-MR~^H%V)10PBb~Q?_>z-m>yn4wX|Y`EldfOwKcbUpG!M0+h z8F1`czoY{CoO80ZXSL<6dR?*CwBqXOdC``7QS!;{=)KrkvZ=s3`>gH$qxT9?bMq`= zCk<6H>H`P05A+_X`KdcjAkC1emd`wVri&XlWmSvstG}h`o*mpgFPdqVikI%a-|}>4 z{B3i++Eh5CKe=$dEIq4tr>vKE#hQM0X3g}hthc;SbWdBRcQkF??9Sy1SED}WT1eP@ zSEJr`y07m-FeT^LJ8+_Rt&|p}dF)9iI$a#;3|V;}_-BG9>TcXlK-OpV;C#uH@F2IV zKU+bfns9v0H(GpcT3rDLfS?)yqNn#Rfh(ha*0TOGG^xqVnYKp1{VO1cEIm_`S;lKZ z>}4)&j7ES4SQuDdsW*NhzOoE&dIYC51hrIKtP;N$P7JG9;#6??U<8uA@%!;Zcpnz* zAm{X<>pq!`g+1J>7nI4t`$*WQh;AA=8u_WX(@iKHj$i}JkFvs&f|Iv9!;cu@^#otP znURLkvY(+GsuV-OyR}=kce0qqYup56?}WiwqcEry+~ftT2>a4t;YS2f1gZXRb0NQX zDlvso;Lyy9$}bj}0NBxSbO&@yfESKM@FN@8nNX-{!Y2bg5CoHRukofaHbX%!PZywq z5+Uj%5|@GJ8W|Yu7oD+NB`C7QM{ZGuQB94AG#^OjPkc*6`M$kd#)F3XtynsK5G4yY zlB$a5*KR{ey$j6@(&MxkE{iQxifxhx1#r2k9E@QL9S!B=D>xhx5!)08i&(t>jl_=) z1im5^x`#k{7YJigekgZ0J8Mn6z13bY72Xw_jOYA?YZS8oqh5aWT#Y1jQGFtJ8 z#7Je6km&~41S@$JDITTue&LiX4|x9SFEOf)1+jjcAR{;(M6KhXm%gz+*FF^HU;g%@OFVx2`@r{0N55xx(W7}rSNKy2urQ#U*E z1{#C%QESQtn00j|FtII`h>!u>UMUslb{;LgVmMZX_tr~n11dgl$XvDY*P^{6_gj&e zslbBVnVFtiT1DSHdda*`Ct=}fE{l2WGph<=x_)PgG?N|8DI3j9tj;S(kKcRga}=c2 z_29J&W!7t21RYjz@jsu`ezR;YM67YFGA#%F><7$X`ToN1CCTOKAkKs#&X~Chc3io5JYw?p8@lB5Aq2YCQN%rnix<1+;sqj zZ(zSX8jz7(yuRt~=&r6=k>DV-{~_Y5gk(Jo%qx#X0?79tU9MJNt|~lo37cN;MQUWh zh#>C;-hrS5AGBrO+1Hb)gQPZEWpX?pY6T&a67u-CoFRuLZE-)c4Wx73ce)MzW?fXZ za}la}qYgcEwXS=aqLn{T=~gAHz8&*5?cq^ev=4IVO6guLn<=i(_Kt60aAT_`Zq+`K zoGU8vw~Hn%i9xn#IjqAxto_G!VI4tR*fKMuQ0g&--oXb$RI_osFJY% zdJ4Y0sb2awC#30rTa<|HUcFYPxo9QFAplX^*fR)P_h2&_ZEo0|Xc~{#8Zk@?IrQG2 z%Ey{IWqTuL+*Z;230&)sJS}}7I=<3h{kh0gbY8VQi*~=*RF=N- z^ZDdi=c$J8d9kUj`LT11Ka$>p z?hp5}A8J>hpDvQn3)RP2!y z4@k=HloU^35>KH1pxW|YHO*1w@v92x(Oo6YLFN3b%DH>I>HFzc$RE-4N8+iL_fsuI zDr$q`^ZPq>%{;WC9%&yO+yUHuk3Wdjw%)s(8q4vIu3ZkF{#j1#db*!qw^ZVX_qy9W ziP{1E=tA2uN0a~dyqqeqTC$?^aO=2>oJHN)8|)iw6t01V(HndXj5qG4#Fz%*ouZNL zvuuP0n}yGzk4IuWQ)Cg6mx}i2DAvJX7P+6^Ft&KB_8h3ImIur3wK0PCd%eJwt*MGTu3_{ra?XoT3f^mDtWXgS5gVrPqFNTd)hK=@X!|v+( z&2&j>ipU!Emr0Kgo*ml*y2iR7R%W_mSp8eyi2jk;q=Af9{zFcgsXEUR`$GP#RLG6q z3F((2A@T~hCziT*Fl^;z%aog0&Ea6gqtRwV4Zsrdx1+bU+d#LX*)z3Y&2}r7Z#d|$ zUk4)Ha@qx!(d+AC%<982;p1+b;>FLVyLXk-lnMMU#@>FTHZho*?Q1!MC4?8^cx0LNHqe$=sd6hZ%l@@@)09MV9TO-02v$m7|k3v4ZrtM$naufqcPf@yz(6Y-#Yw{@t89 z-hA+<;!=Tq0`f&i6P;z68JWVGh1Er*c&8es(lLSL-zeRM#d3cn<$i?MTq*4%krO7c zTOCC;_V&-@seBhrF_WU3eiBp9AduL^*xlAEKCcN>iOc+~KaWyE1+#t@K4}j$nOPuq ziiol0VFi^s#oOeuYagAs!~L?XumR%x-?RH!#brA5^rPF6p6pxfikFT{IR z6|Bl2))RQr#3z<*8cYFg53Cuh)wat>_f4KSfj`2hufYcpJQzVWfw5f>IMqKySUG)TJOyaM}k&8@{USW%YILY2wBkKmml*rP44x1Q>w<&VS7g9OG zb%4+I-fvdH@%s08 zhs9Og>5c0enqmq|bEBc@F5l90oxjvGRk$-v zlEz4lk|e=lsl;%&(RpKpLB41t#ek#8fFo7Fp*MmMkDaD}%s|tnp)DbrAQVDLiIG|p zpwith)@^7@ip^5Vn3rP|!wZ^KR;oBX6U~0`%L7*qGDQ?4^Do9#SnDtT=<|pUe8~mI z98$5`o_KbKEOv%?cAE#=G_m!H!f4H>SRFya{W-n&p>xG0QCY9Zw$4D>&1F&)uz^FCb2V6h@on_T!f>h`Wp!{C z92g&(Xn{5}I8vyPr;XeSIX5uIHd)Dvl&*%vQK{*S9tFmf{(09PK?=@LnIz{s!pMXf z0tXO^Id4}QITNalX+=73MQZ}lzHWlK)X+Mt1&~>6gVIxrVRODmM(&$QaJ)Ea8nQ3^ z%g`h>GQ5Z|R|}n|P}hwWtDtZ6#J&@(Ae3CEV8vRipWF(7&_}}op*pgF@&5;20Arfw zxj;YxjxXy0M$SiVa{RF~8?v?t7rg|%am)&DK9IHqC(9GT2xR<|sl?|7pBn+4ijnkG z`~42CeFv<)j~ls&%sTEqqze{Dkyqg@+Af*`TZ~C_66({(613(zh6k5V64CncZXtY9 zg&KSDzg>|v?ov}*w-_}QZ$4upp4q21cN66UsFXqv^^mNbR&&4xzYwF-tzb5YmkN}z zx4VOad9{$3!iVX#Gh{+f-zf!$wBWwe zIa35plzqR*)i^i}ll6OZd+_}gi!DY$YU7pY2+boHs1FJ?1@J~Ekqp@gkxO_y*=$ym zhs7JjC>1N*^rQ=cnQP#tNscs!ZaySSuww`3VJ;9$b7F4g*S;b>a2xt`P_RK?CVwwQ z;|$7Yk%(U1flTX;!#2XhYO$TGuaDSsn4}5+n(i^QN6RPqlELhUQ_j$D>0hm6#t9nl zV@OsbVL;u*su>}R33O-1aNfoJ8o9V`kS1}qr6}G%AnwYoNWu!JnG|DoN`RX`Vv?AZ zz|>$_ii3*_m zySP0H8^5UAtL}}Vnfc#MUMP${qzjFhaw#Uz9z0^_&`5?jzJ-z5Yz(pWUt`%`x|Tyi zK*3)&ZJ+2XsPZ#uUVJMkSxnA1lhLQetiQgf2=@F89iHFEGhvMCUJPdl!qyv?h*oF+ zk7^uOW=CYrTG84nK^)2RMDi<^15JooiAawA3Y=!#u?YN(8i>sEYcVK#SQh@F=_e(!f!Hq|G{xj5H)#m4m7k#~`{RFnS`y8Z~% z`U(ut5*}|heKgmC1~SyGUaGIguy!_Yj@ARv5zm%s1c!Li2~+>6R`2l1!Xtvkh2XhH zj3K<**|bMQWbmDsLLz@6_S$IXc4-dyAK`)!4SFMsALJlC#QlHM6WQPb5NeU3KpQF~ zmp;7=ZUa4fN0T@j|KBD*u|hiS{okX1a(UoUAS@?$M4TsAbVzLV;w;S}E%-4(a@r0+ zV!{`NZ~md70*{C_?AA7M}gND*_ZNzo_S ziJz-BhEV&9F}($vMxU`r8ey^+FS(8v_Xn^t|i>_5TR}11V^BjUov~9Tw|#W)hA%EHh}WE1@Iu zJlSC;=ELW5W9ncu?T-}wqc%`#59dUk58ETtNcf*OCP;*m=kX6eL4BUDfc@+YzWLi2 z19N*FI0I#Oz9Q^!&iBJ-AMP}!$J(v=P_gI zWVA&f1;SA>NGJ+Ac?dn}ZUxp*kS!Uezw=N=pIi9(ZP>%jMcv@N8v^%jq)GvjwkQCp zkjY2qIK*}ZiQ$&lzj!U5O!12pE=|n+1ETI(2>mjW&Mohjd~kqkz^{h`d~5u$fg-FK zI@oP2Y$8W;rI+u;$?!TB~ItBR84OQ528>Vlz7 zQ8%4+uAbUeSX>J@kY~u6Bw%2G|%6aszwSmFqV91w`lW5eo=vjVNu|a!}EZ& z63o$j?D_+@V9V233d3e9Q}j8Qe$#YUs*-lYQ4yKJRaTkyIb?ib?W?auzY0V4H=^_} zFuOptI5eIBUm@+HD%o16eGNKB=|>({CPPL&^Aw*Bc=`65?IFJO@hE>O(d$yQFWa}clFM|3NAw;+GBQ#&~qvg zXGREbh#wGK1Ua2Xw9S!v@_u@p9PUtKn1fR7_WcQSNHai6W6~O7N8hlR{|5MkFzvi) zmEgNFcsHARwp{c;x1C`SShq3*F)!fDgc-%-_o!t*5fdrPXjt6h!*cHyJ;-nP8Slp> z72oQ^akn8%U@Z=FjMtM0yL5BAjD|yI33i|@qk`iWj@0XP;1Ao%608G8tX_3*Nl>nO z1`Hu81=43!ictL_M4cE{U3{A#?pVjlaJ7UM0By1$`aeP+uYo8X*o9o%?*nAt67*=s zlY2mg{yS?tQ>l>JhVo0n?71QCEOVl*ukyjDrTi_3Y*}Cd6jDW!*8xVy)Cw9#j3!@( z_hgeF0ds*QigQ6EibIcYV5Eyd9w?>k5bZRWR19{cmR}0}UQipm$fZmzv_%9ql4CR% zR)I&u_i)jJe2V7fs(Z3-9R|i=u}pO~Ptz4>KJJ~cDFh*wCBQ6Vy;y)4#!iHEQIZjI z$I_#Mb^Q4^^q(4?mz<1Sa{In;)|ykMG3hmyE61q_ z3qe*g>t~F%tSp6H)d1n+bCM*F<>;8UT9`BOXD|s?WgsG$d$z>!9h_=3m9?e-3Qxy_FEq<-Yv2~{P}KtT>0v2Lw*}MP){|IelDI=aV~)r%ATGquUAc|!&doZ&(chq#>~Wgbx19sOAhCor2|4`e7l zq}9CFOMBa}gr%3u7!E?rPi#*^LF$P>;U0NWzVmR|QeB_LtdA1P`d_$$@UZe2eVgzo zLR-Ff75yW$I)r6?3G*ge|3%RqtQt@9gY{s_z>>_uGnCBig}4Musdza3UXQQCv==iKKYKJB@gV8dIo5y1>#-#!592MH z$>6oW(a4Yh@G1bLw!C4IqIF@tgs^lh87gvF?k1AULlKwiDE?z8wfFnQb@xC~Co|QT z)mR`j(wA?72&5UT!ihMjY>Z*986^Q896{>xNpgCy$prS5f9Coae3sry-GsekrIOJl zn%r<9HFQnjNYsbLech3Srw?oYnmQ?1AC?7l3jOz4seL5Z$%<#wZS{RwYFBdK)q_8&O>ukgV$qU(sJJ>+y2Ahm+QUr(YC02d!{~qoHf_; z#iZpnyLWv-TPIarWiF6gE6`H42@N+~Sy+gudIv*Jt&Ey~;@MO6E{2>QTRxCIM&nYi zUI(qFBi|oCzlN3*C}f0^;cB@o}q^LDFUZISb{^*Qr=3;VQ{*ZXR(@2-=U?DM6ZqnmXo#Hpm* z`}g<5x*SC(t#(B_SB#R%d?gEBHBEiPgLaTeIU`D1G|;^z2k+M_ktTbRoF2Jgcj1|LlcaGd#P`eq|f)La^Op9SQ|6-D<7kNPwLtE($BwldpK{7LU(N#~mRxk{wHoCMEATah^f)a7x4W z=$({*LO1?HJqV;rv=Z&GIvaEv7@pc(GO&sCvt(g}A8FRUNOU6g}D24}m|?@yWx(`tjErg7L{caUBMO+eL@)F&cyQ@i7{L;mD0}6`9E# zFxptioG_$2@S?Slf=!(&+oX52x6|ws`Y5P~{w7PJE2Mz*!9yVn&KtjA`ugr@Nc!kFG(+8bvo%B&0PH z%ICT85gV~k+4|`enA@?w^WDBd4q;AHqp>M&YAPOL%UF{79Nu+s zjNC|EyIOsMa!0_Z8y(pvAux+VuzQTbdr0f46i4(QKN01o;S6CRB_D)>bZR!QQr!|a zLK6xN`-ZqVFhWCc@n}9FVuTte;?YdL6CR$r3odM=;7zjv5XpZ~>HCG9VgZ`ppD$+# zo)6xE?WO!q7VztPGi;=mQciPty^Vf7r(r?ttIz&ohGAb6bZwBefi{El<(@-b#JnWs@I_!VON)fPa@ME-Gc zrXGKLsS|xZk%qlfESc0Om5pWbD`$0|5vLhp$qX2Zc#aB9JZ8eN;ghlL4@LfuK;nGG z-S`M*>29dqX`69C60sR9HmJr;jJu?tWDzr7-3ae zn>e@}3Cl*AjEawAG=w;C{k6b={#sVBqQ7Sx*3^9AH&qsi)EZAiBD6mrnrlC>+rAONjw5g!6)IGUEUomDG@klY3a&-=_bkUXbCWee`Q1ax=8Jgp69l5y zK8iXnOuZ$b#h=Q2y!NI)c_=p~XLYg_B;PxFCA@qKo4h41He`WjO4T1o}{K_TNm@&MO@(vH;6~lAz5AnkZv=$n=`hT%Ocyq zd2{RjZ)we>h-N=;ZXV(h=>I6UKGclTdwCuw-tJo(g71~Gzvv?YrkA4}4r;;sn^?s| z>Z8kJE?bZeM6J*cL{RG-Q+?(_DP{4@Jzj;1^-PeaGDM|GPd(}|IZ3Tboq+3Hv301f zN4?&i8k5(AwEiw`YhgcS@ElP_;v-(2RZ${{zc80+3VHQt8`Hl9=v%PAuC=E*RL)NJ|K@Ph(8Vjj-%p}NIl|RYZcSnQb@JN5H6NbyTK7vtfAxx4q~FrrS^#!HPQG;kDBzR{_Uq03^~<;x&Q zdmKKUco=%A*C9$ITU2RA-)3o+ieP%2&~S6xLzM)x04SK05m}9IgOvn&OYS%5Suk@2 z=h=9+=u~)ePdefIq2k5gN`jRDgiI2a1QM-fSQ7{WHCsjlnDJ8~e}I3tijPGm+nXMcitIFHo-cNWAR;1v+X#RzZ9|(Qq7zL9F4VsNiy~49 zO#p>dW;|i^fKK*b?kYjWWe9I}^irfDN(Ec+0>dL5NCJBpP>N{+)Z&FPa}|Q$a1bJP znq>>BTz-*6vb9DNH4fM=C8@TBL#Qk9S*ul5cCuakyFssgnn~}q10ogdUE7Il5F1ab zh5Zf^=xqTkK8RR7k=AW`iFUUEGpCRs1T{Yf%}57aJbVOr2dcNhjPDcwy(oqHc<)8S zL;sQR_4@QEiPj@Z<}_2@zSd)m?FB}iraNK+V)W@Qy?02b+-EGBMq)^?lx$9-3a-UB znCy5D_Z!64c|e#D?5-zK|Kv*%*VyZ?HM76$LBrB~FFq3uG?5@PM7NlgLa*R!kGwEm z`Snxh0e@+5Kl9FOn%Cy1OZKSK;>_Y>IofIKCv6)kbm^xeatvePP&;-=#H zRZ@Ci`r_R-yEEwMX#ZUKvhSCr3$8%a_o!69%gcJ&ncj}M`dN(Y&l^JGyobT!ed^Uo zJ+dR94v%vI=m!)tkYEV`@ztw~&;PFvsHAt+u=oF`Vopj7}5GcDx+ahg^2{q+{=Lo!ZBRd`+jRQ%o#i zb9_uJ(4zUUvpNeZ!)a@NT%5ihzKUAjxpW6Pv+9?59rJtY2`nA!*|wGv zqdlKFfU3Oemx;ZXy&IRjmP_qVBK?S3b?zu=KN8!W5aSB4Hm~$<&3Qh!J{z_ydEQ)= zdoMjpRO*5nmWh8Yd$m3{YB#quHVHf|D&OKRUiNW?=`SCw+`2p5UhTUcKChIuoxls| z^LoW!rw$X#w>i4l;|yS3V9p&F71xVvm~&2Fowr2)fa1o$i8t_Fp_vzkU*{q{C0|2x&e&&?G%P zfD+?y6Lv?c$Ys!o*^YM}zVMqZZAWpt{pc86d^}n#I{I_pb7iSS6wCkk_h9`dh`U)^ z=kVvBr^O@@NKjxg@dh!|?Ibc-G{*c!+(9AJc4Kbz-*%UUK>6KefmfB<}_uz9LLFYb4+>tqpEVXMeIxUr%1vdksi%VaCXDM;1-cB4?ji@8@0_qe3@hd zjoi5Ot(ojRnKNHKC-q*dk0!54PF6<GepITgXwmu7 zFmt92aG(AvoMW z@u<=cY)J*bD(et_l=B#bPi7Gm$fsTMBf8~h`u7H20}BS0hM!@9yW13R$3)(EmRs=g*w0# zhg0?sd<_QYi;GZJWuYKAhu^0DNq9Y242x4hFlyaWE?7^-jDgd{+5&2GgZBn(XSpO02QeupSrWl0d0{=+4x$>-&SNFgiV&#FJfj08S)r! zd)`s&wjFaQvM84Em$~JVUC;z)bkt?{6tBvJXK}Jg$U135j05j5dLc_OHWaCz%Mrb$*Z3Ue{W{Pe?n|x*?$5 zu`JkBBqxr8z=~xbK88Q7(#EpfrjXURLH7m;a138pm}K(}mOv(7*_#p7n^DzlfM;AR z<4a$q?4Ex=!_s#d+Y{c#i#a_Io^ji-=0_xz=GK+5~W3}@e9v17e z`9XjhWKNF*VAA+E$ZNLn%!>O8gd|{Ue_mbqSEzoB6$1z5%wVQD#4pA=nG49H%3dGn zCXyqcKcr1Cr2T71+io~j@YGvQikKpg|`_6J}-G%N!OR;Z>w3;?tj zgbfJ))K_-W;-TketaROeD>W0S&SK2hnAeSmt_VZLD8hrDY z6mqFbD8=A-4=i=#!N#`1Sipi1a2b`?Yr!QN`3$Leg2cDY81odWBd>XC$p^=Qw@XXs zAMuh1;`tiG=C&Q;!s#__T&j)HdTT(y%gYjfgIyK4RIT-^I%Uc1dS$fUlIPZ*ho04S z7)uA|k0|f9X`;Pr1wN?(?{~E>zl|Aq#uX3EwR4rSzKJJSF$WJ(2HwIdLk*1{9i>tf z8W_XKe1z!U$IgyomgkmtnH<2sO;)U~>8+3<8^px~j5)hahVmZGj^e@q(bjs#Xu!}| z&!OB>p(&#oL-~#pM{|+W_LvYs)TFs3zUi$|&Iy%tK>@G%#E%(Y27hNkHfYm^MidXc z4^$<%sQ&aGGbbNzeht;gwBc3t!E+#qq9C@bv-FHzc%*0rTuk6zqGjTO@*=EMHhN5F zjxpGA--b?>wShXMvF@&+F3p`%ps9wgNRQM!!$!ntJj68t4r3Sm!1Bn1r!yxrZ&AE*; zQ2<{u#E^O$))rDcx?KmbDDpbec(NaLSq*ln2Sm$(YNVYESnp;{=g*!v*{@(mdi9Z<+NRRpgNgBn!)4wtC-%eZy$O0yzfBu%g1)uS3s z0B?=w&X(06tjn?@5~BH9LHWu=t!ReS|0WAUtuf_b{13-eCi^7@373f^kjML>t%2_Z zN)eaU1n_8yJr_%e1UT_X>+A_xDm*6lk)BNz>V$^rUc$}>UL4!c0a9j$3*lK3d*<`u{nZFeO9Ct)*|=M3aBH=m{2DMdjrQOn#-+kONf+*5 z4WKK0#9vQ3E?&N#t^_euJfMK_Sqf740z@A%$q3 z!zNIgu@yR0yE%U~D7g`U8w4lufX}95{ggm;XQz-Yd`2^8bmrdy3Y81A|0QZrbtaJQ zwnWx%!>wEQcWEfN1(EE<`aLSuIm)!_54PwBcKu6yBxsCfk>FBZ9Kf&w!79P)xe;;n zibw3xE^mT97k{e0b&oFg$uclIUg88z#VMsvp$4*OWUJl5DOpW|&lDrZyO2=BPr&+a zefflp2>nGE-}+Y>_C>l=&JL+=mlc^*86zva0NEnb=GYOi0XgNVmhecRJsNC%y`)s~MSruqOgT zJVPcvNnL_f3w>zq4`uKQ#*WwMA)0$bQ4-ae@&nTP5?`aAO@_6FCtamXr-{e&+NM}8 z=LVX-75_eBsj~6Q{8JmS0|u>Xw{09=rv>*^smglRzqet(yS&`4fW z%7=M7F1oE>_pVhNk8ht33HF8-PjOLRz2f%#pN9l#-v4&fQ&O`J7#tJ&0Ps0CtGDim z$Qi00^8t4Y_mEL-(jKhH;45-#g1zsy&4c`sIUQ!2kDW6!Ph8neNf$m~6rkC?RsU+_ zzBj~#y<|OJ!f>%8lqkkHm=41-Az0zxs{Cru)q^&(;3>JvNa+^&fcK5$uhnP1rN?N^ z3Sf&@M=$;2q~^R>V~m*?zIaU<1NCLBuPbQKwKU_2V!NBiP>yh0Y~Pb>DUgs=f_l0x zjV6=>QV@01k;Z3gB$2F8O$-!8kqZlJHe9M3O`h+JY;;q5+ewxk!e@q;pVpNEm-yW?QnrXRV&czp`0$=-bus%qYS8mf!leMs6&$F%G%2Ggo-KY&Y`77xPAb*pDE zYCEU%hgTQsVp&FO^c;j&zwaW&~1ufX6O!=*~6yVST=r_2$& zMI&Q<(Uh8Ev0C0zg(oJ%rf7V1(A}jnCY+%v;VZk1QL7m1XqPA05t!%1ns6;7TufA! zKJ==(?S4gEf<(TUNbizfBLadRSLK-Ol!@Fn8D<>^tU+v>e$0g`TitjDBl{}1_YYWD zMK0Fg=*_EF1JM6--pP^!hyo{Hu#tbAP=UB!t{F>QvDsoo4m!D}rrUToj`9Y!SVIjK zj#jypPph?;SUwJWso>&lfs2*=dl@VTGSU-A<~<8D;>mg#emgTUi_Um8Uk#(dPUe8R zd-C^OR*=i5VXp1!d2-s+T~KUxxMn(rnikHUSw*_1J_qp zd-|w>m*XI2mqe_IB99o;aov(WicG`OSX80blFx3aR3D%D-Y60Qc{&P`_S z)jSG|sHg|a3v3*mIAWGMMQWEifE+=wVOXHFXjIDi8ibv?ct^CIhImi3o%(oJw4KIy z5E`3JvHi!0$}9?cwtcEQSQ@k9tX#i|Y;!nip271Eg;qb?N9Lu;m)D%U!h;Co0G^CrW#f-2RLff=cm z3S1j@V?xu`VPH&i-?25N6n+<0Uz~h_fv1Q9utG@p)m1JcazaY2A&9-#B5#q@E={jc zjx^tLdeh2AhU=fCr4@E);`;4s+MFdCxZs!qa=mP{7jf|pg+iz2t4S93BG{mnzMd<} zkEMMVmlh!xzbPL^kt=j~&|LS!sx(#$S3DMHJ@YxPNq3ti_98qw)L6hMCZx+TX!L@c zrJb0ii~3YA?EY0c7~DkB0#a5Qp_8MXYqYzu3HxC{=mKLEQyjL7pa~op57M$YgUk<7 zzN)uM_%#YSrWF_275TZLkFC<2s!~d{Yf(xY`7I*jsLG{`sAKtgAAD5q7i&ByMZP#* z2?xevO^A&$d+(#9Emo8^qsJUaVm*L8|DM8NMY!SzBN`+2AQAL}b+sU)k-y63l{yE zp2)IUsJ#`GOJH87rynL&2Kzw!+t&IHR^YdUH)~>OsfF)G`F)|VsfT@e9nvqqGfPi2 zQ(9%){M0OjR*KBf*lb=t5 z!vT@0B_ho79i+Jb>ohrd_O4}FMozy#wP}J?updiZf)4V@-|9ru6X7Ybi$V2N%$Ryb z?DNj4n0eGA5P5=3s-IvSN!3Eg#{`lmYyAUzZ@~-ry6cP?Ul-LYft${B$jk(>=6Bh# z_vyW+gpbrCPIQ8@7o0%EM7={x9}k&{;X`&CD>EiRYBOUWcTPv_rAB~!_aFz4Y1jP? z8q+}B6`AtlP>wfMJ=XLrLnP9`#V4P%&_pb0SoJ~&bdpyyGqsZnbHzPUUpdQW&1i5}Hl?dLV zIl7LW+MoVPP`g#g-iv1h=18>hknA?ucz8vcWDNTw80tN6g908DboX6V@GqcTYT^I8 zTu@?xTfIU;|D#-(UY39)ZQC4vbYKZkMLt&T5Qtb-(uSp#P95{nQpAZ@!e(Kaf4nD% zR^T!X_n7HE^VS{bbxa@J-ppM!KM6SVQ&C*QO>Pk_VH*pxV3~WmN9;tp3|?v+imBn~ zAQv`M&^;^ez%cm04&SjJ%e({DLYZ(+R#+w#*k%mE^FP56ukBYlhF@Xz&XxKs@qs*i zi5`b_;xn82^kp_#0%ss&jbz|qqU~qC1=F~)=r40emf_oq4^z05zBZ#2V{uQI+k+Do z^&Z5P@f~v<_Uvi>zneb>Z9l`jkFXhQeWEDq^DRSxn{oksP4qVntQ8qFl{q!DxNaczc1=VsUDw)vg4onM+s8_oB4 zS^_^|xs#mzEf-sYGA!NJSS_S;$G1Hev=e_fkL+sGYXD0@M6mbg6UX;-cbH%7Q-@6a zl8VJl(L|$gOM?}H=CPuF{dNdyt~m3!GL5?irEoE=TUwST8wSp)(p7aI(OP_sEIYjoqbxhU3xlTh>mcb5)7L#iqZI`nZ3N)?rO{*Gl?1Kk+ms&Klv=^tvx4LA zNucmIb7H9%7J>~;+n|L{ASgik6F}QnA-wv~^*mKYTT0-| z6U0|_kPl~1S3vW#@?9dS7v&)BPy4Qn-WXDD4m2XC+ZXaZ3g9wb`AF_Gxn1&TTV~+s ze{_SRKkL51`UFWZ$zM-2d4&I&mo?+HP94lwI2}+c2GZ3IGMR+iNx5fvubH-g#ql+Zu zSdGEQc_-I0G5T@h@c7W^wO?(Vc5J6Jf{*icm5j0UvmXsRoR#TMS7@K82Sau7X~!bk zgrN6v&^JPZVRq zyg=C+9zu?;+kPsb3G%MUyz@+LlRf4W2lb4RmJwrDhC7C&ndbCXEt@?D&m>QO%jM>R z_K~Kp9cPA0SN8?!+HuyO(hZJl#y?I<%Qoh6rep^O+>#q_*7tgV^~roM#fs7`BZTY} zhmX1pM*?RVpLh7@2+nRvciIxteIx&MJ*csNnL1HTA0C6Yj4?QjO+`(pkE5(AI1HIK zJ$nm=b~T%%J8WML#W0XV$!j2NNv;})7&6P|BiUOewq}V3g%sc)_Ldc7i)Lgf?k_v{dpa8%i{?_^I)&4s(;^Qe$8op|LP~VSCU?g5uz|H9^2uk zR-KjS4sNo6f7d1__+~&R0-e>7tQ|L>j43>2Q#Ls!7t2in32@Q!G|-mg+i4_8clVEZWGQCKCEeqA zyH{$HLVF3Ss6&$CnP?O@ebwE&fveHAoNUWB3?dp&z&AXnFWY1I2FbY_V126j@Aat= zSfBoUe)#+(m-I*p4w>{m4h#iE{#+sjH1+jKrX>CfulrMR41FFElaTi*FucXH`1U5f z)=-%{J!#=~5*RaQEdG>8eXhCA5!S(%jZIhCcDRnQiTL(YFk-=&+pu@D{>TF<1!rr% z@i1Q|NsG5Bag2>gwy9Sv?+3+V*$ZkWrL7%vcVYz&LJ6pzN~ZlS_18@DobT;uLFmu#OtP$JTfu3LVIPs_1- zl+*5-NlVS6X&^0?y&4;brHqk|p&ciNJ&L52=GFBboy}C23iA`@3Oo0Vk)PV@3lyC! zzuSjgI$UsW@8U1hG+1wsZq$&@aX0RKuy@(sm#+<(_%DQt`Eli%2F^)R3;p!>boXxV z(NcD6zw5eZo7`Krv_3+YEMp7`!%#^U>cgci%ie-gSp*4*gkX%zoqfVMmP66+b1Dj{ z?#83>F$nyiWF;E%x@ZMu2ufL6ruc2bQq*v7h!cUGmO;#p=c}Cq1*5vZYXl4z0TK;Z zj9^}U_zEmWTQSGq;In{fw(`0ARpH$Cx_-Mi@RD>jUT@(YjkALY>=rEHwtBmwl|l?r zKvLLvU4r34$WlL+zIM+8&u?ozbpv{SM`{K!-+SijGfvjNWaC9QJ_(h?w8k%>iEMgD0^QpnRDTj(EqNHb^OSoOkN7BFREJZ1%e$` zV*5rkP|r0|ICxFSa0=ce^uH8)==Z<;Pg>q81)L zJT*O-E)K=!ZNWc~_20 z)_Cc4I3ChU@A{56u6C~H&x3zH0#~qVVm@?@&28pCwI)9;ra!E%bjDSd>Iirr!O0 zw0lPoeRU<*ck*-n;a>mh$o=liT-1=)*-hPA%JzE#%(e1Nj^L-O#Lw-n59TOGFzLy*dl^)tBJWQ6{H_<#z(zt5vyssO6 ztNMF}=1WxxX9bN+sZ@8#uci{-a+(cYR&EB|49uP52W69+b1Ed@3RbQRg3XITh4}~G z4^oLWHm5E!gyY}Ntaw_RH7b2B=I`PhlANA;Dq9yeGJ4W{Y->Ruu5BwiHsC8EH?Ae4 z!on~pRA$Qt4f>KX*j2prMF?qa)He|g%UClmHROfg5|XPNO)+vhHtfu)^!NTz8@y*pPs)O>a_#6;j)K>dWFFQH%W%eHd|riKt5dRlZQhT$rsO^)H7;plunq%>Dx5^7n1ZFUZ4(h`>< zlLCXa7AE2Y9kdWR7T_^}IJVt}_>Q?TJ!!PJ4Go?(JpeS?%ccllckGw)XjGtT^5zQ- z=5OMLX3$g4{*+V#)=K($Y)Z1LpRXu-@E~ z$XS?9z`-J@5XW9r_Cc_W#HHjjqiGeXZJ!a$?cA9pniULxwjOsMk{add;wKFgVzCDS zajx8-(qvT=tv=DRon^uc}f4@YIEUCQuUKzgN9|A(kcRm-7i>B zwHci%LkSX!rxapRdGlw{!dOd$TYe5GD~8qW#Vjt>x=X@y3n^yR8pPumtb8PKL?_<3 zCaF@{A5n0#P*zJNqQzb0KwYDT_#*dNXIVI<|vta2%g@;Gb?#+(W;2?Ncg z?7WRxcZNcW2@GFz>S6pbb~5GiP}~$QzgGAz?>(@gJB}dCdj$Bag`!~WSOk! z$JAP0wGfhptH*l^#)xj~Tbj@2h*>fqXi`XNibiPStW8T`Xd}B7;iz9EiZaCDeIZ{D z8$F~$&_*{GCUi;MWq6LpwsH3lz>w18*)5sw9FQ;8Nm@mJ#OkQt*Oa2(edgpvLio`nsE`26mH)+Hfy&$puqZf;W z8#^QQ#v9zjBqWf=Fxi;(qa;d(prEj_tHsuY3|JzajsxvT`XD}jv_{xzx;#l)izb>X z0bz%_SA~*#wd?DF4UI4muL`}el5-(N1^1`nEta%lShdMn8j%|}xzHDLE|&&=-tgwt zynzoOCMSWXMp4d)B*tSjf)P^rYG&G_)2g4;7eQG@koZZE8s{{s< zPs70H#bh{*gy)`XML;mP@y@^Yr@yrQap!CQvpaf*GFGDy<#tcT^dhqnFjj~2y~=+y zPL||7JJ|nk#xR&ED{#P0g|smFMy#ba9sH$mN{F92=Z|yiOW2D)LIAGTNm!`g8evs< z3DBj-FDkhWa?$F#5!&j}^*LyOfRBq}0g`}Vn9DZ_6l*-`zhi@fmytCG-6|hKcN|Pm zD)nr+wq7nNJ9j|>fdPjEic2oC{oKBllPO+AXhfvBaqxe*^CAdJ=<{x|$1PS&637Udp_b|xC0_oayd#5~m3X7r&c=~qnM`(nO z9umjyoJ4@+aM zwx_qqhZfa<=+$Ti}z0Kq8jw!&VQuRP{4`~{L1WIBeX zIbhrWI+saeqy~osB_yxKrb?g(o}8njUz=wAHkFWuAOQ1K%2ycTS_rR`5b5>HWQqd4 z!ile6!D&yKI@0*OrpqxqKeX4`C*!`OoRM@_JWS}Mym_abvU4}4^zdN$JF3tp(>oP^ zP969)-bg8PQPTr-E`?tH@IA?W?VzYG>5MKFvCEhV^#p)S&ZPz-I zvFiis&FU8NT&>D;4BhzBB)^kB>b$L1CDyh1m3z6;TJc1VFZD;X7=X@qhfMknC1Vt8 z`A=iNt2^Av>uB8>Mm`*+QKgl5(9VUpEIFU$Dlm7*=(=o~y2HD7EQLYFK1`;l>{J{- z(ul0rC?=4A9#$Sc?4~TrC@b39SLj&CV?Jd_%f+A{sG|fdNl{isSdVx&{c!TwArFRc?A2bGgWxRYUC;8pw>^B*l

C<|>;{Gr)&(h*8Lg_z3tD}=u?KHq-B!kde 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 UW4L>S>0;m3Qz%3AFp??%1MN~R*Z=?k diff --git a/sormas-api/src/main/resources/doc/SORMAS_User_Roles.xlsx b/sormas-api/src/main/resources/doc/SORMAS_User_Roles.xlsx index e36a507175e66706d039a233301ab8da5b3d55d3..e0aa6bdabe61b880a404887375c68bbccb0ac584 100644 GIT binary patch delta 6145 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 NERF_0E#^Oq{|lXOo=^Y) delta 6061 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 BdISIf From 22a676c7dbb2aebfccecea8c9e8036f2b98873a4 Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 28 Sep 2023 13:54:10 +0200 Subject: [PATCH 144/144] [GITFLOW]updating poms for branch'release-1.89.0' with non-snapshot versions --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-serverlibs/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index d8c6a1cf9e4..a9d2523fb7e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 24ee76cc1e0..e7f1aa46387 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 176828ed37f..b7ad37b6ed9 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8cda7a43557..e1abc19c8ee 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.89.0-SNAPSHOT + 1.89.0 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 1c7c5505f5a..79e53441536 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 1472d34945e..f03555dd5d8 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 85d50aff6b2..f708abfed4d 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index a9bffb43a74..e965f8f35b6 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index ef2c2dc06c3..fbf8f036a43 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index d5033a43e5e..7dfa27fa6f7 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 88bc5a439c9..b311823baa1 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.89.0-SNAPSHOT + 1.89.0 ../sormas-base 4.0.0