From 9303b0f41e64bdc8e69514416cceee0713cc846b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 24 Jan 2024 15:06:06 +0100 Subject: [PATCH 01/65] 12900 - Hide jurisdiction fields in selection windows --- .../CampaignFormDataSelectionField.java | 32 ++++++++------- .../sormas/ui/caze/CasePickOrCreateField.java | 28 +++++++------ .../ui/caze/ConvertToCaseSelectionField.java | 20 ++++++---- .../caseselection/CaseSelectionGrid.java | 6 +++ .../ui/events/EventIndexLocationRenderer.java | 40 +++++++++++++++++++ .../events/eventLink/EventSelectionGrid.java | 3 ++ .../EventParticipantMergeSelectionGrid.java | 6 +++ .../ui/person/PersonSelectionField.java | 28 +++++++------ .../sormas/ui/person/PersonSelectionGrid.java | 7 ++++ 9 files changed, 123 insertions(+), 47 deletions(-) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventIndexLocationRenderer.java diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignFormDataSelectionField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignFormDataSelectionField.java index 30b8e3f9f17..1e6ecab5d0a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignFormDataSelectionField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignFormDataSelectionField.java @@ -23,9 +23,11 @@ import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.campaign.data.CampaignFormDataDto; +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; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.DateFormatHelper; @@ -119,20 +121,22 @@ private HorizontalLayout buildFormDataDetailsComponent(CampaignFormDataDto formD HorizontalLayout formDataLayout = new HorizontalLayout(); formDataLayout.setSpacing(true); { - Label fdRegion = new Label(formData.getRegion() != null ? formData.getRegion().buildCaption() : ""); - fdRegion.setCaption(I18nProperties.getPrefixCaption(CampaignFormDataDto.I18N_PREFIX, CampaignFormDataDto.REGION)); - fdRegion.setWidthUndefined(); - formDataLayout.addComponent(fdRegion); - - Label fdDistrict = new Label(formData.getDistrict() != null ? formData.getDistrict().buildCaption() : ""); - fdDistrict.setCaption(I18nProperties.getPrefixCaption(CampaignFormDataDto.I18N_PREFIX, CampaignFormDataDto.DISTRICT)); - fdDistrict.setWidthUndefined(); - formDataLayout.addComponent(fdDistrict); - - Label fdCommunity = new Label(formData.getCommunity() != null ? formData.getCommunity().buildCaption() : ""); - fdCommunity.setCaption(I18nProperties.getPrefixCaption(CampaignFormDataDto.I18N_PREFIX, CampaignFormDataDto.COMMUNITY)); - fdCommunity.setWidthUndefined(); - formDataLayout.addComponent(fdCommunity); + if (UiUtil.disabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + Label fdRegion = new Label(formData.getRegion() != null ? formData.getRegion().buildCaption() : ""); + fdRegion.setCaption(I18nProperties.getPrefixCaption(CampaignFormDataDto.I18N_PREFIX, CampaignFormDataDto.REGION)); + fdRegion.setWidthUndefined(); + formDataLayout.addComponent(fdRegion); + + Label fdDistrict = new Label(formData.getDistrict() != null ? formData.getDistrict().buildCaption() : ""); + fdDistrict.setCaption(I18nProperties.getPrefixCaption(CampaignFormDataDto.I18N_PREFIX, CampaignFormDataDto.DISTRICT)); + fdDistrict.setWidthUndefined(); + formDataLayout.addComponent(fdDistrict); + + Label fdCommunity = new Label(formData.getCommunity() != null ? formData.getCommunity().buildCaption() : ""); + fdCommunity.setCaption(I18nProperties.getPrefixCaption(CampaignFormDataDto.I18N_PREFIX, CampaignFormDataDto.COMMUNITY)); + fdCommunity.setWidthUndefined(); + formDataLayout.addComponent(fdCommunity); + } Label fdFormDate = new Label(DateFormatHelper.formatDate(formData.getFormDate())); fdFormDate.setCaption(I18nProperties.getPrefixCaption(CampaignFormDataDto.I18N_PREFIX, CampaignFormDataDto.FORM_DATE)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePickOrCreateField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePickOrCreateField.java index 325ca687485..dea5c717376 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePickOrCreateField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePickOrCreateField.java @@ -15,12 +15,14 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseSelectionDto; +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; import de.symeda.sormas.api.infrastructure.facility.FacilityHelper; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.PersonHelper; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.caze.components.caseselection.CaseSelectionGrid; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.DateFormatHelper; @@ -106,18 +108,20 @@ protected void addInfoComponent() { ageAndBirthDateField.setWidthUndefined(); caseInfoLayout.addComponent(ageAndBirthDateField); - Label responsibleDistrictField = new Label(); - responsibleDistrictField.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.RESPONSIBLE_DISTRICT)); - responsibleDistrictField.setValue(newCase.getResponsibleDistrict() != null ? newCase.getResponsibleDistrict().buildCaption() : ""); - responsibleDistrictField.setWidthUndefined(); - caseInfoLayout.addComponent(responsibleDistrictField); - - if (newCase.getDistrict() != null) { - Label districtField = new Label(); - districtField.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.DISTRICT)); - districtField.setValue(newCase.getDistrict().buildCaption()); - districtField.setWidthUndefined(); - caseInfoLayout.addComponent(districtField); + if (UiUtil.disabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + Label responsibleDistrictField = new Label(); + responsibleDistrictField.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.RESPONSIBLE_DISTRICT)); + responsibleDistrictField.setValue(newCase.getResponsibleDistrict() != null ? newCase.getResponsibleDistrict().buildCaption() : ""); + responsibleDistrictField.setWidthUndefined(); + caseInfoLayout.addComponent(responsibleDistrictField); + + if (newCase.getDistrict() != null) { + Label districtField = new Label(); + districtField.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.DISTRICT)); + districtField.setValue(newCase.getDistrict().buildCaption()); + districtField.setWidthUndefined(); + caseInfoLayout.addComponent(districtField); + } } Label facilityField = new Label(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/ConvertToCaseSelectionField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/ConvertToCaseSelectionField.java index d1395172d72..dbef692be00 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/ConvertToCaseSelectionField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/ConvertToCaseSelectionField.java @@ -27,10 +27,12 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.contact.SimilarContactDto; import de.symeda.sormas.api.event.SimilarEventParticipantDto; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.contact.ContactCaseConversionSelectionGrid; import de.symeda.sormas.ui.events.EventParticipantCaseConversionSelectionGrid; import de.symeda.sormas.ui.utils.VaadinUiUtil; @@ -94,15 +96,17 @@ private void addContactDetailsComponent() { lblLastName.setCaption(I18nProperties.getPrefixCaption(PersonDto.I18N_PREFIX, PersonDto.LAST_NAME)); contactDetailsLayout.addComponent(lblLastName); - final Label lblRegion = new Label(caseDataDto.getResponsibleRegion().buildCaption()); - lblRegion.setWidthUndefined(); - lblRegion.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.RESPONSIBLE_REGION)); - contactDetailsLayout.addComponent(lblRegion); + if (UiUtil.disabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + final Label lblRegion = new Label(caseDataDto.getResponsibleRegion().buildCaption()); + lblRegion.setWidthUndefined(); + lblRegion.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.RESPONSIBLE_REGION)); + contactDetailsLayout.addComponent(lblRegion); - final Label lblDistrict = new Label(caseDataDto.getResponsibleDistrict().buildCaption()); - lblDistrict.setWidthUndefined(); - lblDistrict.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.RESPONSIBLE_DISTRICT)); - contactDetailsLayout.addComponent(lblDistrict); + final Label lblDistrict = new Label(caseDataDto.getResponsibleDistrict().buildCaption()); + lblDistrict.setWidthUndefined(); + lblDistrict.setCaption(I18nProperties.getPrefixCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.RESPONSIBLE_DISTRICT)); + contactDetailsLayout.addComponent(lblDistrict); + } addComponent(new Panel(contactDetailsLayout)); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java index a79fe53efbc..ec13552cc48 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java @@ -12,8 +12,10 @@ import de.symeda.sormas.api.CountryHelper; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseSelectionDto; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.utils.AgeAndBirthDateDtoConverterV7; import de.symeda.sormas.ui.utils.V7UuidRenderer; @@ -67,6 +69,10 @@ private void buildGrid() { getColumn(CaseSelectionDto.AGE_AND_BIRTH_DATE).setConverter(new AgeAndBirthDateDtoConverterV7()); getColumn(CaseSelectionDto.REPORT_DATE).setRenderer(new DateRenderer(DateHelper.getLocalDateTimeFormat(I18nProperties.getUserLanguage()))); + if (UiUtil.enabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + getColumn(CaseSelectionDto.RESPONSIBLE_DISTRICT_NAME).setHidden(true); + } + for (Column column : getColumns()) { column.setHeaderCaption( I18nProperties.getPrefixCaption(CaseSelectionDto.I18N_PREFIX, column.getPropertyId().toString(), column.getHeaderCaption())); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventIndexLocationRenderer.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventIndexLocationRenderer.java new file mode 100644 index 00000000000..9078fc22f45 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventIndexLocationRenderer.java @@ -0,0 +1,40 @@ +/* + * 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.events; + +import com.vaadin.ui.renderers.TextRenderer; + +import de.symeda.sormas.api.event.EventIndexDto.EventIndexLocation; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.ui.UiUtil; +import elemental.json.JsonValue; + +public class EventIndexLocationRenderer extends TextRenderer { + + @Override + public JsonValue encode(Object value) { + + if (value != null && (value.getClass().equals(EventIndexLocation.class))) { + if (UiUtil.enabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + return super.encode(((EventIndexLocation) value).getAddress()); + } else { + return super.encode(((EventIndexLocation) value).buildCaption()); + } + } else { + return null; + } + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java index 49521dd7f58..f560a0cefb8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java @@ -33,6 +33,7 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.events.EventGrid; +import de.symeda.sormas.ui.events.EventIndexLocationRenderer; import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; import de.symeda.sormas.ui.utils.FilteredGrid; import de.symeda.sormas.ui.utils.GridHeightResizer; @@ -74,6 +75,8 @@ private void buildGrid() { ((Column) getColumn(EventIndexDto.REPORT_DATE_TIME)) .setRenderer(new DateRenderer(DateHelper.getLocalDateTimeFormat(userLanguage))); + ((Column) getColumn(EventIndexDto.EVENT_LOCATION)) + .setRenderer(new EventIndexLocationRenderer()); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantMerge/EventParticipantMergeSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantMerge/EventParticipantMergeSelectionGrid.java index eb1caf69a07..391b51c80fb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantMerge/EventParticipantMergeSelectionGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantMerge/EventParticipantMergeSelectionGrid.java @@ -11,11 +11,13 @@ import de.symeda.sormas.api.event.EventParticipantDto; import de.symeda.sormas.api.event.EventParticipantSelectionDto; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.ui.SormasUI; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.caze.CaseDataView; import de.symeda.sormas.ui.events.EventParticipantDataView; import de.symeda.sormas.ui.utils.UuidRenderer; @@ -83,6 +85,10 @@ private void buildGrid() { getColumn(EventParticipantSelectionDto.LAST_NAME).setMinimumWidth(150); ((Column) getColumn(EventParticipantSelectionDto.PERSON_UUID)).setRenderer(new UuidRenderer()); getColumn(EventParticipantSelectionDto.CONTACT_COUNT).setSortable(false); + + if (UiUtil.enabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + getColumn(EventParticipantSelectionDto.DISTRICT_NAME).setHidden(true); + } } /** diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionField.java index 7407cd39781..96cf9ed04af 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionField.java @@ -36,6 +36,7 @@ import de.symeda.sormas.api.person.PersonSimilarityCriteria; import de.symeda.sormas.api.person.SimilarPersonDto; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; @@ -135,19 +136,20 @@ private void addPersonDetailsComponent() { HorizontalLayout personDetailsLayout2 = new HorizontalLayout(); personDetailsLayout2.setSpacing(true); - addLabelIfVisible( - personDetailsLayout2, - referencePerson.getAddress().getDistrict() != null ? referencePerson.getAddress().getDistrict().buildCaption() : "", - LocationDto.I18N_PREFIX, - LocationDto.DISTRICT, - LocationDto.class); - - addLabelIfVisible( - personDetailsLayout2, - referencePerson.getAddress().getCommunity() != null ? referencePerson.getAddress().getCommunity().buildCaption() : "", - LocationDto.I18N_PREFIX, - LocationDto.COMMUNITY, - LocationDto.class); + if (UiUtil.disabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + addLabelIfVisible( + personDetailsLayout2, + referencePerson.getAddress().getDistrict() != null ? referencePerson.getAddress().getDistrict().buildCaption() : "", + LocationDto.I18N_PREFIX, + LocationDto.DISTRICT, + LocationDto.class); + addLabelIfVisible( + personDetailsLayout2, + referencePerson.getAddress().getCommunity() != null ? referencePerson.getAddress().getCommunity().buildCaption() : "", + LocationDto.I18N_PREFIX, + LocationDto.COMMUNITY, + LocationDto.class); + } addLabelIfVisible( personDetailsLayout2, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionGrid.java index a8a85fccf6a..0762c264e40 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionGrid.java @@ -25,9 +25,11 @@ import com.vaadin.v7.shared.ui.grid.HeightMode; import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.person.PersonSimilarityCriteria; import de.symeda.sormas.api.person.SimilarPersonDto; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.utils.CustomizableGrid; @SuppressWarnings("serial") @@ -76,6 +78,11 @@ private void buildGrid() { getColumn(SimilarPersonDto.FIRST_NAME).setMinimumWidth(150); getColumn(SimilarPersonDto.LAST_NAME).setMinimumWidth(150); + + if (UiUtil.enabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + getColumn(SimilarPersonDto.DISTRICT_NAME).setHidden(true); + getColumn(SimilarPersonDto.COMMUNITY_NAME).setHidden(true); + } } @SuppressWarnings("unchecked") From 7023b6c6115109d81bab142e33aa54db340e68dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Mon, 29 Jan 2024 11:36:06 +0100 Subject: [PATCH 02/65] #12869 - Force automatic lab message processing --- .../de/symeda/sormas/api/feature/FeatureType.java | 2 +- .../sormas/api/feature/FeatureTypeProperty.java | 3 ++- .../externalmessage/ExternalMessageFacadeEjb.java | 12 +++++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) 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 177ed3dd2b1..27288358f37 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 @@ -125,7 +125,7 @@ public enum FeatureType { new FeatureType[] { SAMPLES_LAB }, null, - ImmutableMap.of(FeatureTypeProperty.FETCH_MODE, Boolean.FALSE)), + ImmutableMap.of(FeatureTypeProperty.FETCH_MODE, Boolean.FALSE, FeatureTypeProperty.FORCE_AUTOMATIC_PROCESSING, false)), MANUAL_EXTERNAL_MESSAGES(true, true, new FeatureType[] { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureTypeProperty.java b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureTypeProperty.java index 6f4ec901d7f..f4c0878e202 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureTypeProperty.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureTypeProperty.java @@ -29,7 +29,8 @@ public enum FeatureTypeProperty { SHARE_SAMPLES(Boolean.class), SHARE_IMMUNIZATIONS(Boolean.class), SHARE_REPORTS(Boolean.class), - FETCH_MODE(Boolean.class); + FETCH_MODE(Boolean.class), + FORCE_AUTOMATIC_PROCESSING(Boolean.class); private final Class returnType; 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 fe1f05f479e..0037dbf2b48 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 @@ -63,6 +63,8 @@ import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto; import de.symeda.sormas.api.externalmessage.processing.ExternalMessageProcessingResult; import de.symeda.sormas.api.externalmessage.processing.flow.ProcessingResult; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -86,6 +88,7 @@ import de.symeda.sormas.backend.externalmessage.labmessage.SampleReport; import de.symeda.sormas.backend.externalmessage.labmessage.SampleReportFacadeEjb; import de.symeda.sormas.backend.externalmessage.labmessage.TestReport; +import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.infrastructure.country.CountryFacadeEjb; import de.symeda.sormas.backend.infrastructure.country.CountryService; import de.symeda.sormas.backend.infrastructure.facility.FacilityFacadeEjb; @@ -134,6 +137,8 @@ public class ExternalMessageFacadeEjb implements ExternalMessageFacade { private CustomizableEnumFacadeEjb.CustomizableEnumFacadeEjbLocal customizableEnumFacade; @EJB private AutomaticLabMessageProcessor automaticLabMessageProcessor; + @EJB + private FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; ExternalMessage fillOrBuildEntity(@NotNull ExternalMessageDto source, ExternalMessage target, boolean checkChangeDate) { @@ -216,7 +221,7 @@ public ExternalMessageDto save(@Valid ExternalMessageDto dto) { @Override public ExternalMessageDto saveAndProcessLabmessage(@Valid ExternalMessageDto labMessage) { - if (!labMessage.isAutomaticProcessingPossible()) { + if (!labMessage.isAutomaticProcessingPossible() || !checkAutomaticProcessingAllowed()) { return save(labMessage); } @@ -238,6 +243,11 @@ public ExternalMessageDto saveAndProcessLabmessage(@Valid ExternalMessageDto lab return getByUuid(labMessage.getUuid()); } + private boolean checkAutomaticProcessingAllowed() { + return featureConfigurationFacade.isPropertyValueTrue(FeatureType.EXTERNAL_MESSAGES, FeatureTypeProperty.FORCE_AUTOMATIC_PROCESSING) + || !featureConfigurationFacade.isAnyFeatureEnabled(FeatureType.CONTACT_TRACING, FeatureType.EVENT_SURVEILLANCE); + } + public ExternalMessageDto save(@Valid ExternalMessageDto dto, boolean checkChangeDate, boolean newTransaction) { ExternalMessage externalMessage = externalMessageService.getByUuid(dto.getUuid()); From bd99787585a2302dca8fb80959725e527cabe42f Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:47:27 +0200 Subject: [PATCH 03/65] #7350 - Remove wrong info "creating a new sample will discard all unsaved changes made to this case" --- .../src/main/java/de/symeda/sormas/api/i18n/Strings.java | 1 - sormas-api/src/main/resources/strings.properties | 1 - .../main/java/de/symeda/sormas/ui/caze/CaseDataView.java | 7 ++----- .../java/de/symeda/sormas/ui/contact/ContactDataView.java | 5 ++--- .../symeda/sormas/ui/events/EventParticipantDataView.java | 7 ++----- 5 files changed, 6 insertions(+), 15 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 fadd698da1f..d6e89b7375f 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 @@ -902,7 +902,6 @@ public interface Strings { String infoCountryNotEditableEventParticipantsWithoutJurisdiction = "infoCountryNotEditableEventParticipantsWithoutJurisdiction"; String infoCreateEntry = "infoCreateEntry"; String infoCreateNewContactDiscardsChanges = "infoCreateNewContactDiscardsChanges"; - String infoCreateNewSampleDiscardsChangesCase = "infoCreateNewSampleDiscardsChangesCase"; String infoCreateNewSampleDiscardsChangesContact = "infoCreateNewSampleDiscardsChangesContact"; String infoCreateNewSampleDiscardsChangesEventParticipant = "infoCreateNewSampleDiscardsChangesEventParticipant"; String infoCustomExport = "infoCustomExport"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 4c5d537912f..e8c26a6147b 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java index 46bc6bb7ff2..ea8a80b3bce 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java @@ -22,8 +22,6 @@ import de.symeda.sormas.api.document.DocumentRelatedEntityType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; -import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.immunization.ImmunizationListCriteria; import de.symeda.sormas.api.sample.SampleAssociationType; import de.symeda.sormas.api.sample.SampleCriteria; @@ -141,8 +139,7 @@ protected void initView(String params) { new SampleCriteria().caze(getCaseRef()).sampleAssociationType(SampleAssociationType.CASE).disease(caze.getDisease()), this::showUnsavedChangesPopup, isEditAllowed); - SampleListComponentLayout sampleListComponentLayout = - new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesCase), isEditAllowed); + SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, null, isEditAllowed); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); } @@ -225,7 +222,7 @@ protected void initView(String params) { if (UiUtil.permitted(FeatureType.EXTERNAL_EMAILS, UserRight.EXTERNAL_EMAIL_SEND)) { ExternalEmailSideComponent externalEmailSideComponent = - ExternalEmailSideComponent.forCase(caze, isEditAllowed, SormasUI::refreshView, this::showUnsavedChangesPopup); + ExternalEmailSideComponent.forCase(caze, isEditAllowed, SormasUI::refreshView, this::showUnsavedChangesPopup); layout.addSidePanelComponent(new SideComponentLayout(externalEmailSideComponent), EXTERNAL_EMAILS_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java index 4048532ff47..bd5ef59158b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java @@ -217,8 +217,7 @@ protected void initView(String params) { new SampleCriteria().contact(getContactRef()).disease(contactDto.getDisease()).sampleAssociationType(SampleAssociationType.CONTACT), this::showUnsavedChangesPopup, editAllowed); - SampleListComponentLayout sampleListComponentLayout = - new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesContact)); + SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, null); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); } @@ -294,7 +293,7 @@ protected void initView(String params) { if (UiUtil.permitted(FeatureType.EXTERNAL_EMAILS, UserRight.EXTERNAL_EMAIL_SEND)) { ExternalEmailSideComponent externalEmailSideComponent = - ExternalEmailSideComponent.forContact(contactDto, editAllowed, this::showUnsavedChangesPopup); + ExternalEmailSideComponent.forContact(contactDto, editAllowed, this::showUnsavedChangesPopup); layout.addSidePanelComponent(new SideComponentLayout(externalEmailSideComponent), EXTERNAL_EMAILS_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java index 7c8b4735601..4521142c810 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java @@ -27,8 +27,6 @@ import de.symeda.sormas.api.event.EventParticipantReferenceDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; -import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.immunization.ImmunizationListCriteria; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; @@ -117,8 +115,7 @@ protected void initView(String params) { .sampleAssociationType(SampleAssociationType.EVENT_PARTICIPANT), this::showUnsavedChangesPopup, editAllowed); - SampleListComponentLayout sampleListComponentLayout = - new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesEventParticipant)); + SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, null); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); } @@ -190,7 +187,7 @@ protected void initView(String params) { if (UiUtil.permitted(FeatureType.EXTERNAL_EMAILS, UserRight.EXTERNAL_EMAIL_SEND)) { ExternalEmailSideComponent externalEmailSideComponent = - ExternalEmailSideComponent.forEventParticipant(eventParticipant, editAllowed, this::showUnsavedChangesPopup); + ExternalEmailSideComponent.forEventParticipant(eventParticipant, editAllowed, this::showUnsavedChangesPopup); layout.addSidePanelComponent(new SideComponentLayout(externalEmailSideComponent), EXTERNAL_EMAILS_LOC); } From 8d184263ff8a811f20286ca56bc1cbc14b703479 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:03:41 +0200 Subject: [PATCH 04/65] #11528 - Rename See samples for this person" to "See sample for this..." based on the associated entity --- .../de/symeda/sormas/api/i18n/Captions.java | 3 +++ .../src/main/resources/captions.properties | 3 +++ .../symeda/sormas/ui/caze/CaseDataView.java | 5 ++-- .../sormas/ui/contact/ContactDataView.java | 5 ++-- .../ui/events/EventParticipantDataView.java | 5 ++-- .../person/PersonSideComponentsElement.java | 14 +++++------ .../sampleLink/SampleListComponent.java | 24 +++++++++++++++++-- 7 files changed, 44 insertions(+), 15 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 a3b5a16b05a..a7b671e33c1 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 @@ -549,6 +549,7 @@ public interface Captions { String caseImportMergeCase = "caseImportMergeCase"; String caseInfrastructureDataChanged = "caseInfrastructureDataChanged"; String caseJurisdictionType = "caseJurisdictionType"; + String caseLinkToSamples = "caseLinkToSamples"; String caseMergeDuplicates = "caseMergeDuplicates"; String caseMinusDays = "caseMinusDays"; String caseNewCase = "caseNewCase"; @@ -766,6 +767,7 @@ public interface Captions { String contactFollowUpDay = "contactFollowUpDay"; String contactFollowUpVisitsOverview = "contactFollowUpVisitsOverview"; String contactIncludeContactsFromOtherJurisdictions = "contactIncludeContactsFromOtherJurisdictions"; + String contactLinkToSamples = "contactLinkToSamples"; String contactLostToFollowUp = "contactLostToFollowUp"; String contactMergeDuplicates = "contactMergeDuplicates"; String contactMinusDays = "contactMinusDays"; @@ -1322,6 +1324,7 @@ public interface Captions { String EventParticipantExport_eventTypeOfPlace = "EventParticipantExport.eventTypeOfPlace"; String EventParticipantExport_personNationalHealthId = "EventParticipantExport.personNationalHealthId"; String EventParticipantExport_sampleInformation = "EventParticipantExport.sampleInformation"; + String eventParticipantLinkToSamples = "eventParticipantLinkToSamples"; String eventParticipantSelect = "eventParticipantSelect"; String EventParticipantSelection_eventParticipantUuidLink = "EventParticipantSelection.eventParticipantUuidLink"; String EventParticipantSelection_eventUuidLink = "EventParticipantSelection.eventUuidLink"; diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index b5e788f5747..ee545a720e3 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1795,6 +1795,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning: This might replace coordinates which were intentionally set differently! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java index 46bc6bb7ff2..9453d7d9d97 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java @@ -140,7 +140,8 @@ protected void initView(String params) { SampleListComponent sampleList = new SampleListComponent( new SampleCriteria().caze(getCaseRef()).sampleAssociationType(SampleAssociationType.CASE).disease(caze.getDisease()), this::showUnsavedChangesPopup, - isEditAllowed); + isEditAllowed, + SampleAssociationType.CASE); SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesCase), isEditAllowed); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); @@ -225,7 +226,7 @@ protected void initView(String params) { if (UiUtil.permitted(FeatureType.EXTERNAL_EMAILS, UserRight.EXTERNAL_EMAIL_SEND)) { ExternalEmailSideComponent externalEmailSideComponent = - ExternalEmailSideComponent.forCase(caze, isEditAllowed, SormasUI::refreshView, this::showUnsavedChangesPopup); + ExternalEmailSideComponent.forCase(caze, isEditAllowed, SormasUI::refreshView, this::showUnsavedChangesPopup); layout.addSidePanelComponent(new SideComponentLayout(externalEmailSideComponent), EXTERNAL_EMAILS_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java index 4048532ff47..14eae747b54 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java @@ -216,7 +216,8 @@ protected void initView(String params) { SampleListComponent sampleList = new SampleListComponent( new SampleCriteria().contact(getContactRef()).disease(contactDto.getDisease()).sampleAssociationType(SampleAssociationType.CONTACT), this::showUnsavedChangesPopup, - editAllowed); + editAllowed, + SampleAssociationType.CONTACT); SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesContact)); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); @@ -294,7 +295,7 @@ protected void initView(String params) { if (UiUtil.permitted(FeatureType.EXTERNAL_EMAILS, UserRight.EXTERNAL_EMAIL_SEND)) { ExternalEmailSideComponent externalEmailSideComponent = - ExternalEmailSideComponent.forContact(contactDto, editAllowed, this::showUnsavedChangesPopup); + ExternalEmailSideComponent.forContact(contactDto, editAllowed, this::showUnsavedChangesPopup); layout.addSidePanelComponent(new SideComponentLayout(externalEmailSideComponent), EXTERNAL_EMAILS_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java index 7c8b4735601..25685eaa049 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java @@ -116,7 +116,8 @@ protected void initView(String params) { .disease(event.getDisease()) .sampleAssociationType(SampleAssociationType.EVENT_PARTICIPANT), this::showUnsavedChangesPopup, - editAllowed); + editAllowed, + SampleAssociationType.EVENT_PARTICIPANT); SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesEventParticipant)); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); @@ -190,7 +191,7 @@ protected void initView(String params) { if (UiUtil.permitted(FeatureType.EXTERNAL_EMAILS, UserRight.EXTERNAL_EMAIL_SEND)) { ExternalEmailSideComponent externalEmailSideComponent = - ExternalEmailSideComponent.forEventParticipant(eventParticipant, editAllowed, this::showUnsavedChangesPopup); + ExternalEmailSideComponent.forEventParticipant(eventParticipant, editAllowed, this::showUnsavedChangesPopup); layout.addSidePanelComponent(new SideComponentLayout(externalEmailSideComponent), EXTERNAL_EMAILS_LOC); } 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 695e4fa9de7..afcdeae85e3 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 @@ -108,12 +108,11 @@ default void addSideComponents( if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CONTACT_TRACING) && currentUser != null && currentUser.hasUserRight(UserRight.CONTACT_VIEW)) { - contactListComponent = - new ContactListComponent( - person, - entityType == DeletableEntityType.CONTACT ? entityUuid : null, - showUnsavedChangesPopup, - isEditAllowed); + contactListComponent = new ContactListComponent( + person, + entityType == DeletableEntityType.CONTACT ? entityUuid : null, + showUnsavedChangesPopup, + isEditAllowed); layout.addComponent(new SideComponentLayout(contactListComponent), CONTACTS_LOC); } @@ -153,7 +152,8 @@ && getClass().equals(PersonDataView.class)) { .eventParticipantUuids(eventParticipantList) .sampleAssociationType(SampleAssociationType.PERSON); - SampleListComponent sampleList = new SampleListComponent(sampleCriteria, showUnsavedChangesPopup, isEditAllowed); + SampleListComponent sampleList = + new SampleListComponent(sampleCriteria, showUnsavedChangesPopup, isEditAllowed, SampleAssociationType.PERSON); SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, null, isEditAllowed); layout.addComponent(sampleListComponentLayout, SAMPLES_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/sampleLink/SampleListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/sampleLink/SampleListComponent.java index d8bd39a9159..0fc5137a60c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/sampleLink/SampleListComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/sampleLink/SampleListComponent.java @@ -35,7 +35,11 @@ public class SampleListComponent extends SideComponent { - public SampleListComponent(SampleCriteria sampleCriteria, Consumer actionCallback, boolean isEditAllowed) { + public SampleListComponent( + SampleCriteria sampleCriteria, + Consumer actionCallback, + boolean isEditAllowed, + SampleAssociationType sampleAssociationType) { super(I18nProperties.getString(Strings.entitySamples), actionCallback); SampleList sampleList = new SampleList(sampleCriteria, isEditAllowed); @@ -61,7 +65,23 @@ public SampleListComponent(SampleCriteria sampleCriteria, Consumer act addComponent(sampleList); sampleList.reload(); if (!sampleList.isEmpty()) { - final Button seeSamples = ButtonHelper.createButton(I18nProperties.getCaption(Captions.personLinkToSamples)); + + String buttonCaption = null; + switch (sampleAssociationType) { + case CASE: + buttonCaption = I18nProperties.getCaption(Captions.caseLinkToSamples); + break; + case CONTACT: + buttonCaption = I18nProperties.getCaption(Captions.contactLinkToSamples); + break; + case EVENT_PARTICIPANT: + buttonCaption = I18nProperties.getCaption(Captions.eventParticipantLinkToSamples); + break; + default: + buttonCaption = I18nProperties.getCaption(Captions.personLinkToSamples); + } + final Button seeSamples = ButtonHelper.createButton(buttonCaption); + CssStyles.style(seeSamples, ValoTheme.BUTTON_PRIMARY); seeSamples.addClickListener(clickEvent -> ControllerProvider.getSampleController().navigateTo(sampleCriteria)); addComponent(seeSamples); From 2c3cd7c8ae932c1c754dbcff3fd8a22ee01cc422 Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 1 Feb 2024 10:47:13 +0100 Subject: [PATCH 05/65] [GITFLOW]updating poms for 1.95.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 aa93f16816c..5d9d3081e73 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 159c9d59104..f91cdef48f2 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index bb443312196..3f5cd7773c7 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 087d8672f46..1d317fa7be4 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 073f8fba583..d5cd58a79eb 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 46f66d77382..d304af4c2af 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 2077aec10fd..e5b8ed57ef7 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.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 66249550380..c7ef31458bc 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index 082b934c139..bbb89ea43ee 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index bfed80ce6dd..026122208f0 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index b1a543340fd..2cf7c307fb2 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0-SNAPSHOT + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 From 562e50394eee661c5775ee4afe6d747e28b4815e Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 1 Feb 2024 11:08:05 +0100 Subject: [PATCH 06/65] [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 5d9d3081e73..1e162e898d5 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index f91cdef48f2..b32c643205b 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 3f5cd7773c7..566bb487cfa 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 1d317fa7be4..6a77258e114 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.95.0-SNAPSHOT + 1.94.0 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index d5cd58a79eb..e6014f3a69e 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index d304af4c2af..6a68f017583 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index e5b8ed57ef7..49e86fd1c29 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.95.0-SNAPSHOT + 1.94.0 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index c7ef31458bc..1c96991f84e 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index bbb89ea43ee..bf9fec66f4c 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 026122208f0..dc14e72a3e0 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 2cf7c307fb2..b0c92535cee 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.94.0 ../sormas-base 4.0.0 From bc47e1de1a345bf42db93b09c3708dc7563a768d Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 1 Feb 2024 11:08:08 +0100 Subject: [PATCH 07/65] [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 1e162e898d5..5d9d3081e73 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index b32c643205b..f91cdef48f2 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 566bb487cfa..3f5cd7773c7 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 6a77258e114..1d317fa7be4 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.94.0 + 1.95.0-SNAPSHOT 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index e6014f3a69e..d5cd58a79eb 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 6a68f017583..d304af4c2af 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 49e86fd1c29..e5b8ed57ef7 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.94.0 + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 1c96991f84e..c7ef31458bc 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index bf9fec66f4c..bbb89ea43ee 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index dc14e72a3e0..026122208f0 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index b0c92535cee..2cf7c307fb2 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.94.0 + 1.95.0-SNAPSHOT ../sormas-base 4.0.0 From cc59138d742e6dbeb647e85a0d7982d4b17a8102 Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Thu, 1 Feb 2024 10:12:34 +0000 Subject: [PATCH 08/65] [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 b0f7fd688b2..a74ea4d6023 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.94.0-SNAPSHOT" + "version" : "1.95.0-SNAPSHOT" }, "servers" : [ { "url" : "/sormas-rest" diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index b6340d78e0e..0b0d86ee09d 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.94.0-SNAPSHOT + version: 1.95.0-SNAPSHOT servers: - url: /sormas-rest paths: From 9bcc41edce0f0dd1cb4268e135a2c50b08385c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 1 Feb 2024 13:56:24 +0100 Subject: [PATCH 09/65] #12930 - Only disable config when enabled --- .../sormas/backend/feature/FeatureConfigurationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 049570c7570..03c04d2f5b2 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 @@ -162,7 +162,7 @@ public void updateFeatureConfigurations() { FeatureConfiguration configuration = configs.get(featureType); boolean persistingNeeded = false; - if (featureType.isServerFeature() && featureType.isDependent()) { + if (featureType.isServerFeature() && featureType.isDependent() && configuration.isEnabled()) { boolean hasEnabledDependentFeature = hasEnabledDependentFeature(featureType, configs); if (!hasEnabledDependentFeature) { configuration.setEnabled(false); From dfcf7a04183b4872f9e77993c69c3d6f2424c246 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Fri, 2 Feb 2024 10:39:58 +0200 Subject: [PATCH 10/65] #12923 - Error when trying to enter the Campaigns Dashboard with a Surveillance Officer --- .../dashboard/campaigns/CampaignDashboardFilterLayout.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/campaigns/CampaignDashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/campaigns/CampaignDashboardFilterLayout.java index fc7d36c78cf..59f31f05b13 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/campaigns/CampaignDashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/campaigns/CampaignDashboardFilterLayout.java @@ -232,9 +232,9 @@ private void updateFiltersBasedOnArea(Object value) { regionFilter.removeAllItems(); regionFilter.addItems(FacadeProvider.getRegionFacade().getAllActiveByArea(((AreaReferenceDto) value).getUuid())); regionFilter.setEnabled(true); + campaignJurisdictionGroupByFilter.addItems(AREA, REGION, DISTRICT); campaignJurisdictionGroupByFilter.setValue(REGION); campaignJurisdictionGroupByFilter.removeItem(COMMUNITY); - campaignJurisdictionGroupByFilter.addItems(AREA, REGION, DISTRICT); } else { regionFilter.clear(); regionFilter.removeAllItems(); @@ -249,10 +249,10 @@ private void updateFiltersBasedOnArea(Object value) { private void updateFiltersBasedOnDistrict(Object value) { if (value != null) { - campaignJurisdictionGroupByFilter.removeItem(AREA); - campaignJurisdictionGroupByFilter.removeItem(REGION); campaignJurisdictionGroupByFilter.addItems(DISTRICT, COMMUNITY); campaignJurisdictionGroupByFilter.setValue(COMMUNITY); + campaignJurisdictionGroupByFilter.removeItem(AREA); + campaignJurisdictionGroupByFilter.removeItem(REGION); } else { campaignJurisdictionGroupByFilter.removeItem(AREA); campaignJurisdictionGroupByFilter.addItems(REGION, DISTRICT, COMMUNITY); From 9ee6acb6bd37f554358182eae146565f318d82c8 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 5 Feb 2024 10:19:47 +0100 Subject: [PATCH 11/65] qa-auto/HSP-6574 Stabilize "Delete a contact in source system with handing ownership and check it in both systems" - in the one step the method waitUntilIdentifiedElementIsVisibleAndClickable has changed for waitForElementPresent, sleep time was increased --- .../steps/web/application/aCommonComponents/SideCardsSteps.java | 2 +- .../steps/web/application/contacts/EditContactSteps.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java index 3fdbbf91100..3e6e06c67f8 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java @@ -109,7 +109,7 @@ public SideCardsSteps( "I check if handover card contains shared with {string} information", (String environmentIdentifier) -> { webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(HANDOVER_SIDE_CARD); - TimeUnit.SECONDS.sleep(3); + TimeUnit.SECONDS.sleep(4); // waiting for page loaded softly.assertTrue( webDriverHelpers.isElementPresent( checkTextInHandoverSideComponent( 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 a14ff4cdf24..f88e2310616 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 @@ -515,7 +515,7 @@ public EditContactSteps( When( "I click to accept potential duplicate in Shares Page", () -> { - webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(ACTION_CONFIRM); + webDriverHelpers.waitForElementPresent(ACTION_CONFIRM, 2); webDriverHelpers.clickOnWebElementBySelector(ACTION_CONFIRM); }); When( From 0131aa57fcf3516454e55ad1e29ea23fae07e991 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 5 Feb 2024 11:55:29 +0100 Subject: [PATCH 12/65] qa-auto/HSP-6575 Stabilize "S2S_added sample after sharing a case/contact does not get shared [2]" --- .../steps/web/application/aCommonComponents/SideCardsSteps.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java index 3e6e06c67f8..be0bd86f28b 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java @@ -202,6 +202,7 @@ public SideCardsSteps( Then( "^I check that the number of added samples on the Edit case page is (\\d+)$", (Integer numberOfSamples) -> { + webDriverHelpers.waitForElementPresent(ADDED_SAMPLES_IN_SAMPLE_CARD, 2); Integer actualNumberOfSamples = webDriverHelpers.getNumberOfElements(ADDED_SAMPLES_IN_SAMPLE_CARD); softly.assertEquals( From dc6faefd248d5a178c4b6654977786d7835bf0ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Mon, 5 Feb 2024 12:58:38 +0100 Subject: [PATCH 13/65] #12900 - Handle merge views --- .../ui/caze/MergeCasesFilterComponent.java | 6 +- .../symeda/sormas/ui/caze/MergeCasesGrid.java | 6 ++ .../contact/MergeContactsFilterComponent.java | 64 ++++++++++--------- .../sormas/ui/contact/MergeContactsGrid.java | 6 ++ 4 files changed, 51 insertions(+), 31 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesFilterComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesFilterComponent.java index 80c5f499fac..0d51c379f7e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesFilterComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesFilterComponent.java @@ -24,11 +24,13 @@ import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.NewCaseDateType; +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; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; import de.symeda.sormas.ui.utils.ButtonHelper; @@ -75,7 +77,9 @@ public MergeCasesFilterComponent(CaseCriteria criteria, QueryDetails queryDetail setWidth(100, Unit.PERCENTAGE); addFirstRowLayout(); - addSecondRowLayout(); + if (UiUtil.disabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + addSecondRowLayout(); + } addThirdRowLayout(); setValue(criteria, queryDetails); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesGrid.java index bb8c1ff9b93..fd44aa6ddf5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/MergeCasesGrid.java @@ -15,11 +15,13 @@ import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.caze.CaseIndexDto; import de.symeda.sormas.api.caze.CaseMergeIndexDto; +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; import de.symeda.sormas.api.person.PersonHelper; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.utils.AbstractMergeGrid; public class MergeCasesGrid extends AbstractMergeGrid { @@ -78,6 +80,10 @@ protected void buildColumns() { value.getDateOfBirthMM(), value.getDateOfBirthYYYY()), new TextRenderer()); + + if (UiUtil.enabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + getColumn(CaseIndexDto.RESPONSIBLE_DISTRICT_NAME).setHidden(true); + } } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsFilterComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsFilterComponent.java index 529f60c1aee..783de2cac0a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsFilterComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsFilterComponent.java @@ -21,11 +21,13 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.contact.ContactCriteria; 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; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; import de.symeda.sormas.ui.utils.ButtonHelper; @@ -159,38 +161,40 @@ private void addSecondRowLayout() { secondRowLayout.setMargin(false); secondRowLayout.setWidth(100, Unit.PERCENTAGE); - cbRegion = new ComboBox<>(); - cbDistrict = new ComboBox<>(); - cbRegion.setItemCaptionGenerator(item -> item.buildCaption()); - cbDistrict.setItemCaptionGenerator(item -> item.buildCaption()); - - cbRegion.setId(ContactDto.REGION); - cbRegion.setWidth(200, Unit.PIXELS); - CssStyles.style(cbRegion, CssStyles.FORCE_CAPTION); - cbRegion.setPlaceholder(I18nProperties.getPrefixCaption(ContactDto.I18N_PREFIX, ContactDto.REGION)); - cbRegion.setItems(FacadeProvider.getRegionFacade().getAllActiveAsReference()); - criteriaBinder.bind(cbRegion, ContactDto.REGION); - cbRegion.addValueChangeListener(e -> { - RegionReferenceDto region = e.getValue(); - cbDistrict.clear(); - if (region != null) { - cbDistrict.setItems(FacadeProvider.getDistrictFacade().getAllActiveByRegion(region.getUuid())); - cbDistrict.setEnabled(true); - } else { - cbDistrict.setEnabled(false); + if (UiUtil.disabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + cbRegion = new ComboBox<>(); + cbDistrict = new ComboBox<>(); + cbRegion.setItemCaptionGenerator(item -> item.buildCaption()); + cbDistrict.setItemCaptionGenerator(item -> item.buildCaption()); + + cbRegion.setId(ContactDto.REGION); + cbRegion.setWidth(200, Unit.PIXELS); + CssStyles.style(cbRegion, CssStyles.FORCE_CAPTION); + cbRegion.setPlaceholder(I18nProperties.getPrefixCaption(ContactDto.I18N_PREFIX, ContactDto.REGION)); + cbRegion.setItems(FacadeProvider.getRegionFacade().getAllActiveAsReference()); + criteriaBinder.bind(cbRegion, ContactDto.REGION); + cbRegion.addValueChangeListener(e -> { + RegionReferenceDto region = e.getValue(); + cbDistrict.clear(); + if (region != null) { + cbDistrict.setItems(FacadeProvider.getDistrictFacade().getAllActiveByRegion(region.getUuid())); + cbDistrict.setEnabled(true); + } else { + cbDistrict.setEnabled(false); + } + }); + secondRowLayout.addComponent(cbRegion); + if (UserProvider.getCurrent().getUser().getRegion() != null) { + cbRegion.setEnabled(false); } - }); - secondRowLayout.addComponent(cbRegion); - if (UserProvider.getCurrent().getUser().getRegion() != null) { - cbRegion.setEnabled(false); - } - cbDistrict.setId(ContactDto.DISTRICT); - cbDistrict.setWidth(200, Unit.PIXELS); - CssStyles.style(cbDistrict, CssStyles.FORCE_CAPTION); - cbDistrict.setPlaceholder(I18nProperties.getPrefixCaption(ContactDto.I18N_PREFIX, ContactDto.DISTRICT)); - criteriaBinder.bind(cbDistrict, ContactDto.DISTRICT); - secondRowLayout.addComponent(cbDistrict); + cbDistrict.setId(ContactDto.DISTRICT); + cbDistrict.setWidth(200, Unit.PIXELS); + CssStyles.style(cbDistrict, CssStyles.FORCE_CAPTION); + cbDistrict.setPlaceholder(I18nProperties.getPrefixCaption(ContactDto.I18N_PREFIX, ContactDto.DISTRICT)); + criteriaBinder.bind(cbDistrict, ContactDto.DISTRICT); + secondRowLayout.addComponent(cbDistrict); + } ComboBox cbResultLimit = new ComboBox<>(); cbResultLimit.setId(QueryDetails.RESULT_LIMIT); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsGrid.java index e042965f870..96a042830a5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/MergeContactsGrid.java @@ -16,6 +16,7 @@ import de.symeda.sormas.api.caze.AgeAndBirthDateDto; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.MergeContactIndexDto; +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; @@ -23,6 +24,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.SormasUI; +import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.caze.CaseDataView; import de.symeda.sormas.ui.utils.AbstractMergeGrid; @@ -93,6 +95,10 @@ protected void buildColumns() { value.getDateOfBirthMM(), value.getDateOfBirthYYYY()), new TextRenderer()); + + if (UiUtil.enabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { + getColumn(MergeContactIndexDto.DISTRICT_NAME).setHidden(true); + } } @Override From 12e3690736ff1bb8f193c092d937f685b625f168 Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Mon, 5 Feb 2024 13:52:47 +0100 Subject: [PATCH 14/65] qa-auto/HSP-6559 - Refactoring the sleep method * qa-auto/HSP-6559 - Refactoring the sleep method part 2 * qa-auto/HSP-6559 - Refactoring the sleep method part 3 --- .../web/application/contacts/EditContactSteps.java | 11 ++++------- .../steps/web/application/events/EditEventSteps.java | 6 ++---- .../web/application/events/EventDirectorySteps.java | 2 +- .../web/application/persons/EditPersonSteps.java | 2 +- .../web/application/samples/EditSampleSteps.java | 3 +-- 5 files changed, 9 insertions(+), 15 deletions(-) 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 f88e2310616..13699dbd16d 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 @@ -804,8 +804,7 @@ public EditContactSteps( When( "^I click Link Event button on Edit Contact Page$", () -> { - TimeUnit.SECONDS.sleep(2); - webDriverHelpers.waitUntilElementIsVisibleAndClickable(LINK_EVENT_BUTTON); + webDriverHelpers.waitForElementPresent(LINK_EVENT_BUTTON, 2); webDriverHelpers.clickOnWebElementBySelector(LINK_EVENT_BUTTON); }); When( @@ -1102,8 +1101,7 @@ public EditContactSteps( When( "I check that text appearing in hover over Expected Follow-up is based on Report date on Edit Contact Page", () -> { - TimeUnit.SECONDS.sleep(2); - webDriverHelpers.waitUntilElementIsVisibleAndClickable(EXPECTED_FOLLOWUP_LABEL); + webDriverHelpers.waitForElementPresent(EXPECTED_FOLLOWUP_LABEL, 2); webDriverHelpers.hoverToElement(EXPECTED_FOLLOWUP_LABEL); String displayedText = webDriverHelpers.getTextFromWebElement(EXPECTED_FOLLOWUP_POPUP_TEXT); @@ -1124,8 +1122,7 @@ public EditContactSteps( When( "I check that text appearing in hover over Expected Follow-up is based on Last Contact date on Edit Contact Page", () -> { - TimeUnit.SECONDS.sleep(2); - webDriverHelpers.waitUntilElementIsVisibleAndClickable(EXPECTED_FOLLOWUP_LABEL); + webDriverHelpers.waitForElementPresent(EXPECTED_FOLLOWUP_LABEL, 2); webDriverHelpers.hoverToElement(EXPECTED_FOLLOWUP_LABEL); String displayedText = webDriverHelpers.getTextFromWebElement(EXPECTED_FOLLOWUP_POPUP_TEXT); @@ -1405,7 +1402,7 @@ public EditContactSteps( When( "I check if Follow up until date is ([^\"]*) days after last created API contact report date", (Integer days) -> { - TimeUnit.SECONDS.sleep(3); + webDriverHelpers.waitForElementPresent(FOLLOW_UP_UNTIL_DATE, 3); String date = webDriverHelpers.getValueFromWebElement(FOLLOW_UP_UNTIL_DATE); softly.assertEquals( DateTimeFormatter.ofPattern("dd.MM.yyyy") diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index de1be326381..9c753fbd857 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -786,9 +786,7 @@ public EditEventSteps( When( "I click on save button in Add Participant form", () -> { - webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( - EDIT_EVENT_PAGE_SAVE_BUTTON); - TimeUnit.SECONDS.sleep(2); // needed for button to be available + webDriverHelpers.waitForElementPresent(EDIT_EVENT_PAGE_SAVE_BUTTON, 3); int attempts = 0; do { webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_PAGE_SAVE_BUTTON); @@ -1714,7 +1712,7 @@ public EditEventSteps( "I check if editable fields are read only for an archived event", () -> { webDriverHelpers.waitForPageLoadingSpinnerToDisappear(30); - TimeUnit.SECONDS.sleep(15); + webDriverHelpers.waitForElementPresent(EVENT_PARTICIPANTS_TAB, 15); webDriverHelpers.waitUntilElementIsVisibleAndClickable(EVENT_PARTICIPANTS_TAB); softly.assertEquals( webDriverHelpers.isElementEnabled(EVENT_STATUS_OPTIONS), diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java index 88c2f77eb41..5f6a664b026 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java @@ -196,8 +196,8 @@ public EventDirectorySteps( When( "I fill EVENT ID filter by API", () -> { - TimeUnit.SECONDS.sleep(5); // wait for reaction webDriverHelpers.waitForPageLoadingSpinnerToDisappear(50); + webDriverHelpers.waitForElementPresent(APPLY_FILTER, 5); webDriverHelpers.waitUntilElementIsVisibleAndClickable(APPLY_FILTER); String eventUuid = apiState.getCreatedEvent().getUuid(); webDriverHelpers.waitUntilIdentifiedElementIsPresent(SEARCH_EVENT_BY_FREE_TEXT); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java index e3e414f54eb..852ff7a98c3 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java @@ -201,8 +201,8 @@ public EditPersonSteps( When( "I check that new edited person is correctly displayed in Edit Person page", () -> { - TimeUnit.SECONDS.sleep(2); // wait for reaction webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); + webDriverHelpers.waitForElementPresent(PRESENT_CONDITION_INPUT, 2); webDriverHelpers.waitUntilIdentifiedElementIsPresent(PRESENT_CONDITION_INPUT); collectedPerson = collectPersonData(); TimeUnit.SECONDS.sleep(2); // wait for reaction 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 ca4ea504969..24f8fdeb4d7 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 @@ -68,7 +68,6 @@ import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.concurrent.TimeUnit; import javax.inject.Inject; import org.openqa.selenium.By; import org.sormas.e2etests.entities.pojo.helpers.ComparisonHelper; @@ -332,7 +331,7 @@ public EditSampleSteps( And( "I check if editable fields are read only for a sample", () -> { - TimeUnit.SECONDS.sleep(2); // waiting for page sample loaded + webDriverHelpers.waitForElementPresent(DATE_SAMPLE_COLLECTED, 2); softly.assertEquals( webDriverHelpers.isElementEnabled(DATE_SAMPLE_COLLECTED), false, From 9102d8a83de6e66631115e65fa0d23dcc642dffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 6 Feb 2024 09:58:09 +0100 Subject: [PATCH 15/65] New Crowdin updates (#12935) * 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 (Spanish, Cuba) * New translations captions.properties (Czech) * 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 (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 captions.properties (Spanish, Cuba) * New translations enum.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) * 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) * 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 captions.properties (Czech) * New translations enum.properties (Czech) * New translations captions.properties (Spanish, Bolivia) * New translations descriptions.properties (Spanish, Bolivia) * New translations enum.properties (Spanish, Bolivia) * New translations strings.properties (Spanish, Bolivia) * New translations validations.properties (Spanish, Bolivia) * New translations strings.xml (Spanish, Bolivia) * New translations strings_format.xml (Spanish, Bolivia) * New translations countries.properties (Spanish, Bolivia) * New translations continents.properties (Spanish, Bolivia) * New translations subcontinents.properties (Spanish, Bolivia) --- .../main/resources/captions_cs-CZ.properties | 16 +- .../main/resources/captions_es-BO.properties | 2928 +++++++++++++++++ .../resources/continents_es-BO.properties | 24 + .../main/resources/countries_es-BO.properties | 216 ++ .../resources/descriptions_es-BO.properties | 235 ++ .../src/main/resources/enum_cs-CZ.properties | 2 +- .../src/main/resources/enum_es-BO.properties | 2270 +++++++++++++ .../main/resources/strings_cs-CZ.properties | 2 +- .../main/resources/strings_es-BO.properties | 1770 ++++++++++ .../resources/subcontinents_es-BO.properties | 49 + .../resources/validations_es-BO.properties | 295 ++ .../src/main/res/values-es-rBO/strings.xml | 704 ++++ .../main/res/values-es-rBO/strings_format.xml | 37 + 13 files changed, 8538 insertions(+), 10 deletions(-) create mode 100644 sormas-api/src/main/resources/captions_es-BO.properties create mode 100644 sormas-api/src/main/resources/continents_es-BO.properties create mode 100644 sormas-api/src/main/resources/countries_es-BO.properties create mode 100644 sormas-api/src/main/resources/descriptions_es-BO.properties create mode 100644 sormas-api/src/main/resources/enum_es-BO.properties create mode 100644 sormas-api/src/main/resources/strings_es-BO.properties create mode 100644 sormas-api/src/main/resources/subcontinents_es-BO.properties create mode 100644 sormas-api/src/main/resources/validations_es-BO.properties create mode 100644 sormas-app/app/src/main/res/values-es-rBO/strings.xml create mode 100644 sormas-app/app/src/main/res/values-es-rBO/strings_format.xml diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index dada4e2d078..7f9c32793f7 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -866,14 +866,14 @@ CustomizableEnum.hasDetails.short=Má detaily customizableEnumValueAllDiseases=Všechny nemoci customizableEnumValueDiseaseCount=%d nemoci customizableEnumValueNoProperties=Žádné vlastnosti -customizableEnumValueActiveValues=Active values -customizableEnumValueInactiveValues=Inactive values +customizableEnumValueActiveValues=Aktivní hodnoty +customizableEnumValueInactiveValues=Neaktivní hodnoty CustomizableEnumValue.dataType=Datový typ CustomizableEnumValue.value=Hodnota CustomizableEnumValue.caption=Popisek CustomizableEnumValue.diseases=Nemoci CustomizableEnumValue.properties=Vlastnosti -CustomizableEnumValue.active=Active +CustomizableEnumValue.active=Aktivní # Dashboard dashboardAlive=Naživu dashboardApplyCustomFilter=Použít vlastní filtr @@ -1609,7 +1609,7 @@ externalMessageCriteria.messageDateFrom=Datum zprávy od... ExternalMessageCriteria.messageDateTo=... do ExternalMessageCriteria.birthDateFrom=Datum narození od... ExternalMessageCriteria.birthDateTo=... do -externalMessageValueNotSpecified=Value not specified in external message +externalMessageValueNotSpecified=Hodnota není uvedena v externí zprávě #Physician report physiciansReportCaseImmunizations=Imunizace @@ -2922,7 +2922,7 @@ environmentSampleNewSample=Nový vzorek ExternalEmailOptions.templateName=Vyberte šablonu ExternalEmailOptions.recipientEmail=E-mailová adresa ExternalEmailOptions.attachedDocuments=Přiložit dokument(y) -externalEmailUsedTemplate=Template -externalEmailSentBy=Sent by -externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailUsedTemplate=Šablona +externalEmailSentBy=Odeslal +externalEmailSentTo=Příjemce +externalEmailAttachedDocuments=Připojené dokumenty \ No newline at end of file diff --git a/sormas-api/src/main/resources/captions_es-BO.properties b/sormas-api/src/main/resources/captions_es-BO.properties new file mode 100644 index 00000000000..0a4ce4d66ed --- /dev/null +++ b/sormas-api/src/main/resources/captions_es-BO.properties @@ -0,0 +1,2928 @@ +# 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 . +############################################################################### +# General Captions +all=All +area=Area +city=City +postcode=Postcode +address=Address +communityName=Community +date=Date +description=Description +disease=Disease +districtName=District +edit=Edit +view=View +epiWeekFrom=From Epi Week +epiWeekTo=To Epi Week +facilityType=Facility type +facilityTypeGroup=Facility category +firstName=First name +sex=Sex +nationalHealthId=National health ID +passportNumber=Passport number +from=From +info=Info +lastName=Last name +menu=Menu +moreActions=More +name=Name +options=Options +regionName=Region +system=System +to=To +total=Total +notSpecified=Not specified +noUserSelected=No user selected +creationDate=Creation date +changeDate=Date of last change +notAvailableShort=NA +inaccessibleValue=Confidential +numberOfCharacters=Number of characters\: %d / %d +remove=Remove +reportingUser=Reporting user +notTestedYet=Not tested yet +latestPathogenTest=Latest Pathogen test\: +unknown=Unknown +diseaseVariantDetails=Disease variant details +unassigned=Unassigned +assign=Assign +assignToMe=Assign to me +endOfProcessingDate=End of processing date +dearchiveReason=De-archive reason +deletionReason=Reason for deletion +otherDeletionReason=Reason for deletion details +requiredUserRights=Needed user rights +adoptHomeAddressOfCasePerson=Adopt home address of case person +adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household +casePersonAddress=Address of the case person +viewMessage=View message +primarySuffix=primary +# About +about=About +aboutAdditionalInfo=Additional Info +aboutCopyright=Copyright +aboutDocuments=Documents +aboutVersion=Version +versionIsMissing=Version is missing +aboutBrandedSormasVersion=%s powered by SORMAS +aboutCaseClassificationRules=Case Classification Rules (HTML) +aboutChangelog=Full Changelog +aboutDataDictionary=Data Dictionary (XLSX) +aboutSormasWebsite=Official SORMAS Website +aboutTechnicalManual=Technical Manual (PDF) +aboutWhatsNew=What's New? +aboutExternalMessageAdapter=External messages adapter +aboutServiceNotAvailable=Not available +aboutExternalSurveillanceToolGateway=External surveillance tool gateway +aboutDataProtectionDictionary=Data Protection Dictionary (XLSX) +dataProtectionAllFieldsSheet=All fields +# Action +actionNewAction=New action +actionNoActions=There are no actions for this %s +actionCreatingLabel=Created at %s by %s +actionLastModifiedByLabel=Updated at %s by %s +actionStatusChangeDate=updated at %s +Action=Action +Action.title=Title +Action.description=Description +Action.reply=Comments on execution +Action.creatorUser=Created by +Action.date=Date +Action.event=Associated event +Action.priority=Priority +Action.actionContext=Action context +Action.actionStatus=Action status +Action.lastModifiedBy=Last modified by +Action.actionMeasure=Measure +# Actions +actionApplyDateFilter=Apply date filter +actionArchiveInfrastructure=Archive +actionArchiveCoreEntity=Archive +actionAssignNewEpidNumber=Assign new epid number +actionBack=Back +actionSend=Send +actionApply=Apply +actionCancel=Cancel +actionClear=Clear +actionClearAll=Clear all +actionClose=Close +actionConfirm=Confirm +actionProceed=Proceed +actionContinue=Continue +actionCreate=Create +actionDearchiveInfrastructure=De-Archive +actionDearchiveCoreEntity=De-Archive +actionDelete=Delete +actionRestore=Restore +actionDeselectAll=Deselect all +actionDeselectAndContinue=Deselect and continue +actionDisable=Disable +actionDiscard=Discard +actionGenerateNewPassword=Generate new password +actionGenerateNewPasswords=Generate new passwords +actionEnable=Enable +actionGenerate=Generate +actionImport=Import +actionImportAllCountries=Import default countries +actionImportAllContinents=Import default continents +actionImportAllSubcontinents=Import default subcontinents +actionLogout=Logout +actionNewEntry=New entry +actionOkay=Okay +actionConfirmFilters=Confirm filters +actionResetFilters=Reset filters +actionApplyFilters=Apply filters +actionSave=Save +actionSelectAll=Select all +actionShowLessFilters=Show Less Filters +actionShowMoreFilters=Show More Filters +actionSkip=Skip +actionMerge=Merge +actionPick=Pick +actionDismiss=Dismiss +actionCompare=Compare +actionHide=Hide +actionEnterBulkEditMode=Enter bulk edit mode +actionLeaveBulkEditMode=Leave bulk edit mode +actionDiscardChanges=Discard changes +actionSaveChanges=Save changes +actionAdjustChanges=Adjust changes +actionBackToNationOverview=Back to Nation Overview +actionSettings=User Settings +actionNewForm=New Form +actionOverwrite=Overwrite +actionRemindMeLater=Remind me later +actionGroupEvent=Group +actionUnclearLabMessage=Mark as unclear +actionManualForwardLabMessage=Mark as forwarded +actionAccept=Accept +actionReject=Reject +actionResetEnumCache=Reset enum cache +actionNo=No +actionYes=Yes +actionYesForAll=Yes, for all +actionYesForSome=Yes, for some +actionReset=Reset +actionSearch=Search +actionSaveAndOpenHospitalization=Save and open hospitalization +actionSaveAndOpenCase=Save and open case +actionSaveAndOpenContact=Save and open contact +actionSaveAndOpenEventParticipant=Save and open event participant +actionSaveAndContinue=Save and continue +actionDiscardAllAndContinue=Discard all and continue +actionDiscardAndContinue=Discard and continue +actionNext=Next +actionYesAll=Yes all +actionNoAll=No all +actionOkAndGoToMerge = Okay, and continue to merge overview +actionOkAndGoToContactDirectory = Okay, and continue to contact directory +actionOkAndGoToContactDetails = Okay, and continue to contact +actionOkAndGoToPersonDirectory = Okay, and continue to person directory +actionExecuteAutomaticDeletion = Execute automatic deletion +actionDone = Done +actionConfirmAction = Confirm action +activityAsCaseFlightNumber=Flight number +ActivityAsCase=Activity as case +ActivityAsCase.startDate=Start of activity +ActivityAsCase.endDate=End of activity +ActivityAsCase.activityAsCaseDate=Activity date +ActivityAsCase.activityAsCaseType=Type of Activity +ActivityAsCase.activityAsCaseTypeDetails=Type of Activity details +ActivityAsCase.location=Location +ActivityAsCase.typeOfPlace=Type of place +ActivityAsCase.typeOfPlaceIfSG=Facility (IfSG) +ActivityAsCase.typeOfPlaceDetails=Type of place details +ActivityAsCase.meansOfTransport=Means of transport +ActivityAsCase.meansOfTransportDetails=Means of transport details +ActivityAsCase.connectionNumber=Connection number +ActivityAsCase.seatNumber=Seat number +ActivityAsCase.workEnvironment=Work environment +ActivityAsCase.gatheringType=Type of gathering +ActivityAsCase.gatheringDetails=Type of gathering details +ActivityAsCase.habitationType=Type of habitation +ActivityAsCase.habitationDetails=Type of habitation details +ActivityAsCase.role=Role +# AdditionalTest +additionalTestNewTest=New test result +AdditionalTest=Additional test +AdditionalTest.altSgpt=ALT/SGPT (U/L) +AdditionalTest.arterialVenousBloodGas=Arterial/venous blood gas +AdditionalTest.arterialVenousGasHco3=HCO3 (mEq/L) +AdditionalTest.arterialVenousGasPao2=PaO2 (mmHg) +AdditionalTest.arterialVenousGasPco2=pCO2 (mmHg) +AdditionalTest.arterialVenousGasPH=pH +AdditionalTest.astSgot=AST/SGOT (U/L) +AdditionalTest.conjBilirubin=Conj. bilirubin (umol/L) +AdditionalTest.creatinine=Creatinine (umol/L) +AdditionalTest.gasOxygenTherapy=Oxygen therapy at time of blood gas (L/min) +AdditionalTest.haemoglobin=Haemoglobin (g/L) +AdditionalTest.haemoglobinuria=Haemoglobin in urine +AdditionalTest.hematuria=Red blood cells in urine +AdditionalTest.otherTestResults=Other performed tests and results +AdditionalTest.platelets=Platelets (x10^9/L) +AdditionalTest.potassium=Potassium (mmol/L) +AdditionalTest.proteinuria=Protein in urine +AdditionalTest.prothrombinTime=Prothrombin Time (PT) +AdditionalTest.testDateTime=Date and time of result +AdditionalTest.totalBilirubin=Total bilirubin (umol/L) +AdditionalTest.urea=Urea (mmol/L) +AdditionalTest.wbcCount=WBC count (x10^9/L) +aggregateReportDeathsShort=D +aggregateReportLabConfirmationsShort=L +aggregateReportLastWeek=Last Week +aggregateReportDiscardSelection=Discard selection +aggregateReportEditAggregateReport=Edit aggregate report +aggregateReportEditReport=Edit report +aggregateReportReportFound=Aggregate report found +aggregateReportShowZeroRows = Show 0-rows for disease(s) +aggregateReportExpiredAgeGroups = Expired +aggregateReportNoAgeGroup = No age group +aggregateReportShowOnlyDuplicateReports = Display only duplicate reports +aggregateReportNewAggregateReport=New aggregate report +aggregateReportNewCasesShort=C +aggregateReportThisWeek=This Week +AggregateReport.disease=Disease +AggregateReport.grouping=Grouping +AggregateReport.newCases=Suspected cases +AggregateReport.labConfirmations=Lab confirmations +AggregateReport.deaths=Deaths +AggregateReport.healthFacility=Facility +AggregateReport.reportingUser=Reporting user +AggregateReport.pointOfEntry=Point of Entry +areaActiveAreas=Active areas +areaArchivedAreas=Archived areas +areaAllAreas=All areas +Area.archived=Archived +Area.externalId=External ID +Area.defaultInfrastructure=Default +years=years +months=months +days=days +# Bulk actions +bulkActions=Bulk Actions +bulkEditAssignee=Edit assignee +bulkCancelFollowUp=Cancel follow-up +bulkCaseClassification=Change case classification +bulkCaseOutcome=Change case outcome +bulkCaseShareWithReportingTool=Change share with reporting tool +bulkContactClassification=Change contact classification +bulkContactOfficer=Change contact officer +bulkDelete=Delete +bulkDisease=Change Disease +bulkDiseaseVariant=Change Disease variant +bulkEdit=Edit... +bulkEventInvestigationStatus=Change event investigation status +bulkEventManagementStatus=Change event management status +bulkEventParticipantsToContacts=Create contacts +bulkEventStatus=Change event status +bulkEventType=Change event type +bulkFacility=Change facility +bulkInvestigationStatus=Change investigation status +bulkLinkToEvent=Link to event +bulkLostToFollowUp=Set to lost to follow-up +bulkSurveillanceOfficer=Change surveillance officer +bulkTaskStatus=Change task status +bulkTaskAssignee=Change assignee +bulkTaskPriority=Change priority +bulkRestore=Restore +bulkCompleted=%d/%d Completed +bulkSkipped=%d Skipped +bulkSuccessful=%d Successful +# Campaign +campaignActiveCampaigns=Active campaigns +campaignAllCampaigns=All campaigns +campaignAllActiveAndArchivedCampaigns=All active and archived campaigns +campaignArchivedCampaigns=Archived campaigns +campaignNewCampaign=New campaign +campaignCampaignData=Campaign Data +campaignCampaignDataForm=Data Form +campaignCampaignForm=Form +campaignValidateForms=Validate Forms +campaignAdditionalForm=Add form +campaignAdditionalChart=Add chart +campaignDashboardChart=Campaign data chart +campaignDashboardTabName=Tab name +campaignDashboardSubTabName=Sub-tab name +campaignDashboardChartWidth=Width in % +campaignDashboardChartHeight=Height in % +campaignDashboardOrder=Order +campaignDeletedCampaigns=Deleted campaigns +campaignSearch=Search Campaign +campaignDiagramGroupBy=Group by +Campaign=Campaign +Campaign.name=Name +Campaign.description=Description +Campaign.startDate=Start date +Campaign.endDate=End date +Campaign.creatingUser=Creating user +Campaign.deletionReason=Reason for deletion +Campaign.otherDeletionReason=Reason for deletion details +Campaign.open=Open +Campaign.edit=Edit +Campaign.area=Area +Campaign.region=Region +Campaign.district=District +Campaign.community=Community +Campaign.grouping=Grouping +CampaignFormData.campaign=Campaign +CampaignFormData.campaignFormMeta=Form +CampaignFormData.formDate=Form date +CampaignFormData.formValuesJson=Form data +CampaignFormData.area=Area +CampaignFormData.edit=Edit +# CaseData +caseCasesList=Cases list +caseInfrastructureDataChanged=Infrastructure data has changed +caseCloneCaseWithNewDisease=Generate new case for +caseContacts=Contacts +caseDocuments=Case Documents +caseEditData=Edit data +caseEvents=Events +caseEventsResetDateFilter=Reset date filter +caseFilterWithoutGeo=Only cases without geo coordinates +caseFilterPortHealthWithoutFacility=Only port health cases without a facility +caseFilterCasesWithCaseManagementData=Only cases with case management data +caseFilterWithDifferentRegion=Show duplicates with differing regions +caseFilterExcludeSharedCases=Exclude cases shared from other jurisdictions +caseFilterWithoutResponsibleUser=Only cases without responsible user +caseFilterWithExtendedQuarantine=Only cases with extended quarantine +caseFilterWithReducedQuarantine=Only cases with reduced quarantine +caseFilterOnlyQuarantineHelpNeeded=Help needed in quarantine +caseFilterIncludeCasesFromOtherJurisdictions=Include cases from other jurisdictions +caseFilterOnlyCasesWithFulfilledReferenceDefinition=Only cases with fulfilled reference definition +caseFilterRelatedToEvent=Only cases with events +caseFilterOnlyFromOtherInstances=Only cases from other instances +caseFilterCasesWithReinfection=Only cases with reinfection +caseFilterOnlyCasesNotSharedWithExternalSurvTool=Only cases not yet shared with reporting tool +caseFilterOnlyCasesSharedWithExternalSurvToo=Only cases already shared with reporting tool +caseFilterOnlyCasesChangedSinceLastSharedWithExternalSurvTool=Only cases changed since last shared with reporting tool +caseFilterOnlyCasesWithDontShareWithExternalSurvTool=Only cases marked with 'Don't share with reporting tool' +caseFacilityDetailsShort=Facility name +caseNewCase=New case +casePlaceOfStay=Place of stay +caseActiveCases=Active cases +caseArchivedCases=Archived cases +caseAllActiveAndArchivedCases=All active and archived cases +caseDeletedCases=Deleted cases +caseTransferCase=Transfer case +caseTransferCases=Transfer cases +caseReferFromPointOfEntry=Refer case from point of entry +casePickCase=Pick an existing case +caseCreateCase=Create a new case +caseDefaultView=Default view +caseDetailedView=Detailed view +caseFollowupVisitsView=Follow-up +caseMinusDays=Previous +casePlusDays=Next +caseMergeDuplicates=Merge duplicates +caseBackToDirectory=Back to case directory +caseNewCaseDate=Report or onset date +caseNoDiseaseVariant=no disease variant +caseOpenCasesGuide=Open cases guide +caseOpenMergeGuide=Open merge guide +caseCalculateCompleteness=Calculate completeness +caseClassificationCalculationButton=Calculate case classification +caseNumberOfDuplicatesDetected=%d potential duplicates detected +caseConfirmCase=Confirm case +convertEventParticipantToCase=Create case from event participant with positive test result? +convertContactToCase=Create case from contact with positive test result? +caseSearchSpecificCase=Search specific case +caseSearchCase=Search case +caseSelect=Select case +caseCreateNew=Create new case +caseDataEnterHomeAddressNow=Enter home address of the case person now +caseCancelDeletion=Cancel case deletion +caseJurisdictionType=Jurisdiction type +CaseData=Case +CaseData.ageAndBirthDate=Age and birth date +CaseData.additionalDetails=General comment +CaseData.caseClassification=Case classification +CaseData.caseIdentificationSource=Case identification source +CaseData.screeningType=Screening +CaseData.clinicalConfirmation=Clinical confirmation +CaseData.community=Community +CaseData.epidemiologicalConfirmation=Epidemiological confirmation +CaseData.laboratoryDiagnosticConfirmation=Laboratory diagnostic confirmation +CaseData.caseConfirmationBasis=Basis for confirmation +CaseData.caseOfficer=Case officer +CaseData.caseOrigin=Case origin +CaseData.classificationComment=Classification comment +CaseData.classificationDate=Date of classification +CaseData.classificationUser=Classifying user +CaseData.classifiedBy=Classified by +CaseData.clinicalCourse=Clinical course +CaseData.clinicianName=Name of responsible clinician +CaseData.clinicianPhone=Phone number of responsible clinician +CaseData.clinicianEmail=Email address of responsible clinician +CaseData.contactOfficer=Contact officer +CaseData.dengueFeverType=Dengue fever type +CaseData.diseaseVariant=Disease variant +CaseData.diseaseDetails=Disease name +CaseData.district=District +CaseData.districtLevelDate=Date received at district level +CaseData.doses=How many doses +CaseData.epiData=Epidemiological data +CaseData.epidNumber=EPID number +CaseData.externalID=External ID +CaseData.externalToken=External Token +CaseData.internalToken=Internal Token +CaseData.facilityType=Facility type +CaseData.healthFacility=Facility +CaseData.healthFacilityDetails=Facility name & description +CaseData.hospitalization=Hospitalization +CaseData.investigatedDate=Date of investigation +CaseData.investigationStatus=Investigation status +CaseData.maternalHistory=Maternal history +CaseData.nationalLevelDate=Date received at national level +CaseData.noneHealthFacilityDetails=Place description +CaseData.notifyingClinic=Notifying clinic +CaseData.notifyingClinicDetails=Notifying clinic details +CaseData.numberOfVisits=Number of visits +CaseData.outcome=Outcome of case +CaseData.outcomeDate=Date of outcome +CaseData.person=Case person +CaseData.personUuid=Person ID +CaseData.personFirstName=First name +CaseData.personLastName=Last name +CaseData.plagueType=Plague type +CaseData.pointOfEntry=Point of entry +CaseData.pointOfEntryDetails=Point of entry name & description +CaseData.pointOfEntryName=Point of entry +CaseData.portHealthInfo=Port health +CaseData.postpartum=Postpartum +CaseData.pregnant=Pregnancy +CaseData.previousQuarantineTo=Previous quarantine end +CaseData.quarantineChangeComment=Quarantine change comment +CaseData.region=Region +CaseData.regionLevelDate=Date received at region level +CaseData.reportDate=Date of report +CaseData.reportingUser=Reporting user +CaseData.reportLat=Report GPS latitude +CaseData.reportLon=Report GPS longitude +CaseData.reportLatLonAccuracy=Report GPS accuracy in m +CaseData.sequelae=Sequelae +CaseData.sequelaeDetails=Sequelae Description +CaseData.smallpoxVaccinationReceived=Was a Smallpox vaccination received in the past? +CaseData.smallpoxVaccinationScar=Is a Smallpox vaccination scar present? +CaseData.smallpoxLastVaccinationDate=Date of last Smallpox vaccination +CaseData.vaccinationStatus=Vaccination status +CaseData.vaccinationStatusUpdate=Vaccination status update +CaseData.surveillanceOfficer=Responsible surveillance officer +CaseData.symptoms=Symptoms +CaseData.therapy=Therapy +CaseData.trimester=Trimester +CaseData.uuid=Case ID +CaseData.visits=Follow-up +CaseData.completeness=Completeness +CaseData.rabiesType=Rabies type +CaseData.healthConditions=Health conditions +CaseData.sharedToCountry=Share this case with the whole country +CaseData.quarantine=Quarantine +CaseData.quarantineTypeDetails=Quarantine details +CaseData.quarantineFrom=Quarantine start +CaseData.quarantineTo=Quarantine end +CaseData.quarantineHelpNeeded=Help needed in quarantine? +CaseData.quarantineHomePossible=Home-based quarantine possible? +CaseData.quarantineHomePossibleComment=Comment +CaseData.quarantineHomeSupplyEnsured=Supply ensured? +CaseData.quarantineHomeSupplyEnsuredComment=Comment +CaseData.quarantineOrderedVerbally=Quarantine ordered verbally? +CaseData.quarantineOrderedVerballyDate=Date of the verbal order +CaseData.quarantineOrderedOfficialDocument=Quarantine ordered by official document? +CaseData.quarantineOrderedOfficialDocumentDate=Date of the official document order +CaseData.quarantineExtended=Quarantine period extended? +CaseData.quarantineReduced=Quarantine period reduced? +CaseData.quarantineOfficialOrderSent=Official quarantine order sent? +CaseData.quarantineOfficialOrderSentDate=Date official quarantine order was sent +CaseData.healthFacilityName=Health facility +CaseData.followUpComment=Follow-up status comment +CaseData.followUpStatus=Follow-up status +CaseData.followUpUntil=Follow-up until +CaseData.overwriteFollowUpUntil=Overwrite follow-up until date +CaseData.symptomJournalStatus=Symptom journal status +CaseData.eventCount=Number of events +CaseData.latestEventId=Latest event ID +CaseData.latestEventStatus=Latest event status +CaseData.latestEventTitle=Latest event title +CaseData.latestSampleDateTime=Latest collection date +CaseData.caseIdIsm=Case-ID ISM +CaseData.contactTracingFirstContactType=Type of contact +CaseData.contactTracingFirstContactDate=Date of Contact +CaseData.deletionReason=Reason for deletion +CaseData.otherDeletionReason=Reason for deletion details +CaseData.wasInQuarantineBeforeIsolation=Was the case in quarantine before isolation? +CaseData.quarantineReasonBeforeIsolation=Reason why the case was in quarantine before this isolation +CaseData.quarantineReasonBeforeIsolationDetails=Other reason +CaseData.endOfIsolationReason=Reason for end of isolation +CaseData.endOfIsolationReasonDetails=Other reason +CaseData.sormasToSormasOriginInfo=Shared by +CaseData.nosocomialOutbreak=Resulted from nosocomial outbreak +CaseData.infectionSetting=Infection setting +CaseData.prohibitionToWork=Prohibition to work +CaseData.prohibitionToWorkFrom=Prohibition to work from +CaseData.prohibitionToWorkUntil=Prohibition to work until +CaseData.reInfection=Reinfection +CaseData.previousInfectionDate=Previous infection date +CaseData.reportingDistrict=Reporting district +CaseData.bloodOrganOrTissueDonated=Blood/organ/tissue donation in the last 6 months +CaseData.notACaseReasonNegativeTest=Negative test result for disease +CaseData.notACaseReasonPhysicianInformation=Information provided by physician +CaseData.notACaseReasonDifferentPathogen=Verification of different pathogen +CaseData.notACaseReasonOther=Other +CaseData.notACaseReasonDetails=Reason details +CaseData.followUpStatusChangeDate=Date of follow-up status change +CaseData.followUpStatusChangeUser=Responsible user +CaseData.expectedFollowUpUntil=Expected follow-up until +CaseData.surveillanceToolLastShareDate=Last shared with reporting tool +CaseData.surveillanceToolShareCount=Reporting tool share count +CaseData.surveillanceToolStatus=Reporting tool status +CaseData.differentPlaceOfStayJurisdiction=Place of stay of this case differs from its responsible jurisdiction +CaseData.differentPointOfEntryJurisdiction=Point of entry of this case differs from its responsible / place of stay jurisdiction +CaseData.responsibleRegion=Responsible region +CaseData.responsibleDistrict=Responsible district +CaseData.responsibleCommunity=Responsible community +CaseData.dontShareWithReportingTool=Don't share this case with the external reporting tool +CaseData.responsibleDistrictName=Responsible district +CaseData.caseReferenceDefinition=Reference definition +CaseData.pointOfEntryRegion=Point of entry region +CaseData.pointOfEntryDistrict=Point of entry district +CaseData.externalData=External data +CaseData.reinfectionStatus=Reinfection status +CaseData.changeDate=Date of last change +CaseData.creationDate=Creation date +# CaseExport +CaseExport.address=Address +CaseExport.addressRegion=Address Region +CaseExport.addressDistrict=Address District +CaseExport.addressCommunity=Address Community +CaseExport.addressGpsCoordinates=GPS coordinates of the address +CaseExport.admittedToHealthFacility=Admitted as inpatient? +CaseExport.associatedWithOutbreak=Associated with outbreak? +CaseExport.ageGroup=Age group +CaseExport.burialInfo=Burial of case +CaseExport.country=Country +CaseExport.maxSourceCaseClassification=Classification of source case +CaseExport.contactWithRodent=Contact with rodent? +CaseExport.firstName=First name +CaseExport.id=Case SN +CaseExport.initialDetectionPlace=Place of initial detection +CaseExport.labResults=Lab results +CaseExport.lastName=Last name +CaseExport.sampleDates=Dates of sample collection +CaseExport.sampleTaken=Sample taken? +CaseExport.travelHistory=Travel history +CaseExport.numberOfPrescriptions=Number of prescriptions +CaseExport.numberOfTreatments=Number of treatments +CaseExport.numberOfClinicalVisits=Number of clinical assessments +CaseExport.sampleUuid1=Latest sample uuid +CaseExport.sampleDateTime1=Latest sample date time +CaseExport.sampleLab1=Latest sample laboratory +CaseExport.sampleResult1=Latest sample final laboratory result +CaseExport.sampleUuid2=2nd latest sample uuid +CaseExport.sampleDateTime2=2nd latest sample date time +CaseExport.sampleLab2=2nd latest sample laboratory +CaseExport.sampleResult2=2nd latest sample final laboratory result +CaseExport.sampleUuid3=3rd latest sample uuid +CaseExport.sampleDateTime3=3rd latest sample date time +CaseExport.sampleLab3=3rd latest sample laboratory +CaseExport.sampleResult3=3rd latest sample final laboratory result +CaseExport.otherSamples=Other samples taken +CaseExport.sampleInformation=Sample information +CaseExport.diseaseFormatted=Disease +CaseExport.quarantineInformation=Quarantine information +CaseExport.lastCooperativeVisitDate=Date of last cooperative visit +CaseExport.lastCooperativeVisitSymptomatic=Symptomatic at last cooperative visit? +CaseExport.lastCooperativeVisitSymptoms=Symptoms at last cooperative visit +CaseExport.traveled=Traveled outside of district +CaseExport.burialAttended=Visited a burial +CaseExport.reportingUserName=Reporting user +CaseExport.reportingUserRoles=Reporting user roles +CaseExport.followUpStatusChangeUserName=Responsible user +CaseExport.followUpStatusChangeUserRoles=Responsible user roles +# CaseHospitalization +CaseHospitalization=Hospitalization +CaseHospitalization.admissionDate=Date of visit or admission +CaseHospitalization.admittedToHealthFacility=Was patient admitted at the facility as an inpatient? +CaseHospitalization.dischargeDate=Date of discharge or transfer +CaseHospitalization.healthFacility=Hospital name +CaseHospitalization.hospitalizedPreviously=Was the patient hospitalized or did he/she visit a health clinic previously for this illness? +CaseHospitalization.isolated=Isolation +CaseHospitalization.isolationDate=Date of isolation +CaseHospitalization.leftAgainstAdvice=Left against medical advice +CaseHospitalization.previousHospitalizations=Previous hospitalizations +CaseHospitalization.intensiveCareUnit=Stay in the intensive care unit +CaseHospitalization.intensiveCareUnitStart=Start of the stay +CaseHospitalization.intensiveCareUnitEnd=End of the stay +CaseHospitalization.hospitalizationReason=Reason for hospitalization +CaseHospitalization.otherHospitalizationReason=Specify reason +# CaseImport +caseImportErrorDescription=Error description +caseImportMergeCase=Override existing case with changes from the imported case? +# CasePreviousHospitalization +CasePreviousHospitalization=Previous hospitalization +CasePreviousHospitalization.admissionAndDischargeDate=Date of admission & discharge +CasePreviousHospitalization.admittedToHealthFacility=Was patient admitted at the facility as an inpatient? +CasePreviousHospitalization.admissionDate=Date of admission +CasePreviousHospitalization.description=Description +CasePreviousHospitalization.dischargeDate=Date of discharge or transfer +CasePreviousHospitalization.editColumn=Edit +CasePreviousHospitalization.region=Region +CasePreviousHospitalization.district=District +CasePreviousHospitalization.community=Community +CasePreviousHospitalization.healthFacility=Hospital +CasePreviousHospitalization.healthFacilityDetails=Hospital name & description +CasePreviousHospitalization.isolated=Isolation +CasePreviousHospitalization.isolationDate=Date of isolation +CasePreviousHospitalization.prevHospPeriod=Period of hospitalization +CasePreviousHospitalization.hospitalizationReason=Reason for hospitalization +CasePreviousHospitalization.otherHospitalizationReason=Specify reason +CasePreviousHospitalization.intensiveCareUnit=Stay in the intensive care unit +CasePreviousHospitalization.intensiveCareUnitStart=Start of the stay +CasePreviousHospitalization.intensiveCareUnitEnd=End of the stay +# ClinicalVisit +clinicalVisitNewClinicalVisit=New clinical assessment +ClinicalVisit=Clinical assessment +ClinicalVisit.bloodPressure=Blood pressure +ClinicalVisit.heartRate=Heart rate +ClinicalVisit.temperature=Temperature +ClinicalVisit.visitDateTime=Date and time of visit +ClinicalVisit.visitingPerson=Attending clinician +ClinicalVisit.visitRemarks=Clinician remarks +ClinicalVisitExport.caseUuid=Case ID +ClinicalVisitExport.caseName=Case name +columnAdditionalTests=Additional tests +columnDiseaseShort=Disease +columnLastPathogenTest=Latest Pathogen test (CT/CQ-Value) +columnNumberOfPendingTasks=Pending tasks +columnVaccineName=Vaccine name +columnVaccineManufacturer=Vaccine manufacturer +# Community +Community=Community +Community.archived=Archived +Community.externalID=External ID +Community.region=Region +Community.district=District +Community.defaultInfrastructure=Default +communityActiveCommunities=Active communities +communityArchivedCommunities=Archived communities +communityAllCommunities=All communities +# Configuration +Configuration.Facilities=Facilities +Configuration.Outbreaks=Outbreaks +Configuration.PointsOfEntry=Points of Entry +Configuration.LineListing=Line Listing +# Contact +contactCancelFollowUp=Cancel follow-up +contactCaseContacts=Case contacts +contactContactsList=Contacts list +contactCreateContactCase=Create a case for this contact person +contactLostToFollowUp=Lost to follow-up +contactNewContact=New contact +contactOpenContactCase=Open case of this contact person +contactPersonVisits=All visits of contact person +contactRelated=Contact related +contactResumeFollowUp=Resume follow-up +contactSelect=Select contact +contactCreateNew=Create new contact +contactActiveContacts=Active contacts +contactArchivedContacts=Archived contacts +contactAllActiveAndArchiveContacts=All active and archived contacts +contactContactsOverview=Contacts +contactDetailedOverview=Detailed +contactDeletedContacts=Deleted contacts +contactFollowUpVisitsOverview=Follow-up Visits +contactMinusDays=Previous +contactPlusDays=Next +contactNoContactsForEventParticipant=There are no contacts for this event participant +contactOnlyFromOtherInstances=Only contacts from other instances +contactOnlyHighPriorityContacts=Only high priority contacts +contactChooseCase=Choose Case +contactRemoveCase=Remove Case +contactChangeCase=Change Case +contactChooseSourceCase=Choose Source Case +contactOnlyQuarantineHelpNeeded=Help needed in quarantine +contactOnlyWithExtendedQuarantine=Only contacts with extended quarantine +contactOnlyWithReducedQuarantine=Only contacts with reduced quarantine +contactIncludeContactsFromOtherJurisdictions=Include contacts from other jurisdictions +contactOnlyWithSharedEventWithSourceCase=Only contacts with source case linked to the specified event +contactOnlyWithSourceCaseInGivenEvent=Only contacts whose source case is linked to this event +contactFollowUpDay=Day +contactQuarantineNotOrdered=No quarantine ordered +contactPersonPhoneNumber=Contact Person's Phone Number +contactSourceCase=Source case +contactMergeDuplicates=Merge duplicates +contactBackToDirectory=Back to contact directory +contactOpenCasesGuide=Open contacts guide +contactOpenMergeGuide=Open merge guide +contactCalculateCompleteness=Calculate completeness +contactNumberOfDuplicatesDetected=%d potential duplicates detected +contactFilterWithDifferentRegion=Show duplicates with differing regions +Contact=Contact +Contact.additionalDetails=General comment +Contact.ageAndBirthDate=Age and birth date +Contact.caseClassification=Classification of the source case +Contact.caze=Source case +Contact.caze.ageSex=Age, sex +Contact.caze.caseClassification=Case classification +Contact.caze.person=Name +Contact.caze.symptomsOnset=Symptoms onset +Contact.caze.uuid=Case ID +Contact.cazeDisease=Disease of source case +Contact.cazeDiseaseVariant=Disease variant of source case +Contact.cazeDistrict=District of source case +Contact.community=Responsible community +Contact.completeness=Completeness +Contact.contactClassification=Contact classification +Contact.contactOfficer=Responsible contact officer +Contact.contactOfficerUuid=Responsible contact officer +Contact.contactIdentificationSource=Contact identification source +Contact.contactIdentificationSourceDetails=Contact identification source details +Contact.tracingApp=Tracing app +Contact.tracingAppDetails=Tracing app details, e.g. name +Contact.contactProximity=Type of contact +Contact.contactProximityLongForm=Type of contact - if multiple pick the closest contact proximity +Contact.contactStatus=Contact status +Contact.deletionReason=Reason for deletion +Contact.otherDeletionReason=Reason for deletion details +Contact.description=Description of how contact took place +Contact.disease=Disease of source case +Contact.district=Responsible district +Contact.epiData=Epidemiological data +Contact.externalID=External ID +Contact.externalToken=External Token +Contact.internalToken=Internal Token +Contact.personUuid=Person ID +Contact.firstContactDate=Date of first contact +Contact.firstName=First name of contact person +Contact.followUpComment=Follow-up status comment +Contact.followUpStatus=Follow-up status +Contact.followUpUntil=Follow-up until +Contact.symptomJournalStatus=Symptom journal status +Contact.lastContactDate=Date of last contact +Contact.lastName=Last name of contact person +Contact.latestEventId=Latest event ID +Contact.latestEventTitle=Latest event title +Contact.multiDayContact=Multi-day contact +Contact.numberOfVisits=Number of visits +Contact.person=Contact person +Contact.previousQuarantineTo=Previous quarantine end +Contact.quarantine=Quarantine +Contact.quarantineChangeComment=Quarantine change comment +Contact.quarantineTypeDetails=Quarantine details +Contact.quarantineFrom=Quarantine start +Contact.quarantineHelpNeeded=Help needed in quarantine? +Contact.quarantineTo=Quarantine end +Contact.region=Responsible region +Contact.relationDescription=Relationship description +Contact.relationToCase=Relationship with case +Contact.reportDateTime=Report date +Contact.reportingUser=Reporting user +Contact.reportLat=Report GPS latitude +Contact.reportLon=Report GPS longitude +Contact.reportLatLonAccuracy=Report GPS accuracy in m +Contact.resultingCase=Resulting case +Contact.resultingCaseUser=Resulting case assigned by +Contact.returningTraveler=Returning Traveler +Contact.uuid=Contact ID +Contact.visits=Follow-up visits +Contact.highPriority=High priority contact +Contact.immunosuppressiveTherapyBasicDisease=Immunosuppressive therapy or basic disease is present +Contact.immunosuppressiveTherapyBasicDiseaseDetails=Please specify +Contact.careForPeopleOver60=Is the person medically/nursingly active in the care of patients or people over 60 years of age? +Contact.diseaseDetails=Disease name +Contact.caseIdExternalSystem=Case ID in external system +Contact.caseOrEventInformation=Case or event information +Contact.contactProximityDetails=Additional information on the type of contact +Contact.contactCategory=Contact Category +Contact.overwriteFollowUpUntil=Overwrite follow-up until date +Contact.regionUuid=Contact or Case Region +Contact.districtUuid=Contact or Case District +Contact.communityUuid=Contact or Case Community +Contact.quarantineHomePossible=Home-based quarantine possible? +Contact.quarantineHomePossibleComment=Comment +Contact.quarantineHomeSupplyEnsured=Supply ensured? +Contact.quarantineHomeSupplyEnsuredComment=Comment +Contact.quarantineOrderedVerbally=Quarantine ordered verbally? +Contact.quarantineOrderedVerballyDate=Date of the verbal order +Contact.quarantineOrderedOfficialDocument=Quarantine ordered by official document? +Contact.quarantineOrderedOfficialDocumentDate=Date of the official document order +Contact.quarantineExtended=Quarantine period extended? +Contact.quarantineReduced=Quarantine period reduced? +Contact.quarantineOfficialOrderSent=Official quarantine order sent? +Contact.quarantineOfficialOrderSentDate=Date official quarantine order was sent +Contact.endOfQuarantineReason=Reason for end of quarantine +Contact.endOfQuarantineReasonDetails=Other reason +Contact.prohibitionToWork=Prohibition to work +Contact.prohibitionToWorkFrom=Prohibition to work from +Contact.prohibitionToWorkUntil=Prohibition to work until +Contact.reportingDistrict=Reporting district +Contact.followUpStatusChangeDate=Date of follow-up status change +Contact.followUpStatusChangeUser=Responsible user +Contact.expectedFollowUpUntil=Expected follow-up until +Contact.vaccinationStatus=Vaccination status +Contact.changeDate=Date of last change +Contact.creationDate=Creation date +# ContactExport +ContactExport.address=Address +ContactExport.addressDistrict=Address District +ContactExport.addressRegion=Address Region +ContactExport.addressCommunity=Address Community +ContactExport.burialAttended=Visited a burial +ContactExport.contactWithRodent=Contact with rodent? +ContactExport.directContactConfirmedCase=Direct contact with a confirmed case +ContactExport.directContactProbableCase=Direct contact with a probable or confirmed case +ContactExport.firstName=First name of contact person +ContactExport.lastCooperativeVisitDate=Date of last cooperative visit +ContactExport.lastCooperativeVisitSymptomatic=Symptomatic at last cooperative visit? +ContactExport.lastCooperativeVisitSymptoms=Symptoms at last cooperative visit +ContactExport.lastName=Last name of contact person +ContactExport.sourceCaseUuid=Source case ID +ContactExport.traveled=Traveled outside of district +ContactExport.travelHistory=Travel history +ContactExport.quarantineInformation=Quarantine information +ContactExport.reportingUserName=Reporting user +ContactExport.reportingUserRoles=Reporting user roles +ContactExport.followUpStatusChangeUserName=Responsible user +ContactExport.followUpStatusChangeUserRoles=Responsible user roles +# Customizable enums +CustomizableEnum.hasDetails=Show an additional details text field when this value is selected +CustomizableEnum.hasDetails.short=Has details +# Customizable enum values +customizableEnumValueAllDiseases=All diseases +customizableEnumValueDiseaseCount=%d diseases +customizableEnumValueNoProperties=No properties +customizableEnumValueActiveValues=Active values +customizableEnumValueInactiveValues=Inactive values +CustomizableEnumValue.dataType=Data type +CustomizableEnumValue.value=Value +CustomizableEnumValue.caption=Caption +CustomizableEnumValue.diseases=Diseases +CustomizableEnumValue.properties=Properties +CustomizableEnumValue.active=Active +# Dashboard +dashboardAlive=Alive +dashboardApplyCustomFilter=Apply custom filter +dashboardCanceledFollowUp=Canceled follow-up +dashboardCanceledFollowUpShort=Canceled F/U +dashboardCaseFatalityRateShort=CFR +dashboardCasesIn=Cases in +dashboardComparedTo=compared to +dashboardComparedToPreviousPeriod=%s compared to %s +dashboardCompletedFollowUp=Completed follow-up +dashboardCompletedFollowUpShort=Completed F/U +dashboardConfirmed=Confirmed +dashboardConfirmedContact=Confirmed contact +dashboardConfirmedNoSymptoms=Confirmed no symptoms +dashboardConfirmedUnknownSymptoms=Confirmed unknown symptoms +dashboardConvertedToCase=Converted to case +dashboardCooperative=Cooperative +dashboardCustom=Custom +dashboardCustomPeriod=Custom period +dashboardData=Data +dashboardDead=Dead +dashboardDiscarded=Discarded +dashboardDiseaseBurdenInfo=Disease Burden Information +dashboardDiseaseBurdenOutbreakDistricts=Outbreak Districts +dashboardDiseaseCarouselSlideShow=slide show +dashboardDiseaseDifference=Difference in Number of Cases +dashboardDiseaseDifferenceYAxisLabel=Difference +dashboardDone=Done +dashboardFatalities=Fatalities +dashboardFollowUpUntilShort=F/U Until +dashboardGrouping=Grouping +dashboardGt1ConfirmedCases=> 1 Confirmed Cases +dashboardGt1ProbableCases=> 1 Probable Cases +dashboardGt1SuspectCases=> 1 Suspect Cases +dashboardGtThreeDays=> 3 Days +dashboardFacilities=Facilities +dashboardHideOtherCountries=Hide other countries +dashboardHideOverview=Hide overview +dashboardHigh=High +dashboardIndeterminate=Indeterminate +dashboardNotDone=Not done +dashboardInvestigated=Investigated +dashboardLastVisitGt48=Last Visit > 48h or No Visit +dashboardLastVisitLt24=Last Visit < 24h +dashboardLastVisitLt48=Last Visit < 48h +dashboardLastWeek=Last epi week\: %s +dashboardLastYear=Last year +dashboardLostToFollowUp=Lost to follow-up +dashboardLostToFollowUpShort=Lost To F/U +dashboardLow=Low +dashboardMapKey=Map Key +dashboardMapLayers=Layers +dashboardMapShowEpiSituation=Show epidemiological situation +dashboardMissed=Missed +dashboardNegative=Negative +dashboardNeverVisited=Never visited +dashboardNew=New +dashboardNewCases=New Cases +dashboardNewEvents=New Events +dashboardNewFinalLaboratoryResults=Final Laboratory Results +dashboardNoPopulationData=No population data available +dashboardNormal=Normal +dashboardNotACase=Not A Case +dashboardNotAContact=Not a contact +dashboardNotAnEvent=Not An Event +dashboardNotExecutable=Not Executable +dashboardNotVisitedFor=Contacts not visited for... +dashboardNotYetClassified=Not Yet Classified +dashboardNotYetClassifiedOnly=Only Not Yet Classified Cases +dashboardNumberOfCases=Number of Cases +dashboardNumberOfContacts=Number of Contacts +dashboardNumberOfSamples=Number of Samples +dashboardOneDay=1 Day +dashboardOutbreak=Outbreak +dashboardPending=Pending +dashboardPositive=Positive +dashboardPossible=Possible +dashboardProbable=Probable +dashboardReceived=Received +dashboardRemoved=Removed +dashboardRumor=Signal +dashboardSelectPeriod=Select Period +dashboardShipped=Shipped +dashboardShowAllDiseases=Show All Diseases +dashboardShowCases=Show cases +dashboardShowConfirmedContacts=Show confirmed contacts +dashboardShowContacts=Show contacts +dashboardShowEvents=Show events +dashboardShowFirstDiseases=Show First 6 Diseases +dashboardShowMinimumEntries=Always show at least 7 entries +dashboardShowRegions=Show regions +dashboardShowUnconfirmedContacts=Show unconfirmed contacts +dashboardSuspect=Suspect +dashboardSymptomatic=Symptomatic +dashboardThisWeek=This epi week\: %s +dashboardThisYear=This year\: %s +dashboardThreeDays=3 Days +dashboardToday=Today\: %s +dashboardTotal=Total +dashboardTwoDays=2 Days +dashboardUnavailable=Unavailable +dashboardUnconfirmed=Unconfirmed +dashboardUnconfirmedContact=Unconfirmed contact +dashboardUncooperative=Uncooperative +dashboardUnderFollowUp=Under follow-up +dashboardUnderFollowUpShort=Under F/U +dashboardUnknown=Unknown +dashboardYesterday=Yesterday\: %s +dashboardDayBefore=The day before\: %s +dashboardWeekBefore=The epi week before\: %s +dashboardPeriodBefore=The period before\: %s +dashboardSameDayLastYear=Same day last year\: %s +dashboardSameWeekLastYear=Same epi week last year\: %s +dashboardSamePeriodLastYear=Same period last year\: %s +dashboardLastReport=Last report\: +dashboardFollowUpStatusChart=Follow-up Status Chart +dashboardContactClassificationChart=Contact Classification Chart +dashboardFollowUpUntilChart=Follow-Up Until Chart +dashboardShowPercentageValues=Show percentage values +dashboardShowTotalValues=Show total values +dashboardShowDataLabels=Show data labels +dashboardHideDataLabels=Hide data labels +dashboardAggregatedNumber=Count +dashboardProportion=Proportion (%) +dashboardViewAsColumnChart=View as Column Chart +dashboardViewAsBarChart=View as Bar Chart +#SampleDashboard +sampleDashboardAllSamples=All Samples +sampleDashboardFinalLabResults=Final Laboratory Results +sampleDashboardSamplePurpose=Purpose of Sample +sampleDashboardSpecimenCondition=Specimen Condition +sampleDashboardShipmentStatus=Shipment Status +sampleDashboardTestResults=Test Results +sampleDashboardCaseSamples=Case Samples +sampleDashboardContactSamples=Contact Samples +sampleDashboardEventParticipantSamples=Event Participant Samples +sampleDashboardEnvironmentsSamples=Environment Samples +sampleDashboardShowCaseSamples=Show Case Samples +sampleDashboardShowContactSamples=Show Contact Samples +sampleDashboardShowEventParticipantSamples=Show Event Participant Samples +sampleDashboardShowEnvironmentSamples=Show Environment Samples +captionDefault=Default +defaultRegion=Default Region +defaultDistrict=Default District +defaultCommunity=Default Community +defaultFacility=Default Facility +defaultLaboratory=Default Laboratory +defaultPointOfEntry=Default Point Of Entry +devModeCaseCount=Number of generated cases +devModeCaseDisease=Disease of the cases +devModeCaseDistrict=District of the cases +devModeCaseEndDate=Latest case start date +devModeCaseRegion=Region of the cases +devModeCaseStartDate=Earliest case start date +devModeContactCount=Number of generated contacts +devModeContactDisease=Disease of the contacts +devModeContactDistrict=District of the contacts +devModeContactEndDate=Latest contact start date +devModeContactRegion=Region of the contacts +devModeContactStartDate=Earliest contact start date +devModeContactCreateWithoutSourceCases=Create contacts without source cases +devModeContactCreateWithResultingCases=Create some contacts with resulting cases +devModeContactCreateMultipleContactsPerPerson=Create multiple contacts per person +devModeContactCreateWithVisits=Create visits for the contacts +devModeEventCasePercentage=Percentage of cases among participants +devModeEventCount=Number of generated Events +devModeEventDisease=Event Disease +devModeEventDistrict=District of the events +devModeEventEndDate=Latest event start date +devModeEventMaxContacts=Max contacts per participant +devModeEventMaxParticipants=Max participants per event +devModeEventMinContacts=Min contacts per participant +devModeEventMinParticipants=Min participants per event +devModeEventRegion=Region of the events +devModeEventStartDate=Earliest event start date +devModeSampleCount=Number of generated Samples +devModeSampleStartDate=Sample collected start date +devModeSampleEndDate=Sample collected end date +devModeSamplePathogenTestsToBePerformed=Request pathogen tests to be performed +devModeSampleAdditionalTestsToBePerformed=Request additional tests to be performed +devModeSampleExternalLabTesting=External Lab Testing +devModeSampleSendDispatch=Send/Dispatch +devModeSampleReceived=Received +devModeSampleComment=Comment +devModeSampleDisease=Disease of the sample +devModeSampleRegion=Region of the cases +devModeSampleDistrict=District of the sample +devModeSampleMaterial=Type of the sample +devModeSampleLaboratory=Laboratory +devModeGenerateCases=Generate Cases +devModeGenerateContacts=Generate Contacts +devModeGenerateEvents=Generate Events +devModeGenerateSamples=Generate Samples +devModeGeneratorSeed=Generator Seed +devModeLoadDefaultConfig=Load default config +devModeLoadPerformanceTestConfig=Load performance testing config +devModeUseSeed=Use Seed +DiseaseBurden.caseCount=New cases +DiseaseBurden.caseDeathCount=Fatalities +DiseaseBurden.casesDifference=Dynamic +DiseaseBurden.caseFatalityRate=CFR +DiseaseBurden.eventCount=Number of events +DiseaseBurden.outbreakDistrictCount=Outbreak districts +DiseaseBurden.previousCaseCount=Previous cases +# District +districtActiveDistricts=Active districts +districtArchivedDistricts=Archived districts +districtAllDistricts=All districts +District=District +District.archived=Archived +District.epidCode=Epid code +District.growthRate=Growth rate +District.population=Population +District.externalID=External ID +District.region=Region +District.defaultInfrastructure=Default +epiDataNoSourceContacts=No source contacts have been created for this case +EpiData=Epidemiological data +EpiData.areaInfectedAnimals=Residing, working or travelling to an area where infected animals have been confirmed +EpiData.exposureDetailsKnown=Exposure details known +EpiData.exposures=Exposures +EpiData.activityAsCaseDetailsKnown=Activity details known +EpiData.activitiesAsCase=Activities as case +EpiData.highTransmissionRiskArea=Residing or working in an area with high risk of transmission of the disease, e.g. closed residential and camp-like settings +EpiData.largeOutbreaksArea=Residing or travelling to countries/territories/areas experiencing larger outbreaks of local transmission +EpiData.contactWithSourceCaseKnown=Contacts with source case known +# Documents +documentUploadDocument=New document +documentNoDocuments=There are no documents for this %s +bulkActionCreatDocuments=Create quarantine order documents +# DocumentTemplate +DocumentTemplate=Document Template +DocumentTemplate.buttonUploadTemplate=Upload Template +DocumentTemplate.documentTemplateGuide=Document Template Guide +DocumentTemplate.plural=Document Templates +DocumentTemplate.EventHandout=Event Handout +DocumentTemplate.EventHandout.create=Create Event Handout +DocumentTemplate.QuarantineOrder=Quarantine Order +DocumentTemplate.QuarantineOrder.create=Create Quarantine Order +DocumentTemplate.QuarantineOrder.templates=Quarantine Order Templates +DocumentTemplate.uploadWorkflowTemplate=Upload %s +DocumentTemplate.uploadTemplate=Upload Template +DocumentTemplate.exampleTemplateCases=Example Template Cases +DocumentTemplate.exampleTemplateContacts=Example Template Contacts +DocumentTemplate.exampleTemplateEventHandout=Example Template Event Handout +DocumentTemplate.exampleTemplateEventParticipants=Example Template Event Participants +DocumentTemplate.exampleTemplateTravelEntries=Example Template Travel Entries +DocumentTemplate.exampleTemplateCaseEmail=Example Template Case Email +DocumentTemplate.exampleTemplateContactEmail=Example Template Contact Email +DocumentTemplate.exampleTemplateEventParticipantEmail=Example Template Event Participant Email +DocumentTemplate.exampleTemplateTravelEntryEmail=Example Template Travel Entry Email +DocumentTemplate.uploadGeneratedDocumentToEntity=Also upload the generated document to this entity +DocumentTemplate.uploadGeneratedDocumentsToEntities=Also upload the generated documents to the selected entities +DocumentTemplate.documentUploadWarning=Document upload warning +DocumentTemplate.fileTooBig=The documents were successfully generated, but at least one document could not be uploaded to its entity because its file size exceeds the specified file size limit of %dMB +DocumentTemplate.notUploaded=Documents could not be uploaded to the following entities\: + +# Environment +Environment=Environment +Environment.uuid=Environment ID +Environment.reportDate=Report date +Environment.reportingUser=Reporting user +Environment.environmentName=Environment name +Environment.description=Description +Environment.externalId=External ID +Environment.responsibleUser=Responsible user +Environment.investigationStatus=Investigation status +Environment.environmentMedia=Environment media +Environment.waterType=Water type +Environment.otherWaterType=Other water type +Environment.infrastructureDetails=Infrastructure details +Environment.otherInfrastructureDetails=Other infrastructure details +Environment.waterUse=Water use +Environment.otherWaterUse=Other water use +Environment.location=Location + +environmentActiveEnvironments=Active environments +environmentArchivedEnvironments = Archived environments +environmentAllActiveAndArchivedEnvironments = All active and archived environments +environmentDeletedEnvironments = Deleted environments +environmentNewEnvironment= New environment +environmentEnvironmentsList=Environments list + +# EnvironmentSample +EnvironmentSample = Environment Sample +EnvironmentSample.uuid = Sample ID +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 °C) +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.positivePathogenTests = Positive pathogen tests +EnvironmentSample.latestPathogenTest = Latest pathogen test +EnvironmentSample.numberOfTests = Number of tests + +# Event +eventActiveEvents=Active events +eventArchivedEvents=Archived events +eventAllActiveAndArchivedEvents=All active and archived events +eventActiveGroups=Active groups +eventArchivedGroups=Archived groups +eventDeletedEvents = Deleted events +eventAllGroups=All groups +eventEventActions=Event actions +eventEventParticipants=Event participants +eventEventsList=Events list +eventEvolutionDateWithStatus=%s evolution date +eventEvolutionCommentWithStatus=Nature of the %s evolution +eventNewEvent=New event +eventNewEventGroup=New event group +eventSearchEvent=Search event +eventSearchSpecificEvent=Search specific Event +linkEvent=Link event +linkEventGroup=Link event group +eventSelect=Select event +eventSelectGroup=Select event group +eventDefaultView=Events +eventActionsView=Actions +eventGroupsView=Groups +eventNoEventLinkedToCase=No event linked to case +eventNoEventLinkedToEventGroup=No event linked to event group +eventNoEventLinkedToContact=No event linked to contact +eventOnlyWithContactSourceCaseInvolved=Only events in which the contact's source case is involved +eventLinkToCases=See event cases +eventLinkToContacts=See event contacts +eventSubordinateEvents=Subordinate Events +eventSuperordinateEvent=Superordinate Event +eventUnlinkEvent=Unlink event +eventUnlinkEventGroup=Unlink event group +eventGroupListEvents=Navigate to event directory filtered on this event group +eventOpenSuperordinateEvent=Open event +eventEditEvent=Edit event +eventEditEventGroup=Edit event group +eventLinkToEventsWithinTheSameFacility=See events within the same facility +eventNoDisease=No disease +eventGroups=Event groups +eventGroupsMultiple=This event is related to %s event groups +eventFilterOnlyEventsNotSharedWithExternalSurvTool=Only events not yet shared with reporting tool +eventFilterOnlyEventsSharedWithExternalSurvTool=Only events already shared with reporting tool +eventFilterOnlyEventsChangedSinceLastSharedWithExternalSurvTool=Only events changed since last shared with reporting tool +Event=Event +Event.caseCount=Cases +Event.contactCount=Contacts +Event.contactCountMethod=Contact Count Method +Event.contactCountSourceInEvent=Contacts with source case in event +Event.deathCount=Fatalities +Event.deletionReason=Reason for deletion +Event.otherDeletionReason=Reason for deletion details +Event.diseaseDetails=Disease name +Event.diseaseShort=Disease +Event.diseaseVariant=Disease variant +singleDayEventDate=Date of event +singleDayEventEvolutionDate=Evolution date of event +Event.startDate=Start date +Event.eventActions=Event actions +Event.endDate=End date +Event.multiDayEvent=Multi-day event +Event.externalId=External ID +Event.externalToken=External Token +Event.eventTitle=Title +Event.eventDesc=Description +Event.nosocomial=Nosocomial +Event.eventInvestigationEndDate=Investigation end date +Event.eventInvestigationStartDate=Investigation start date +Event.eventInvestigationStatus=Investigation status +Event.eventLocation=Event location +Event.eventParticipants=Event participants +Event.eventStatus=Event status +Event.eventManagementStatus=Event management status +Event.eventIdentificationSource=Event identification source +Event.participantCount=Participants +Event.eventType=Event type +Event.informationSource=Source of information +Event.meansOfTransport=Means of transport +Event.meansOfTransportDetails=Means of transport details +Event.connectionNumber=Connection number +Event.travelDate=Travel date +Event.workEnvironment=Work environment +Event.numberOfPendingTasks=Pending tasks +Event.reportDateTime=Date of report +Event.reportingUser=Reporting user +Event.riskLevel=Epidemiological risk level +Event.specificRisk=Other specific risk +Event.evolutionDate=Evolution date +Event.evolutionComment=Nature of the evolution +Event.srcType=Source type +Event.srcEmail=Email +Event.srcInstitutionalPartnerType=Source institutional partner +Event.srcInstitutionalPartnerTypeDetails=Source institutional partner details +Event.srcFirstName=Source first name +Event.srcLastName=Source last name +Event.srcTelNo=Source telephone no +Event.srcMediaWebsite=Source media Website +Event.srcMediaName=Source media name +Event.srcMediaDetails=Source media details +Event.responsibleUser=Responsible user +Event.typeOfPlace=Type of place +Event.typeOfPlaceText=Specify other event place +Event.uuid=Event ID +Event.transregionalOutbreak=Transregional outbreak +Event.diseaseTransmissionMode=Primary mode of transmission +Event.infectionPathCertainty=Certainty of infection path +Event.humanTransmissionMode=Mode of human to human transmission +Event.parenteralTransmissionMode=Mode of parenteral transmission +Event.medicallyAssociatedTransmissionMode=Mode of medically associated transmission +Event.epidemiologicalEvidence=Epidemiological evidence +Event.laboratoryDiagnosticEvidence=Laboratory diagnostic evidence +Event.internalToken=Internal Token +Event.eventGroups=Groups +Event.latestEventGroup=Latest Event Group +Event.eventGroupCount=Event Group Count +Event.region=Region +Event.district=District +Event.community=Community +Event.changeDate=Date of last change +Event.creationDate=Creation date +# Event action +EventAction.eventUuid=Event id +EventAction.eventTitle=Event title +EventAction.eventDisease=Disease +EventAction.eventDiseaseVariant=Disease variant +EventAction.eventDiseaseDetails=Disease name +EventAction.eventIdentificationSource=Event identification source +EventAction.eventStatus=Event status +EventAction.eventRiskLevel=Event epidemiological risk level +EventAction.eventInvestigationStatus=Event investigation status +EventAction.eventEvolutionDate=Event evolution date +EventAction.eventEvolutionComment=Event evolution nature +EventAction.eventReportingUser=Event reporting user +EventAction.eventResponsibleUser=Event responsible user +EventAction.actionTitle=Action title +EventAction.actionDate=Action date +EventAction.actionCreationDate=Action creation date +EventAction.actionChangeDate=Action change date +EventAction.actionStatus=Action status +EventAction.actionPriority=Action priority +EventAction.actionLastModifiedBy=Action last modified by +# Event action export +EventActionExport.eventDate=Date of event +#Event export +# EventParticipant +eventParticipantAddPerson=Add participant +eventParticipantContactCountOnlyWithSourceCaseInEvent=Only counts contacts whose source case is related to this event +eventParticipantSelect=Select event participant +eventParticipantCreateNew=Create new event participant +eventParticipantDeletedEventParticipants = Deleted event participants +eventParticipantActiveEventParticipants=Active event participants +eventParticipantActiveAndArchivedEventParticipants=Active and archived event participants +eventParticipantArchivedEventParticipants=Archived event participants +EventParticipant=Event participant +EventParticipant.contactCount=Contact count +EventParticipant.deletionReason=Reason for deletion +EventParticipant.otherDeletionReason=Reason for deletion details +EventParticipant.event=Event +EventParticipant.caseUuid=Case ID +EventParticipant.approximateAge=Age +EventParticipant.name=Name +EventParticipant.sex=Sex +EventParticipant.responsibleRegion=Responsible Region +EventParticipant.responsibleDistrict=Responsible District +EventParticipant.personUuid=Person ID +EventParticipant.involvementDescription=Involvement description +EventParticipant.person=Event participant person +EventParticipant.uuid=Event participant ID +EventParticipant.region=Responsible region +EventParticipant.district=Responsible district +EventParticipant.vaccinationStatus=Vaccination status +EventParticipant.changeDate=Date of last change +EventParticipant.creationDate=Creation date +#EventParticipant export +EventParticipantExport.eventParticipantU=Event disease +EventParticipantExport.eventDisease=Event disease +EventParticipantExport.eventTypeOfPlace=Event type +EventParticipantExport.eventStartDate=Event start date +EventParticipantExport.eventEndDate=Event end date +EventParticipantExport.eventTitle=Event title +EventParticipantExport.eventDescription=Event description +EventParticipantExport.eventRegion=Event region +EventParticipantExport.eventDistrict=Event district +EventParticipantExport.eventCommunity=Event community +EventParticipantExport.eventCity=Event city +EventParticipantExport.eventStreet=Event street +EventParticipantExport.eventHouseNumber=Event house number +EventParticipantExport.ageGroup=Age group +EventParticipantExport.addressRegion=Address Region +EventParticipantExport.addressDistrict=Address District +EventParticipantExport.addressCommunity=Address Community +EventParticipantExport.addressGpsCoordinates=GPS coordinates of the address +EventParticipantExport.burialInfo=Burial of person +EventParticipantExport.sampleInformation=Sample information +EventParticipantExport.personNationalHealthId=Person National Health Id +EventParticipantExport.eventParticipantInvolvmentDescription=Involvment description +EventParticipantExport.eventParticipantUuid=Event participant ID +#Event Participant Selection +EventParticipantSelection.eventParticipantUuidLink = Event participant ID +EventParticipantSelection.eventUuidLink = Event ID +EventParticipantSelection.resultingCaseUuidLink = Resulting case ID +# Event Group +EventGroup=Event group +EventGroup.uuid=Group id +EventGroup.name=Group name +EventGroup.eventCount=Event count +# Expo +export=Export +exportBasic=Basic Export +exportDetailed=Detailed Export +exportCustom=Custom Export +exportFollowUp=Follow-up Export +exportInfrastructureData=Infrastructure data +exportSamples=Sample export +exportSelectSormasData=Select all SORMAS data +exportSormasData=SORMAS data +exportCaseManagement=Case Management Export +exportCaseCustom=Custom Case Export +exportNewExportConfiguration=New Export Configuration +exportEditExportConfiguration=Edit Export Configuration +exportConfigurationData=Configuration data +exportExternalData=External data +ExportConfiguration.NAME=Configuration name +ExportConfiguration.myExports=My exports +ExportConfiguration.sharedExports=Shared exports +ExportConfiguration.sharedToPublic=Shared to public +exposureFlightNumber=Flight number +exposureTimePeriod=Time period +exposureSourceCaseName=Name of source case +Exposure=Exposure +Exposure.probableInfectionEnvironment=Probable infection environment +Exposure.startDate=Start of exposure +Exposure.endDate=End of exposure +Exposure.exposureType=Type of activity +Exposure.exposureTypeDetails=Type of activity details +Exposure.location=Location +Exposure.typeOfPlace=Type of place +Exposure.typeOfPlaceDetails=Type of place details +Exposure.meansOfTransport=Means of transport +Exposure.meansOfTransportDetails=Means of transport details +Exposure.connectionNumber=Connection number +Exposure.seatNumber=Seat number +Exposure.workEnvironment=Work environment +Exposure.indoors=Indoors +Exposure.outdoors=Outdoors +Exposure.wearingMask=Wearing mask +Exposure.wearingPpe=Wearing appropriate PPE +Exposure.otherProtectiveMeasures=Other protective measures +Exposure.protectiveMeasuresDetails=Protective measures details +Exposure.shortDistance=< 1.5 m distance +Exposure.longFaceToFaceContact=> 15 min face-to-face contact +Exposure.animalMarket=Animal market +Exposure.percutaneous=Percutaneous exposure +Exposure.contactToBodyFluids=Contact to blood or body fluids +Exposure.handlingSamples=Handling samples (animal or human) +Exposure.eatingRawAnimalProducts=Eating raw or undercooked animal products +Exposure.handlingAnimals=Handling or butchering animals (or their remains) +Exposure.animalCondition=Condition of the animal +Exposure.animalVaccinated=Animal vaccinated +Exposure.animalContactType=Kind of contact to the animal +Exposure.animalContactTypeDetails=Kind of contact details +Exposure.contactToCase=Contact to source case +Exposure.gatheringType=Type of gathering +Exposure.gatheringDetails=Type of gathering details +Exposure.habitationType=Type of habitation +Exposure.habitationDetails=Type of habitation details +Exposure.typeOfAnimal=Type of animal +Exposure.typeOfAnimalDetails=Type of animal details +Exposure.physicalContactDuringPreparation=Has had direct physical contact during burial preparation ritual +Exposure.physicalContactWithBody=Has had direct physical contact with the (deceased) case at a funeral +Exposure.deceasedPersonIll=Was the deceased person ill? +Exposure.deceasedPersonName=Name of the deceased person +Exposure.deceasedPersonRelation=Relation to the deceased person +Exposure.bodyOfWater=Contact with body of water +Exposure.waterSource=Water source +Exposure.waterSourceDetails=Water source details +Exposure.prophylaxis=Post-exposure prophylaxis +Exposure.prophylaxisDate=Date of prophylaxis +Exposure.riskArea=Risk area as defined by public health institution +Exposure.exposureDate=Exposure date +Exposure.exposureRole=Role +Exposure.largeAttendanceNumber=More than 300 attendees +# Facility +facilityActiveFacilities=Active facilities +facilityArchivedFacilities=Archived facilities +facilityAllFacilities=All facilities +Facility.CONFIGURED_FACILITY=Configured facility +Facility.NO_FACILITY=Home or other place +Facility.OTHER_FACILITY=Other facility +Facility=Facility +Facility.additionalInformation=Additional information +Facility.archived=Archived +Facility.areaType=Area type (urban/rural) +Facility.city=City +Facility.community=Community +Facility.district=District +Facility.externalID=External ID +Facility.houseNumber=House number +Facility.latitude=Latitude +Facility.longitude=Longitude +Facility.postalCode=Postal code +Facility.street=Street +Facility.name=Name +Facility.publicOwnership=Public ownership +Facility.region=Region +Facility.type=Facility type +Facility.typeGroup=Facility category +Facility.contactPersonFirstName=Contact person first name +Facility.contactPersonLastName=Contact person last name +Facility.contactPersonPhone=Contact person phone number +Facility.contactPersonEmail=Contact person email address +Facility.defaultInfrastructure=Default +FeatureConfiguration.districtName=District +FeatureConfiguration.enabled=Line listing enabled? +FeatureConfiguration.endDate=End date +# Formats +formatNumberOfVisitsFormat=%d (%d missed) +formatNumberOfVisitsLongFormat=%d visits (%d missed) +formatSimpleNumberFormat=%d +# FollowUp +FollowUp.person=Follow-up person +FollowUp.reportDate=Date of report +FollowUp.followUpUntil=Follow-up until +# HealthConditions +HealthConditions=Health conditions +HealthConditions.tuberculosis=Tuberculosis +HealthConditions.asplenia=Asplenia +HealthConditions.hepatitis=Hepatitis +HealthConditions.diabetes=Diabetes +HealthConditions.hiv=HIV +HealthConditions.hivArt=Patient on ART? +HealthConditions.chronicLiverDisease=Liver disease +HealthConditions.malignancyChemotherapy=Malignancy +HealthConditions.chronicHeartFailure=Chronic heart failure +HealthConditions.chronicPulmonaryDisease=Chronic pulmonary disease +HealthConditions.chronicKidneyDisease=Renal disease +HealthConditions.chronicNeurologicCondition=Chronic neurological/neuromuscular disease +HealthConditions.congenitalSyphilis=Congenital syphilis +HealthConditions.downSyndrome=Down syndrome +HealthConditions.otherConditions=Additional relevant pre-existing conditions +HealthConditions.immunodeficiencyOtherThanHiv=Immunodeficiency other than HIV +HealthConditions.cardiovascularDiseaseIncludingHypertension=Cardiovascular disease including hypertension +HealthConditions.obesity=Obesity +HealthConditions.currentSmoker=Current smoker +HealthConditions.formerSmoker=Former smoker +HealthConditions.asthma=Asthma +HealthConditions.sickleCellDisease=Sickle cell disease +HealthConditions.immunodeficiencyIncludingHiv=Immunodeficiency including HIV +# Import +importDetailed=Detailed Import +importDownloadCaseImportTemplate=Download Case Import Template +importDownloadImportTemplate=Download Import Template +importDownloadDataDictionary=Download Data Dictionary +importDownloadErrorReport=Download Error Report +importDownloadImportGuide=Download Import Guide +importDuplicates=%d Skipped as Duplicates +importErrorDescription=Error description +importErrors=%d Error(s) +importImportData=Start Data Import +importImports=%d Imported +importLineListing=Line Listing Import +importProcessed=%d/%d Processed +importSkips=%d Skipped +importValueSeparator=Value separator +importCancelImport=Cancel import +infrastructureImportAllowOverwrite=Overwrite existing entries with imported data +#External Message +ExternalMessage=Message +ExternalMessage.labMessageDetails=Message details +ExternalMessage.labSampleId=Lab sample ID +ExternalMessage.messageDateTime=Message date +ExternalMessage.personBirthDateDD=Day of birth +ExternalMessage.personBirthDateMM=Month of birth +ExternalMessage.personBirthDateYYYY=Year of birth +ExternalMessage.personCity=City +ExternalMessage.personFirstName=First name +ExternalMessage.personHouseNumber=House number +ExternalMessage.personLastName=Last name +ExternalMessage.personBirthDate=Birth date +ExternalMessage.personPostalCode=Postal code +ExternalMessage.personSex=Sex +ExternalMessage.personStreet=Street +ExternalMessage.status=Status +ExternalMessage.sampleDateTime=Date sample was collected +ExternalMessage.sampleMaterial=Type of sample +ExternalMessage.sampleReceivedDate=Sample received +ExternalMessage.specimenCondition=Specimen condition +ExternalMessage.disease=Disease +ExternalMessage.diseaseVariant=Disease variant +ExternalMessage.diseaseVariantDetails=Disease variant details +ExternalMessage.reporterCity=Reporter city +ExternalMessage.labExternalId=Lab external ID +ExternalMessage.reporterName=Reporter name +ExternalMessage.reporterPostalCode=Reporter postal code +externalMessage.deleteNewlyCreatedCase=Delete new case you just created +externalMessage.deleteNewlyCreatedContact=Delete new contact you just created +externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created +ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID +ExternalMessage.sampleOverallTestResult=Overall test result +ExternalMessage.assignee=Assignee +ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report +ExternalMessage.caseReportDate=Case report date +ExternalMessage.personExternalId=External ID +ExternalMessage.personNationalHealthId=National health ID +ExternalMessage.personPhoneNumberType=Phone number type +ExternalMessage.personCountry=Country +externalMessageFetch=Fetch messages +externalMessageProcess=Process +externalMessageNoDisease=No disease found +externalMessageNoNewMessages=No new messages available +externalMessageForwardedMessageFound=Related forwarded message(s) found +externalMessagesList=Messages list +externalMessageRelatedEntriesFound=Related entries found +externalMessageCriteria.messageDateFrom=Message date from... +ExternalMessageCriteria.messageDateTo=... to +ExternalMessageCriteria.birthDateFrom=Birth date from... +ExternalMessageCriteria.birthDateTo=... to +externalMessageValueNotSpecified=Value not specified in external message + +#Physician report +physiciansReportCaseImmunizations=Immunizations +physiciansReportCaseAddVaccination=Add vaccination +#Line listing +lineListing=Line listing +lineListingAddLine=Add line +lineListingDiseaseOfSourceCase=Disease of source case +lineListingInfrastructureData=Take over infrastructure data from last line +lineListingNewCasesList=List of new cases +lineListingNewContactsList=List of new contacts +lineListingNewEventParticipantsList = List of new event participants +lineListingSharedInformation=Shared information +lineListingEdit=Edit line listing +lineListingDisableAll=Disable all line listing +lineListingEnableForDisease=Enable line listing for disease +lineListingEnableAll=Enable all +lineListingDisableAllShort=Disable all +lineListingEndDate=End date +lineListingSetEndDateForAll=Set end date for all +# Location +Location=Location +Location.additionalInformation=Additional information +Location.addressType=Address Type +Location.addressTypeDetails=Address name / description +Location.areaType=Area type (urban/rural) +Location.details=Community contact person +Location.facility=Facility +Location.facilityDetails=Facility name & description +Location.facilityType=Facility type +Location.houseNumber=House number +Location.latitude=GPS latitude +Location.latLon=GPS lat and lon +Location.latLonAccuracy=GPS accuracy in m +Location.longitude=GPS longitude +Location.postalCode=Postal code +Location.continent=Continent +Location.subcontinent=Subcontinent +Location.country=Country +Location.region=Region +Location.district=District +Location.community=Community +Location.street=Street +Location.contactPersonFirstName=Contact person first name +Location.contactPersonLastName=Contact person last name +Location.contactPersonPhone=Contact person phone number +Location.contactPersonEmail=Contact person email address +# Login +Login.doLogIn=Log in +Login.login=Login +Login.password=password +Login.username=username +#LoginSidebar +LoginSidebar.diseaseDetection=Disease Detection +LoginSidebar.diseasePrevention=Disease Prevention +LoginSidebar.outbreakResponse=Outbreak Response +LoginSidebar.poweredBy=Powered By +# Messaging +messagesSendSMS=Send SMS +messagesSentBy=Sent by +messagesNoSmsSentForCase=No SMS sent to case person +messagesNoPhoneNumberForCasePerson=Case person has no phone number +messagesSms=SMS +messagesEmail=Email +messagesEmails=Emails +messagesSendEmail=Send email +messagesSendingSms=Send new SMS +messagesNumberOfMissingPhoneNumbers=Number of selected cases without phone number\: %s +messagesCharacters=Characters\: %d / 160 +messagesNumberOfMessages=Nr. of messages\: %d +# Main Menu +mainMenuAbout=About +mainMenuCampaigns=Campaigns +mainMenuPersons=Persons +mainMenuCases=Cases +mainMenuConfiguration=Configuration +mainMenuContacts=Contacts +mainMenuDashboard=Dashboard +mainMenuEntries=Entries +mainMenuEvents=Events +mainMenuExternalMessages=Messages +mainMenuImmunizations=Immunizations +mainMenuReports=Reports +mainMenuSamples=Samples +mainMenuEnvironments=Environments +mainMenuStatistics=Statistics +mainMenuTasks=Tasks +mainMenuUsers=Users +mainMenuAggregateReports=mSERS +mainMenuShareRequests=Shares +MaternalHistory.childrenNumber=Total number of children +MaternalHistory.ageAtBirth=Mother's age at birth of infant patient +MaternalHistory.conjunctivitis=Conjunctivitis +MaternalHistory.conjunctivitisOnset=Date of onset +MaternalHistory.conjunctivitisMonth=Month of pregnancy +MaternalHistory.maculopapularRash=Maculopapular rash +MaternalHistory.maculopapularRashOnset=Date of onset +MaternalHistory.maculopapularRashMonth=Month of pregnancy +MaternalHistory.swollenLymphs=Swollen lymph nodes +MaternalHistory.swollenLymphsOnset=Date of onset +MaternalHistory.swollenLymphsMonth=Month of pregnancy +MaternalHistory.arthralgiaArthritis=Arthralgia/Arthritis +MaternalHistory.arthralgiaArthritisOnset=Date of onset +MaternalHistory.arthralgiaArthritisMonth=Month of pregnancy +MaternalHistory.rubella=Laboratory-confirmed rubella +MaternalHistory.rubellaOnset=Date of onset +MaternalHistory.rashExposure=Exposure to rash during pregnancy +MaternalHistory.rashExposureDate=Date of exposure +MaternalHistory.rashExposureMonth=Month of pregnancy +MaternalHistory.rashExposureRegion=Region +MaternalHistory.rashExposureDistrict=District +MaternalHistory.rashExposureCommunity=Community +MaternalHistory.otherComplications=Other complications +MaternalHistory.otherComplicationsOnset=Date of onset +MaternalHistory.otherComplicationsMonth=Month of pregnancy +MaternalHistory.otherComplicationsDetails=Complication details +# Outbreak +outbreakAffectedDistricts=Affected districts +outbreakNoOutbreak=No outbreak +outbreakNormal=Normal +outbreakOutbreak=Outbreak +# PathogenTest +pathogenTestAdd=Add pathogen test +pathogenTestCreateNew=Create new pathogen test +pathogenTestNewResult=New result +pathogenTestNewTest=New test result +pathogenTestRemove=Remove this pathogen test +pathogenTestSelect=Select pathogen test +PathogenTest=Pathogen test +PathogenTests=Pathogen tests +PathogenTest.fourFoldIncreaseAntibodyTiter=4 fold increase of antibody titer +PathogenTest.lab=Laboratory +PathogenTest.labDetails=Laboratory name & description +PathogenTest.testDateTime=Date and time of result +PathogenTest.testResult=Test result +PathogenTest.testResultText=Test result details +PathogenTest.testResultVerified=Result verified by lab supervisor +PathogenTest.testType=Type of test +PathogenTest.pcrTestSpecification=PCR/RT-PCR test specification +PathogenTest.testTypeText=Specify test details +PathogenTest.testedDisease=Tested disease +PathogenTest.testedDiseaseVariant=Tested disease variant +PathogenTest.testedDiseaseDetails=Tested disease name +PathogenTest.testedPathogen=Tested pathogen +PathogenTest.testedPathogenDetails=Tested pathogen details +PathogenTest.typingId=Typing ID +PathogenTest.serotype=Serotype +PathogenTest.cqValue=CQ/CT Value +PathogenTest.deletionReason=Reason for deletion +PathogenTest.otherDeletionReason=Reason for deletion details +PathogenTest.externalId=External ID +PathogenTest.reportDate=Report date +PathogenTest.viaLims=Via LIMS +PathogenTest.testedDiseaseVariantDetails=Disease variant details +PathogenTest.externalOrderId=External order ID +PathogenTest.preliminary=Preliminary +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 +# Person +personPersonsList=Person list +personCreateNew=Create a new person +personFindMatching=Find matching persons +personSelect=Select a matching person +personSearchAndSelect=Select a different person +personAgeAndBirthdate=Age and birth date +personNoEventParticipantLinkedToPerson=No event participant linked to person +personNoCaseLinkedToPerson=No case linked to person +personNoContactLinkedToPerson=No contact linked to person +personLinkToEvents=See events for this person +personLinkToCases=See cases for this person +personLinkToContacts=See contacts for this person +personLinkToSamples = See samples for this person +personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! +personsSetMissingGeoCoordinates=Set Missing Geo Coordinates +personsUpdated=Persons Updated +Person=Person +Person.additionalDetails=General comment +Person.address=Home address +Person.addresses=Addresses +Person.approximateAge=Age +Person.approximateAgeReferenceDate=Last updated +Person.approximateAgeType=Unit +Person.birthdate=Date of birth (year / month / day) +Person.birthDate=Date of birth (year / month / day) +Person.birthdateDD=Day of birth +Person.birthdateMM=Month of birth +Person.birthdateYYYY=Year of birth +Person.ageAndBirthDate=Age and birth date +Person.birthWeight=Birth weight (g) +Person.burialConductor=Burial conductor +Person.burialDate=Date of burial +Person.burialPlaceDescription=Burial place description +Person.causeOfDeath=Cause of death +Person.causeOfDeathDetails=Specified cause of death +Person.causeOfDeathDisease=Responsible disease +Person.causeOfDeathDiseaseDetails=Responsible disease name +Person.deathDate=Date of death +Person.deathPlaceType=Death place type +Person.deathPlaceDescription=Death place description +Person.districtName=District +Person.educationType=Education +Person.educationDetails=Details +Person.fathersName=Father's name +Person.namesOfGuardians=Names of guardians +Person.gestationAgeAtBirth=Gestation age at birth (weeks) +Person.lastDisease=Last disease +Person.matchingCase=Matching case +Person.mothersMaidenName=Mother's maiden name +Person.mothersName=Mother's name +Person.nickname=Nickname +Person.occupationCommunity=Facility community +Person.occupationDetails=Please specify occupation +Person.occupationDistrict=Facility district +Person.occupationFacility=Healthcare facility +Person.occupationFacilityDetails=Facility name & description +Person.occupationFacilityType=Facility type +Person.occupationRegion=Facility region +Person.occupationType=Type of occupation +Person.armedForcesRelationType=Staff of armed forces +Person.phone=Primary phone number +Person.phoneOwner=Owner of phone +Person.placeOfBirthRegion=Region of birth +Person.placeOfBirthDistrict=District of birth +Person.placeOfBirthCommunity=Community of birth +Person.placeOfBirthFacility=Facility of birth +Person.placeOfBirthFacilityDetails=Facility name & description +Person.placeOfBirthFacilityType=Facility type +Person.presentCondition=Present condition of person +Person.sex=Sex +Person.generalPractitionerDetails=General practitioner name and contact details +Person.emailAddress=Primary email address +Person.otherContactDetails=Other contact details +Person.passportNumber=Passport number +Person.nationalHealthId=National health ID +Person.uuid=Person ID +Person.hasCovidApp=Has COVID app +Person.covidCodeDelivered=COVID code was generated and delivered +Person.externalId=External ID +Person.externalToken=External Token +Person.internalToken=Internal Token +Person.symptomJournalStatus=Symptom journal status +Person.salutation=Salutation +Person.otherSalutation=Other salutation +Person.birthName=Birth name +Person.birthCountry=Country of birth +Person.citizenship=Citizenship +personContactDetailOwner=Owner +personContactDetailOwnerName=Owner name +personContactDetailThisPerson=This person +personContactDetailThirdParty=Collect contact details of another person or facility +PersonContactDetail=Person contact detail +PersonContactDetail.person=Person +PersonContactDetail.primaryContact=Primary contact details +PersonContactDetail.personContactDetailType=Type of contact details +PersonContactDetail.phoneNumberType=Phone number type +PersonContactDetail.details=Details +PersonContactDetail.contactInformation=Contact information +PersonContactDetail.additionalInformation=Additional information +PersonContactDetail.thirdParty=Third party +PersonContactDetail.thirdPartyRole=Third party role +PersonContactDetail.thirdPartyName=Third party name +pointOfEntryActivePointsOfEntry=Active points of entry +pointOfEntryArchivedPointsOfEntry=Archived points of entry +pointOfEntryAllPointsOfEntry=All points of entry +PointOfEntry.OTHER_AIRPORT=Other airport +PointOfEntry.OTHER_SEAPORT=Other seaport +PointOfEntry.OTHER_GROUND_CROSSING=Other ground crossing +PointOfEntry.OTHER_POE=Other point of entry +PointOfEntry=Point of entry +PointOfEntry.pointOfEntryType=Point of entry type +PointOfEntry.active=Active? +PointOfEntry.latitude=Latitude +PointOfEntry.longitude=Longitude +PointOfEntry.externalID=External ID +PointOfEntry.archived=Archived +PointOfEntry.region=Region +PointOfEntry.district=District +PointOfEntry.defaultInfrastructure=Default +populationDataMaleTotal=Male total +populationDataFemaleTotal=Female total +PortHealthInfo=Port health information +PortHealthInfo.airlineName=Airline name +PortHealthInfo.flightNumber=Flight number +PortHealthInfo.departureDateTime=Date and time of departure +PortHealthInfo.arrivalDateTime=Date and time of arrival +PortHealthInfo.freeSeating=Free seating? +PortHealthInfo.seatNumber=Seat number +PortHealthInfo.departureAirport=Departure airport +PortHealthInfo.numberOfTransitStops=Number of transit stops +PortHealthInfo.transitStopDetails1=Details about first transit stop +PortHealthInfo.transitStopDetails2=Details about second transit stop +PortHealthInfo.transitStopDetails3=Details about third transit stop +PortHealthInfo.transitStopDetails4=Details about fourth transit stop +PortHealthInfo.transitStopDetails5=Details about fifth transit stop +PortHealthInfo.vesselName=Vessel name +PortHealthInfo.vesselDetails=Vessel details +PortHealthInfo.portOfDeparture=Port of departure +PortHealthInfo.lastPortOfCall=Last port of call +PortHealthInfo.conveyanceType=Conveyance type +PortHealthInfo.conveyanceTypeDetails=Specify the conveyance type +PortHealthInfo.departureLocation=Start location of travel +PortHealthInfo.finalDestination=Final destination +PortHealthInfo.details=Point of entry details +# Prescription +prescriptionNewPrescription=New prescription +Prescription=Prescription +Prescription.additionalNotes=Additional notes +Prescription.dose=Dose +Prescription.drugIntakeDetails=Drug name +Prescription.frequency=Frequency +Prescription.prescribingClinician=Prescribing clinician +Prescription.prescriptionDate=Date prescription issued +Prescription.prescriptionDetails=Prescription details +Prescription.prescriptionPeriod=Prescription period +Prescription.prescriptionRoute=Prescription route +Prescription.prescriptionEnd=Treatment end date +Prescription.prescriptionStart=Treatment start date +Prescription.prescriptionType=Prescription type +Prescription.route=Route +Prescription.routeDetails=Route specification +Prescription.typeOfDrug=Type of drug +PrescriptionExport.caseUuid=Case ID +PrescriptionExport.caseName=Case name +prescriptionWithTreatmentTitleDelete=Delete prescriptions with treatments +prescriptionAlone=Just Prescriptions +prescriptionWithTreatment=Prescriptions With Treatments +# QueryDetails +QueryDetails.resultLimit=Limit result count +# Continent +continentActiveContinents=Active continents +continentArchivedContinents=Archived continents +continentAllContinents=All continents +Continent=Continent +Continent.archived=Archived +Continent.externalId=External ID +Continent.defaultName=Default name +Continent.displayName=Name +Continent.defaultInfrastructure=Default +# Subcontinent +subcontinentActiveSubcontinents=Active subcontinents +subcontinentArchivedSubcontinents=Archived subcontinents +subcontinentAllSubcontinents=All subcontinents +Subcontinent=Subcontinent +Subcontinent.archived=Archived +Subcontinent.externalId=External ID +Subcontinent.defaultName=Default name +Subcontinent.displayName=Name +Subcontinent.continent=Continent name +Subcontinent.defaultInfrastructure=Default +# Country +countryActiveCountries=Active countries +countryArchivedCountries=Archived countries +countryAllCountries=All countries +Country=Country +Country.archived=Archived +Country.externalId=External ID +Country.defaultName=Default name +Country.displayName=Name +Country.isoCode=ISO code +Country.unoCode=UNO code +Country.subcontinent=Subcontinent +Country.defaultInfrastructure=Default +# Region +regionActiveRegions=Active regions +regionArchivedRegions=Archived regions +regionAllRegions=All regions +Region=Region +Region.archived=Archived +Region.epidCode=Epid code +Region.growthRate=Growth rate +Region.population=Population +Region.externalID=External ID +Region.country=Country +Region.defaultInfrastructure=Default +# Sample +sampleCreateNew=Create new sample +sampleDeletedSamples=Deleted samples +sampleIncludeTestOnCreation=Create test result for this sample now +sampleNewSample=New sample +sampleNoSamplesForCase=There are no samples for this case +sampleNoSamplesForContact=There are no samples for this contact +sampleNoSamplesForEventParticipant=There are no samples for this event participant +sampleNoSamplesForPerson=There are no samples for this person +sampleNotShipped=Not shipped +sampleNotShippedLong=Not shipped yet +samplePending=Pending +sampleReceived=Received +sampleRefer=Refer to another laboratory +sampleReferred=Referred to other lab +sampleReferredFrom=Referred from +sampleReferredFromInternal=Referred from internal sample +sampleReferredShort=Referred +sampleReferredTo=Referred to +sampleReferredToInternal=Referred to internal sample +sampleSamplesList=Samples list +selectSimilarSample=Select matching sample +selectOtherSample=Select a different sample +sampleShipped=Shipped +sampleSpecimenNotAdequate=Specimen not adequate +sampleActiveSamples=Active samples +sampleArchivedSamples=Archived samples +sampleAllActiveAndArchivedSamples=All active and archived samples +sampleAssociationType=Sample type +Sample=Sample +Sample.additionalTestingRequested=Request additional tests to be performed? +Sample.additionalTestingStatus=Additional testing status +Sample.associatedCase=Associated case +Sample.associatedContact=Associated contact +Sample.associatedEventParticipant=Associated event participant +Sample.caseClassification=Case classification +Sample.caseDistrict=District +Sample.casePersonName=Corresponding person +Sample.caseRegion=Region +Sample.comment=Comment +Sample.diseaseShort=Disease +Sample.lab=Laboratory +Sample.labDetails=Laboratory name & description +Sample.labSampleID=Lab sample ID +Sample.fieldSampleID=Field sample ID +Sample.labUser=Lab user +Sample.noTestPossibleReason=Reason +Sample.otherLab=Referral laboratory +Sample.pathogenTestingRequested=Request pathogen tests to be performed? +Sample.pathogenTestCount=Number of tests +Sample.pathogenTestResult=Final laboratory result +Sample.received=Received +Sample.receivedDate=Date sample received at lab +Sample.referredToUuid=Sample referred to +Sample.reportDateTime=Date of report +Sample.reportInfo=Report date & user +Sample.reportingUser=Reporting user +Sample.requestedAdditionalTests=If you wish to request specific pathogen tests, tick each of them in the list below +Sample.requestedAdditionalTestsTags=Requested additional tests\: +Sample.requestedOtherAdditionalTests=Other requested additional tests +Sample.requestedOtherPathogenTests=Other requested pathogen tests +Sample.requestedPathogenTests=If you wish to request specific additional tests, tick each of them in the list below +Sample.requestedPathogenTestsTags=Requested pathogen tests\: +Sample.sampleCode=Sample code +Sample.sampleDateTime=Date sample was collected +Sample.sampleMaterial=Type of sample +Sample.sampleMaterialText=Specify other type +Sample.sampleSource=Sample source +Sample.shipmentDate=Date sample was sent +Sample.shipmentDetails=Dispatch details +Sample.shipped=Sent/dispatched +Sample.specimenCondition=Specimen condition +Sample.suggestedTypeOfTest=Suggested type of test +Sample.testResult=Test result +Sample.testStatusGen=Test status +Sample.testType=Type of test +Sample.typeOfTest=Type of test +Sample.uuid=Sample ID +Sample.samplePurpose=Purpose of the Sample +Sample.samplingReason=Reason for sampling/testing +Sample.samplingReasonDetails=Sampling reason details +Sample.region=Region +Sample.district=District +Sample.community=Community +Sample.deletionReason=Reason for deletion +Sample.otherDeletionReason=Reason for deletion details +# Sample Export +SampleExport.additionalTestingRequested=Have additional tests been requested? +SampleExport.personAddressCaption=Address of case/contact/event participant person +SampleExport.personAge=Age of case/contact/event participant person +SampleExport.caseDistrict=District of case +SampleExport.caseCommunity=Community of case +SampleExport.caseFacility=Facility of case +SampleExport.contactRegion=Region of contact +SampleExport.contactDistrict=District of contact +SampleExport.contactCommunity=Community of contact +SampleExport.caseOutcome=Outcome of case +SampleExport.caseRegion=Region of case +SampleExport.caseReportDate=Case report date +SampleExport.caseResponsibleCommunity=Case responsible community +SampleExport.caseResponsibleDistrict=Case responsible district +SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.personSex=Sex of case/contact/event participant person +SampleExport.caseUuid=Case UUID +SampleExport.contactUuid=Contact UUID +SampleExport.contactReportDate=Contact report date +SampleExport.id=Sample SN +SampleExport.sampleReportDate=Sample report date +SampleExport.noTestPossibleReason=No test possible reason +SampleExport.pathogenTestType1=Latest pathogen test type +SampleExport.pathogenTestDisease1=Latest pathogen test disease +SampleExport.pathogenTestDateTime1=Latest pathogen test date +SampleExport.pathogenTestLab1=Latest pathogen test lab +SampleExport.pathogenTestResult1=Latest pathogen test result +SampleExport.pathogenTestVerified1=Latest pathogen test verified? +SampleExport.pathogenTestType2=2nd latest pathogen test type +SampleExport.pathogenTestDisease2=2nd latest pathogen test disease +SampleExport.pathogenTestDateTime2=2nd latest pathogen test date +SampleExport.pathogenTestLab2=2nd latest pathogen test lab +SampleExport.pathogenTestResult2=2nd latest pathogen test result +SampleExport.pathogenTestVerified2=2nd latest pathogen test verified? +SampleExport.pathogenTestType3=3rd latest pathogen test type +SampleExport.pathogenTestDisease3=3rd latest pathogen test disease +SampleExport.pathogenTestDateTime3=3rd latest pathogen test date +SampleExport.pathogenTestLab3=3rd latest pathogen test lab +SampleExport.pathogenTestResult3=3rd latest pathogen test result +SampleExport.pathogenTestVerified3=3rd latest pathogen test verified? +SampleExport.otherPathogenTestsDetails=Other pathogen tests +SampleExport.otherAdditionalTestsDetails=Are there other additional tests? +SampleExport.pathogenTestingRequested=Have pathogen tests been requested? +SampleExport.referredToUuid=Referred sample +SampleExport.requestedAdditionalTests=Requested additional tests +SampleExport.requestedPathogenTests=Requested pathogen tests +SampleExport.shipped=Sent/dispatched? +SampleExport.received=Received? +SampleExport.altSgpt=ALT/SGPT of latest additional test +SampleExport.arterialVenousBloodGas=Arterial/venous blood gas of latest additional test +SampleExport.arterialVenousGasHco3=HCO3 of latest additional test +SampleExport.arterialVenousGasPao2=PaO2 of latest additional test +SampleExport.arterialVenousGasPco2=pCO2 of latest additional test +SampleExport.arterialVenousGasPH=pH of latest additional test +SampleExport.astSgot=AST/SGOT of latest additional test +SampleExport.conjBilirubin=Conj. bilirubin of latest additional test +SampleExport.creatinine=Creatinine of latest additional test +SampleExport.gasOxygenTherapy=Oxygen therapy at time of blood gas of latest additional test +SampleExport.haemoglobin=Haemoglobin of latest additional test +SampleExport.haemoglobinuria=Haemoglobin in urine of latest additional test +SampleExport.hematuria=Red blood cells in urine of latest additional test +SampleExport.otherTestResults=Other performed tests and results of latest additional test +SampleExport.platelets=Platelets of latest additional test +SampleExport.potassium=Potassium of latest additional test +SampleExport.proteinuria=Protein in urine of latest additional test +SampleExport.prothrombinTime=Prothrombin Time of latest additional test +SampleExport.testDateTime=Date and time of latest additional test +SampleExport.totalBilirubin=Total bilirubin of latest additional test +SampleExport.urea=Urea of latest additional test +SampleExport.wbcCount=WBC count of latest additional test +# Immunization +Immunization=Immunization +Immunization.reportDate=Date of report +Immunization.externalId=External ID +Immunization.country=Immunization country +Immunization.deletionReason=Reason for deletion +Immunization.otherDeletionReason=Reason for deletion details +Immunization.disease=Disease +Immunization.diseaseDetails=Disease details +Immunization.healthFacility=Facility +Immunization.healthFacilityDetails=Facility name & description +Immunization.meansOfImmunization=Means of immunization +Immunization.meansOfImmunizationDetails=Means of immunization details +Immunization.overwriteImmunizationManagementStatus=Overwrite immunization management status +Immunization.immunizationManagementStatus=Management status +Immunization.immunizationStatus=Immunization status +Immunization.startDate=Start date +Immunization.endDate=End date +Immunization.validFrom=Valid from +Immunization.validUntil=Valid until +Immunization.numberOfDoses=Number of doses +Immunization.numberOfDosesDetails=Number of doses details +Immunization.vaccinations=Vaccinations +Immunization.uuid=Immunization Id +Immunization.personUuid=Person Id +Immunization.personFirstName=First name +Immunization.personLastName=Last name +Immunization.ageAndBirthDate=Age and birthdate +Immunization.recoveryDate=Date of recovery +Immunization.positiveTestResultDate=Date of first positive test result +Immunization.previousInfection=Previous infection with this disease +Immunization.lastInfectionDate=Date of last infection +Immunization.lastVaccineType=Type of last vaccine +Immunization.firstVaccinationDate=Date of first vaccination +Immunization.lastVaccinationDate=Date of last vaccination +Immunization.additionalDetails=Additional details +Immunization.responsibleRegion=Responsible region +Immunization.responsibleDistrict=Responsible district +Immunization.responsibleCommunity=Responsible community +Immunization.immunizationPeriod=Immunization period +Immunization.region=Region +Immunization.district=District +Immunization.community=Community +Immunization.changeDate=Date of last change +Immunization.creationDate=Creation date +immunizationActiveImmunizations = Active immunizations +immunizationArchivedImmunizations = Archived immunizations +immunizationAllActiveAndArchivedImmunizations = All active and archived immunizations +immunizationDeletedImmunizations = Deleted immunizations +immunizationImmunizationsList=Immunizations list +linkImmunizationToCaseButton=Link case +openLinkedCaseToImmunizationButton=Open case +immunizationNewImmunization=New immunization +immunizationKeepImmunization=Keep the existing information and discard the new immunization +immunizationOnlyPersonsWithOverdueImmunization=Only show persons with overdue immunization +immunizationOverwriteImmunization=Overwrite the existing immunization with this data +immunizationCreateNewImmunization=Create the new immunization anyway +immunizationNoImmunizationsForPerson=There are no immunizations for this person +# Statistics +statisticsAddFilter=Add filter +statisticsAttribute=Attribute +statisticsAttributeSelect=Select an attribute +statisticsAttributeSpecification=Attribute specification +statisticsChartType=Chart type +statisticsDatabaseExport=Database Export +statisticsDontGroupColumns=Don't group columns +statisticsDontGroupRows=Don't group rows +statisticsDontGroupSeries=Don't group series +statisticsDontGroupX=Don't group x-axis +statisticsExchange=Exchange rows and columns +statisticsMapType=Map type +statisticsRemoveFilter=Remove filter +statisticsResetFilters=Reset filters +statisticsShowZeroValues=Show zero values +statisticsShowCaseIncidence=Show case incidence +statisticsSpecifySelection=Specify your selection +statisticsStatistics=Statistics +statisticsVisualizationType=Type +statisticsIncidenceDivisor=Incidence divisor +statisticsDataDisplayed=Data displayed +statisticsOpenSormasStats=Open Sormas-Stats +# Symptoms +symptomsLesionsLocations=Localization of the lesions +symptomsMaxTemperature=Maximum body temperature in ° C +symptomsSetClearedToNo=Set cleared to No +symptomsSetClearedToUnknown=Set cleared to Unknown +Symptoms=Symptoms +Symptoms.abdominalPain=Abdominal pain +Symptoms.alteredConsciousness=Altered level of consciousness +Symptoms.anorexiaAppetiteLoss=Anorexia/loss of appetite +Symptoms.backache=Backache +Symptoms.bedridden=Is the patient bedridden? +Symptoms.bilateralCataracts=Bilateral cataracts +Symptoms.blackeningDeathOfTissue=Blackening and death of tissue in extremities +Symptoms.bleedingVagina=Bleeding from vagina, other than menstruation +Symptoms.bloodInStool=Blood in stool +Symptoms.bloodPressureDiastolic=Blood pressure (diastolic) +Symptoms.bloodPressureSystolic=Blood pressure (systolic) +Symptoms.bloodUrine=Blood in urine (hematuria) +Symptoms.bloodyBlackStool=Bloody or black stools (melena) +Symptoms.buboesGroinArmpitNeck=Buboes in the groin, armpit or neck +Symptoms.bulgingFontanelle=Bulging fontanelle +Symptoms.chestPain=Chest pain +Symptoms.chillsSweats=Chills or sweats +Symptoms.confusedDisoriented=Confused or disoriented +Symptoms.congenitalGlaucoma=Congenital glaucoma +Symptoms.congenitalHeartDisease=Congenital heart disease +Symptoms.congenitalHeartDiseaseType=Heart disease type +Symptoms.congenitalHeartDiseaseDetails=Specify +Symptoms.conjunctivitis=Conjunctivitis (red eyes) +Symptoms.cough=Cough +Symptoms.coughWithSputum=Cough with sputum +Symptoms.coughWithHeamoptysis=Cough with heamoptysis +Symptoms.coughingBlood=Coughing up blood (haemoptysis) +Symptoms.darkUrine=Dark Urine +Symptoms.dehydration=Dehydration +Symptoms.developmentalDelay=Developmental delay +Symptoms.diarrhea=Diarrhea +Symptoms.difficultyBreathing=Difficulty breathing/Dyspnea +Symptoms.digestedBloodVomit=Digested blood/"coffee grounds" in vomit +Symptoms.eyePainLightSensitive=Pain behind eyes/Sensitivity to light +Symptoms.eyesBleeding=Bleeding from the eyes +Symptoms.fatigueWeakness=Fatigue/general weakness +Symptoms.fever=Fever +Symptoms.firstSymptom=First symptom +Symptoms.fluidInLungCavity=Fluid in the lung cavity +Symptoms.glasgowComaScale=Glasgow coma scale +Symptoms.gumsBleeding=Bleeding of the gums +Symptoms.headache=Headache +Symptoms.hearingloss=Acute hearing loss +Symptoms.heartRate=Heart rate (bpm) +Symptoms.height=Height (cm) +Symptoms.hemorrhagicSyndrome=Hemorrhagic syndrome +Symptoms.hiccups=Hiccups +Symptoms.hyperglycemia=Hyperglycemia +Symptoms.hypoglycemia=Hypoglycemia +Symptoms.injectionSiteBleeding=Bleeding from injection site +Symptoms.jaundice=Jaundice +Symptoms.jaundiceWithin24HoursOfBirth=Jaundice within 24 hours of birth? +Symptoms.jointPain=Joint pain or arthritis +Symptoms.kopliksSpots=Koplik's Spots +Symptoms.lesions=Vesiculopustular rash +Symptoms.lesionsAllOverBody=All over the body +Symptoms.lesionsArms=Arms +Symptoms.lesionsDeepProfound=Rash lesions deep and profound? +Symptoms.lesionsFace=Face +Symptoms.lesionsGenitals=Genitals +Symptoms.lesionsLegs=Legs +Symptoms.lesionsLocation=Localization of the rash +Symptoms.lesionsOnsetDate=Date of rash onset +Symptoms.lesionsPalmsHands=Palms of the hands +Symptoms.lesionsResembleImg1=Does the rash resemble the photo below? +Symptoms.lesionsResembleImg2=Does the rash resemble the photo below? +Symptoms.lesionsResembleImg3=Does the rash resemble the photo below? +Symptoms.lesionsResembleImg4=Does the rash resemble the photo below? +Symptoms.lesionsSameSize=All rash lesions the same size? +Symptoms.lesionsSameState=All rash lesions in same state of development? +Symptoms.lesionsSolesFeet=Soles of the feet +Symptoms.lesionsThatItch=Rash that itches +Symptoms.lesionsThorax=Thorax +Symptoms.lossOfSmell=New loss of smell +Symptoms.lossOfTaste=New loss of taste +Symptoms.wheezing=Wheezing +Symptoms.skinUlcers=Skin ulcers +Symptoms.inabilityToWalk=Inability to walk +Symptoms.inDrawingOfChestWall=Indrawing of chest wall +Symptoms.lossSkinTurgor=Loss of skin turgor +Symptoms.lymphadenopathy=Enlarged lymph nodes +Symptoms.lymphadenopathyAxillary=Enlarged lymph nodes, axillary +Symptoms.lymphadenopathyCervical=Enlarged lymph nodes, cervical +Symptoms.lymphadenopathyInguinal=Enlarged lymph nodes, inguinal +Symptoms.malaise=Malaise +Symptoms.meningealSigns=Meningeal signs +Symptoms.meningoencephalitis=Meningoencephalitis +Symptoms.microcephaly=Microcephaly +Symptoms.midUpperArmCircumference=Mid-upper arm circumf. (cm) +Symptoms.musclePain=Muscle pain +Symptoms.nausea=Nausea +Symptoms.neckStiffness=Stiff neck +Symptoms.noseBleeding=Nose bleed (epistaxis) +Symptoms.oedemaFaceNeck=Oedema of face/neck +Symptoms.oedemaLowerExtremity=Oedema of lower extremities +Symptoms.onsetDate=Date of symptom onset +Symptoms.onsetSymptom=First symptom +Symptoms.oralUlcers=Oral ulcers +Symptoms.otherHemorrhagicSymptoms=Other hemorrhagic symptoms +Symptoms.otherHemorrhagicSymptomsText=Specify other symptoms +Symptoms.otherNonHemorrhagicSymptoms=Other clinical symptoms +Symptoms.otherNonHemorrhagicSymptomsText=Specify other symptoms +Symptoms.otherComplications=Other complications +Symptoms.otherComplicationsText=Specify other complications +Symptoms.otitisMedia=Middle ear inflammation (otitis media) +Symptoms.painfulLymphadenitis=Painful lymphadenitis +Symptoms.palpableLiver=Palpable liver +Symptoms.palpableSpleen=Palpable spleen +Symptoms.patientIllLocation=Location where the patient became ill +Symptoms.pharyngealErythema=Pharyngeal erythema +Symptoms.pharyngealExudate=Pharyngeal exudate +Symptoms.pigmentaryRetinopathy=Pigmentary retinopathy +Symptoms.purpuricRash=Purpuric rash +Symptoms.radiolucentBoneDisease=Radiolucent bone disease +Symptoms.rapidBreathing=Rapid breathing +Symptoms.redBloodVomit=Fresh/red blood in vomit (hematemesis) +Symptoms.refusalFeedorDrink=Refusal to feed or drink +Symptoms.respiratoryRate=Respiratory rate (bpm) +Symptoms.runnyNose=Runny nose +Symptoms.seizures=Convulsions or Seizures +Symptoms.sepsis=Sepsis +Symptoms.shock=Shock (Systolic bp <90) +Symptoms.sidePain=Side pain +Symptoms.skinBruising=Bruising of the skin (petechiae/ecchymosis) +Symptoms.skinRash=Maculopapular rash +Symptoms.soreThroat=Sore throat/pharyngitis +Symptoms.stomachBleeding=Bleeding from the stomach +Symptoms.sunkenEyesFontanelle=Sunken eyes or fontanelle +Symptoms.swollenGlands=Swollen glands +Symptoms.splenomegaly=Splenomegaly +Symptoms.symptomatic=Symptomatic +Symptoms.symptomOnset=Date of symptom onset +Symptoms.symptomsComments=Comments +Symptoms.symptomsNotOccurred=Symptoms that did not occur during this illness +Symptoms.symptomsOccurred=Symptoms that occurred during this illness +Symptoms.symptomsUnknownOccurred=Symptoms with no reliable occurrence information +Symptoms.temperature=Current body temperature in ° C +Symptoms.temperatureSource=Source of body temperature +Symptoms.throbocytopenia=Thrombocytopenia +Symptoms.tremor=Tremor +Symptoms.unexplainedBleeding=Bleeding or bruising +Symptoms.unilateralCataracts=Unilateral cataracts +Symptoms.vomiting=Vomiting +Symptoms.convulsion=Convulsion +Symptoms.weight=Weight (kg) +Symptoms.hydrophobia=Hydrophobia +Symptoms.opisthotonus=Opisthotonus +Symptoms.anxietyStates=Anxiety states +Symptoms.delirium=Delirium +Symptoms.uproariousness=Uproariousness +Symptoms.paresthesiaAroundWound=Paresthesia/Pain around wound +Symptoms.excessSalivation=Excess salivation +Symptoms.insomnia=Sleeplessness (Insomnia) +Symptoms.paralysis=Paralysis +Symptoms.excitation=Excitation/Irritability +Symptoms.dysphagia=Difficulty in swallowing (Dysphagia) +Symptoms.aerophobia=Fear of flying (Aerophobia) +Symptoms.hyperactivity=Hyperactivity +Symptoms.paresis=Paresis +Symptoms.agitation=Agitation +Symptoms.ascendingFlaccidParalysis=Ascending flaccid paralysis +Symptoms.erraticBehaviour=Erratic behaviour +Symptoms.coma=Coma/Somnolence +Symptoms.fluidInLungCavityAuscultation=Fluid in lung cavity in auscultation +Symptoms.fluidInLungCavityXray=Fluid in cavity through X-Ray +Symptoms.abnormalLungXrayFindings=Abnormal lung X-Ray findings +Symptoms.conjunctivalInjection=Conjunctivitis +Symptoms.acuteRespiratoryDistressSyndrome=Acute respiratory distress syndrome +Symptoms.pneumoniaClinicalOrRadiologic=Pneumonia (clinical or radiologic) +Symptoms.respiratoryDiseaseVentilation=Respiratory disease requiring ventilation +Symptoms.feelingIll=Feeling ill +Symptoms.shivering=Shivering +Symptoms.fastHeartRate=Fast heart rate (Tachycardia) +Symptoms.oxygenSaturationLower94=Oxygen saturation < 94 % +Symptoms.feverishFeeling=Feverish feeling +Symptoms.weakness=General weakness +Symptoms.fatigue=Increased fatigue +Symptoms.coughWithoutSputum=Dry cough without sputum +Symptoms.breathlessness=Breathlessness at rest or during exertion +Symptoms.chestPressure=Pressure on the chest +Symptoms.blueLips=Blue lips +Symptoms.bloodCirculationProblems=General blood circulation problems +Symptoms.palpitations=Palpitations +Symptoms.dizzinessStandingUp=Dizziness (when standing up from a sitting or lying position) +Symptoms.highOrLowBloodPressure=Blood pressure too high or too low (measured) +Symptoms.urinaryRetention=Urinary retention +# Task +taskMyTasks=My tasks +taskNewTask=New task +taskNoTasks=There are no tasks for this %s +taskOfficerTasks=Officer tasks +taskActiveTasks=Active tasks +taskArchivedTasks=Archived tasks +taskAllTasks=All tasks +Task=Task +Task.assigneeReply=Comments on execution +Task.assigneeUser=Assigned to +Task.assignedByUser=Assigned by +Task.caze=Associated case +Task.contact=Associated contact +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 +Task.priority=Priority +Task.statusChangeDate=Status change date +Task.suggestedStart=Suggested start +Task.taskContext=Task context +Task.taskStatus=Task status +Task.taskType=Task type +Task.taskAssignee=Task assignee +Task.taskPriority=Task priority +Task.travelEntry=Travel entry +Task.region=Region +Task.district=District +# TestReport +TestReport=Test report +TestReport.dateOfResult=Date of result +TestReport.testDateTime=Date and time of result +TestReport.testLabCity=Lab city +TestReport.testLabExternalId=Lab external ID +TestReport.testLabName=Lab name +TestReport.testLabPostalCode=Lab postal code +TestReport.testResult=Test result +TestReport.testType=Type of test +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 +# TravelEntry +travelEntryCreateCase=Create case +travelEntryOnlyRecoveredEntries=Only recovered entries +travelEntryOnlyVaccinatedEntries=Only vaccinated entries +travelEntryOnlyEntriesTestedNegative=Only entries tested negative +travelEntryOnlyEntriesConvertedToCase=Only entries converted to case +travelEntryOpenResultingCase=Open case of this travel entry +travelEntryActiveTravelEntries=Active travel entries +travelEntryArchivedTravelEntries=Archived travel entries +travelEntryAllActiveAndArchivedTravelEntries=All active and archived travel entries +travelEntriesNoTravelEntriesForPerson=There are no travel entries for this person +TravelEntry=Travel entry +TravelEntry.person=Travel entry person +TravelEntry.reportDate=Date of report +TravelEntry.uuid=Travel Entry ID +TravelEntry.externalId=External ID +TravelEntry.personFirstName=Person First Name +TravelEntry.personLastName=Person Last Name +TravelEntry.homeDistrictName=Home District Name +TravelEntry.pointOfEntryName=Point of Entry Name +TravelEntry.recovered=Recovered +TravelEntry.vaccinated=Vaccinated +TravelEntry.testedNegative=Tested Negative +travelEntryNewTravelEntry=New travel entry +travelEntryPointOfEntry=Point of entry +TravelEntry.diseaseVariant=Disease variant +TravelEntry.responsibleRegion=Responsible region +TravelEntry.responsibleDistrict=Responsible district +TravelEntry.responsibleCommunity=Responsible community +TravelEntry.differentPointOfEntryJurisdiction=Point of entry jurisdiction differs from responsible jurisdiction +TravelEntry.pointOfEntry=Point of entry +TravelEntry.pointOfEntryRegion=Region +TravelEntry.pointOfEntryDistrict=District +TravelEntry.pointOfEntryDetails=Point of entry details +TravelEntry.quarantine=Quarantine +TravelEntry.quarantineTypeDetails=Quarantine details +TravelEntry.quarantineFrom=Quarantine start +TravelEntry.quarantineTo=Quarantine end +TravelEntry.quarantineHelpNeeded=Help needed in quarantine? +TravelEntry.quarantineHomePossible=Home-based quarantine possible? +TravelEntry.quarantineHomePossibleComment=Comment +TravelEntry.quarantineHomeSupplyEnsured=Supply ensured? +TravelEntry.quarantineHomeSupplyEnsuredComment=Comment +TravelEntry.quarantineOrderedVerbally=Quarantine ordered verbally? +TravelEntry.quarantineOrderedVerballyDate=Date of the verbal order +TravelEntry.quarantineOrderedOfficialDocument=Quarantine ordered by official document? +TravelEntry.quarantineOrderedOfficialDocumentDate=Date of the official document order +TravelEntry.quarantineExtended=Quarantine period extended? +TravelEntry.quarantineReduced=Quarantine period reduced? +TravelEntry.quarantineOfficialOrderSent=Official quarantine order sent? +TravelEntry.quarantineOfficialOrderSentDate=Date official quarantine order was sent +TravelEntry.dateOfArrival=Date of Arrival +TravelEntry.changeDate=Date of last change +TravelEntry.creationDate=Creation date +TravelEntry.deletionReason=Reason for deletion +TravelEntry.otherDeletionReason=Reason for deletion details +TravelEntry.deletedTravelEntries=Deleted travel entries +travelEntryTravelEntriesList=Travel entries list +# Treatment +treatmentCreateTreatment=Create treatment +treatmentNewTreatment=New treatment +treatmentOpenPrescription=Open prescription +Treatment=Treatment +Treatment.additionalNotes=Additional notes +Treatment.dose=Dose +Treatment.drugIntakeDetails=Drug name +Treatment.executingClinician=Executing staff member +Treatment.openPrescription=Open prescription +Treatment.route=Route +Treatment.routeDetails=Route specification +Treatment.textFilter=Treatment type type or executing clinician +Treatment.treatmentDateTime=Treatment date & time +Treatment.treatmentDetails=Treatment details +Treatment.treatmentType=Treatment type +Treatment.typeOfDrug=Type of drug +Treatment.treatmentRoute=Treatment route +TreatmentExport.caseUuid=Case ID +TreatmentExport.caseName=Case name +# User +userNewUser=New user +userMyUserId=My user ID +userResetPassword=Create new password +userUpdatePasswordConfirmation=Really update password? +sync=Sync +syncUsers=Sync Users +syncErrors=%d Error(s) +syncSuccessful=%d Synced +syncProcessed=%d/%d Processed +User=User +User.active=Active? +User.associatedOfficer=Associated officer +User.hasConsentedToGdpr=GDPR +User.healthFacility=Facility +User.laboratory=Laboratory +User.limitedDisease=Limited disease +User.phone=Phone number +User.pointOfEntry=Assigned point of entry +User.userEmail=Email +User.userName=User name +User.userRoles=User roles +User.address=Address +User.uuid=UUID +User.region=Region +User.district=District +User.community=Community +userRestrictDiseases=Restrict access to specific diseases +# Vaccination +vaccinationNewVaccination=New vaccination +vaccinationNoVaccinationsForPerson=There are no vaccinations for this person +vaccinationNoVaccinationsForPersonAndDisease=There are no vaccinations for this person and disease +Vaccination=Vaccination +Vaccination.uuid=Vaccination ID +Vaccination.reportDate=Report date +Vaccination.reportingUser=Reporting user +Vaccination.vaccinationDate=Vaccination date +Vaccination.vaccineName=Vaccine name +Vaccination.otherVaccineName=Vaccine name details +Vaccination.vaccineManufacturer=Vaccine manufacturer +Vaccination.otherVaccineManufacturer=Vaccine manufacturer details +Vaccination.vaccineType=Vaccine type +Vaccination.vaccineDose=Vaccine dose +Vaccination.vaccineInn=INN +Vaccination.vaccineBatchNumber=Batch number +Vaccination.vaccineUniiCode=UNII code +Vaccination.vaccineAtcCode=ATC code +Vaccination.vaccinationInfoSource=Vaccination info source +Vaccination.pregnant=Pregnant +Vaccination.trimester=Trimester +# Views +View.actions=Action Directory +View.groups=Group Directory +View.aggregatereports=Aggregate Reporting (mSERS) +View.aggregatereports.aggregatereporting=Aggregate reporting +View.aggregatereports.reportdata=Report data +View.aggregatereports.sub= +View.campaign.campaigns=Campaign Directory +View.campaign.campaigns.short=Campaigns +View.campaign.campaigndata=Campaign Data +View.campaign.campaigndata.short=Campaign Data +View.campaign.campaigndata.dataform=Campaign Data Form +View.campaign.campaigndata.dataform.short=Data Form +View.campaign.campaignstatistics=Campaign statistics +View.campaign.campaignstatistics.short=Campaign statistics +View.cases=Case Directory +View.cases.merge=Merge Duplicate Cases +View.cases.archive=Case Archive +View.cases.contacts=Case Contacts +View.cases.data=Case Information +View.cases.epidata=Case Epidemiological Data +View.cases.hospitalization=Case Hospitalization +View.cases.person=Case Person +View.cases.sub= +View.cases.symptoms=Case Symptoms +View.cases.therapy=Case Therapy +View.cases.clinicalcourse=Clinical Course +View.cases.maternalhistory=Maternal History +View.cases.porthealthinfo=Port Health Information +View.cases.visits=Case Visits +View.persons=Person Directory +View.persons.data=Person Information +View.configuration.communities=Communities Configuration +View.configuration.communities.short=Communities +View.configuration.districts=Districts Configuration +View.configuration.districts.short=Districts +View.configuration.documentTemplates=Document Templates Management +View.configuration.documentTemplates.short=Document Templates +View.configuration.facilities=Facilities Configuration +View.configuration.facilities.short=Facilities +View.configuration.laboratories=Laboratories Configuration +View.configuration.laboratories.short=Laboratories +View.configuration.pointsofentry=Points of Entry Configuration +View.configuration.pointsofentry.short=Points of Entry +View.configuration.outbreaks=Outbreaks Configuration +View.configuration.outbreaks.short=Outbreaks +View.configuration.areas=Areas Configuration +View.configuration.areas.short=Areas +View.configuration.countries=Countries Configuration +View.configuration.countries.short=Countries +View.configuration.subcontinents=Subcontinents Configuration +View.configuration.subcontinents.short=Subcontinents +View.configuration.continents=Continents Configuration +View.configuration.continents.short=Continents +View.configuration.regions=Regions Configuration +View.configuration.regions.short=Regions +View.configuration.templates=Templates Configuration +View.configuration.templates.short=Templates +View.configuration.userrights=User Rights Management +View.configuration.userrights.short=User Rights +View.configuration.devMode=Developer Options +View.configuration.devMode.short=Developer +View.configuration.populationdata=Population Data +View.configuration.populationdata.short=Population +View.configuration.linelisting=Line Listing Configuration +View.configuration.linelisting.short=Line Listing +View.configuration.emailTemplates=Email Templates +View.configuration.emailTemplates.short=Email Templates +View.configuration.customizableEnums=Customizable Enum Configuration +View.configuration.customizableEnums.short=Customizable Enums +View.contacts=Contact Directory +View.contacts.archive=Contact Archive +View.contacts.epidata=Contact Epidemiological Data +View.contacts.data=Contact Information +View.contacts.merge=Merge Duplicate Contacts +View.contacts.person=Contact Person +View.contacts.sub= +View.contacts.visits=Contact Visits +View.dashboard.contacts=Contacts Dashboard +View.dashboard.surveillance=Surveillance Dashboard +View.dashboard.campaigns=Campaigns Dashboard +View.dashboard.samples=Samples Dashboard +View.events=Event Directory +View.events.archive=Event Archive +View.events.data=Event Information +View.events.eventactions=Event Actions +View.events.eventparticipants=Event Participants +View.events.sub= +View.events.eventparticipants.data=Event Participant Information +View.messages=Message Directory +View.reports=Weekly Reports +View.reports.sub= +View.samples=Sample Directory +View.samples.archive=Sample Archive +View.samples.data=Sample Information +View.samples.sub= +View.travelEntries=Travel Entries Directory +View.immunizations=Immunization Directory +View.statistics=Statistics +View.statistics.database-export=Database export +View.tasks=Task Management +View.tasks.archive=Task Archive +View.tasks.sub= +View.user.users=User Management +View.user.userroles=User Roles +View.users.sub= +View.shareRequests=Share directory +View.environments=Environment directory +# Visit +visitNewVisit=New visit +Visit=Visit +Visit.person=Visited person +Visit.symptoms=Symptoms +Visit.visitDateTime=Date and time of visit +Visit.visitRemarks=Visit remarks +Visit.visitStatus=Person available and cooperative? +Visit.origin=Visit origin +Visit.visitUser=Visiting officer +Visit.disease=Disease +Visit.reportLat=Report latitude +Visit.reportLon=Report longitude +# WeeklyReport +weeklyReportNoReport=Missing report +weeklyReportOfficerInformants=Informants +weeklyReportsInDistrict=Weekly Reports in %s +weeklyReportRegionOfficers=Officers +weeklyReportRegionInformants=Informants +WeeklyReport.epiWeek=Epi Week +WeeklyReport.year=Year +# WeeklyReportEntry +WeeklyReportEntry.numberOfCases=Cases reported +# WeeklyReportInformantSummary +WeeklyReportInformantSummary.informantReportDate=Informant report submission +WeeklyReportInformantSummary.totalCaseCount=Cases reported by informant +WeeklyReportInformantSummary.informant=Informant +WeeklyReportInformantSummary.community=Community +WeeklyReportInformantSummary.facility=Facility +# WeeklyReportOfficerSummary +WeeklyReportOfficerSummary.informants=Number of informants +WeeklyReportOfficerSummary.informantReports=Number of informant reports +WeeklyReportOfficerSummary.informantReportPercentage=Percentage +WeeklyReportOfficerSummary.informantZeroReports=Number of informant zero reports +WeeklyReportOfficerSummary.officer=Officer +WeeklyReportOfficerSummary.officerReportDate=Officer report submission +WeeklyReportOfficerSummary.totalCaseCount=Cases reported by officer +WeeklyReportOfficerSummary.district=District +# WeeklyReportRegionSummary +WeeklyReportRegionSummary.informants=Number of informants +WeeklyReportRegionSummary.informantReports=Number of informant reports +WeeklyReportRegionSummary.informantReportPercentage=Percentage +WeeklyReportRegionSummary.informantZeroReports=Number of informant zero reports +WeeklyReportRegionSummary.officers=Number of officers +WeeklyReportRegionSummary.officerReports=Number of officers reports +WeeklyReportRegionSummary.officerReportPercentage=Percentage +WeeklyReportRegionSummary.officerZeroReports=Number of officer zero reports +WeeklyReportRegionSummary.region=Region +# SORMAS to SORMAS +SormasToSormasOptions.organization=Organization +SormasToSormasOptions.withAssociatedContacts=Share associated contacts +SormasToSormasOptions.withSamples=Share samples +SormasToSormasOptions.withEventParticipants=Share event participants +SormasToSormasOptions.withImmunizations=Share immunizations +SormasToSormasOptions.withSurveillanceReports=Share reports +SormasToSormasOptions.handOverOwnership=Hand over the ownership +SormasToSormasOptions.pseudonymizeData=Exclude personal data +SormasToSormasOptions.comment=Comment +sormasToSormasErrorDialogTitle=Error during share operation +sormasToSormasListTitle=Share +sormasToSormasShare=Share +sormasToSormasReturn=Return +sormasToSormasSync=Sync +sormasToSormasRevokeShare=Revoke +sormasToSormasCaseNotShared=This case is not shared +sormasToSormasContactNotShared=This contact is not shared +sormasToSormasSampleNotShared=This sample is not shared +sormasToSormasEventNotShared=This event is not shared +sormasToSormasEventParticipantNotShared=This event participant is not shared +sormasToSormasImmunizationNotShared=This immunization is not shared +sormasToSormasSharedWith=Shared with\: +sormasToSormasOwnedBy=Owned by +sormasToSormasSharedBy=Shared by +sormasToSormasSharedDate=On +sormasToSormasSentFrom=Sent from +sormasToSormasSendLabMessage=Send to another organization +sormasToSormasOriginInfo=Sent from +BAGExport=BAG Export +# Survnet Gateway +ExternalSurveillanceToolGateway.title=Reporting Tool +ExternalSurveillanceToolGateway.send=Send to reporting tool +ExternalSurveillanceToolGateway.unableToSend=Unable to send +ExternalSurveillanceToolGateway.confirmSend=Confirm sending +ExternalSurveillanceToolGateway.notTransferred=Not yet sent to reporting tool +ExternalSurveillanceToolGateway.confirmDelete=Confirm delete +ExternalSurveillanceToolGateway.excludeAndSend=Send %d of %d +patientDiaryRegistrationError=Could not register person in the patient diary. +patientDiaryCancelError=Could not cancel external journal follow-up +patientDiaryPersonNotExportable=Cannot export the person to the patient diary. The person needs a valid birthdate and either a valid phone number or email address. +showPlacesOnMap=Show +changeUserEmail=Change user email +SurveillanceReport=Report +SurveillanceReport.uuid=Report-Id +SurveillanceReport.reportingType=Type of reporting +SurveillanceReport.externalId=External Id +SurveillanceReport.reportingUser=Creating user +SurveillanceReport.reportDate=Date of report +SurveillanceReport.dateOfDiagnosis=Date of diagnosis +SurveillanceReport.facilityRegion=Reporter facility region +SurveillanceReport.facilityDistrict=Reporter facility district +SurveillanceReport.facilityType=Reporter facility type +SurveillanceReport.facilityTypeGroup=Reporter facility category +SurveillanceReport.facility=Reporter facility +SurveillanceReport.facilityDetails=Reporter facility details +SurveillanceReport.notificationDetails=Details +surveillanceReportNewReport=New report +surveillanceReportNoReportsForCase=There are no reports for this case +cancelExternalFollowUpButton=Cancel external follow-up +createSymptomJournalAccountButton=Create PIA Account +registerInPatientDiaryButton=Register in CLIMEDO eDiary +symptomJournalOptionsButton=PIA eDiary +patientDiaryOptionsButton=CLIMEDO eDiary +openInSymptomJournalButton=Open in PIA +openInPatientDiaryButton=Open in CLIMEDO +cancelExternalFollowUpPopupTitle=Cancel External Follow-Up +# User role/right +exportUserRoles=Export user roles +userRights=User Rights +userRight=User Right +UserRight.caption=Caption +UserRight.description=Description +UserRight.userRightGroup=Group +UserRight.requiredUserRights=Needed user rights +# UserRole +UserRole=User role +userRoleNewUserRole=New User Role +UserRole.uuid=Uuid +UserRole.userRights=User rights +UserRole.emailNotificationTypes=Email notification types +UserRole.enabled=Enabled +UserRole.caption=Caption +UserRole.description=Description +UserRole.hasOptionalHealthFacility=Has optional health facility +UserRole.hasAssociatedDistrictUser=Has associated district user +UserRole.jurisdictionLevel=Jurisdiction level +UserRole.linkedDefaultUserRole=Linked default user role +UserRole.portHealthUser=Port health user +UserRole.smsNotificationTypes=SMS notification types +UserRole.templateUserRole=User role template +UserRole.restrictAccessToAssignedEntities=Restrict access to assigned entities +userRoleShowOnlyRestrictedAccessToAssignCases=Only show user roles with access restricted to assigned entities +userRoleUserrolesView=User role list +userRoleNotifications=Notifications +userRoleNotificationTypeSms = SMS +userRoleNotificationTypeEmail = EMAIL +userrole.main=User role +userrole.notifications=Notifications +userrole.applyUserRoleTemplate=Apply user role template + +notificationType=Notification type +notificationType.group = Group +notificationType.caption = Caption +notificationType.description = Description + +SormasToSormasShareRequest.uuid=Request ID +SormasToSormasShareRequest.creationDate=Share date +SormasToSormasShareRequest.dataType=Type +SormasToSormasShareRequest.status=Status +SormasToSormasShareRequest.cases=Cases +SormasToSormasShareRequest.contacts=Contacts +SormasToSormasShareRequest.events=Events +SormasToSormasShareRequest.organizationName=Sender organization +SormasToSormasShareRequest.senderName=Sender name +SormasToSormasShareRequest.ownershipHandedOver=Ownership handed over +SormasToSormasShareRequest.comment=Comment +SormasToSormasShareRequest.responseComment=Response comment +SormasToSormasShareRequestIndex.uuid=Share ID +SormasToSormasShareRequestIndex.organizationName=From / To (Counterpart) +SormasToSormasPerson.personName=Person name +SormasToSormasPerson.sex=Sex +SormasToSormasPerson.birthdDate=Birth date +SormasToSormasPerson.address=Address +TaskExport.personFirstName=Person first name +TaskExport.personLastName=Person last name +TaskExport.personSex=Person sex +TaskExport.personBirthDate=Person birth date +TaskExport.personAddressRegion=Person address region +TaskExport.personAddressDistrict=Person address district +TaskExport.personAddressCommunity=Person address community +TaskExport.personAddressFacility=Person address facility +TaskExport.personAddressFacilityDetail=Person address facility details +TaskExport.personAddressCity=Person address city +TaskExport.personAddressStreet=Person address street +TaskExport.personAddressHouseNumber=Person address house number +TaskExport.personAddressPostalCode=Person address postal code +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 +humanSampleViewType=Human +environmentSampleViewType=Environment +environmentSampleNewSample=New sample +ExternalEmailOptions.templateName=Choose template +ExternalEmailOptions.recipientEmail=Email address +ExternalEmailOptions.attachedDocuments=Attach document(s) +externalEmailUsedTemplate=Template +externalEmailSentBy=Sent by +externalEmailSentTo=Sent to +externalEmailAttachedDocuments=Attached documents \ No newline at end of file diff --git a/sormas-api/src/main/resources/continents_es-BO.properties b/sormas-api/src/main/resources/continents_es-BO.properties new file mode 100644 index 00000000000..e7cb993fedf --- /dev/null +++ b/sormas-api/src/main/resources/continents_es-BO.properties @@ -0,0 +1,24 @@ +############################################################################### +# SORMAS® - Surveillance Outbreak Response Management & Analysis System +# Copyright © 2016-2020 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 . +############################################################################### + +continent.AFRICA.name = Africa +continent.AMERICA.name = America +continent.ASIA.name = Asia +continent.AUSTRALIA.name = Australia (Continent) +continent.EUROPE.name = Europe +continent.FOREIGN_COUNTRIES.name = Foreign Countries (Unknown) \ No newline at end of file diff --git a/sormas-api/src/main/resources/countries_es-BO.properties b/sormas-api/src/main/resources/countries_es-BO.properties new file mode 100644 index 00000000000..4e0b12bfb40 --- /dev/null +++ b/sormas-api/src/main/resources/countries_es-BO.properties @@ -0,0 +1,216 @@ +############################################################################### +# SORMAS® - Surveillance Outbreak Response Management & Analysis System +# Copyright © 2016-2020 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 . +############################################################################### + +country.AFG.name=Afghanistan +country.ALB.name=Albania +country.DZA.name=Algeria +country.AND.name=Andorra +country.AGO.name=Angola +country.ATG.name=Antigua and Barbuda +country.ARG.name=Argentina +country.ARM.name=Armenia +country.AUS.name=Australia +country.AUT.name=Austria +country.AZE.name=Azerbaijan +country.BHS.name=Bahamas +country.BHR.name=Bahrain +country.BGD.name=Bangladesh +country.BRB.name=Barbados +country.BLR.name=Belarus +country.BEL.name=Belgium +country.BLZ.name=Belize +country.BEN.name=Benin +country.BTN.name=Bhutan +country.BOL.name=Bolivia (Plurinational State of) +country.BIH.name=Bosnia and Herzegovina +country.BWA.name=Botswana +country.BRA.name=Brazil +country.BRN.name=Brunei Darussalam +country.BGR.name=Bulgaria +country.BFA.name=Burkina Faso +country.BDI.name=Burundi +country.CPV.name=Cabo Verde +country.KHM.name=Cambodia +country.CMR.name=Cameroon +country.CAN.name=Canada +country.CAF.name=Central African Republic +country.TCD.name=Chad +country.CHL.name=Chile +country.CHN.name=China +country.COL.name=Colombia +country.COM.name=Comoros +country.COG.name=Congo (Brazzaville) +country.COK.name=Cook Islands +country.CRI.name=Costa Rica +country.HRV.name=Croatia +country.CUB.name=Cuba +country.CYP.name=Cyprus +country.CZE.name=Czech Republic +country.PRK.name=Democratic People's Republic of Korea +country.COD.name=Democratic Republic of the Congo +country.DNK.name=Denmark +country.DJI.name=Djibouti +country.DMA.name=Dominica +country.DOM.name=Dominican Republic +country.ECU.name=Ecuador +country.EGY.name=Egypt +country.SLV.name=El Salvador +country.GNQ.name=Equatorial Guinea +country.ERI.name=Eritrea +country.EST.name=Estonia +country.SWZ.name=Eswatini +country.ETH.name=Ethiopia +country.FJI.name=Fiji +country.FIN.name=Finland +country.FRA.name=France +country.GAB.name=Gabon +country.GMB.name=Gambia +country.GEO.name=Georgia +country.DEU.name=Germany +country.GHA.name=Ghana +country.GRC.name=Greece +country.GRL.name=Greenland +country.GRD.name=Grenada +country.GTM.name=Guatemala +country.GIN.name=Guinea +country.GNB.name=Guinea-Bissau +country.GUY.name=Guyana +country.HTI.name=Haiti +country.HND.name=Honduras +country.HUN.name=Hungary +country.ISL.name=Iceland +country.IND.name=India +country.IDN.name=Indonesia +country.IRN.name=Iran (Islamic Republic of) +country.IRQ.name=Iraq +country.IRL.name=Ireland +country.ISR.name=Israel +country.ITA.name=Italy +country.CIV.name=Ivory Coast +country.JAM.name=Jamaica +country.JPN.name=Japan +country.JOR.name=Jordan +country.KAZ.name=Kazakhstan +country.KEN.name=Kenya +country.KIR.name=Kiribati +country.KWT.name=Kuwait +country.KGZ.name=Kyrgyzstan +country.LAO.name=Lao People's Democratic Republic +country.LVA.name=Latvia +country.LBN.name=Lebanon +country.LSO.name=Lesotho +country.LBR.name=Liberia +country.LBY.name=Libya +country.LIE.name=Liechtenstein +country.LTU.name=Lithuania +country.LUX.name=Luxembourg +country.MDG.name=Madagascar +country.MWI.name=Malawi +country.MYS.name=Malaysia +country.MDV.name=Maldives +country.MLI.name=Mali +country.MLT.name=Malta +country.MHL.name=Marshall Islands +country.MRT.name=Mauritania +country.MUS.name=Mauritius +country.MEX.name=Mexico +country.FSM.name=Micronesia (Federated States of) +country.MCO.name=Monaco +country.MNG.name=Mongolia +country.MNE.name=Montenegro +country.MAR.name=Morocco +country.MOZ.name=Mozambique +country.MMR.name=Myanmar +country.NAM.name=Namibia +country.NRU.name=Nauru +country.NPL.name=Nepal +country.NLD.name=Netherlands +country.NCL.name=New Caledonia +country.NZL.name=New Zealand +country.NIC.name=Nicaragua +country.NER.name=Niger +country.NGA.name=Nigeria +country.NIU.name=Niue +country.MKD.name=North Macedonia +country.NOR.name=Norway +country.OMN.name=Oman +country.PAK.name=Pakistan +country.PLW.name=Palau +country.PAN.name=Panama +country.PNG.name=Papua New Guinea +country.PRY.name=Paraguay +country.PER.name=Peru +country.PHL.name=Philippines +country.POL.name=Poland +country.PRT.name=Portugal +country.PRI.name=Puerto Rico +country.QAT.name=Qatar +country.KOR.name=Republic of Korea +country.MDA.name=Republic of Moldova +country.ROU.name=Romania +country.RUS.name=Russian Federation +country.RWA.name=Rwanda +country.KNA.name=Saint Kitts and Nevis +country.LCA.name=Saint Lucia +country.VCT.name=Saint Vincent and the Grenadines +country.WSM.name=Samoa +country.SMR.name=San Marino +country.STP.name=Sao Tome and Principe +country.SAU.name=Saudi Arabia +country.SEN.name=Senegal +country.SRB.name=Serbia +country.SYC.name=Seychelles +country.SLE.name=Sierra Leone +country.SGP.name=Singapore +country.SVK.name=Slovakia +country.SVN.name=Slovenia +country.SLB.name=Solomon Islands +country.SOM.name=Somalia +country.ZAF.name=South Africa +country.SSD.name=South Sudan +country.ESP.name=Spain +country.LKA.name=Sri Lanka +country.PSE.name=State of Palestine +country.SDN.name=Sudan +country.SUR.name=Suriname +country.SWE.name=Sweden +country.CHE.name=Switzerland +country.SYR.name=Syrian Arab Republic +country.TJK.name=Tajikistan +country.THA.name=Thailand +country.TLS.name=Timor-Leste +country.TGO.name=Togo +country.TKL.name=Tokelau +country.TON.name=Tonga +country.TTO.name=Trinidad and Tobago +country.TUN.name=Tunisia +country.TUR.name=Turkey +country.TKM.name=Turkmenistan +country.TUV.name=Tuvalu +country.UGA.name=Uganda +country.UKR.name=Ukraine +country.ARE.name=United Arab Emirates +country.GBR.name=United Kingdom of Great Britain and Northern Ireland +country.TZA.name=United Republic of Tanzania +country.USA.name=United States of America +country.URY.name=Uruguay +country.UZB.name=Uzbekistan +country.VUT.name=Vanuatu +country.VAT.name=Vatican City +country.VEN.name=Venezuela (Bolivarian Republic of) +country.VNM.name=Viet Nam \ No newline at end of file diff --git a/sormas-api/src/main/resources/descriptions_es-BO.properties b/sormas-api/src/main/resources/descriptions_es-BO.properties new file mode 100644 index 00000000000..43e8be4291f --- /dev/null +++ b/sormas-api/src/main/resources/descriptions_es-BO.properties @@ -0,0 +1,235 @@ +############################################################################### +# SORMAS® - Surveillance Outbreak Response Management & Analysis System +# Copyright © 2016-2018 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 . +############################################################################### + +# Descriptions used to detail captions + +# Campaign +Campaign.campaignPhase = This is a preview for a feature that will be implemented later +Campaign.calculatedBasedOn=Calculated based on + +# CaseData +CaseData.caseClassification = Select the case status for the person +CaseData.clinicianDetails = Please specify the name, phone number and email address of the clinician responsible for this case +CaseData.disease = Select the disease in question +CaseData.healthFacility = Provide the facility the patient was admitted to +CaseData.reportLat = Report GPS latitude is the the north/south angular location of the case in degrees +CaseData.reportLon = Report GPS longitude is the the east/west angular location of the case in degrees +CaseData.reportLatLonAccuracy = If you draw a circle centered at this location's latitude and longitude, and with a radius equal to the accuracy, then there is a 68% probability that the true location of the case is inside the circle +CaseData.measlesVaccination = Is the person vaccinated against measles? +CaseData.pregnant = Is the person currently pregnant? +CaseData.vaccineInn = International non-proprietary name +CaseData.vaccineUniiCode = Unique ingredient identifier code + + +# CaseHospitalization +CaseHospitalization.admissionDate = Please provide the date of admission to the hospital +CaseHospitalization.isolated = Is the person in isolation or currently being placed there? + +# CasePreviousHospitalization +CasePreviousHospitalization.admissionDate = Please provide the date of admission to the hospital + +# Contact +Contact.community = Users associated to the responsible region/district/community will be able to access this contact. +Contact.contactProximity = Select the type of contact with the case +Contact.district = Users associated to the responsible region/district/community will be able to access this contact. +Contact.followUpStatus =
  • Under follow-up\: The follow-up process is running.
  • Follow-up completed\: The follow-up has been completed.
  • Follow-up canceled\: The follow-up process has been canceled, e.g. because the person died or the contact became irrelevant.
  • Lost to follow-up\: The follow-up process could not be continued, e.g. because the person could not be found.
  • No follow-up\: No contact follow-up is being done.
+Contact.region = Users associated to the responsible region/district/community will be able to access this contact. +Contact.relationToCase = Select the person's relation to the case + +# General +descCommunityFilter = Select a community in the district +descDistrictFilter = Select an district in the region +descFacilityFilter = Select a facility in the district +descPointOfEntryFilter = Select a point of entry in the district +descExportButton = Export the columns and rows that are shown in the table below. +descDetailedExportButton = Export the rows that are shown in the table below with an extended set of columns. This may take a while. +descFollowUpExportButton = Export the follow-up visits for all contacts below. +descDashboardConvertedToCase = The contact has been converted to a case because it has become symptomatic +descDashboardFollowUpInfo = Follow-up status is calculated by taking the status of the last visit to the respective contact. "Never visited" means that the contact has not yet been visited at all. +descDashboardFatalityRateInfo = The fatality rate is calculated based on the number of confirmed, suspect and probable cases. +descDashboardNewFinalLaboratoryResults = Final laboratory results of the new cases +descCaseFilterWithoutGeo = Only list cases that don't have address or report geo coordinates +descCaseFilterPortHealthWithoutFacility = Only list cases that origin from a point of entry and have not yet been referred to a facility +descCaseFilterCasesWithCaseManagementData = Only list cases that have at least one prescription, treatment or clinical visit +descCaseFilterExcludeSharedCases = Exclude all cases that do not originally belong to your jurisdiction, but have been shared with you by other users +descCaseFilterWithoutResponsibleUser = Only list cases that don't have responsible surveillance user +descCaseFilterWithExtendedQuarantine = Only list cases whose quarantine period has been extended +descContactOnlyWithExtendedQuarantine = Only list contacts whose quarantine period has been extended +descCaseFilterWithReducedQuarantine = Only list cases whose quarantine period has been reduced +descCaseFilterRelatedToEvent = Only list cases related to events +descCaseFilterIncludeCasesFromOtherJurisdictions = Include all cases from other jurisdictions that you have access to, e.g. because you created them or they have a contact in your jurisdiction +descCaseFilterOnlyCasesWithFulfilledReferenceDefinition = Include only cases with fulfilled reference definition +descCaseFilterOnlyFromOtherInstances = Only cases that have been received from or sent to other SORMAS instances +descCaseFilterCasesWithReinfection = Only list cases for reinfected persons +descContactOnlyWithReducedQuarantine = Only list contacts whose quarantine period has been reduced +descContactIncludeContactsFromOtherJurisdictions = Include all contacts from other jurisdictions that you have access to, e.g. because you created them or their source case is in your jurisdiction +descGdpr = Reminder\: All comments entered must comply with GDPR rules as described during connection. +discardDescription = Discards any unsaved changes + +# EpiData +EpiData.bats = Did you have contact with live or dead bats or their excreta during the incubation period? +EpiData.birds = Did you have contact with live or dead poultry or wild birds during the incubation period? +EpiData.burialAttended = Did you attend a burial during the incubation period? +EpiData.cattle = Did you have contact with live or dead cattle (cows, sheep, goats) during the incubation period? +EpiData.fleaBite = Did you get bitten by fleas during the incubation period? +EpiData.gatheringAttended = Did you visit a social event during the incubation period? (e.g. religious event, family occasion) +EpiData.otherAnimals = Did you have contact with other animals during the incubation period? +EpiData.otherAnimalsDetails = Please specify +EpiData.primates = Did you have contact with live or dead monkeys during the incubation period? +EpiData.rodents = Did you have contact with live or dead rodents or their excreta during the incubation period? +EpiData.swine = Did you have contact with live or dead swine/pigs during the incubation period? +EpiData.tickBite = Did you get bitten by tick during the incubation period? +EpiData.traveled = Did you travel outside your home village/locality during the incubation period? +EpiData.waterBody = Did you have contact with a body of water (e.g. bathing, doing laundry, or fishing in a river) during the incubation period? +EpiData.waterBodyDetails = Please provide the name and location of this body of water +EpiData.waterSource = What is the main source for your drinking water? +EpiData.waterSourceOther = Please, specify +EpiData.visitedHealthFacility = Did you visit any facility during the incubation period? +EpiData.contactWithSourceRespiratoryCase = Did you have close contact with a person with accute respiratory infection during the incubation period? +EpiData.camels = Did you have contact with live, dead or consume camel products during the incubation period? +EpiData.snakes = Did you have contact with live, dead or eat snakes during the incubation period? + +# EpiDataBurial +EpiDataBurial.address = Please provide the address (village/city, district) of the burial +EpiDataBurial.burialIll = Was the deceased person ill before his/her death with similar disease to yours? +EpiDataBurial.burialPersonName = Please provide the name of the deceased person +EpiDataBurial.burialRelation = Please provide your relation to the deceased person +EpiDataBurial.burialTouching = Did you touch or carry the body? + +# EpiDataTravel +EpiDataTravel.travelType = Did you travel abroad or within the country? + +# Event +Event.startDate = Enter the start date of the event occurrence (dd/mm/yyyy) +Event.endDate = Enter the end date of the event occurrence (dd/mm/yyyy) +Event.eventDesc = Provide a description of the event +Event.eventStatus = Select the status of the event +Event.srcEmail = Enter the source's e-mail address +Event.srcFirstName = Enter the source's first name +Event.srcLastName = Enter the source's last name +Event.srcTelNo = Enter the source's phone number +Event.srcMediaWebsite = Enter the source's website +Event.srcMediaName = Enter the source's name +Event.srcMediaDetails = Enter the source's details +Event.typeOfPlace = Select the place where the event took place +Event.infectionPathCertainty=Certainty of proof in regards to the infection path/source/vehicle/medical procedure in a nosocomial relation of the infections + +# Facility +Facility.CONFIGURED_FACILITY = This should be used if a facility named has been configured for the district and community. The corresponding facilityType must be filled in. +Facility.NO_FACILITY = This facility should be used if explicitly not a facility but another place (e.g. at home) is meant. In this case, the corresponding facilityType must be empty. +Facility.OTHER_FACILITY = This facility should be used if the desired facility does not (yet) exist in Sormas for any reason. Provide a description in the corresponding facilityDetails. The corresponding facilityType must be filled in to make clear what kind of facility it is. + +# Hospitalization +Hospitalization.admissionDate = Please provide the date of admission to the hospital +Hospitalization.isolated = Is the person in isolation or currently being placed there? + +# Location +Location.areaType = The type of area of the community. +Location.latitude = GPS latitude is the north/south angular location in degrees +Location.latLonAccuracy = If you draw a circle centered at this location's latitude and longitude, and with a radius equal to the accuracy, then there is a 68% probability that the true location is inside the circle +Location.longitude = GPS longitude is the the east/west angular location in degrees + +MaternalHistory.rubella = Laboratory-confirmed rubella in the mother +MaternalHistory.rashExposure = Known exposure during pregnancy to any person with maculopapular rash (not vesicular) illness with fever + +# PathogenTest +PathogenTest.fourFoldIncreaseAntibodyTiter = You can only edit this field when there are at least two received samples for the case this pathogen test has been done for +PathogenTest.lab = The laboratory where the pathogen test is done +PathogenTest.labDetails = The name and/or description of the laboratory +PathogenTest.testDateTime = The date and time when the sample is analyzed +PathogenTest.testResult = The result of the pathogen test +PathogenTest.testResultText = Any additional information associated with this pathogen test +PathogenTest.testResultVerified = Is the result of this test verified by a lab supervisor? +PathogenTest.testType = The type of test that is performed on this sample +PathogenTest.testTypeText = The name of the pathogen test that is performed on this sample +PathogenTest.testedDisease = The disease for which this pathogen test is done +PathogenTest.testedDiseaseDetails = The name of the disease for which this pathogen test is done +PathogenTest.serotype = The serotype/serogroup for this test + +# Person +Person.approximateAge = Enter the age of the person +Person.birthdate = Enter the date of birth of the person (dd/mm/yyyy) +Person.deathDate = Enter the person's death date (dd/mm/yyyy) +Person.firstName = Enter the first name of the person +Person.lastName = Enter the last name of the person +Person.phone = Enter phone number of the person +Person.presentCondition = Select the person's current health condition +Person.sex = Select the sex of the person + +# Sample +Sample.sampleDateTime = When the sample was taken (enter a date)? +Sample.associatedLabMessages = Display associated lab messages + +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + +# Symptoms +Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma +Symptoms.bloodInStool = Visible blood in stool +Symptoms.confusedDisoriented = Confused or disoriented +Symptoms.conjunctivitis = Conjunctivitis, redness of the eyes +Symptoms.diarrhea = >\= 3 loose stools within 24h +Symptoms.difficultyBreathing = Difficulty breathing or shortness of breath/dyspnea +Symptoms.eyePainLightSensitive = Pain behind eyes or eyes sensitive to light +Symptoms.fatigueWeakness = Fatigue or general weakness +Symptoms.fever = >\= 38°C +Symptoms.firstSymptom = Enter the person's first symptom +Symptoms.hearingloss = Acute hearing loss not related to an injury +Symptoms.hiccups = Hiccups +Symptoms.kopliksSpots = Koplik's Spots +Symptoms.musclePain = Muscle pain (myalgia) +Symptoms.neckStiffness = Neck feels stiff +Symptoms.onsetDate = Enter the date of onset of the person's first symptom (dd/mm/yyyy) +Symptoms.onsetSymptom = What was the first symptom? +Symptoms.otherHemorrhagicSymptomsText = Specify other hemorrhagic symptoms +Symptoms.refusalFeedorDrink = Refusal to feed or drink +Symptoms.runnyNose = Runny nose (rhinitis or coryza) +Symptoms.skinRash = Sudden onset of skin rash +Symptoms.symptomatic = Did the person have any symptoms or signs of illness? +Symptoms.symptomOnset = Select the date when the person became ill +Symptoms.temperature = Enter the measured body temperature +Symptoms.temperatureSource = Select the source of body temperature +Symptoms.throbocytopenia = Decreased level of thrombocytes in the blood +Symptoms.unexplainedBleeding = Unexplained bleeding or bruising from any site not related to an injury + +# Task +Task.taskType = Select the type of task + +User.limitedDisease = Select a disease here if the user should be restricted to only see data for one case-based disease + +# Visit +Visit.visitDateTime = Enter the date of the follow-up visit (dd/mm/yyyy) +Visit.visitRemarks = Type your remarks of the visit +Visit.visitStatus = Select the visit status + +#UserRole +userRoleTemplate=You can choose one of the existing or default SORMAS user roles to pre-configure it +userRoleVersionUpdate=Version updates of the software may change the user rights and notification settings of a default user role. When linked, these changes will also be applied to this user role. +userRoleNotifications=Select the notifications that this user role will receive +UserRole.hasOptionalHealthFacility=Allows to associate a user to a health facility even though the user is not on health facility jurisdiction level. When the user is entering new data, e.g. a case, the place of stay facility will be pre-filled. +UserRole.hasAssociatedDistrictUser=Allows to associate a user to another user on district jurisdiction level which will be used for weekly reports. +UserRole.portHealthUser=User is a port health user and can only access cases and related data that is associated to a point of entry in the user's jurisdiction. + +# SormasToSormasOptions +SormasToSormasOptions.comment = All comments entered must comply with GDPR rules as described during connection + +sampleDashboardRegionFilter= The region of the associated Case/Contact/Event participant +sampleDashboardDistrictFilter= The district of the associated Case/Contact/Event participant +sampleDashboardDiseaseFilter= The disease of the associated Case/Contact/Event participant's event +sampleDashboardCountsByShipmentStatus=Only samples with the purpose external lab testing are considered +sampleDashboardCountsBySpecimenCondition=Only samples received and with the purpose external lab testing are considered \ No newline at end of file diff --git a/sormas-api/src/main/resources/enum_cs-CZ.properties b/sormas-api/src/main/resources/enum_cs-CZ.properties index 0ac8fc97d1c..4778eb7c186 100644 --- a/sormas-api/src/main/resources/enum_cs-CZ.properties +++ b/sormas-api/src/main/resources/enum_cs-CZ.properties @@ -1532,7 +1532,7 @@ UserRight.EXTERNAL_SURVEILLANCE_SHARE = Odeslat data do nástroje externího doh UserRight.EXTERNAL_SURVEILLANCE_DELETE = Vymazat data v nástroji vnějšího dohledu UserRight.EXTERNAL_MESSAGE_VIEW = Zobrazit a načíst zprávy UserRight.EXTERNAL_MESSAGE_PROCESS = Pracovat se zprávami -UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system +UserRight.EXTERNAL_MESSAGE_PUSH = Nabídnout odeslání externí zprávy do systému UserRight.EXTERNAL_MESSAGE_DELETE = Odstranit zprávy ze systému UserRight.CASE_SHARE = Sdílet případy s celou zemí UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Provést hromadné operace v seznamu zpráv diff --git a/sormas-api/src/main/resources/enum_es-BO.properties b/sormas-api/src/main/resources/enum_es-BO.properties new file mode 100644 index 00000000000..a470fa223b8 --- /dev/null +++ b/sormas-api/src/main/resources/enum_es-BO.properties @@ -0,0 +1,2270 @@ +############################################################################### +# 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 . +############################################################################### + +# Enum captions and descriptions + +# ActionContext +ActionContext.EVENT = Event + +ActionMeasure.PROHIBITION_OF_ENTRY_AND_WORK_CASES = Prohibition of entry and work for case persons +ActionMeasure.SAMPLE_COLLECTION = Sample collection +ActionMeasure.FORWARDING_TO_NATIONAL_REFERENCE_CENTER = Forwarding to the national reference center +ActionMeasure.CONTACT_FOLLOW_UP = Active follow-up of contact persons +ActionMeasure.VERIFICATION_OF_VACCINATION_IMMUNIZATION = Verification of vaccination or immunization status +ActionMeasure.POST_EXPOSURE_PROPHYLAXIS_VACCINATION = Conduct post-exposure prophylaxis vaccination +ActionMeasure.CLOSURE_OF_FACILITY = Closure of facility +ActionMeasure.PROHIBITION_OF_ENTRY_AND_WORK_CONTACTS = Prohibition of entry and work for contact persons +ActionMeasure.POPULATION_INFORMATION = Population information about outbreak +ActionMeasure.OTHER = Other + +# ActionPriority +ActionPriority.HIGH = High +ActionPriority.LOW = Low +ActionPriority.NORMAL = Normal + +# ActionStatus +ActionStatus.DONE = Done +ActionStatus.PENDING = Pending +ActionStatus.IN_PROGRESS = In progress + +# ActivityAsCaseType +ActivityAsCaseType.WORK=Work +ActivityAsCaseType.TRAVEL=Travel +ActivityAsCaseType.SPORT=Sport +ActivityAsCaseType.VISIT=Visit +ActivityAsCaseType.GATHERING=Gathering +ActivityAsCaseType.HABITATION=Habitation +ActivityAsCaseType.PERSONAL_SERVICES=Personal Services +ActivityAsCaseType.CARED_FOR=Cared for +ActivityAsCaseType.OTHER=Other +ActivityAsCaseType.UNKNOWN=Unknown + +# AdditionalTestingStatus +AdditionalTestingStatus.NOT_REQUESTED = Not requested +AdditionalTestingStatus.REQUESTED = Requested +AdditionalTestingStatus.PERFORMED = Performed + +# AdditionalTestType +AdditionalTestType.HAEMOGLOBINURIA = Haemoglobin in urine +AdditionalTestType.PROTEINURIA = Protein in urine +AdditionalTestType.HEMATURIA = Red blood cells in urine +AdditionalTestType.ARTERIAL_VENOUS_BLOOD_GAS = Arterial/venous blood gas +AdditionalTestType.ALT_SGPT = ALT/SGPT +AdditionalTestType.AST_SGOT = AST/SGOT +AdditionalTestType.CREATININE = Creatinine +AdditionalTestType.POTASSIUM = Potassium +AdditionalTestType.UREA = Urea +AdditionalTestType.HAEMOGLOBIN = Haemoglobin +AdditionalTestType.TOTAL_BILIRUBIN = Total bilirubin +AdditionalTestType.CONJ_BILIRUBIN = Conj. bilirubin +AdditionalTestType.WBC_COUNT = WBC count +AdditionalTestType.PLATELETS = Platelets +AdditionalTestType.PROTHROMBIN_TIME = Prothrombin time + +AgeGroup.AGE_0_4 = 0--4 +AgeGroup.AGE_5_9 = 5--9 +AgeGroup.AGE_10_14 = 10--14 +AgeGroup.AGE_15_19 = 15--19 +AgeGroup.AGE_20_24 = 20--24 +AgeGroup.AGE_25_29 = 25--29 +AgeGroup.AGE_30_34 = 30--34 +AgeGroup.AGE_35_39 = 35--59 +AgeGroup.AGE_40_44 = 40--44 +AgeGroup.AGE_45_49 = 45--49 +AgeGroup.AGE_50_54 = 50--54 +AgeGroup.AGE_55_59 = 55--59 +AgeGroup.AGE_60_64 = 60--64 +AgeGroup.AGE_65_69 = 65--69 +AgeGroup.AGE_70_74 = 70--74 +AgeGroup.AGE_75_79 = 75--79 +AgeGroup.AGE_80_84 = 80--84 +AgeGroup.AGE_80_PLUS = 80+ + +#AggregatedReportGroupingLevel +AggregateReportGroupingLevel.REGION = Region +AggregateReportGroupingLevel.DISTRICT = District +AggregateReportGroupingLevel.HEALTH_FACILITY = Facility +AggregateReportGroupingLevel.POINT_OF_ENTRY = Point of entry + +# AnimalCondition +AnimalCondition.ALIVE = Alive +AnimalCondition.DEAD = Dead +AnimalCondition.PROCESSED = Processed +AnimalCondition.UNKNOWN = Unknown + +AnimalContactType.BITE=Bite +AnimalContactType.TOUCH=Touch +AnimalContactType.SCRATCH=Scratch +AnimalContactType.LICK=Lick +AnimalContactType.OTHER=Other + +# ApproximateAgeType +ApproximateAgeType.DAYS = Days +ApproximateAgeType.MONTHS = Months +ApproximateAgeType.YEARS = Years + +AreaType.URBAN = Urban +AreaType.RURAL = Rural +AreaType.UNKNOWN = Unknown + +ArmedForcesRelationType.UNKNOWN = Unknown +ArmedForcesRelationType.NO_RELATION = No relation to armed forces +ArmedForcesRelationType.CIVIL = Civil person working for/accomodated in facility of armed forces +ArmedForcesRelationType.SOLDIER_OR_RELATIVE = Soldier, Relative + +ArrivalOrDeparture.ARRIVAL = Arrival +ArrivalOrDeparture.DEPARTURE = Departure +ArrivalOrDeparture.UNKNOWN = Unknown + +# BurialConductor +BurialConductor.FAMILY_COMMUNITY = Family/Community +BurialConductor.OUTBREAK_TEAM = Outbreak burial team + +# CampaignPhase +CampaignPhase.PRE = Pre-Campaign +CampaignPhase.INTRA = Intra-Campaign +CampaignPhase.POST = Post-Campaign + +# CampaignJurisdictionLevel +CampaignJurisdictionLevel.AREA = Area +CampaignJurisdictionLevel.REGION = Region +CampaignJurisdictionLevel.DISTRICT = District +CampaignJurisdictionLevel.COMMUNITY = Community + +# CaseClassification +CaseClassification.CONFIRMED = Confirmed case +CaseClassification.CONFIRMED_NO_SYMPTOMS = Confirmed case with no symptoms +CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS = Confirmed case with unknown symptoms +CaseClassification.NO_CASE = Not a case +CaseClassification.NOT_CLASSIFIED = Not yet classified +CaseClassification.PROBABLE = Probable case +CaseClassification.SUSPECT = Suspect case +CaseClassification.Short.CONFIRMED = Confirmed +CaseClassification.Short.CONFIRMED_NO_SYMPTOMS = Confirmed with symptoms +CaseClassification.Short.CONFIRMED_UNKNOWN_SYMPTOMS = Confirmed unknown symptoms +CaseClassification.Short.NO_CASE = No case +CaseClassification.Short.NOT_CLASSIFIED = Not classified +CaseClassification.Short.PROBABLE = Probable +CaseClassification.Short.SUSPECT = Suspect + +# CaseIdentificationSource +CaseIdentificationSource.UNKNOWN = Unknown +CaseIdentificationSource.OUTBREAK_INVESTIGATION = Outbreak investigation +CaseIdentificationSource.CONTACT_TRACKING_APP = Contact tracking app +CaseIdentificationSource.SUSPICION_REPORT = Suspicion report +CaseIdentificationSource.CONTACT_TRACING = Contact tracing +CaseIdentificationSource.SCREENING = Screening +CaseIdentificationSource.OTHER = Other + +ScreeningType.ON_HOSPITAL_ADMISSION = On admission in a hospital +ScreeningType.ON_CARE_HOME_ADMISSION = On admission in care home +ScreeningType.ON_ASYLUM_ADMISSION = On admission in an asylum seeking centre +ScreeningType.ON_ENTRY_FROM_RISK_AREA = On entry from risk area +ScreeningType.HEALTH_SECTOR_EMPLOYEE = Employee in health sector +ScreeningType.EDUCATIONAL_INSTITUTIONS = Educational institutions +ScreeningType.SELF_ARRANGED_TEST = Self arranged test +ScreeningType.SELF_CONDUCTED_TEST = Self conducted test +ScreeningType.OTHER = Other + +CaseCountOrIncidence.CASE_COUNT = Case count +CaseCountOrIncidence.CASE_INCIDENCE = Case incidence + +CaseJurisdictionType.RESPONSIBLE = Responsible jurisdiction +CaseJurisdictionType.PLACE_OF_STAY = Place of stay +CaseJurisdictionType.ALL = All + +# CaseMeasure +CaseMeasure.CASE_COUNT = Case count +CaseMeasure.CASE_INCIDENCE = Case incidence proportion + +CaseOrigin.IN_COUNTRY = In-Country +CaseOrigin.POINT_OF_ENTRY = Point of Entry + +# CaseOutcome +CaseOutcome.DECEASED = Deceased +CaseOutcome.NO_OUTCOME = No Outcome Yet +CaseOutcome.RECOVERED = Recovered +CaseOutcome.UNKNOWN = Unknown + +# CaseReferenceDefinition +CaseReferenceDefinition.FULFILLED = Fulfilled +CaseReferenceDefinition.NOT_FULFILLED = Not fulfilled + +# CauseOfDeath +CauseOfDeath.EPIDEMIC_DISEASE = Epidemic disease +CauseOfDeath.OTHER_CAUSE = Other cause + +## Confirmed case classification +CaseConfirmationBasis.CLINICAL_CONFIRMATION = Clinical confirmation +CaseConfirmationBasis.EPIDEMIOLOGICAL_CONFIRMATION = Epidemiological confirmation +CaseConfirmationBasis.LABORATORY_DIAGNOSTIC_CONFIRMATION = Laboratory diagnostic confirmation + +CongenitalHeartDiseaseType.PDA = Patent ductus arteriosus (PDA) +CongenitalHeartDiseaseType.PPS = Peripheral pulmonary stenosis (PPS) +CongenitalHeartDiseaseType.VSD = Ventricular septal defect (VSD) +CongenitalHeartDiseaseType.OTHER = Other heart defect + +# ContactCategory +ContactCategory.HIGH_RISK = High risk contact +ContactCategory.HIGH_RISK_MED = High risk medical contact +ContactCategory.MEDIUM_RISK_MED = Medium risk medical contact +ContactCategory.LOW_RISK = Low risk contact +ContactCategory.NO_RISK = No risk contact + +# ContactClassification +ContactClassification.CONFIRMED = Confirmed contact +ContactClassification.NO_CONTACT = Not a contact +ContactClassification.UNCONFIRMED = Unconfirmed contact +ContactClassification.Short.CONFIRMED = Confirmed +ContactClassification.Short.NO_CONTACT = No contact +ContactClassification.Short.UNCONFIRMED = Unconfirmed + +# ContactDateType +ContactDateType.REPORT_DATE = Report date +ContactDateType.LAST_CONTACT_DATE = Last contact date + +ContactsEpiCurveMode.FOLLOW_UP_STATUS = Follow-up status +ContactsEpiCurveMode.CONTACT_CLASSIFICATION = Contact classification +ContactsEpiCurveMode.FOLLOW_UP_UNTIL = Follow-up until + +# ContactIdentificationSource +ContactIdentificationSource.CASE_PERSON = Case person +ContactIdentificationSource.CONTACT_PERSON = Contact person +ContactIdentificationSource.TRACING_APP = Proximity tracing app +ContactIdentificationSource.OTHER = Other +ContactIdentificationSource.UNKNOWN = Unknown + +# ContactProximity +ContactProximity.AEROSOL = Persons exposed to aerosol producing activities +ContactProximity.AIRPLANE = Airplane, sitting up to two rows in front or behind the source case +ContactProximity.CLOSE_CONTACT = Was in close proximity (1 meter) with source case +ContactProximity.CLOTHES_OR_OTHER = Manipulation of clothes or other objects of source case +ContactProximity.FACE_TO_FACE_LONG = Face-to-face contact of at least 15 minutes +ContactProximity.FACE_TO_FACE_SHORT = Face-to-face contact of less than 15 minutes +ContactProximity.MEDICAL_DISTANT = Medical personnel at safe proximity (> 2 meter), without direct contact with secretions or excretions of the patient and without aerosol exposure +ContactProximity.MEDICAL_SAME_ROOM = Medical personnel that was in same room or house with source case +ContactProximity.MEDICAL_SAFE = Medical personnel at safe proximity (> 2 meter) or with protective equipment +ContactProximity.MEDICAL_UNSAFE = Medical personnel with a high risk of exposure, e.g. unprotected relevant exposure to secretions, exposure to aerosols from COVID-19 cases +ContactProximity.MEDICAL_LIMITED = Medical personnel with limited exposure, e.g. with contact < 2m to COVID-19 cases without protective equipment, ≥ 15min face-to-face contact (without exposure as described under Ia) +ContactProximity.PHYSICAL_CONTACT = Direct physical contact with source case +ContactProximity.SAME_ROOM = Was in same room or house with source case +ContactProximity.TOUCHED_FLUID = Touched fluid of source case + +# ContactRelation +ContactRelation.FAMILY_MEMBER_OR_FRIEND = Other family member or friend +ContactRelation.SAME_ENVIRONMENT = Work in the same environment +ContactRelation.SAME_HOUSEHOLD = Live in the same household +ContactRelation.MEDICAL_CARE = Provided medical care for the case +ContactRelation.OTHER = Other + +# ContactStatus +ContactStatus.ACTIVE = Active contact +ContactStatus.CONVERTED = Converted to case +ContactStatus.DROPPED = Dropped + +ConveyanceType.CAR = Car +ConveyanceType.BUS = Bus +ConveyanceType.MOTORBIKE = Motorbike +ConveyanceType.OTHER = Other + +CustomizableEnumType.DISEASE_VARIANT = Disease variant +CustomizableEnumType.SPECIFIC_EVENT_RISK = Specific event risk +CustomizableEnumType.OCCUPATION_TYPE = Occupation type +CustomizableEnumType.PATHOGEN = Pathogen + +# DashboardType +DashboardType.CONTACTS = Contacts +DashboardType.SURVEILLANCE = Surveillance +DashboardType.CAMPAIGNS = Campaigns + +# DatabaseTable +DatabaseTable.ACTIONS = Actions +DatabaseTable.CASES = Cases +DatabaseTable.SYMPTOMS = Symptoms +DatabaseTable.CLINICAL_COURSES = Clinical courses +DatabaseTable.CLINICAL_VISITS = Clinical visits +DatabaseTable.COMMUNITIES = Communities +DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits +DatabaseTable.CONTINENTS = Continents +DatabaseTable.SUBCONTINENTS = Subcontinents +DatabaseTable.AREAS = Areas +DatabaseTable.COUNTRIES = Countries +DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values +DatabaseTable.DISTRICTS = Districts +DatabaseTable.EPIDATA = Epidemiological data +DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups +DatabaseTable.EVENTGROUPS = Event groups +DatabaseTable.EVENTPARTICIPANTS = Event participants +DatabaseTable.EXPOSURES = Exposures +DatabaseTable.ACTIVITIES_AS_CASE = Activities as case +DatabaseTable.FACILITIES = Facilities +DatabaseTable.POINTS_OF_ENTRY = Points of entry +DatabaseTable.HEALTH_CONDITIONS = Health conditions +DatabaseTable.HOSPITALIZATIONS = Hospitalizations +DatabaseTable.IMMUNIZATIONS = Immunizations +DatabaseTable.LOCATIONS = Locations +DatabaseTable.OUTBREAKS = Outbreaks +DatabaseTable.PERSONS = Persons +DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations +DatabaseTable.PRESCRIPTIONS = Prescriptions +DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations +DatabaseTable.REGIONS = Regions +DatabaseTable.SAMPLES = Samples +DatabaseTable.PATHOGEN_TESTS = Pathogen tests +DatabaseTable.ADDITIONAL_TESTS = Additional tests +DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer +DatabaseTable.THERAPIES = Therapies +DatabaseTable.TRAVEL_ENTRIES = Travel entries +DatabaseTable.TREATMENTS = Treatments +DatabaseTable.USERS = Users +DatabaseTable.USER_ROLES = User roles +DatabaseTable.USERS_USERROLES = Users → User roles +DatabaseTable.USERROLES_USERRIGHTS = User roles → User rights +DatabaseTable.USERROLES_EMAILNOTIFICATIONTYPES = User roles → Email notification types +DatabaseTable.USERROLES_SMSNOTIFICATIONTYPES = User roles → SMS notification types +DatabaseTable.VACCINATIONS = Vaccinations +DatabaseTable.VISITS = Visits +DatabaseTable.WEEKLYREPORTS = Weekly reports +DatabaseTable.WEEKLYREPORTENTRIES = Weekly report entries +DatabaseTable.PORT_HEALTH_INFO = Port health information +DatabaseTable.MATERNAL_HISTORIES = Maternal histories +DatabaseTable.EXTERNAL_MESSAGES = Messages +DatabaseTable.SAMPLE_REPORTS = Sample reports +DatabaseTable.TEST_REPORTS = Test reports +DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information +DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information +DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests +DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info +DatabaseTable.EXTERNAL_SHARE_INFO = External share information +DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta +DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta +DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data +DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions +DatabaseTable.POPULATION_DATA = Population data +DatabaseTable.SURVEILLANCE_REPORTS = Surveillance reports +DatabaseTable.AGGREGATE_REPORTS = Aggregate reports +DatabaseTable.WEEKLY_REPORTS = Weekly reports +DatabaseTable.WEEKLY_REPORT_ENTRIES = Weekly report entries +DatabaseTable.DOCUMENTS = Documents +DatabaseTable.EXPORT_CONFIGURATIONS = Export configurations +DatabaseTable.FEATURE_CONFIGURATIONS = Feature configurations +DatabaseTable.DISEASE_CONFIGURATIONS = Disease configurations +DatabaseTable.DELETION_CONFIGURATIONS = Deletion configurations + +# DateFilterOption +DateFilterOption.DATE = By Date +DateFilterOption.EPI_WEEK = By Epi Week + +# DeathPlaceType +DeathPlaceType.COMMUNITY = Community +DeathPlaceType.HOSPITAL = Hospital +DeathPlaceType.OTHER = Other + +# DefaultUserRole +DefaultUserRole.ADMIN = Admin +DefaultUserRole.CASE_OFFICER = Case Officer +DefaultUserRole.CASE_SUPERVISOR = Clinician +DefaultUserRole.COMMUNITY_INFORMANT = Community Informant +DefaultUserRole.COMMUNITY_OFFICER = Community Officer +DefaultUserRole.CONTACT_OFFICER = Contact Officer +DefaultUserRole.CONTACT_SUPERVISOR = Contact Supervisor +DefaultUserRole.DISTRICT_OBSERVER = District Observer +DefaultUserRole.EVENT_OFFICER = Event Officer +DefaultUserRole.EXTERNAL_LAB_USER = External Lab Officer +DefaultUserRole.HOSPITAL_INFORMANT = Hospital Informant +DefaultUserRole.IMPORT_USER = Import User +DefaultUserRole.LAB_USER = Lab Officer +DefaultUserRole.NATIONAL_CLINICIAN = National Clinician +DefaultUserRole.NATIONAL_OBSERVER = National Observer +DefaultUserRole.NATIONAL_USER = National User +DefaultUserRole.POE_INFORMANT = POE Informant +DefaultUserRole.POE_NATIONAL_USER = POE National User +DefaultUserRole.POE_SUPERVISOR = POE Supervisor +DefaultUserRole.STATE_OBSERVER = Region Observer +DefaultUserRole.SURVEILLANCE_OFFICER = Surveillance Officer +DefaultUserRole.SURVEILLANCE_SUPERVISOR = Surveillance Supervisor +DefaultUserRole.REST_EXTERNAL_VISITS_USER = External Visits User +DefaultUserRole.SORMAS_TO_SORMAS_CLIENT = Sormas to Sormas Client +DefaultUserRole.ADMIN_SUPERVISOR = Admin Surveillance Supervisor +DefaultUserRole.BAG_USER = BAG User +DefaultUserRole.ENVIRONMENTAL_SURVEILLANCE_USER = Environmental Surveillance User +DefaultUserRole.Short.ADMIN = Admin +DefaultUserRole.Short.CASE_OFFICER = CaseOff +DefaultUserRole.Short.CASE_SUPERVISOR = Clinician +DefaultUserRole.Short.CONTACT_OFFICER = ContOff +DefaultUserRole.Short.CONTACT_SUPERVISOR = ContSup +DefaultUserRole.Short.COMMUNITY_INFORMANT = CommInf +DefaultUserRole.Short.DISTRICT_OBSERVER = DistObs +DefaultUserRole.Short.EVENT_OFFICER = EventOff +DefaultUserRole.Short.EXTERNAL_LAB_USER = ExtLabOff +DefaultUserRole.Short.HOSPITAL_INFORMANT = HospInf +DefaultUserRole.Short.IMPORT_USER = ImpUser +DefaultUserRole.Short.LAB_USER = LabOff +DefaultUserRole.Short.NATIONAL_CLINICIAN = NatClin +DefaultUserRole.Short.NATIONAL_OBSERVER = NatObs +DefaultUserRole.Short.NATIONAL_USER = NatUser +DefaultUserRole.Short.POE_INFORMANT = POEInf +DefaultUserRole.Short.POE_NATIONAL_USER = POENat +DefaultUserRole.Short.POE_SUPERVISOR = POESup +DefaultUserRole.Short.STATE_OBSERVER = RegObs +DefaultUserRole.Short.SURVEILLANCE_SUPERVISOR = SurvSup +DefaultUserRole.Short.ADMIN_SUPERVISOR = AdminSup +DefaultUserRole.Short.SURVEILLANCE_OFFICER = SurvOff +DefaultUserRole.Short.REST_EXTERNAL_VISITS_USER = ExtVis +DefaultUserRole.Short.SORMAS_TO_SORMAS_CLIENT = SormasToSormas +DefaultUserRole.Short.BAG_USER = BAG +DefaultUserRole.Short.ENVIRONMENTAL_SURVEILLANCE_USER = EnvSurv + +#DeleteReason +DeletionReason.GDPR = Deletion request by affected person according to GDPR +DeletionReason.DELETION_REQUEST = Deletion request by another authority +DeletionReason.CREATED_WITH_NO_LEGAL_REASON = Entity created without legal reason +DeletionReason.TRANSFERRED_RESPONSIBILITY = Responsibility transferred to another authority +DeletionReason.DUPLICATE_ENTRIES = Deletion of duplicate entries +DeletionReason.OTHER_REASON = Other reason + +# DengueFeverType +DengueFeverType.DENGUE_FEVER = Dengue Fever +DengueFeverType.DENGUE_HEMORRHAGIC_FEVER = Dengue Hemorrhagic Fever +DengueFeverType.DENUGE_SHOCK_SYNDROME = Denuge Shock Syndrome + +# HumanRabiesType +RabiesType.FURIOUS_RABIES = Furious Rabies +RabiesType.PARALYTIC_RABIES = Paralytic Rabies + +# Disease +Disease.AFP = Acute Flaccid Paralysis +Disease.CHOLERA = Cholera +Disease.CONGENITAL_RUBELLA = Congenital Rubella +Disease.CSM = Meningitis (CSM) +Disease.DENGUE = Dengue Fever +Disease.EVD = Ebola Virus Disease +Disease.GUINEA_WORM = Guinea Worm +Disease.LASSA = Lassa +Disease.MEASLES = Measles +Disease.MONKEYPOX = Monkeypox +Disease.NEW_INFLUENZA = Influenza (New subtype) +Disease.UNDEFINED = Not Yet Defined +Disease.OTHER = Other Epidemic Disease +Disease.PLAGUE = Plague +Disease.POLIO = Poliomyelitis +Disease.UNSPECIFIED_VHF = Unspecified VHF +Disease.WEST_NILE_FEVER = West Nile Fever +Disease.YELLOW_FEVER = Yellow Fever +Disease.RABIES = Human Rabies +Disease.ANTHRAX = Anthrax +Disease.PNEUMONIA = Pneumonia +Disease.MALARIA = Malaria +Disease.TYPHOID_FEVER = Typhoid Fever +Disease.ACUTE_VIRAL_HEPATITIS = Acute Viral Hepatitis +Disease.NON_NEONATAL_TETANUS = Non-Neonatal Tetanus +Disease.HIV = HIV +Disease.SCHISTOSOMIASIS = Schistosomiasis +Disease.SOIL_TRANSMITTED_HELMINTHS = Soil-Transmitted Helminths +Disease.TRYPANOSOMIASIS = Trypanosomiasis +Disease.DIARRHEA_DEHYDRATION = Diarrhea w/ Dehydration (< 5) +Disease.DIARRHEA_BLOOD = Diarrhea w/ Blood (Shigella) +Disease.SNAKE_BITE = Snake Bite +Disease.RUBELLA = Rubella +Disease.TUBERCULOSIS = Tuberculosis +Disease.LEPROSY = Leprosy +Disease.LYMPHATIC_FILARIASIS = Lymphatic Filariasis +Disease.BURULI_ULCER = Buruli Ulcer +Disease.PERTUSSIS = Pertussis +Disease.NEONATAL_TETANUS = Neonatal Tetanus +Disease.ONCHOCERCIASIS = Onchocerciasis +Disease.DIPHTERIA = Diphteria +Disease.TRACHOMA = Trachoma +Disease.YAWS_ENDEMIC_SYPHILIS = Yaws and Endemic Syphilis +Disease.MATERNAL_DEATHS = Maternal Deaths +Disease.PERINATAL_DEATHS = Perinatal Deaths +Disease.CORONAVIRUS = COVID-19 +Disease.INFLUENZA_A = Influenza A +Disease.INFLUENZA_B = Influenza B +Disease.H_METAPNEUMOVIRUS = H.metapneumovirus +Disease.RESPIRATORY_SYNCYTIAL_VIRUS = Respiratory syncytial virus (RSV) +Disease.PARAINFLUENZA_1_4 = Parainfluenza (1-4) +Disease.ADENOVIRUS = Adenovirus +Disease.RHINOVIRUS = Rhinovirus +Disease.ENTEROVIRUS = Enterovirus +Disease.M_PNEUMONIAE = M.pneumoniae +Disease.C_PNEUMONIAE = C.pneumoniae +Disease.ARI = ARI (Acute Respiratory Infections) +Disease.CHIKUNGUNYA = Chikungunya +Disease.POST_IMMUNIZATION_ADVERSE_EVENTS_MILD = Post-immunization adverse events mild +Disease.POST_IMMUNIZATION_ADVERSE_EVENTS_SEVERE = Post-immunization adverse events severe +Disease.FHA = FHA (Functional Hypothalamic Amenorrhea) +Disease.Short.AFP = AFP +Disease.Short.CHOLERA = Cholera +Disease.Short.CONGENITAL_RUBELLA = CRS +Disease.Short.CSM = Meningitis +Disease.Short.DENGUE = Dengue +Disease.Short.EVD = EVD +Disease.Short.GUINEA_WORM = Guinea Worm +Disease.Short.LASSA = Lassa +Disease.Short.MEASLES = Measles +Disease.Short.MONKEYPOX = Monkeypox +Disease.Short.NEW_INFLUENZA = New Flu +Disease.Short.UNDEFINED = Undefined +Disease.Short.OTHER = Other +Disease.Short.PLAGUE = Plague +Disease.Short.POLIO = Polio +Disease.Short.UNSPECIFIED_VHF = VHF +Disease.Short.WEST_NILE_FEVER = West Nile Fever +Disease.Short.YELLOW_FEVER = Yellow Fever +Disease.Short.RABIES = Rabies +Disease.Short.ANTHRAX = Anthrax +Disease.Short.PNEUMONIA = Pneumonia +Disease.Short.MALARIA = Malaria +Disease.Short.TYPHOID_FEVER = Typhoid Fever +Disease.Short.ACUTE_VIRAL_HEPATITIS = Acute Viral Hepatitis +Disease.Short.NON_NEONATAL_TETANUS = Non-Neonatal Tetanus +Disease.Short.HIV = HIV +Disease.Short.SCHISTOSOMIASIS = Schistosomiasis +Disease.Short.SOIL_TRANSMITTED_HELMINTHS = Soil-Transmitted Helminths +Disease.Short.TRYPANOSOMIASIS = Trypanosomiasis +Disease.Short.DIARRHEA_DEHYDRATION = Diarrhea w/ Dehydration (< 5) +Disease.Short.DIARRHEA_BLOOD = Diarrhea w/ Blood (Shigella) +Disease.Short.SNAKE_BITE = Snake Bite +Disease.Short.RUBELLA = Rubella +Disease.Short.TUBERCULOSIS = Tuberculosis +Disease.Short.LEPROSY = Leprosy +Disease.Short.LYMPHATIC_FILARIASIS = Lymphatic Filariasis +Disease.Short.BURULI_ULCER = Buruli Ulcer +Disease.Short.PERTUSSIS = Pertussis +Disease.Short.NEONATAL_TETANUS = Neonatal Tetanus +Disease.Short.ONCHOCERCIASIS = Onchocerciasis +Disease.Short.DIPHTERIA = Diphteria +Disease.Short.TRACHOMA = Trachoma +Disease.Short.YAWS_ENDEMIC_SYPHILIS = Yaws and Endemic Syphilis +Disease.Short.MATERNAL_DEATHS = Maternal Deaths +Disease.Short.PERINATAL_DEATHS = Perinatal Deaths +Disease.Short.CORONAVIRUS = COVID-19 +Disease.Short.INFLUENZA_A = Influenza A +Disease.Short.INFLUENZA_B = Influenza B +Disease.Short.H_METAPNEUMOVIRUS = H.metapneumovirus +Disease.Short.RESPIRATORY_SYNCYTIAL_VIRUS = RSV +Disease.Short.PARAINFLUENZA_1_4 = Parainfluenza +Disease.Short.ADENOVIRUS = Adenovirus +Disease.Short.RHINOVIRUS = Rhinovirus +Disease.Short.ENTEROVIRUS = Enterovirus +Disease.Short.M_PNEUMONIAE = M.pneumoniae +Disease.Short.C_PNEUMONIAE = C.pneumoniae +Disease.Short.ARI = ARI +Disease.Short.CHIKUNGUNYA = Chikungunya +Disease.Short.POST_IMMUNIZATION_ADVERSE_EVENTS_MILD = Post-immunization adverse events mild +Disease.Short.POST_IMMUNIZATION_ADVERSE_EVENTS_SEVERE = Post-immunization adverse events severe +Disease.Short.FHA = FHA + +DiseaseTransmissionMode.HUMAN_TO_HUMAN = Primarily via human to human +DiseaseTransmissionMode.ANIMAL = Primarily via animal +DiseaseTransmissionMode.ENVIRONMENT = Primarily via environment +DiseaseTransmissionMode.FOOD = Primarily via food +DiseaseTransmissionMode.VECTOR_BORNE = Primarily vector-borne +DiseaseTransmissionMode.UNKNOWN = Unknown + +# DocumentRelatedEntityType +DocumentRelatedEntityType.ACTION = Action +DocumentRelatedEntityType.CASE = Case +DocumentRelatedEntityType.CONTACT = Contact +DocumentRelatedEntityType.EVENT = Event +DocumentRelatedEntityType.TRAVEL_ENTRY = Travel Entry + +# DocumentWorkflow +DocumentWorkflow.QUARANTINE_ORDER_CASE = Document Templates Case +DocumentWorkflow.QUARANTINE_ORDER_CONTACT = Document Templates Contact +DocumentWorkflow.QUARANTINE_ORDER_EVENT_PARTICIPANT = Document Templates Event Participant +DocumentWorkflow.QUARANTINE_ORDER_TRAVEL_ENTRY = Document Templates Travel Entry +DocumentWorkflow.EVENT_HANDOUT = Templates Event Handout +DocumentWorkflow.CASE_EMAIL = Case email templates +DocumentWorkflow.CONTACT_EMAIL = Contact email templates +DocumentWorkflow.EVENT_PARTICIPANT_EMAIL = Event participant email templates +DocumentWorkflow.TRAVEL_ENTRY_EMAIL = Travel entry email templates + +EducationType.NONE = No education +EducationType.NURSERY = Nursery +EducationType.PRIMARY = Primary +EducationType.SECONDARY = Secondary +EducationType.TERTIARY = Tertiary +EducationType.OTHER = Other + +EntityRelevanceStatus.ACTIVE = Active +EntityRelevanceStatus.ARCHIVED = Archived +EntityRelevanceStatus.ALL = All + +# EnvironmentInfrastructureDetails +EnvironmentInfrastructureDetails.SEPTIC_TANK = Septic tank +EnvironmentInfrastructureDetails.LATRIN = Latrin +EnvironmentInfrastructureDetails.TOILET = Toilet +EnvironmentInfrastructureDetails.MANHOLE = Manhole +EnvironmentInfrastructureDetails.WELLS = Wells +EnvironmentInfrastructureDetails.SURFACE_WATER = Surface water +EnvironmentInfrastructureDetails.OPEN_DRAIN = Open drain +EnvironmentInfrastructureDetails.OTHER = Other +EnvironmentInfrastructureDetails.UNKNOWN = Unknown + +# EnvironmentMedia +EnvironmentMedia.WATER = Water +EnvironmentMedia.SOIL_ROCK = Soil or rock +EnvironmentMedia.AIR = Air +EnvironmentMedia.BIOTA = Biota + +# EpiCurveGrouping +EpiCurveGrouping.DAY = Day +EpiCurveGrouping.MONTH = Month +EpiCurveGrouping.WEEK = Epi Week + +# EpiCurveContactsMode +EpiCurveContactsMode.CONTACT_CLASSIFICATION = Contact Classification +EpiCurveContactsMode.FOLLOW_UP_STATUS = Follow-Up Status +EpiCurveContactsMode.FOLLOW_UP_UNTIL = Follow-Up Until + +# EpiCurveSurveillanceMode +EpiCurveSurveillanceMode.ALIVE_OR_DEAD = Alive or dead +EpiCurveSurveillanceMode.CASE_STATUS = Case status + +# EpiWeekFilterOption +EpiWeekFilterOption.LAST_WEEK = Last Week +EpiWeekFilterOption.SPECIFY_WEEK = Specify +EpiWeekFilterOption.THIS_WEEK = This Week + +# EventContactCountMethod +EventContactCountMethod.ALL = Count all contacts +EventContactCountMethod.SOURCE_CASE_IN_EVENT = Only count contacts with source case in event +EventContactCountMethod.BOTH_METHODS = Show both methods + +# EventInvestigationStatus +EventInvestigationStatus.DISCARDED=Investigation discarded +EventInvestigationStatus.DONE=Investigation done +EventInvestigationStatus.ONGOING=Ongoing Investigation +EventInvestigationStatus.PENDING=Investigation pending +EventInvestigationStatus.Short.DISCARDED=Discarded +EventInvestigationStatus.Short.DONE=Done +EventInvestigationStatus.Short.ONGOING=Ongoing +EventInvestigationStatus.Short.PENDING=Pending + +# EventStatus +EventStatus.EVENT = Event +EventStatus.DROPPED = Dropped +EventStatus.SIGNAL = Signal +EventStatus.SCREENING = Screening +EventStatus.CLUSTER = Cluster +EventStatus.Short.EVENT = Event +EventStatus.Short.DROPPED = Dropped +EventStatus.Short.SIGNAL = Signal +EventStatus.Short.SCREENING = Screening +EventStatus.Short.CLUSTER = Cluster + +# EventManagementStatus +EventManagementStatus.PENDING = Pending +EventManagementStatus.ONGOING = Ongoing +EventManagementStatus.DONE = Done +EventManagementStatus.CLOSED = Closed + +# EventIndentificationSource +EventIdentificationSource.UNKNOWN = Unknown +EventIdentificationSource.BACKWARD_TRACING = Backward-tracing +EventIdentificationSource.FORWARD_TRACING = Forward-tracing + +ExportGroupType.CORE = Core Data +ExportGroupType.SENSITIVE = Sensitive Person Data +ExportGroupType.PERSON = General Person Data +ExportGroupType.HOSPITALIZATION = Hospitalization Data +ExportGroupType.EPIDEMIOLOGICAL = Epidemiological Data +ExportGroupType.VACCINATION = Vaccination Data +ExportGroupType.FOLLOW_UP = Follow-up Data +ExportGroupType.ADDITIONAL = Additional Data +ExportGroupType.LOCATION = Location Data +ExportGroupType.EVENT = Event Data +ExportGroupType.EVENT_GROUP = Event Group Data +ExportGroupType.EVENT_SOURCE = Event Source Data +ExportGroupType.CLINICAL_COURSE = Clinical Course Data +ExportGroupType.THERAPY = Therapy Data + +EventSourceType.NOT_APPLICABLE = Not applicable +EventSourceType.MEDIA_NEWS = Media/News +EventSourceType.HOTLINE_PERSON = Hotline/Person +EventSourceType.MATHEMATICAL_MODEL = Mathematical model +EventSourceType.INSTITUTIONAL_PARTNER = Institutional partner + +InstitutionalPartnerType.HEALTH_INSURANCE = Health insurance +InstitutionalPartnerType.TERRITORIAL_COMMUNITIES = Territorial communities +InstitutionalPartnerType.NATIONAL_EDUCATION = National education +InstitutionalPartnerType.HEALTH_ESTABLISHMENTS = Health establishments +InstitutionalPartnerType.MEDICO_SOCIAL_ESTABLISHMENTS = Medico-social establishments +InstitutionalPartnerType.OTHER = Other + +ExposureType.WORK=Work +ExposureType.TRAVEL=Travel +ExposureType.SPORT=Sport +ExposureType.VISIT=Visit +ExposureType.GATHERING=Gathering +ExposureType.HABITATION=Habitation +ExposureType.PERSONAL_SERVICES=Personal Services +ExposureType.BURIAL=Burial +ExposureType.ANIMAL_CONTACT=Animal Contact +ExposureType.OTHER=Other +ExposureType.UNKNOWN=Unknown + +# FacilityType +FacilityType.ASSOCIATION=Association, club +FacilityType.BAR=Bar +FacilityType.BUSINESS=Business +FacilityType.CAMPSITE=Campsite +FacilityType.CANTINE=Cantine +FacilityType.CHILDRENS_DAY_CARE=Children's day care +FacilityType.CHILDRENS_HOME=Children's home +FacilityType.CORRECTIONAL_FACILITY=Correctional facility +FacilityType.CRUISE_SHIP=Cruise ship +FacilityType.ELDERLY_DAY_CARE=Elderly day care +FacilityType.EVENT_VENUE=Event venue +FacilityType.FOOD_STALL=Food stall +FacilityType.HOLIDAY_CAMP=Holiday camp +FacilityType.HOMELESS_SHELTER=Homeless shelter +FacilityType.HOSPITAL=Hospital +FacilityType.HOSTEL=Hostel, dormitory +FacilityType.HOTEL=Hotel, B&B, inn, lodge +FacilityType.KINDERGARTEN=Kindergarten/After school care +FacilityType.LABORATORY=Laboratory +FacilityType.MASS_ACCOMMODATION=Mass accommodation (e.g. guest and harvest workers) +FacilityType.MILITARY_BARRACKS=Military barracks +FacilityType.MOBILE_NURSING_SERVICE=Mobile nursing service +FacilityType.NIGHT_CLUB=Night club, dance club, discotheque +FacilityType.OTHER_ACCOMMODATION=Other Accommodation +FacilityType.OTHER_CARE_FACILITY=Other Care facility +FacilityType.OTHER_CATERING_OUTLET=Other Catering outlet +FacilityType.OTHER_EDUCATIONAL_FACILITY=Other Educational facility +FacilityType.OTHER_LEISURE_FACILITY=Other Leisure facility +FacilityType.OTHER_MEDICAL_FACILITY=Other Medical facility +FacilityType.OTHER_RESIDENCE=Other Residence +FacilityType.OTHER_WORKING_PLACE=Other Working place/company +FacilityType.OTHER_COMMERCE=Other Commerce +FacilityType.OUTPATIENT_TREATMENT_FACILITY=Outpatient treatment facility +FacilityType.PLACE_OF_WORSHIP=Place of worship +FacilityType.PUBLIC_PLACE=Public place/playground +FacilityType.REFUGEE_ACCOMMODATION=Refugee accommodation/initial reception facility +FacilityType.REHAB_FACILITY=Rehab facility +FacilityType.RESTAURANT=Restaurant/tavern +FacilityType.RETIREMENT_HOME=Retirement home +FacilityType.SCHOOL=School +FacilityType.SWIMMING_POOL=Swimming pool +FacilityType.THEATER=Theater/cinema +FacilityType.UNIVERSITY=University +FacilityType.ZOO=Zoological garden, animal park +FacilityType.RETAIL = Retail +FacilityType.WHOLESALE = Wholesale +FacilityType.AMBULATORY_SURGERY_FACILITY = Ambulatory surgery facility +FacilityType.DIALYSIS_FACILITY = Dialysis facility +FacilityType.DAY_HOSPITAL = Day hospital +FacilityType.MATERNITY_FACILITY = Maternity facility +FacilityType.MEDICAL_PRACTICE = Medical practice +FacilityType.DENTAL_PRACTICE = Dental practice +FacilityType.OTHER_MEDICAL_PRACTICE = Other medical practice +FacilityType.DIAGNOSTIC_PREVENTATIVE_THERAPEUTIC_FACILITY = Diagnostic, preventative, therapeutic facility +FacilityType.EMERGENCY_MEDICAL_SERVICES = Emergency medical services +FacilityType.ELDERLY_CARE_FACILITY = Elderly care facility +FacilityType.DISABLED_PERSON_HABITATION = Disabled person habitation +FacilityType.CARE_RECIPIENT_HABITATION = Care recipient habitation +FacilityType.VISITING_AMBULATORY_AID = Visiting ambulatory aid +FacilityType.AFTER_SCHOOL = After school facility + +#FacilityTypeGroup +FacilityTypeGroup.ACCOMMODATION=Accommodation +FacilityTypeGroup.CARE_FACILITY=Care facility +FacilityTypeGroup.CATERING_OUTLET=Catering outlet +FacilityTypeGroup.EDUCATIONAL_FACILITY=Educational facility +FacilityTypeGroup.LEISURE_FACILITY=Leisure facility +FacilityTypeGroup.MEDICAL_FACILITY=Medical facility +FacilityTypeGroup.RESIDENCE=Residence +FacilityTypeGroup.WORKING_PLACE=Working place/company +FacilityTypeGroup.COMMERCE=Commerce + +# FollowUpStartDateType +FollowUpStartDateType.SYMPTOM_ONSET_DATE=symptom onset date +FollowUpStartDateType.LAST_CONTACT_DATE=last contact date +FollowUpStartDateType.EARLIEST_SAMPLE_COLLECTION_DATE=earliest sample collection date +FollowUpStartDateType.REPORT_DATE=report date + +# FollowUpStatus +FollowUpStatus.CANCELED=Canceled follow-up +FollowUpStatus.COMPLETED=Completed follow-up +FollowUpStatus.FOLLOW_UP=Under follow-up +FollowUpStatus.LOST=Lost follow-up +FollowUpStatus.NO_FOLLOW_UP=No follow-up +FollowUpStatus.Short.CANCELED=Canceled +FollowUpStatus.Short.COMPLETED=Completed +FollowUpStatus.Short.FOLLOW_UP=Ongoing +FollowUpStatus.Short.LOST=Lost to follow-up +FollowUpStatus.Short.NO_FOLLOW_UP=No follow-up +FollowUpStatus.Desc.CANCELED=The follow-up process has been canceled, e.g. because the person died or the contact became irrelevant +FollowUpStatus.Desc.COMPLETED=The follow-up process has been completed +FollowUpStatus.Desc.FOLLOW_UP=The follow-up process is running +FollowUpStatus.Desc.LOST=The follow-up process could not be continued because the person was not available +FollowUpStatus.Desc.NO_FOLLOW_UP=No contact follow-up is being done + +GatheringType.PARTY=Party +GatheringType.RELIGIOUS=Religious Gathering +GatheringType.MUSICAL=Choir/Singing Club/Orchestra +GatheringType.CONCERT=Concert +GatheringType.DEMONSTRATION=Demonstration +GatheringType.CARNIVAL=Carnival +GatheringType.FAIR=Fair +GatheringType.SPORTING_EVENT=Sporting event +GatheringType.OTHER=Other + +HabitationType.MEDICAL=Stay in a Medical Institution +HabitationType.OTHER=Other + +HospitalizationReasonType.REPORTED_DISEASE=Reported disease +HospitalizationReasonType.ISOLATION=Isolation +HospitalizationReasonType.OTHER=Other reason +HospitalizationReasonType.UNKNOWN=Unknown + +HospitalWardType.PEDIATRIC_INPATIENT = Pediatric-Inpatient +HospitalWardType.NURSERY = Nursery +HospitalWardType.EPU = EPU +HospitalWardType.CHER = CHER +HospitalWardType.OPD = OPD +HospitalWardType.EYE = Eye +HospitalWardType.ENT = ENT +HospitalWardType.CARDIOLOGY = Cardiology +HospitalWardType.OTHER = Other + +# ImmunizationDateType +ImmunizationDateType.FIRST_VACCINATION_DATE=Date of first vaccination +ImmunizationDateType.IMMUNIZATION_END=End of immunization +ImmunizationDateType.LAST_VACCINATION_DATE=Date of last vaccination +ImmunizationDateType.RECOVERY_DATE=Date of recovery +ImmunizationDateType.REPORT_DATE=Date of report +ImmunizationDateType.VALID_UNTIL=Valid until + +# InvestigationStatus +InvestigationStatus.DISCARDED=Investigation discarded +InvestigationStatus.DONE=Investigation done +InvestigationStatus.PENDING=Investigation pending +InvestigationStatus.Short.DISCARDED=Discarded +InvestigationStatus.Short.DONE=Done +InvestigationStatus.Short.PENDING=Pending + +# KindOfInvolvement +KindOfInvolvement.OTHER = Other +KindOfInvolvement.POTENTIALLY_EXPOSED = Potentially exposed +KindOfInvolvement.POTENTIAL_INDEX_CASE = Potential index case + +Language.EN = English +Language.EN_AF = English (Afghanistan) +Language.EN_NG = English (Nigeria) +Language.EN_GH = English (Ghana) +Language.FR = Français +Language.DE = Deutsch +Language.ES_EC = Español (Ecuador) +Language.ES_CU = Español (Cuba) +Language.FI = Suomi +Language.IT = Italiano +Language.DE_CH = Deutsch (Schweiz) +Language.IT_CH = Italiano (Svizzera) +Language.FR_CH = Français (Suisse) +Language.PS = Pashto +Language.FA = Dari +Language.CZ = Čeština +Language.UR_PK = Urdu +Language.FR_TN = Français (Tunisie) + +# MapCaseDisplayMode +MapCaseDisplayMode.CASE_ADDRESS = ... by home address +MapCaseDisplayMode.FACILITY = ... by facility +MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS = ... by facility or home address + +MapCaseClassificationOption.ALL_CASES = Show all cases +MapCaseClassificationOption.CONFIRMED_CASES_ONLY = Show confirmed cases only + +MapPeriodType.DAILY = Daily +MapPeriodType.WEEKLY = Weekly +MapPeriodType.MONTHLY = Monthly +MapPeriodType.YEARLY = Yearly + + +MeansOfTransport.LOCAL_PUBLIC_TRANSPORT=Local public transport +MeansOfTransport.BUS=Bus +MeansOfTransport.FERRY=Ship/Ferry +MeansOfTransport.PLANE=Plane +MeansOfTransport.TRAIN=Train +MeansOfTransport.OTHER=Other + +# MessageSubject +MessageSubject.CASE_CLASSIFICATION_CHANGED = Case classification changed +MessageSubject.CASE_INVESTIGATION_DONE = Case investigation done +MessageSubject.EVENT_PARTICIPANT_CASE_CLASSIFICATION_CONFIRMED = Event participant identified as a confirmed %s case +MessageSubject.EVENT_PARTICIPANT_RELATED_TO_OTHER_EVENTS = Event Participant related to other Events +MessageSubject.LAB_RESULT_ARRIVED = Lab result arrived +MessageSubject.LAB_SAMPLE_SHIPPED = Lab sample shipped +MessageSubject.CONTACT_SYMPTOMATIC = Contact has become symptomatic +MessageSubject.TASK_START = Task to be started +MessageSubject.TASK_DUE = Task overdue +MessageSubject.TASK_UPDATED_ASSIGNEE = Updated task assignee +MessageSubject.VISIT_COMPLETED = Follow-up visit completed +MessageSubject.DISEASE_CHANGED = Case disease changed +MessageSubject.EVENT_GROUP_CREATED = Event Group created +MessageSubject.EVENT_ADDED_TO_EVENT_GROUP = Event added to Event Group +MessageSubject.EVENT_REMOVED_FROM_EVENT_GROUP = Event removed from Event Group + +# Month +Month.JANUARY = January +Month.FEBRUARY = February +Month.MARCH = March +Month.APRIL = April +Month.MAY = May +Month.JUNE = June +Month.JULY = July +Month.AUGUST = August +Month.SEPTEMBER = September +Month.OCTOBER = October +Month.NOVEMBER = November +Month.DECEMBER = December + +# NewCaseDateType +NewCaseDateType.MOST_RELEVANT = Most relevant date +NewCaseDateType.ONSET = Symptom onset date +NewCaseDateType.REPORT = Case report date + +# OccupationType +# Temporarily necessary for data migration of older systems; can be removed at a later point in time +OccupationType.BUSINESSMAN_WOMAN = Businessman / woman +OccupationType.BUTCHER = Butcher +OccupationType.CHILD = Child +OccupationType.FARMER = Farmer +OccupationType.HEALTHCARE_WORKER = Healthcare worker +OccupationType.HOUSEWIFE = Housewife +OccupationType.HUNTER_MEAT_TRADER = Hunter / trader of game meat +OccupationType.MINER = Miner +OccupationType.OTHER = Other +OccupationType.PUPIL_STUDENT = Pupil / student +OccupationType.RELIGIOUS_LEADER = Religious leader +OccupationType.TRADITIONAL_SPIRITUAL_HEALER = Traditional / spiritual healer +OccupationType.TRANSPORTER = Transporter +OccupationType.WORKING_WITH_ANIMALS = Working with animals +OccupationType.LABORATORY_STAFF = Laboratory staff +OccupationType.UNKNOWN = Unknown + +OccupationType.AGRICULTURE = A. Agriculture & forestry, fisheries +OccupationType.MINING = B. Mining & quarrying +OccupationType.MANUFACTURING = C. Manufacturing industry /manufacture of goods +OccupationType.ENERGY_SUPPLY = D. Energy supply +OccupationType.WATER_SUPPLY_AND_WASTE = E. Water supply; sewerage and waste management +OccupationType.CONSTRUCTION = F. Construction industry /building +OccupationType.RETAIL_AND_REPAIR_SERVICE = G. Wholesale and retail trade; repair services +OccupationType.TRANSPORT_AND_STORAGE = H. Transport and storage +OccupationType.ACCOMMODATION_AND_FOOD_SERVICES = I. Hotels and restaurants /accommodation & gastronomy +OccupationType.INFORMATION_AND_COMMUNICATION = J. Information & communication +OccupationType.FINANCE_AND_INSURANCE = K. Finance & insurance +OccupationType.REAL_ESTATE = L. Real estate and housing +OccupationType.PROFESSIONAL_SCIENTIFIC_AND_TECHNICAL = M. Service\: freelance, scientific, technical +OccupationType.ADMINISTRATIVE_AND_SUPPORT = N. Service\: other economic activities +OccupationType.PUBLIC_ADMINISTRATION_AND_DEFENCE = O. Public administration and defence; social services/security +OccupationType.EDUCATION = P. Education & teaching +OccupationType.HEALTH_AND_SOCIAL = Q. Health & social services +OccupationType.ARTS_ENTERTAINMENT_AND_RECREATION = R. Arts, entertainment & recreation +OccupationType.SERVICE_OTHER = S. Service\: other +OccupationType.PRIVATE_HOUSEHOLD = T. Private households with domestic staff +OccupationType.EXTRATERRITORIAL_ORGANIZATIONS = U. Exterritorial organisations & bodies + +# PathogenTestResultType +PathogenTestResultType.INDETERMINATE = Indeterminate +PathogenTestResultType.NEGATIVE = Negative +PathogenTestResultType.PENDING = Pending +PathogenTestResultType.POSITIVE = Positive +PathogenTestResultType.NOT_DONE = Not done + +# PathogenTestType +PathogenTestType.ANTIGEN_DETECTION = Antigen detection test +PathogenTestType.CULTURE = Culture +PathogenTestType.DENGUE_FEVER_ANTIBODIES = Dengue fever neutralizing antibodies +PathogenTestType.DENGUE_FEVER_IGM = Dengue fever IgM serum antibody +PathogenTestType.DNA_MICROARRAY = DNA Microarray +PathogenTestType.HISTOPATHOLOGY = Histopathology +PathogenTestType.IGG_SERUM_ANTIBODY = IgG serum antibody +PathogenTestType.IGM_SERUM_ANTIBODY = IgM serum antibody +PathogenTestType.IGA_SERUM_ANTIBODY = IgA serum antibody +PathogenTestType.ISOLATION = Isolation +PathogenTestType.MICROSCOPY = Microscopy +PathogenTestType.NEUTRALIZING_ANTIBODIES = Neutralizing antibodies +PathogenTestType.OTHER = Other +PathogenTestType.PCR_RT_PCR = PCR / RT-PCR +PathogenTestType.RAPID_TEST = Antigen detection test (rapid test) +PathogenTestType.WEST_NILE_FEVER_ANTIBODIES = West nile fever neutralizing antibodies +PathogenTestType.WEST_NILE_FEVER_IGM = West nile fever IgM serum antibody +PathogenTestType.YELLOW_FEVER_ANTIBODIES = Yellow fever neutralizing antibodies +PathogenTestType.YELLOW_FEVER_IGM = Yellow fever IgM serum antibody +PathogenTestType.YERSINIA_PESTIS_ANTIGEN = Yersinia pestis antigen test +PathogenTestType.ANTIBODY_DETECTION = Antibody detection +PathogenTestType.INCUBATION_TIME = Incubation time +PathogenTestType.INDIRECT_FLUORESCENT_ANTIBODY = Indirect Fluorescent Antibody (IFA) +PathogenTestType.DIRECT_FLUORESCENT_ANTIBODY = Direct Fluorescent Antibody (FA) +PathogenTestType.GRAM_STAIN = Gram Stain +PathogenTestType.LATEX_AGGLUTINATION = Latex Agglutination +PathogenTestType.CQ_VALUE_DETECTION = CQ Value Detection +PathogenTestType.SEQUENCING = Sequencing +PathogenTestType.TMA = Transcription-mediated amplification (TMA) + +PCRTestSpecification.VARIANT_SPECIFIC = Variant specific +PCRTestSpecification.N501Y_MUTATION_DETECTION = N501Y mutation detection + +PersonContactDetailType.PHONE = Phone +PersonContactDetailType.EMAIL = Email +PersonContactDetailType.OTHER = Other + +PhoneNumberType.LANDLINE = Landline +PhoneNumberType.MOBILE = Mobile +PhoneNumberType.WORK = Work +PhoneNumberType.OTHER = Other + +ExposureRole.PASSENGER = Passenger +ExposureRole.STAFF = Staff +ExposureRole.NURSING_STAFF = Nursing staff +ExposureRole.MEDICAL_STAFF = Medical staff +ExposureRole.VISITOR = Visitor +ExposureRole.GUEST = Guest +ExposureRole.CUSTOMER = Customer +ExposureRole.CONSERVATEE = Conservatee +ExposureRole.PATIENT = Patient +ExposureRole.EDUCATOR = Educator +ExposureRole.TRAINEE_TEACHER = Trainee teacher +ExposureRole.PUPIL = Pupil +ExposureRole.STUDENT = Student +ExposureRole.PARENT = Parent +ExposureRole.TEACHER = Teacher +ExposureRole.UNKNOWN = Unknown +ExposureRole.OTHER = Other + +#SymptomJournalStatus +SymptomJournalStatus.UNREGISTERED = Unregistered +SymptomJournalStatus.REGISTERED = Registered +SymptomJournalStatus.ACCEPTED = Accepted +SymptomJournalStatus.REJECTED = Rejected +SymptomJournalStatus.DELETED = Deleted + +# PlagueType +PlagueType.BUBONIC = Bubonic plague +PlagueType.PNEUMONIC = Pneumonic plague +PlagueType.SEPTICAEMIC = Septicaemic plague + +# PersonAddressType +PersonAddressType.HOME = Home +PersonAddressType.PLACE_OF_RESIDENCE = Place of residence +PersonAddressType.PLACE_OF_EXPOSURE = Place of exposure +PersonAddressType.PLACE_OF_WORK = Place of work +PersonAddressType.PLACE_OF_ISOLATION = Place of isolation +PersonAddressType.EVENT_LOCATION = Event location +PersonAddressType.OTHER_ADDRESS = Other address + +# PointOfEntryType +PointOfEntryType.AIRPORT = Airport +PointOfEntryType.SEAPORT = Seaport +PointOfEntryType.GROUND_CROSSING = Ground crossing +PointOfEntryType.OTHER = Other + +# PresentCondition +PresentCondition.ALIVE=Alive +PresentCondition.BURIED=Buried +PresentCondition.DEAD=Dead +PresentCondition.UNKNOWN=Unknown + +# QuarantineType +QuarantineType.HOME = Home +QuarantineType.INSTITUTIONELL = Institutional +QuarantineType.NONE = None +QuarantineType.UNKNOWN = Unknown +QuarantineType.OTHER = Other + +QuarantineType.HOSPITAL = Hospital +QuarantineType.HOTEL = Hotel +QuarantineType.ASYLUM_ACCOMMODATION = Asylum Accommodation + +# ReportingType +ReportingType.NOT_RAISED = Not raised +ReportingType.OTHER = Other +ReportingType.DOCTOR = Doctor +ReportingType.LABORATORY = Laboratory +ReportingType.OWN_DETERMINATION = Own Determination +ReportingType.HOSPITAL_OR_STATIONARY_CARE = Hospital or stationary care +ReportingType.NOT_DETERMINABLE = Not determinable +ReportingType.FORWARDING = Forwarding +ReportingType.COMMUNITY_FACILITY = Community facility +ReportingType.COMMUNITY_FACILITY_IFSG_ARTICLE_34 = Community facility (§ 34 IfSG) + +# RiskLevel +RiskLevel.LOW = Low risk +RiskLevel.MODERATE = Moderate risk +RiskLevel.HIGH = High risk +RiskLevel.UNKNOWN = Unknown + +# SampleMaterial +SampleMaterial.BLOOD = Blood +SampleMaterial.CEREBROSPINAL_FLUID = Cerebrospinal fluid +SampleMaterial.CRUST = Crust +SampleMaterial.NASAL_SWAB = Nasal swab +SampleMaterial.NP_SWAB = Nasopharyngeal swab +SampleMaterial.OTHER = Other +SampleMaterial.RECTAL_SWAB = Rectal swab +SampleMaterial.SERA = Sera +SampleMaterial.STOOL = Stool +SampleMaterial.THROAT_SWAB = Throat swab +SampleMaterial.TISSUE = Tissue +SampleMaterial.URINE = Urine +SampleMaterial.CORNEA_PM=Cornea p.m +SampleMaterial.SALIVA=Saliva +SampleMaterial.URINE_PM=Urine p.m +SampleMaterial.NUCHAL_SKIN_BIOPSY=Nuchal skin biopsy +SampleMaterial.BRAIN_TISSUE=Brain tissue +SampleMaterial.OROPHARYNGEAL_SWAB=Oropharyngeal swab +SampleMaterial.SPUTUM=Sputum +SampleMaterial.ENDOTRACHEAL_ASPIRATE=Endotracheal aspirate +SampleMaterial.BRONCHOALVEOLAR_LAVAGE=Bronchoalveolar lavage +SampleMaterial.ANTERIOR_NARES_SWAB=Anterior nares swab +SampleMaterial.OP_ASPIRATE=Oropharyngeal aspirate +SampleMaterial.NP_ASPIRATE=Nasopharyngeal aspirate +SampleMaterial.PLEURAL_FLUID=Pleural fluid specimen +# SampleSource +SampleSource.ANIMAL=Animal +SampleSource.ENVIRONMENT=Environment +SampleSource.HUMAN=Human +# SampleAssociationType +SampleAssociationType.ALL=All samples +SampleAssociationType.CASE=Case samples +SampleAssociationType.CONTACT=Contact samples +SampleAssociationType.EVENT_PARTICIPANT=Event participant samples +SampleAssociationType.PERSON=Person samples +# Sex +Sex.FEMALE=Female +Sex.MALE=Male +Sex.OTHER=Other +Sex.UNKNOWN=Unknown +# ShipmentStatus +ShipmentStatus.NOT_SHIPPED=Not shipped +ShipmentStatus.RECEIVED=Received +ShipmentStatus.REFERRED_OTHER_LAB=Referred to other lab +ShipmentStatus.SHIPPED=Shipped +ShipmentStatus.Short.NOT_SHIPPED=Not shipped +ShipmentStatus.Short.RECEIVED=Received +ShipmentStatus.Short.REFERRED_OTHER_LAB=Referred +ShipmentStatus.Short.SHIPPED=Shipped +# SimpleTestResultType +SimpleTestResultType.POSITIVE=Positive +SimpleTestResultType.NEGATIVE=Negative +SimpleTestResultType.INDETERMINATE=Indeterminate + +# SpecimenCondition +SpecimenCondition.ADEQUATE = Adequate +SpecimenCondition.NOT_ADEQUATE = Not adequate + +# StatisticsCaseAttribute +StatisticsCaseAttribute.AGE_INTERVAL_1_YEAR= Age stratification\: 1 year intervals +StatisticsCaseAttribute.AGE_INTERVAL_5_YEARS= Age stratification\: 5 year intervals +StatisticsCaseAttribute.AGE_INTERVAL_BASIC= Age stratification\: basic +StatisticsCaseAttribute.AGE_INTERVAL_CHILDREN_COARSE= Age stratification\: children coarse +StatisticsCaseAttribute.AGE_INTERVAL_CHILDREN_FINE= Age stratification\: children fine +StatisticsCaseAttribute.AGE_INTERVAL_CHILDREN_MEDIUM= Age stratification\: children medium +StatisticsCaseAttribute.CLASSIFICATION = Classification +StatisticsCaseAttribute.DISEASE = Disease +StatisticsCaseAttribute.ONSET_TIME = Onset time +StatisticsCaseAttribute.OUTCOME = Outcome +StatisticsCaseAttribute.OUTCOME_TIME = Outcome time +StatisticsCaseAttribute.JURISDICTION = Region / District / Community / Facility +StatisticsCaseAttribute.REPORT_TIME = Report time +StatisticsCaseAttribute.REPORTING_USER_ROLE = Reporting user role +StatisticsCaseAttribute.SEX = Sex +StatisticsCaseAttribute.PLACE_OF_RESIDENCE = Place of residence + +# StatisticsCaseAttributeGroup +StatisticsCaseAttributeGroup.CASE = Case +StatisticsCaseAttributeGroup.PERSON = Person +StatisticsCaseAttributeGroup.PLACE = Place +StatisticsCaseAttributeGroup.TIME = Time + +# StatisticsCaseSubAttribute +StatisticsCaseSubAttribute.DATE_RANGE = Date range +StatisticsCaseSubAttribute.DISTRICT = District +StatisticsCaseSubAttribute.EPI_WEEK = Epi week +StatisticsCaseSubAttribute.EPI_WEEK_OF_YEAR = Epi week of year +StatisticsCaseSubAttribute.MONTH = Month +StatisticsCaseSubAttribute.MONTH_OF_YEAR = Month of year +StatisticsCaseSubAttribute.QUARTER = Quarter +StatisticsCaseSubAttribute.QUARTER_OF_YEAR = Quarter of year +StatisticsCaseSubAttribute.REGION = Region +StatisticsCaseSubAttribute.YEAR = Year +StatisticsCaseSubAttribute.COMMUNITY = Community +StatisticsCaseSubAttribute.FACILITY = Facility +StatisticsCaseSubAttribute.PERSON_REGION = Person's region +StatisticsCaseSubAttribute.PERSON_DISTRICT = Person's district +StatisticsCaseSubAttribute.PERSON_COMMUNITY = Person's community +StatisticsCaseSubAttribute.PERSON_CITY = Person's city +StatisticsCaseSubAttribute.PERSON_POSTCODE = Person's postcode +StatisticsCaseSubAttribute.PERSON_ADDRESS = Person's address + +# StatisticsVisualizationChartType +StatisticsVisualizationChartType.COLUMN = Column +StatisticsVisualizationChartType.LINE = Line +StatisticsVisualizationChartType.PIE = Pie +StatisticsVisualizationChartType.STACKED_COLUMN = Stacked column + +# StatisticsVisualizationElementType +StatisticsVisualizationElementType.COLUMNS = Columns +StatisticsVisualizationElementType.Chart.COLUMNS = X-axis +StatisticsVisualizationElementType.Chart.ROWS = Series +StatisticsVisualizationElementType.ROWS = Rows + +# StatisticsVisualizationType +StatisticsVisualizationType.CHART = Chart +StatisticsVisualizationMapType.DISTRICTS = Districts +StatisticsVisualizationType.MAP = Map +StatisticsVisualizationMapType.REGIONS = Regions +StatisticsVisualizationType.TABLE = Table + +SurveillanceEpiCurveMode.CASE_STATUS = Case status +SurveillanceEpiCurveMode.ALIVE_OR_DEAD = Alive or dead + +# SymptomState +SymptomState.NO = No +SymptomState.UNKNOWN = Unknown +SymptomState.YES = Yes + +# TaskAssignee +TaskAssignee.ALL = All tasks +TaskAssignee.CURRENT_USER = Tasks assigned to me +TaskAssignee.OTHER_USERS = Tasks created by me + +# TaskContext +TaskContext.CASE = Case +TaskContext.CONTACT = Contact +TaskContext.EVENT = Event +TaskContext.GENERAL = General +TaskContext.TRAVEL_ENTRY = Travel entry +TaskContext.ENVIRONMENT = Environment + +# TaskDateType +TaskDateType.SUGGESTED_START_DATE = Suggested start date +TaskDateType.DUE_DATE = Due date + +# TaskPriority +TaskPriority.HIGH = High +TaskPriority.LOW = Low +TaskPriority.NORMAL = Normal + +# TaskStatus +TaskStatus.DONE = done +TaskStatus.NOT_EXECUTABLE = not executable +TaskStatus.PENDING = pending +TaskStatus.IN_PROGRESS = in progress +TaskStatus.REMOVED = removed + +# TaskType +TaskType.ACTIVE_SEARCH_FOR_OTHER_CASES = active search for other cases e.g. in household or workplace +TaskType.ANIMAL_DEPOPULATION = depopulation of animals +TaskType.ANIMAL_TESTING = testing of animals +TaskType.CASE_BURIAL = safe burial / cremation +TaskType.CASE_INVESTIGATION = case investigation +TaskType.CASE_ISOLATION = case isolation +TaskType.CASE_MANAGEMENT = case management +TaskType.CONTACT_FOLLOW_UP = contact follow up +TaskType.CONTACT_INVESTIGATION = contact investigation +TaskType.CONTACT_MANAGEMENT = contact management +TaskType.CONTACT_TRACING = contact tracing +TaskType.DAILY_REPORT_GENERATION = generate daily report +TaskType.DECONTAMINATION_DISINFECTION_ACTIVITIES = decontamination / disinfection activities +TaskType.ENVIRONMENTAL_HEALTH_ACTIVITIES = environmental health activities +TaskType.EVENT_INVESTIGATION = investigate the event +TaskType.EVENT_CONTINUE_INVESTIGATION = continue the investigation following a change in the event +TaskType.EVENT_REQUEST_ADDITIONAL_INFORMATION = request for an investigation report / a summary / additional information to be collected +TaskType.OTHER = other task as described in comments +TaskType.QUARANTINE_MANAGEMENT = quarantine management +TaskType.QUARANTINE_ORDER_SEND = send quarantine order +TaskType.QUARANTINE_PLACE = quarantine place +TaskType.SAMPLE_COLLECTION = sample collection +TaskType.SOURCECASE_TRACING = source case tracing +TaskType.SURVEILLANCE_REPORT_GENERATION = generate surveillance report +TaskType.TREATMENT_CENTER_ESTABLISHMENT = establishment of local treatment center +TaskType.VACCINATION_ACTIVITIES = vaccination activities +TaskType.WEEKLY_REPORT_GENERATION = generate weekly report +TaskType.ENVIRONMENT_INVESTIGATION = environment investigation + +# TemperatureSource +TemperatureSource.AXILLARY=axillary +TemperatureSource.NON_CONTACT = Non-contact (infrared) +TemperatureSource.ORAL=oral +TemperatureSource.RECTAL=rectal + +#TracingApp +TracingApp.CORONA_WARN_APP = Corona warn app +TracingApp.OTHER = Other +TracingApp.UNKNOWN = Unknown + +# TravelType +TravelType.ABROAD = Abroad +TravelType.WITHIN_COUNTRY = Within the country + +# TreatmentRoute +TreatmentRoute.ORAL = Oral +TreatmentRoute.IV = IV +TreatmentRoute.RECTAL = Rectal +TreatmentRoute.TOPICAL = Topical +TreatmentRoute.OTHER = Other + +# TreatmentType +TreatmentType.DRUG_INTAKE = Drug intake +TreatmentType.ORAL_REHYDRATION_SALTS = Oral rehydration salts +TreatmentType.BLOOD_TRANSFUSION = Blood transfusion +TreatmentType.RENAL_REPLACEMENT_THERAPY = Renal replacement therapy +TreatmentType.IV_FLUID_THERAPY = IV fluid therapy +TreatmentType.OXYGEN_THERAPY = Oxygen therapy +TreatmentType.INVASIVE_MECHANICAL_VENTILATION = Invasive mechanical ventilation +TreatmentType.VASOPRESSORS_INOTROPES = Vasopressors/Inotropes +TreatmentType.OTHER = Other + +# Trimester +Trimester.FIRST = First +Trimester.SECOND = Second +Trimester.THIRD = Third +Trimester.UNKNOWN = Unknown + +TypeOfAnimal.BAT=Bat or its excreta +TypeOfAnimal.POULTRY=Poultry or wild bird +TypeOfAnimal.CAMEL=Camel +TypeOfAnimal.CANIDAE=Canidae +TypeOfAnimal.CAT=Cat +TypeOfAnimal.CATTLE=Cattle +TypeOfAnimal.DOG=Dog +TypeOfAnimal.PRIMATE=Primate (Monkey) +TypeOfAnimal.SNAKE=Snake +TypeOfAnimal.SWINE=Swine +TypeOfAnimal.RABBIT=Rabbit +TypeOfAnimal.RODENT=Rodent or its excreta +TypeOfAnimal.FLEA=Flea +TypeOfAnimal.TICK=Tick +TypeOfAnimal.OTHER=Other + +# TypeOfDrug +TypeOfDrug.ANTIMICROBIAL = Antimicrobial +TypeOfDrug.ANTIVIRAL = Antiviral +TypeOfDrug.OTHER = Other + +# TypeOfPlace +TypeOfPlace.FACILITY = Facility +TypeOfPlace.FACILITY_23_IFSG = Facility (§ 23 IfSG) +TypeOfPlace.COMMUNITY_FACILITY = Community facility (§ 33 IfSG) +TypeOfPlace.FACILITY_36_IFSG = Facility (§ 36 IfSG) +TypeOfPlace.FESTIVITIES = Festivities +TypeOfPlace.HOME = Home +TypeOfPlace.HOSPITAL = Hospital +TypeOfPlace.MEANS_OF_TRANSPORT = Means of transport +TypeOfPlace.OTHER = Other +TypeOfPlace.PUBLIC_PLACE = Public place +TypeOfPlace.UNKNOWN = Unknown +TypeOfPlace.SCATTERED = Scattered + +# UserRight +UserRight.CASE_ARCHIVE = Archive cases +UserRight.CASE_CHANGE_DISEASE = Edit case disease +UserRight.CASE_CHANGE_EPID_NUMBER = Edit case epid number +UserRight.CASE_CLASSIFY = Edit case classification and outcome +UserRight.CASE_CREATE = Create new cases +UserRight.CASE_DELETE = Delete cases from the system +UserRight.CASE_EDIT = Edit existing cases +UserRight.CASE_EXPORT = Export cases from SORMAS +UserRight.CASE_IMPORT = Import cases into SORMAS +UserRight.CASE_INVESTIGATE = Edit case investigation status +UserRight.CASE_SEE_ARCHIVED = View archived cases +UserRight.CASE_TRANSFER = Transfer cases to another region/district/facility +UserRight.CASE_REFER_FROM_POE = Refer case from point of entry +UserRight.CASE_RESPONSIBLE = Can be responsible for a case +UserRight.CASE_VIEW = View existing cases +UserRight.CONTACT_ASSIGN = Assign contacts to officers +UserRight.CONTACT_CLASSIFY = Edit contact classification +UserRight.CONTACT_CONVERT = Create resulting cases from contacts +UserRight.CONTACT_CREATE = Create new contacts +UserRight.CONTACT_IMPORT = Import contacts +UserRight.CONTACT_DELETE = Delete contacts from the system +UserRight.CONTACT_EDIT = Edit existing contacts +UserRight.CONTACT_EXPORT = Export contacts from SORMAS +UserRight.CONTACT_RESPONSIBLE = Can be responsible for a contact +UserRight.CONTACT_SEE_ARCHIVED = View archived contacts +UserRight.CONTACT_VIEW = View existing contacts +UserRight.CONTACT_ARCHIVE = Archive contacts +UserRight.DASHBOARD_CONTACT_VIEW = Access the contact supervisor dashboard +UserRight.DASHBOARD_SURVEILLANCE_VIEW = Access the surveillance supervisor dashboard +UserRight.DASHBOARD_SAMPLES_VIEW = Access the samples dashboard +UserRight.DATABASE_EXPORT_ACCESS = Export the whole database +UserRight.EVENT_ARCHIVE = Archive events +UserRight.EVENT_CREATE = Create new events +UserRight.EVENT_EDIT = Edit existing events +UserRight.EVENT_EXPORT = Export events from SORMAS +UserRight.EVENT_RESPONSIBLE = Can be responsible for an event +UserRight.EVENT_SEE_ARCHIVED = View archived events +UserRight.EVENT_VIEW = View existing events +UserRight.EVENTPARTICIPANT_CREATE = Create new event participants +UserRight.EVENTPARTICIPANT_EDIT = Edit existing event participants +UserRight.EVENTPARTICIPANT_ARCHIVE = Event participant archive +UserRight.EVENTPARTICIPANT_VIEW = View existing event participants +UserRight.INFRASTRUCTURE_CREATE = Create new regions/districts/communities/facilities +UserRight.INFRASTRUCTURE_EDIT = Edit regions/districts/communities/facilities +UserRight.INFRASTRUCTURE_VIEW = View regions/districts/communities/facilities in the system +UserRight.PERFORM_BULK_OPERATIONS = Perform bulk operations in lists +UserRight.SAMPLE_CREATE = Create new samples +UserRight.SAMPLE_EDIT = Edit existing samples +UserRight.SAMPLE_EXPORT = Export samples from SORMAS +UserRight.SAMPLE_DELETE = Delete samples from the system +UserRight.SAMPLE_SEE_ARCHIVED = View archived samples +UserRight.SAMPLE_TRANSFER = Transfer samples to another lab +UserRight.SAMPLE_VIEW = View existing samples +UserRight.SAMPLETEST_CREATE = Create new sample tests +UserRight.SAMPLETEST_EDIT = Edit existing sample tests +UserRight.STATISTICS_EXPORT = Export detailed statistics from SORMAS +UserRight.TASK_ASSIGN = Assign tasks to users +UserRight.TASK_CREATE = Create new tasks +UserRight.TASK_EDIT = Edit existing tasks +UserRight.TASK_SEE_ARCHIVED = View archived tasks +UserRight.TASK_VIEW = View existing tasks +UserRight.USER_CREATE = Create new users +UserRight.USER_EDIT = Edit existing users +UserRight.USER_VIEW = View existing users +UserRight.USER_ROLE_EDIT = Edit existing user roles +UserRight.USER_ROLE_DELETE = Delete user roles from the system +UserRight.USER_ROLE_VIEW = View existing user roles +UserRight.VISIT_CREATE = Create new visits +UserRight.VISIT_EDIT = Edit existing visits +UserRight.WEEKLYREPORT_CREATE = Create weekly reports +UserRight.WEEKLYREPORT_VIEW = View weekly reports +UserRight.CASE_MERGE = Merge cases +UserRight.PERSON_VIEW = View existing persons +UserRight.PERSON_EDIT = Edit existing persons +UserRight.PERSON_DELETE = Delete persons from the system +UserRight.PERSON_CONTACT_DETAILS_DELETE = Delete person contact details +UserRight.SAMPLE_EDIT_NOT_OWNED = Edit samples reported by other users +UserRight.PATHOGEN_TEST_CREATE = Create new pathogen tests +UserRight.PATHOGEN_TEST_EDIT = Edit existing pathogen tests +UserRight.PATHOGEN_TEST_DELETE = Delete pathogen tests from the system +UserRight.ADDITIONAL_TEST_VIEW = View existing additional tests +UserRight.ADDITIONAL_TEST_CREATE = Create new additional tests +UserRight.ADDITIONAL_TEST_EDIT = Edit existing additional tests +UserRight.ADDITIONAL_TEST_DELETE = Delete additional tests from the system +UserRight.CONTACT_REASSIGN_CASE = Reassign the source case of contacts +UserRight.MANAGE_EXTERNAL_SYMPTOM_JOURNAL = Manage external symptom journal +UserRight.VISIT_DELETE = Delete visits from the system +UserRight.VISIT_EXPORT = Export visits from SORMAS +UserRight.TASK_DELETE = Delete tasks from the system +UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks +UserRight.ACTION_CREATE = Create new actions +UserRight.ACTION_DELETE = Delete actions from the system +UserRight.ACTION_EDIT = Edit existing actions +UserRight.EVENT_IMPORT = Import events +UserRight.EVENT_DELETE = Delete events from the system +UserRight.EVENTPARTICIPANT_DELETE = Delete event participants from the system +UserRight.EVENTPARTICIPANT_IMPORT = Import event participants +UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages +UserRight.STATISTICS_ACCESS = Access statistics +UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations +UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples +UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS +UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data +UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data +UserRight.DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS = View contact transmission chains on the dashboard +UserRight.DASHBOARD_CAMPAIGNS_VIEW = Access campaigns dashboard +UserRight.CASE_CLINICIAN_VIEW = Access case sections concerned with clinician +UserRight.THERAPY_VIEW = View existing therapies +UserRight.PRESCRIPTION_CREATE = Create new prescriptions +UserRight.PRESCRIPTION_EDIT = Edit existing prescriptions +UserRight.PRESCRIPTION_DELETE = Delete prescriptions from the system +UserRight.TREATMENT_CREATE = Create new treatments +UserRight.TREATMENT_EDIT = Edit existing treatments +UserRight.TREATMENT_DELETE = Delete treatments from the system +UserRight.CLINICAL_COURSE_VIEW = View the clinical course of cases +UserRight.CLINICAL_COURSE_EDIT = Edit the clinical course of cases +UserRight.CLINICAL_VISIT_CREATE = Create new clinical visits +UserRight.CLINICAL_VISIT_EDIT = Edit existing clinical visits +UserRight.CLINICAL_VISIT_DELETE = Delete clinical visits from the system +UserRight.PORT_HEALTH_INFO_VIEW = View port health info +UserRight.PORT_HEALTH_INFO_EDIT = Edit existing port health info +UserRight.POPULATION_MANAGE = Manage population data +UserRight.DOCUMENT_TEMPLATE_MANAGEMENT = Manage document templates +UserRight.QUARANTINE_ORDER_CREATE = Create new quarantine orders +UserRight.LINE_LISTING_CONFIGURE = Configure line listing +UserRight.AGGREGATE_REPORT_VIEW = Create new aggregate reports +UserRight.AGGREGATE_REPORT_EXPORT = Export aggregate reports from SORMAS +UserRight.AGGREGATE_REPORT_EDIT = Edit existing aggregate reports +UserRight.SEE_PERSONAL_DATA_IN_JURISDICTION = See personal data in jurisdiction +UserRight.SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION = See personal data outside jurisdiction +UserRight.SEE_SENSITIVE_DATA_IN_JURISDICTION = See sensitive data in jurisdiction +UserRight.SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION = See sensitive data outside jurisdiction +UserRight.CAMPAIGN_VIEW = View existing campaigns +UserRight.CAMPAIGN_EDIT = Edit existing campaigns +UserRight.CAMPAIGN_ARCHIVE = Archive campaigns +UserRight.CAMPAIGN_DELETE = Delete campaigns from the system +UserRight.CAMPAIGN_FORM_DATA_VIEW = View existing campaign form data +UserRight.CAMPAIGN_FORM_DATA_EDIT = Edit existing campaign form data +UserRight.CAMPAIGN_FORM_DATA_ARCHIVE = Archive campaign form data +UserRight.CAMPAIGN_FORM_DATA_DELETE = Delete campaign form data from the system +UserRight.CAMPAIGN_FORM_DATA_EXPORT = Export campaign form data from SORMAS +UserRight.BAG_EXPORT = Perform BAG export +UserRight.SORMAS_TO_SORMAS_SHARE = Share data from one SORMAS instance to another +UserRight.SORMAS_TO_SORMAS_PROCESS = Process shares +UserRight.EXTERNAL_SURVEILLANCE_SHARE = Send data to external surveillance tool +UserRight.EXTERNAL_SURVEILLANCE_DELETE = Delete data in external surveillance tool +UserRight.EXTERNAL_MESSAGE_VIEW = View and fetch messages +UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages +UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system +UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system +UserRight.CASE_SHARE = Share cases with the whole country +UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list +UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations +UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations +UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations +UserRight.IMMUNIZATION_DELETE = Delete immunizations and vaccinations from the system +UserRight.IMMUNIZATION_ARCHIVE = Archive immunizations +UserRight.PERSON_EXPORT = Export persons +UserRight.CONTACT_MERGE = Merge contacts +UserRight.EVENTGROUP_CREATE = Create new event groups +UserRight.EVENTGROUP_EDIT = Edit existing event groups +UserRight.EVENTGROUP_LINK = Link events to event groups +UserRight.EVENTGROUP_ARCHIVE = Archive event groups +UserRight.EVENTGROUP_DELETE = Delete event groups from the system +UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory +UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory +UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory +UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries +UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries +UserRight.TRAVEL_ENTRY_EDIT = Edit existing travel entries +UserRight.TRAVEL_ENTRY_DELETE = Delete travel entries from the system +UserRight.TRAVEL_ENTRY_ARCHIVE = Archive travel entries +UserRight.EXPORT_DATA_PROTECTION_DATA = Export data protection data +UserRight.OUTBREAK_VIEW = View outbreaks +UserRight.OUTBREAK_EDIT = Edit outbreaks +UserRight.PERFORM_BULK_OPERATIONS_PSEUDONYM = Perform bulk pseudonomization +UserRight.SORMAS_TO_SORMAS_CLIENT = Sormas to Sormas Client +UserRight.SORMAS_REST = Access Sormas REST +UserRight.EXTERNAL_VISITS = External visits +UserRight.SORMAS_UI = Access Sormas UI +UserRight.DEV_MODE = Access developer options +UserRight.CUSTOMIZABLE_ENUM_MANAGEMENT = Manage customizable enums +UserRight.DOCUMENT_VIEW = View existing documents +UserRight.DOCUMENT_UPLOAD = Upload documents +UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons +UserRight.ENVIRONMENT_VIEW = View existing environments +UserRight.ENVIRONMENT_CREATE = Create new environments +UserRight.ENVIRONMENT_EDIT = Edit existing environments +UserRight.ENVIRONMENT_ARCHIVE = Archive environments +UserRight.ENVIRONMENT_DELETE = Delete environments from the system +UserRight.ENVIRONMENT_IMPORT = Import environments +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 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 +UserRight.ENVIRONMENT_SAMPLE_EXPORT = Export environment samples +UserRight.ENVIRONMENT_PATHOGEN_TEST_CREATE = Create environment sample pathogen tests +UserRight.ENVIRONMENT_PATHOGEN_TEST_EDIT = Edit environment sample pathogen tests +UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen tests +UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates +UserRight.EXTERNAL_EMAIL_SEND=Send external emails +UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails + + +# UserRight descriptions +UserRight.Desc.CASE_ARCHIVE = Able to archive cases +UserRight.Desc.CASE_CHANGE_DISEASE = Able to edit case disease +UserRight.Desc.CASE_CHANGE_EPID_NUMBER = Able to edit case epid number +UserRight.Desc.CASE_CLASSIFY = Able to edit case classification and outcome +UserRight.Desc.CASE_CREATE = Able to create new cases +UserRight.Desc.CASE_DELETE = Able to delete cases from the system +UserRight.Desc.CASE_EDIT = Able to edit existing cases +UserRight.Desc.CASE_EXPORT = Able to export cases from SORMAS +UserRight.Desc.CASE_IMPORT = Able to import cases into SORMAS +UserRight.Desc.CASE_INVESTIGATE = Able to edit case investigation status +UserRight.Desc.CASE_TRANSFER = Able to transfer cases to another region/district/facility +UserRight.Desc.CASE_REFER_FROM_POE = Able to refer case from point of entry +UserRight.Desc.CASE_RESPONSIBLE = Can be responsible for a case +UserRight.Desc.CASE_VIEW = Able to view existing cases +UserRight.Desc.CONTACT_ASSIGN = Able to assign contacts to officers +UserRight.Desc.CONTACT_CLASSIFY = Able to edit contact classification +UserRight.Desc.CONTACT_CONVERT = Able to create resulting cases from contacts +UserRight.Desc.CONTACT_CREATE = Able to create new contacts +UserRight.Desc.CONTACT_IMPORT = Able to import contacts +UserRight.Desc.CONTACT_DELETE = Able to delete contacts from the system +UserRight.Desc.CONTACT_EDIT = Able to edit existing contacts +UserRight.Desc.CONTACT_EXPORT = Able to export contacts from SORMAS +UserRight.Desc.CONTACT_RESPONSIBLE = Can be responsible for a contact +UserRight.Desc.CONTACT_VIEW = Able to view existing contacts +UserRight.Desc.CONTACT_ARCHIVE = Able to archive contacts +UserRight.Desc.DASHBOARD_CONTACT_VIEW = Able to access the contact supervisor dashboard +UserRight.Desc.DASHBOARD_SURVEILLANCE_VIEW = Able to access the surveillance supervisor dashboard +UserRight.Desc.DATABASE_EXPORT_ACCESS = Able to export the whole database +UserRight.Desc.EVENT_ARCHIVE = Able to archive events +UserRight.Desc.EVENT_CREATE = Able to create new events +UserRight.Desc.EVENT_EDIT = Able to edit existing events +UserRight.Desc.EVENT_EXPORT = Able to export events from SORMAS +UserRight.Desc.EVENT_RESPONSIBLE = Can be responsible for an event +UserRight.Desc.EVENT_VIEW = Able to view existing events +UserRight.Desc.EVENTPARTICIPANT_CREATE = Able to create new event participants +UserRight.Desc.EVENTPARTICIPANT_EDIT = Able to edit existing event participants +UserRight.Desc.EVENTPARTICIPANT_ARCHIVE = Able to archive event participants +UserRight.Desc.EVENTPARTICIPANT_VIEW = Able to view existing event participants +UserRight.Desc.INFRASTRUCTURE_CREATE = Able to create new regions/districts/communities/facilities +UserRight.Desc.INFRASTRUCTURE_EDIT = Able to edit regions/districts/communities/facilities +UserRight.Desc.INFRASTRUCTURE_VIEW = Able to view regions/districts/communities/facilities in the system +UserRight.Desc.PERFORM_BULK_OPERATIONS = Able to perform bulk operations in lists +UserRight.Desc.SAMPLE_CREATE = Able to create new samples +UserRight.Desc.SAMPLE_EDIT = Able to edit existing samples +UserRight.Desc.SAMPLE_EXPORT = Able to export samples from SORMAS +UserRight.Desc.SAMPLE_DELETE = Able to delete samples from the system +UserRight.Desc.SAMPLE_TRANSFER = Able to transfer samples to another lab +UserRight.Desc.SAMPLE_VIEW = Able to view existing samples +UserRight.Desc.SAMPLETEST_CREATE = Able to create new sample tests +UserRight.Desc.SAMPLETEST_EDIT = Able to edit existing sample tests +UserRight.Desc.STATISTICS_EXPORT = Able to export detailed statistics from SORMAS +UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users +UserRight.Desc.TASK_CREATE = Able to create new tasks +UserRight.Desc.TASK_EDIT = Able to edit existing tasks +UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks +UserRight.Desc.USER_CREATE = Able to create new users +UserRight.Desc.USER_EDIT = Able to edit existing users +UserRight.Desc.USER_VIEW = Able to view existing users +UserRight.Desc.VISIT_CREATE = Able to create new visits +UserRight.Desc.VISIT_EDIT = Able to edit existing visits +UserRight.Desc.WEEKLYREPORT_CREATE = Able to create weekly reports +UserRight.Desc.WEEKLYREPORT_VIEW = Able to view weekly reports +UserRight.Desc.CASE_MERGE = Able to merge cases +UserRight.Desc.PERSON_VIEW = Able to view existing persons +UserRight.Desc.PERSON_EDIT = Able to edit existing persons +UserRight.Desc.PERSON_DELETE = Able to delete persons from the system +UserRight.Desc.PERSON_CONTACT_DETAILS_DELETE = Able to delete person contact details +UserRight.Desc.SAMPLE_EDIT_NOT_OWNED = Able to edit samples reported by other users +UserRight.Desc.PATHOGEN_TEST_CREATE = Able to create new pathogen tests +UserRight.Desc.PATHOGEN_TEST_EDIT = Able to edit existing pathogen tests +UserRight.Desc.PATHOGEN_TEST_DELETE = Able to delete pathogen tests from the system +UserRight.Desc.ADDITIONAL_TEST_VIEW = Able to view existing additional tests +UserRight.Desc.ADDITIONAL_TEST_CREATE = Able to create new additional tests +UserRight.Desc.ADDITIONAL_TEST_EDIT = Able to edit existing additional tests +UserRight.Desc.ADDITIONAL_TEST_DELETE = Able to delete additional tests from the system +UserRight.Desc.CONTACT_REASSIGN_CASE = Able to reassign the source case of contacts +UserRight.Desc.MANAGE_EXTERNAL_SYMPTOM_JOURNAL = Able to manage external symptom journal +UserRight.Desc.VISIT_DELETE = Able to delete visits from the system +UserRight.Desc.VISIT_EXPORT = Able to export visits from SORMAS +UserRight.Desc.TASK_DELETE = Able to delete tasks from the system +UserRight.Desc.TASK_EXPORT = Able to export tasks from SORMAS +UserRight.Desc.ACTION_CREATE = Able to create new actions +UserRight.Desc.ACTION_DELETE = Able to delete actions from the system +UserRight.Desc.ACTION_EDIT = Able to edit existing actions +UserRight.Desc.EVENT_IMPORT = Able to import events +UserRight.Desc.EVENT_DELETE = Able to delete events from the system +UserRight.Desc.EVENTPARTICIPANT_DELETE = Able to delete event participants from the system +UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants +UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages +UserRight.Desc.STATISTICS_ACCESS = Able to access statistics +UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations +UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples +UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS +UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data +UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data +UserRight.Desc.DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS = Able to view contact transmission chains on the dashboard +UserRight.Desc.DASHBOARD_CAMPAIGNS_VIEW = Able to access campaigns dashboard +UserRight.Desc.CASE_CLINICIAN_VIEW = Able to access case sections concerned with clinician +UserRight.Desc.THERAPY_VIEW = Able to view existing therapies +UserRight.Desc.PRESCRIPTION_CREATE = Able to create new prescriptions +UserRight.Desc.PRESCRIPTION_EDIT = Able to edit existing prescriptions +UserRight.Desc.PRESCRIPTION_DELETE = Able to delete prescriptions from the system +UserRight.Desc.TREATMENT_CREATE = Able to create new treatments +UserRight.Desc.TREATMENT_EDIT = Able to edit existing treatments +UserRight.Desc.TREATMENT_DELETE = Able to delete treatments from the system +UserRight.Desc.CLINICAL_COURSE_VIEW = Able to view the clinical course of cases +UserRight.Desc.CLINICAL_COURSE_EDIT = Able to edit the clinical course of cases +UserRight.Desc.CLINICAL_VISIT_CREATE = Able to create new clinical visits +UserRight.Desc.CLINICAL_VISIT_EDIT = Able to edit existing clinical visits +UserRight.Desc.CLINICAL_VISIT_DELETE = Able to delete clinical visits from the system +UserRight.Desc.PORT_HEALTH_INFO_VIEW = Able to view port health info +UserRight.Desc.PORT_HEALTH_INFO_EDIT = Able to edit existing port health info +UserRight.Desc.POPULATION_MANAGE = Able to manage population data +UserRight.Desc.DOCUMENT_TEMPLATE_MANAGEMENT = Able to manage document templates +UserRight.Desc.QUARANTINE_ORDER_CREATE = Able to create new quarantine orders +UserRight.Desc.LINE_LISTING_CONFIGURE = Able to configure line listing +UserRight.Desc.AGGREGATE_REPORT_VIEW = Able to create new aggregate reports +UserRight.Desc.AGGREGATE_REPORT_EXPORT = Able to export aggregate reports from SORMAS +UserRight.Desc.AGGREGATE_REPORT_EDIT = Able to edit existing aggregate reports +UserRight.Desc.SEE_PERSONAL_DATA_IN_JURISDICTION = Able to see personal data in jurisdiction +UserRight.Desc.SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION = Able to see personal data outside jurisdiction +UserRight.Desc.SEE_SENSITIVE_DATA_IN_JURISDICTION = Able to see sensitive data in jurisdiction +UserRight.Desc.SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION = Able to see sensitive data outside jurisdiction +UserRight.Desc.CAMPAIGN_VIEW = Able to view existing campaigns +UserRight.Desc.CAMPAIGN_EDIT = Able to edit existing campaigns +UserRight.Desc.CAMPAIGN_ARCHIVE = Able to archive campaigns +UserRight.Desc.CAMPAIGN_DELETE = Able to delete campaigns from the system +UserRight.Desc.CAMPAIGN_FORM_DATA_VIEW = Able to view existing campaign form data +UserRight.Desc.CAMPAIGN_FORM_DATA_EDIT = Able to edit existing campaign form data +UserRight.Desc.CAMPAIGN_FORM_DATA_ARCHIVE = Able to archive campaign form data +UserRight.Desc.CAMPAIGN_FORM_DATA_DELETE = Able to delete campaign form data from the system +UserRight.Desc.CAMPAIGN_FORM_DATA_EXPORT = Able to export campaign form data from SORMAS +UserRight.Desc.BAG_EXPORT = Able to perform BAG export +UserRight.Desc.SORMAS_TO_SORMAS_SHARE = Users with this right can initiate a share to another SORMAS instance +UserRight.Desc.SORMAS_TO_SORMAS_PROCESS = Only users with this right are allowed to see & use the share directory. +UserRight.Desc.EXTERNAL_SURVEILLANCE_SHARE = Allows sharing cases or events to external surveillance tools. In order to do so the related edit user right is needed as-well. +UserRight.Desc.EXTERNAL_SURVEILLANCE_DELETE = Allows deleting cases or events in external surveillance tools. In order to do so the related edit user right is needed as-well. +UserRight.Desc.EXTERNAL_MESSAGE_VIEW = Able to view and fetch messages +UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages +UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system +UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages +UserRight.Desc.CASE_SHARE = Able to share cases with the whole country +UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list +UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations +UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations +UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations +UserRight.Desc.IMMUNIZATION_DELETE = Able to delete immunizations and vaccinations from the system +UserRight.Desc.IMMUNIZATION_ARCHIVE = Able to archive immunizations +UserRight.Desc.PERSON_EXPORT = Able to export persons +UserRight.Desc.CONTACT_MERGE = Able to merge contacts +UserRight.Desc.EVENTGROUP_CREATE = Able to create new event groups +UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups +UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups +UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups +UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system +UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory +UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory +UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory +UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries +UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries +UserRight.Desc.TRAVEL_ENTRY_EDIT = Able to edit existing travel entries +UserRight.Desc.TRAVEL_ENTRY_DELETE = Able to delete travel entries from the system +UserRight.Desc.TRAVEL_ENTRY_ARCHIVE = Able to archive travel entries +UserRight.Desc.EXPORT_DATA_PROTECTION_DATA = Able to export data protection data +UserRight.Desc.OUTBREAK_VIEW = Able to view outbreaks +UserRight.Desc.OUTBREAK_EDIT = Able to edit outbreaks +UserRight.Desc.PERFORM_BULK_OPERATIONS_PSEUDONYM = Able to perform bulk pseudonomization +UserRight.Desc.SORMAS_TO_SORMAS_CLIENT = Techincal user right for the SORMAS to SORMAS interface +UserRight.Desc.SORMAS_REST = Able to access the SORMAS REST interface +UserRight.Desc.EXTERNAL_VISITS = Able to access external visits REST endpoints +UserRight.Desc.SORMAS_UI = Able to access the SORMAS graphical user interface +UserRight.Desc.DEV_MODE = Able to access developer options in the configuration directory +UserRight.Desc.CUSTOMIZABLE_ENUM_MANAGEMENT = Able to create, edit and delete customizable enum values +UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents +UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents +UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons +UserRight.Desc.ENVIRONMENT_CREATE = Able to create new environments +UserRight.Desc.ENVIRONMENT_EDIT = Able to edit existing environments +UserRight.Desc.ENVIRONMENT_ARCHIVE = Able to archive environments +UserRight.Desc.ENVIRONMENT_DELETE = Able to delete environments from the system +UserRight.Desc.ENVIRONMENT_IMPORT = Able to import environments +UserRight.Desc.ENVIRONMENT_EXPORT = Able to export environments +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_PATHOGEN_TEST_CREATE = Able to create environment sample pathogen tests +UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_EDIT = Able to edit environment sample pathogen tests +UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sample pathogen tests +UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates +UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails +UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails + +# UserRightGroup +UserRightGroup.GENERAL = General +UserRightGroup.DATA_PROTECTION = Data Protection +UserRightGroup.PERSON = Persons +UserRightGroup.CASE = Case Surveillance +UserRightGroup.CASE_MANAGEMENT = Case Management +UserRightGroup.PORT_HEALTH = Port Health +UserRightGroup.CONTACT = Contact Surveillance +UserRightGroup.VISIT = Follow-Up +UserRightGroup.SAMPLE = Sample Testing +UserRightGroup.IMMUNIZATION = Immunization +UserRightGroup.TRAVEL_ENTRY = Travel Entries +UserRightGroup.TASK = Tasks +UserRightGroup.EVENT = Events +UserRightGroup.AGGREGATED_REPORTING = Aggregated Reporting +UserRightGroup.CAMPAIGN = Campaigns +UserRightGroup.DASHBOARD = Dashboard +UserRightGroup.STATISTICS = Statistics +UserRightGroup.EXPORT = Export +UserRightGroup.EXTERNAL = External Systems +UserRightGroup.USER = Users +UserRightGroup.INFRASTRUCTURE = Infrastructure +UserRightGroup.CONFIGURATION = Configuration +UserRightGroup.DOCUMENT = Documents +UserRightGroup.EXTERNAL_EMAILS=External emails +UserRightGroup.ENVIRONMENT = Environments + +# Vaccination +VaccinationStatus.UNKNOWN = Unknown +VaccinationStatus.UNVACCINATED = Unvaccinated +VaccinationStatus.VACCINATED = Vaccinated + +# VaccinationInfoSource +VaccinationInfoSource.ORAL_COMMUNICATION = Oral communication +VaccinationInfoSource.VACCINATION_CARD = Vaccination card +VaccinationInfoSource.NO_EVIDENCE = No evidence +VaccinationInfoSource.UNKNOWN = Unknown + +# ValueSeparator +ValueSeparator.DEFAULT = Default (%s) +ValueSeparator.COMMA = Comma +ValueSeparator.SEMICOLON = Semicolon +ValueSeparator.TAB = Tab + +# ViewMode +ViewMode.NORMAL = Normal view +ViewMode.SIMPLE = Simple view + +VisitResult.NOT_SYMPTOMATIC = Seen (no signs) +VisitResult.SYMPTOMATIC = Seen with signs +VisitResult.UNAVAILABLE = Unavailable +VisitResult.UNCOOPERATIVE = Uncooperative +VisitResult.NOT_PERFORMED = Not performed + +# VisitStatus +VisitStatus.COOPERATIVE = Available and cooperative +VisitStatus.UNAVAILABLE = Unavailable +VisitStatus.UNCOOPERATIVE = Available, but uncooperative +VisitStatus.Short.COOPERATIVE = Cooperative +VisitStatus.Short.UNAVAILABLE = Unavailable +VisitStatus.Short.UNCOOPERATIVE = Uncooperative + +# VisitOrigin +VisitOrigin.USER = Created by user +VisitOrigin.EXTERNAL_JOURNAL = External symptom journal + +# WaterSource +WaterSource.COMMUNITY_BOREHOLE_WELL = Community borehole/well +WaterSource.OTHER = Other +WaterSource.PIPE_NETWORK = Pipe network +WaterSource.PRIVATE_BOREHOLE_WELL = Private borehole/well +WaterSource.STREAM = Stream + +# WaterType +WaterType.WASTEWATER = Wastewater +WaterType.GROUNDWATER = Groundwater +WaterType.SURFACE_WATER = Surface water (lakes, rivers, runoff, etc.) +WaterType.PRECIPITATION = Precipitation (rain or snow) +WaterType.OTHER = Other +WaterType.UNKNOWN = Unknown + +# WaterUse +WaterUse.DRINKING_HOUSEHOLD_NEEDS = Drinking and household needs +WaterUse.RECREATION = Recreation +WaterUse.INDUSTRY_COMMERCE = Industry and commerce +WaterUse.AGRICULTURE = Agriculture (plants or livestock) +WaterUse.THERMOELECTRICITY_ENERGY = Thermoelectricity/Energy +WaterUse.OTHER = Other +WaterUse.UNKNOWN = Unknown + +# Work environment +WorkEnvironment.UNKNOWN = Unknown +WorkEnvironment.OPEN_SPACE_OFFICE = Open space office +WorkEnvironment.FOOD_SECTOR = Food sector +WorkEnvironment.BUILDING_SECTOR = Building sector +WorkEnvironment.LOGISTICS_CENTER = Logistics center +WorkEnvironment.OTHER = Other + +# YesNoUnknown +YesNoUnknown.NO = No +YesNoUnknown.UNKNOWN = Unknown +YesNoUnknown.YES = Yes + +#SamplePurpose +SamplePurpose.EXTERNAL = External lab testing +SamplePurpose.INTERNAL = Internal/in-house testing + +#JurisdictionLevel +JurisdictionLevel.NONE = None +JurisdictionLevel.NATION = Nation +JurisdictionLevel.REGION = Region +JurisdictionLevel.DISTRICT = District +JurisdictionLevel.COMMUNITY = Community +JurisdictionLevel.HEALTH_FACILITY = Facility +JurisdictionLevel.LABORATORY = Laboratory +JurisdictionLevel.POINT_OF_ENTRY = Point of entry +JurisdictionLevel.EXTERNAL_LABORATORY = External laboratory + +#CampaignFormElementImportance +CampaignFormElementImportance.ALL = All columns +CampaignFormElementImportance.IMPORTANT = Important + +SamplingReason.PRESENCE_OF_SYMPTOMS=Presence of symptoms +SamplingReason.OUTBREAK=Exposed to an outbreak area +SamplingReason.SCREENING=Screening +SamplingReason.PROFESSIONAL_REASON=Professional reasons +SamplingReason.QUARANTINE_REGULATIONS=Quarantine regulations +SamplingReason.CONTACT_TO_CASE=Contact to a case +SamplingReason.SWISS_COVID_APP_NOTIFICATION=Due to SwissCovidApp notification +SamplingReason.PLANNING_TO_TRAVEL=Planning to travel +SamplingReason.RETURNING_TRAVELER=Returning traveler +SamplingReason.PERSONAL_REASON=Personal reason/Convenience +SamplingReason.MOVING_RETURNING_RETIREMENT_HOME=Moving/returning into retirement home +SamplingReason.QUARANTINE_END=Quarantine end +SamplingReason.UNKNOWN=Unknown +SamplingReason.OTHER_REASON=Other reason +ContactTracingContactType.TELEPHONE=Telephone +ContactTracingContactType.SMS=SMS +ContactTracingContactType.EMAIL=E-Mail +QuarantineReason.IDENTIFIED_BY_CONTACT_TRACING=Identified by contact tracing +QuarantineReason.ENTRY_FROM_RISK_AREA=Entry from risk area +QuarantineReason.SWISS_COVID_APP_NOTIFICATION=SwissCovidApp notification +QuarantineReason.OUTBREAK_INVESTIGATION=Outbreak Investigation +QuarantineReason.OTHER_REASON=Other reason +EndOfIsolationReason.RECOVERED=Recovered +EndOfIsolationReason.DIED=Died +EndOfIsolationReason.LOST_TO_FOLLOW_UP=Lost to Follow-up +EndOfIsolationReason.OTHER=Other +EndOfQuarantineReason.ASYMPTOMATIC=Asymptomatic after 10 days +EndOfQuarantineReason.ISOLATED_AS_CASE=Isolated as Case +EndOfQuarantineReason.LOST_TO_FOLLOWUP=Lost to follow-up +EndOfQuarantineReason.OTHER=Other + +#InfectionSetting +InfectionSetting.UNKNOWN=Unknown +InfectionSetting.AMBULATORY=Ambulatory +InfectionSetting.MEDICAL_PRACTICE=Medical practice +InfectionSetting.OPERATIVE_1200=Operative +InfectionSetting.HOSPITAL_1300=Hospital +InfectionSetting.OTHER_OUTPATIENT_FACILITY=Other outpatient facility +InfectionSetting.STATIONARY=In-patient +InfectionSetting.HOSPITAL_2100=Hospital +InfectionSetting.NORMAL_WARD=Normal ward +InfectionSetting.OPERATIVE_2111=Operative +InfectionSetting.NOT_OPERATIVE=Non-operative +InfectionSetting.HEMATOLOGICAL_ONCOLOGY=Hematological oncology +InfectionSetting.CHILDREN_WARD=Children's ward +InfectionSetting.NEONATOLOGY=Neonatology +InfectionSetting.INTENSIVE_CARE_UNIT=Intensive care unit +InfectionSetting.OTHER_STATION=Other station +InfectionSetting.NURSING_HOME=Nursing home +InfectionSetting.REHAB_FACILITY=Rehab facility +InfectionSetting.OTHER_STATIONARY_FACILITY=Other in-patient facililty + +SymptomGroup.GENERAL=General +SymptomGroup.RESPIRATORY=Respiratory +SymptomGroup.CARDIOVASCULAR=Cardiovascular +SymptomGroup.GASTROINTESTINAL=Gastrointestinal +SymptomGroup.URINARY=Urinary +SymptomGroup.NERVOUS_SYSTEM=Nervous system +SymptomGroup.SKIN=Skin +SymptomGroup.OTHER=Other + +#Salutation +Salutation.MR=Dear Sir +Salutation.MRS=Dear Madame +Salutation.MR_AND_MRS=Dear Sir and Madame +Salutation.FAMILY=Dear family +Salutation.GUARDIAN_OF_MINOR=Dear guardian of the child +Salutation.OTHER=Other + +#PersonAssociation +PersonAssociation.ALL=All +PersonAssociation.CASE=Case +PersonAssociation.CONTACT=Contact +PersonAssociation.EVENT_PARTICIPANT=Event Participant +PersonAssociation.IMMUNIZATION=Immunization +PersonAssociation.TRAVEL_ENTRY=Travel Entry + +ReinfectionDetail.GENOME_SEQUENCE_PREVIOUS_INFECTION_KNOWN = Genome sequence of virus from previous SARS-CoV-2 infection is known +ReinfectionDetail.GENOME_SEQUENCE_CURRENT_INFECTION_KNOWN = Genome sequence of virus from current SARS-CoV-2 infection is known +ReinfectionDetail.GENOME_SEQUENCES_NOT_MATCHING = Genome sequences of viruses from previous and current SARS-CoV-2 infections do not match +ReinfectionDetail.GENOME_COPY_NUMBER_ABOVE_THRESHOLD = SARS-CoV-2 genome copy number within current PCR detection >\= 10^6/ml or Ct value < 30 +ReinfectionDetail.GENOME_COPY_NUMBER_BELOW_THRESHOLD = Individual tested positive for SARS-CoV-2 by PCR, but SARS-CoV-2 genome copy number within current PCR detection < 10^6/ml or Ct value >\= 30, or both not known +ReinfectionDetail.ACUTE_RESPIRATORY_ILLNESS_OVERCOME = Person has overcome acute respiratory illness following confirmed SARS-CoV-2 infection +ReinfectionDetail.PREVIOUS_ASYMPTOMATIC_INFECTION = Person had an asymptomatic SARS-CoV-2 infection +ReinfectionDetail.TESTED_NEGATIVE_AFTER_PREVIOUS_INFECTION = Person tested conclusively negative by PCR at least once after previous SARS-CoV-2 infection +ReinfectionDetail.LAST_PCR_DETECTION_NOT_RECENT = The last positive PCR detection of the preceding infection was more than 3 months ago + +ReinfectionDetailGroup.GENOME_SEQUENCE = +ReinfectionDetailGroup.PRECEDING_INFECTION = Information on the preceding infection +ReinfectionDetailGroup.REINFECTION_EVALUATION = More information on the evaluation of reinfection +ReinfectionDetailGroup.PREVIOUS_INFECTION_COMPLETED = Previous infection completed + +ReinfectionStatus.CONFIRMED = Confirmed reinfection +ReinfectionStatus.PROBABLE = Probable reinfection +ReinfectionStatus.POSSIBLE = Possible reinfection + +# Vaccine +Vaccine.COMIRNATY=Pfizer-BioNTech COVID-19 vaccine +Vaccine.MRNA_1273=Moderna COVID-19 Vaccine +Vaccine.OXFORD_ASTRA_ZENECA=Oxford-AstraZeneca COVID-19 vaccine +Vaccine.AD26_COV2_S=Ad26.COV2.S +Vaccine.NVX_COV_2373=Novavax COVID-19 vaccine +Vaccine.SANOFI_GSK=Sanofi-GSK +Vaccine.ASTRA_ZENECA_COMIRNATY=Combination AstraZeneca & Pfizer-BioNTech +Vaccine.ASTRA_ZENECA_MRNA_1273=Combination AstraZeneca & Moderna +Vaccine.MRNA_BIVALENT_BA_1_BIONTECH_PFIZER=mRNA/bivalent BA.1 (BioNTech/Pfizer) +Vaccine.MRNA_BIVALENT_BA_1_MODERNA=mRNA/bivalent BA.1 (Moderna) +Vaccine.VALNEVA=inactivated (Valneva) +Vaccine.NUVAXOVID=protein-based, recombinant (Novavax) +Vaccine.MRNA_BIVALENT_BA_4_5_BIONTECH_PFIZER=mRNA/bivalent BA.4/5 (BioNTech/Pfizer) +Vaccine.MRNA_BIVALENT_BA_4_5_MODERNA=mRNA/bivalent BA.4/5 (Moderna) +Vaccine.UNKNOWN=Unknown +Vaccine.OTHER=Other + +# VaccineManufacturer +VaccineManufacturer.BIONTECH_PFIZER=BioNTech/Pfizer +VaccineManufacturer.MODERNA=Moderna +VaccineManufacturer.ASTRA_ZENECA=AstraZeneca +VaccineManufacturer.JOHNSON_JOHNSON=Johnson & Johnson +VaccineManufacturer.NOVAVAX=Novavax +VaccineManufacturer.SANOFI_GSK=Sanofi-GSK +VaccineManufacturer.ASTRA_ZENECA_BIONTECH_PFIZER=AstraZeneca & BioNTech/Pfizer +VaccineManufacturer.ASTRA_ZENECA_MODERNA=AstraZeneca & Moderna +VaccineManufacturer.VALNEVA=Valneva +VaccineManufacturer.UNKNOWN=Unknown +VaccineManufacturer.OTHER=Other + +# InfectionPathCertainty +InfectionPathCertainty.SUSPECT=Suspect +InfectionPathCertainty.PROBABLE=Probable +InfectionPathCertainty.CONFIRMED=Confirmed +InfectionPathCertainty.UNKNOWN=Unknown + +# HumanTransmissionMode +HumanTransmissionMode.FECAL_ORAL_SMEAR_INFECTION=Fecal-oral/smear infection +HumanTransmissionMode.PARENTERAL=Parenteral +HumanTransmissionMode.DIRECT_SKIN_CONTACT=Direct skin contact +HumanTransmissionMode.RESPIRATORY=Respiratory +HumanTransmissionMode.SEXUAL=Sexual +HumanTransmissionMode.CONNATAL=Connatal +HumanTransmissionMode.OTHER=Other + +# ParenteralTransmissionMode +ParenteralTransmissionMode.INTRAVENOUS_DRUG_USE=Intravenous drug use +ParenteralTransmissionMode.HOUSEHOLD_CONTACT=Household contact +ParenteralTransmissionMode.MEDICALLY_ASSOCIATED=Medically associated +ParenteralTransmissionMode.TATTOOING_PIERCING=Tattooing/piercing +ParenteralTransmissionMode.PEDICURE_MANICURE=Pedicure/manicure +ParenteralTransmissionMode.OTHER=Other + +# MedicallyAssociatedTransmissionMode +MedicallyAssociatedTransmissionMode.OPERATIVE_OR_DIAGNOSTIC_PROCEDURE=Operative or diagnostic procedure +MedicallyAssociatedTransmissionMode.BLOOD_PRODUCTS=Blood products +MedicallyAssociatedTransmissionMode.ORGAN_TRANSPLANTATION=Organ transplantation +MedicallyAssociatedTransmissionMode.DIALYSIS=Dialysis +MedicallyAssociatedTransmissionMode.INJECTION_FOR_MEDICAL_PURPOSES=Injection for medical purposes + +# ExternalShareDateType +ExternalShareDateType.LAST_EXTERNAL_SURVEILLANCE_TOOL_SHARE = Last share with reporting tool + +# ExternalShareStatus +ExternalShareStatus.SHARED=Shared +ExternalShareStatus.DELETED=Deleted + +# ExternalMessageStatus +ExternalMessageStatus.UNPROCESSED=Unprocessed +ExternalMessageStatus.PROCESSED=Processed +ExternalMessageStatus.FORWARDED=Forwarded +ExternalMessageStatus.UNCLEAR=Unclear + +# ExternalMessageType +ExternalMessageType.LAB_MESSAGE=Lab message +ExternalMessageType.PHYSICIANS_REPORT=Physician's report + +# ShareRequestDataType +ShareRequestDataType.CASE = Case +ShareRequestDataType.CONTACT = Contact +ShareRequestDataType.EVENT = Event + +# ShareRequestStatus +ShareRequestStatus.PENDING = Pending +ShareRequestStatus.ACCEPTED = Accepted +ShareRequestStatus.REJECTED = Rejected +ShareRequestStatus.REVOKED = Revoked + +# EventCriteriaDateType +EventCriteriaDateType.EVENT_DATE = Event date +EventCriteriaDateType.REPORT_DATE = Report date + +#EpidemiologicalEvidenceDetail +EpidemiologicalEvidenceDetail.STUDY=Study +EpidemiologicalEvidenceDetail.CASE_CONTROL_STUDY=Case control study +EpidemiologicalEvidenceDetail.COHORT_STUDY=Cohort study +EpidemiologicalEvidenceDetail.EXPLORATIVE_SURVEY_OF_AFFECTED=Explorative survey of affected people +EpidemiologicalEvidenceDetail.CONTACT_TO_SICK_PERSON=Contact to sick person +EpidemiologicalEvidenceDetail.CONTACT_TO_CONTAMINATED_MATERIAL=Contact to contaminated materials +EpidemiologicalEvidenceDetail.DESCRIPTIVE_ANALYSIS_OF_ASCERTAINED_DATA=Descriptive analysis of ascertained data +EpidemiologicalEvidenceDetail.TEMPORAL_OCCURENCE=Temporal\: temporal occurrence of diseases suggest common infection source +EpidemiologicalEvidenceDetail.SPACIAL_OCCURENCE=Spatial\: Most of the cases were at the same location during the assumed infection period +EpidemiologicalEvidenceDetail.DIRECT_OCCURENCE=Person\: cases were in direct or indirect contact with each other +EpidemiologicalEvidenceDetail.SUSPICION=Suspicion +EpidemiologicalEvidenceDetail.EXPRESSED_BY_DISEASED=Expressed by the diseased person +EpidemiologicalEvidenceDetail.EXPRESSED_BY_HEALTH_DEPARTMENT=Expressed by the health department + +#LaboratoryDiagnosticEvidenceDetail +LaboratoryDiagnosticEvidenceDetail.VERIFICATION_OF_AT_LEAST_TWO_INFECTED=Verification of at least two infected or diseased persons +LaboratoryDiagnosticEvidenceDetail.COMPLIANT_PATHOGEN_FINE_TYPING=Compliant pathogen fine typing +LaboratoryDiagnosticEvidenceDetail.VERIFICATION_ON_MATERIALS=Verification on materials +LaboratoryDiagnosticEvidenceDetail.IMPRESSION_TEST=Impression test +LaboratoryDiagnosticEvidenceDetail.WATER_SAMPLE=Water sample +LaboratoryDiagnosticEvidenceDetail.OTHER=Other +LaboratoryDiagnosticEvidenceDetail.PATHOGEN_FINE_TYPING_COMPLIANT_WITH_CASE=Pathogen fine typing compliant with the one of cases + +#ImmunizationStatus +ImmunizationStatus.PENDING = Pending +ImmunizationStatus.ACQUIRED = Acquired +ImmunizationStatus.NOT_ACQUIRED = Not acquired +ImmunizationStatus.EXPIRED = Expired + +#ImmunizationManagementStatus +ImmunizationManagementStatus.SCHEDULED = Scheduled +ImmunizationManagementStatus.ONGOING = Ongoing +ImmunizationManagementStatus.COMPLETED = Completed +ImmunizationManagementStatus.CANCELED = Canceled + +#MeansOfImmunization +MeansOfImmunization.VACCINATION = Vaccination +MeansOfImmunization.RECOVERY = Recovery +MeansOfImmunization.VACCINATION_RECOVERY = Vaccination/Recovery +MeansOfImmunization.OTHER = Other + +#EntityColumn +EntityColumn.ENTITY = Entity +EntityColumn.FIELD_ID = Field ID +EntityColumn.FIELD = Field +EntityColumn.TYPE = Type +EntityColumn.DATA_PROTECTION = Data protection +EntityColumn.CAPTION = Caption +EntityColumn.DESCRIPTION = Description +EntityColumn.REQUIRED = Required +EntityColumn.NEW_DISEASE = New disease +EntityColumn.DISEASES = Diseases +EntityColumn.OUTBREAKS = Outbreaks +EntityColumn.IGNORED_COUNTRIES = Ignored countries +EntityColumn.EXCLUSIVE_COUNTRIES = Exclusive countries + +#EnumColumn +EnumColumn.TYPE = Type +EnumColumn.VALUE = Value +EnumColumn.CAPTION = Caption +EnumColumn.DESCRIPTION = Description +EnumColumn.SHORT = Short + +#NotificationType +NotificationType.CASE_CLASSIFICATION_CHANGED = Case classification changed +NotificationType.Desc.CASE_CLASSIFICATION_CHANGED = Sent to all users associated to the region or responsible region of a case. +NotificationType.CASE_INVESTIGATION_DONE = Case investigation done +NotificationType.Desc.CASE_INVESTIGATION_DONE = Sent to all users associated to the region or responsible region of a case. +NotificationType.EVENT_PARTICIPANT_CASE_CLASSIFICATION_CONFIRMED = Event participant case classification confirmed +NotificationType.Desc.EVENT_PARTICIPANT_CASE_CLASSIFICATION_CONFIRMED = When a case is set to a confirmed classification, this is sent to all responsible users of active events in which the case person participated and which took place no earlier than 30 days before the case was classified. +NotificationType.EVENT_PARTICIPANT_RELATED_TO_OTHER_EVENTS = Event participant related to other events +NotificationType.Desc.EVENT_PARTICIPANT_RELATED_TO_OTHER_EVENTS = When a new event participant is created, this is sent to all responsible users of active events in which the person also participated and which took place no earlier than 30 days before. +NotificationType.CASE_LAB_RESULT_ARRIVED = Case lab result arrived +NotificationType.Desc.CASE_LAB_RESULT_ARRIVED = Sent to all users associated to the region or responsible region of a case when a pathogen test result is entered or modified (non-pending). +NotificationType.CONTACT_LAB_RESULT_ARRIVED = Contact lab result arrived +NotificationType.Desc.CONTACT_LAB_RESULT_ARRIVED = Sent to all users associated to the region of a contact when a pathogen test result is entered or modified (non-pending). If the contact has no region the region of the source case is used. +NotificationType.EVENT_PARTICIPANT_LAB_RESULT_ARRIVED = Event participant lab result arrived +NotificationType.Desc.EVENT_PARTICIPANT_LAB_RESULT_ARRIVED = Sent to all users associated to the region of an event participant when a pathogen test result is entered or modified (non-pending). +NotificationType.LAB_SAMPLE_SHIPPED = Lab sample shipped +NotificationType.Desc.LAB_SAMPLE_SHIPPED = Sent to all users of a laboratory when a sample of that laboratory is shipped. +NotificationType.CONTACT_SYMPTOMATIC = Contact symptomatic +NotificationType.Desc.CONTACT_SYMPTOMATIC = Sent to all users associated to the region of a contact when a new symptomatic visit is created and the contact was previously asymptomatic. If the contact has no region the region of the source case is used. +NotificationType.TASK_START= Task start +NotificationType.Desc.TASK_START= Sent to the assignee of a task and all observer users when the task start date is within the last 10 minutes. +NotificationType.TASK_DUE = Task due +NotificationType.Desc.TASK_DUE = Sent to the assignee of a task and all observer users when the task due date is within the last 10 minutes. +NotificationType.TASK_UPDATED_ASSIGNEE = Task assignee updated +NotificationType.Desc.TASK_UPDATED_ASSIGNEE = Sent to the previous and new assignee of a task. +NotificationType.CONTACT_VISIT_COMPLETED = Contact visit completed +NotificationType.Desc.CONTACT_VISIT_COMPLETED = Sent to all users associated to the region of a contact and all observer users when a "Contact follow-up" task is completed. If the contact has no region the region of the source case is used. +NotificationType.CASE_DISEASE_CHANGED = Case disease changed +NotificationType.Desc.CASE_DISEASE_CHANGED = Sent to all users associated to the region or responsible region of a case when the disease was previously set to 'Unspecified VHF'. +NotificationType.EVENT_GROUP_CREATED = Event group created +NotificationType.Desc.EVENT_GROUP_CREATED = Sent to all responsible users of events that are part of a newly created event group. +NotificationType.EVENT_ADDED_TO_EVENT_GROUP = Event added to event group +NotificationType.Desc.EVENT_ADDED_TO_EVENT_GROUP = Sent to all responsible users of events that are part of the modified event group. +NotificationType.EVENT_REMOVED_FROM_EVENT_GROUP = Event removed from event group +NotificationType.Desc.EVENT_REMOVED_FROM_EVENT_GROUP = Sent to all responsible users of the removed event and events that are part of the modified event group. + +#NotificationTypeGroup +NotificationTypeGroup.CASES = Cases +NotificationTypeGroup.CONTACTS = Contacts +NotificationTypeGroup.EVENTS = Events +NotificationTypeGroup.SAMPLES = Samples +NotificationTypeGroup.TASKS = Tasks + +#S2SOwnershipStatusFilter +S2SOwnershipStatusFilter.OWNED=With ownership +S2SOwnershipStatusFilter.NOT_OWNED=To view +S2SOwnershipStatusFilter.ALL=All + +#ShareRequestViewType +ShareRequestViewType.INCOMING=Incoming +ShareRequestViewType.OUTGOING=Outgoing + +# SampleDashboardFilterDateType +SampleDashboardFilterDateType.SAMPLE_DATE_TIME=Date sample was collected +SampleDashboardFilterDateType.ASSOCIATED_ENTITY_REPORT_DATE=Report date of associated entity +SampleDashboardFilterDateType.MOST_RELEVANT=Most relevant date + +#SampleDashboardCustomDiseaseFilter +SampleDashboardCustomDiseaseFilter.NO_DISEASE = No Disease + +#SampleShipmentStatus +SampleShipmentStatus.SHIPPED=Shipped +SampleShipmentStatus.NOT_SHIPPED=Not shipped +SampleShipmentStatus.RECEIVED=Received + +#Pathogen Customizable enum +Pathogen.CAMPYLOBACTER_JEJUNI = Campylobacter jejuni +Pathogen.ESCHERICHIA_COLI = Escherichia coli +Pathogen.SALMONELLA_SPP = Salmonella spp. +Pathogen.SHIGELLA_SPP = Shigella spp. +Pathogen.VIBRIO_CHOLERAE = Vibrio cholerae +Pathogen.YERSINIA_SPP = Yersinia spp. +Pathogen.SARS_COV_2 = SARS-CoV-2 +Pathogen.ADENOVIRUS = Adenovirus +Pathogen.ASTROVIRUS = Astrovirus +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.POLIO_VIRUS = Polio virus 2 +Pathogen.REOVIRUS = Reovirus +Pathogen.ROTAVIRUS = Rotavirus +Pathogen.TT_HEPATITIS = TT hepatitis +Pathogen.OTHER = Other + +# EnvironmentSampleMaterial +EnvironmentSampleMaterial.WATER = Water +EnvironmentSampleMaterial.SOIL = Soil +EnvironmentSampleMaterial.AIR = Air +EnvironmentSampleMaterial.VECTORS = Vectors +EnvironmentSampleMaterial.OTHER = Other + +# WeatherCondition +WeatherCondition.SUNNY = Sunny +WeatherCondition.CLOUDY = Cloudy +WeatherCondition.RAINING = Raining +WeatherCondition.WINDY = Windy + +#Pathogen Customizable enum diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index a9bf85558be..73ffe6d231c 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -864,7 +864,7 @@ headingEnvironmentSampleManagement = Sample management headingEnvironmentSampleRequestedPathogenTests = Požadované patogeny k testování headingLimitedDiseases=Disease restrictions headingExternalEmailSend=Poslat e-mail -headingExternalEmailDetails=Email details +headingExternalEmailDetails=Detaily e-mailu headingCustomizableEnumConfigurationInfo=Customizable enum configuration # Info texts diff --git a/sormas-api/src/main/resources/strings_es-BO.properties b/sormas-api/src/main/resources/strings_es-BO.properties new file mode 100644 index 00000000000..b91efd3e5bb --- /dev/null +++ b/sormas-api/src/main/resources/strings_es-BO.properties @@ -0,0 +1,1770 @@ +############################################################################### +# SORMAS® - Surveillance Outbreak Response Management & Analysis System +# Copyright © 2016-2021 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 . +############################################################################### + +# Any text presented to the user that is not a caption or can be used in +# various places (e.g. as part of a larger text or caption) + +# General Strings +active = Active +address = Address +all = All +and = and +at = at +between = between +bpm = bpm +by = by +comparedTo = compared to %s +disabled = Disabled +done = Done +edit = Edit +enabled = Enabled +epiWeek = Epi Week +fileName = File Name +forCase = for case +forContact = for contact +forEventParticipant = for event participant +forEnvironment = for environment +inactive = Inactive +inColumn = in column +lastTwoDays = last two days +lastTwoWeeks = last two weeks +lastTwoYears = last two years +lastWeek = last week +lastYear = last year +mmhg = mmHg +no = No +notAnswered = Not answered +of = of +on = on +or = or +pathogenTestDeletedDuringLabMessageConversion = Pathogen test has been deleted during the conversion process of the associated lab message; +pleaseSpecify = Please specify +previousPeriod = previous period +quarantineEnd = Quarantine ends at the end of follow-up +quarterShort = Q +reportedBy = Reported By +reportedOn = Reported on +reportingUser = Reporting user\: +step = Step +setTo = Set to +toCase = to case +notSpecified = Not specified +week = Week +weekShort = Wk +year = Year +years = years +yes = Yes +yesterday = yesterday +none = None +total = Total +until = until +min = Min +max = Max +average = Average +month = Month +day = Day +text = Text +number = Number +date = Date +nameOf = Name of %s +uuidOf = UUID of %s +listOf = List of %s +mapOf = Map of <%s , %s> + +# Aggregate Report +aggregateReportLegend = %s \= %s; %s \= %s; %s \= %s + +# Classification +classificationAllOf = all of +classificationClassificationRules = SORMAS Case Classification Rules +classificationConfirmed = Confirmed Classification +classificationConfirmedNoSymptoms = Confirmed Classification - No symptoms +classificationConfirmedUnknownSymptoms = Confirmed Classification - Unknown symptoms +classificationCriteriaForTestType = for test type +classificationCriteriaForExposureType = for exposure type +classificationDaysBeforeCaseStart = days before symptom onset/case report date +classificationEventCluster = Case linked to a cluster event +classificationForDisease = for +classificationGeneratedFor = Generated for SORMAS +classificationInfoText = ... when the case meets the following requirements\:
+classificationInfoNumberText = ... when the case meets %s of the following requirements\:
+classificationNoneOf = none of +classificationNotWithin = not within +classificationOneNegativeTestResult = One negative lab result +classificationOneOf = one of +classificationOnePositiveTestResult = One positive lab result of +classificationOneOtherPositiveTestResult = One other positive lab result +classificationPersonAged = Person aged +classificationNotACase = Not a case Classification +classificationProbable = Probable Classification +classificationRulesFor = Classification Rules For +classificationSymptomsAllOf = All symptoms +classificationSymptomsAnyOf = Any symptom +classificationSuspect = Suspect Classification +classificationYearsOrLess = years or less +classificationYearsOrMore = years or more +classificationLastVaccinationDateWithin = Last vaccination date within + +# Confirmation +close = Close +confirmationAlsoAdjustQuarantine = You have extended the follow-up. Should the end of the quarantine be adjusted accordingly? +confirmationArchiveCampaign = Are you sure you want to archive this campaign? This will not remove it from the system or any statistics, but only hide it from the normal campaign directory. +confirmationArchiveCase = Are you sure you want to archive this case? This will not remove it from the system or any statistics, but only hide it from the normal case directory. +confirmationArchiveCaseWithContacts = Archive related contacts along with the archived case +confirmationDearchiveCaseWithContacts = Dearchive related contacts along with the dearchived case +confirmationArchiveCases = Are you sure you want to archive all %d selected cases? +confirmationArchiveContact = Are you sure you want to archive this contact? This will not remove it from the system or any statistics, but only hide it from the normal contact directory. +confirmationArchiveContacts = Are you sure you want to archive all %d selected contacts? +confirmationArchiveEnvironment = Are you sure you want to archive this environment? This will not remove it from the system or any statistics, but only hide it from the normal environment directory. +confirmationArchiveEnvironments = Are you sure you want to archive all %d selected environments? +confirmationArchiveEvent = Are you sure you want to archive this event? This will not remove it from the system or any statistics, but only hide it from the normal event directory. +confirmationArchiveEvents = Are you sure you want to archive all %d selected events? +confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. +confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? +confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. +confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. +confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? +confirmationChangeCaseDisease = Really change case disease? +confirmationDearchiveCampaign = Are you sure you want to de-archive this campaign? This will make it appear in the normal campaign directory again. +confirmationDearchiveCase = Are you sure you want to de-archive this case? This will make it appear in the normal case directory again. +confirmationDearchiveCases = Are you sure you want to de-archive all %d selected cases? +confirmationDearchiveContact = Are you sure you want to de-archive this contact? This will make it appear in the normal contact directory again. +confirmationDearchiveContacts = Are you sure you want to de-archive all %d selected contacts? +confirmationDearchiveEnvironment = Are you sure you want to de-archive this environment? This will make it appear in the normal environment directory again. +confirmationDearchiveEnvironments = Are you sure you want to de-archive all %d selected environments? +confirmationDearchiveEvent = Are you sure you want to de-archive this event? This will make it appear in the normal event directory again. +confirmationDearchiveEvents = Are you sure you want to de-archive all %d selected events? +confirmationDearchiveEventParticipant = Are you sure you want to de-archive this event participant? This will make it appear in the normal event participant list again. +confirmationDearchiveEventGroup = Are you sure you want to de-archive this event group? This will make it appear in the normal event group directory again. +confirmationDeleteCases = Are you sure you want to delete all %d selected cases?

If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteContacts = Are you sure you want to delete all %d selected contacts?

If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteEntities = Are you sure you want to delete all %d selected %s?

If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationRestoreEntities = Are you sure you want to restore all %d selected %s? +confirmationDeleteEntity = Are you sure you want to delete this %s?

If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteEntityWithDetails = Are you sure you want to delete this %s?
%s
If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteEventParticipants = Are you sure you want to delete all %d selected event participants?

If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteEvents = Are you sure you want to delete all %d selected events?

If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteTravelEntries = Are you sure you want to delete all %d selected travel entries?

If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteFile = Are you sure you want to delete "%s"? +confirmationDeletePathogenTests = Are you sure you want to delete all %d selected pathogen tests? If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeletePrescriptions = Are you sure you want to delete all %d selected prescriptions? +confirmationDeleteSamples = Are you sure you want to delete all %d selected samples? If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationDeleteTasks = Are you sure you want to delete all %d selected tasks? +confirmationDeleteTreatments = Are you sure you want to delete all %d selected treatments? +confirmationDeleteVisits = Are you sure you want to delete all %d selected visits? +confirmationDeletePrescriptionWithTreatment = The prescriptions you want to delete are linked to treatments. Do you want to delete the prescriptions alone or together with the linked treatments? +confirmationDeleteUserRole = Are you sure you want to remove this user role, used by %d users? +confirmationLostToFollowUp = Are you sure you want to set the follow-up of all %d selected contacts to lost to follow-up? +confirmationPickCaseAndDeleteOther = Are you sure that the case you did not select is a duplicate of this case? The case you did not select and all contacts, samples, tasks and other data linked to it will be deleted. +confirmationPickContactAndDeleteOther = Are you sure that the contact you did not select is a duplicate of this contact? The contact you did not select and all samples, tasks and other data linked to it will be deleted. +confirmationMergeCaseAndDeleteOther = Are you sure that the case you did not select is a duplicate of this case? The case you selected will be updated with information from the case you did not select, and the latter will then be deleted. +confirmationMergeContactAndDeleteOther = Are you sure that the contact you did not select is a duplicate of this contact? The contact you selected will be updated with information from the contact you did not select, and the latter will then be deleted. +confirmationUpdateCompleteness = Are you sure you want to update the completeness values of all cases in the list? This might take some time. +confirmationEnterBulkEditMode = There are currently more than %d items in the list. It is recommended to use some filters first because entering bulk edit mode with this many items might slow down your system. Do you still want to proceed? +confirmationDisableAllLineListingRegion = Are you sure you want to disable line listing for this disease? Line listing will be canceled for all districts. +confirmationDisableAllLineListingNational = Are you sure you want to disable line listing for this disease? Line listing will be canceled for all districts in all regions. +confirmationArchiveArea = Are you sure you want to archive this area? +confirmationDearchiveArea = Are you sure you want to de-archive this area? +confirmationArchiveContinent = Are you sure you want to archive this continent? +confirmationDearchiveContinent = Are you sure you want to de-archive this continent? +confirmationArchiveSubcontinent = Are you sure you want to archive this subcontinent? +confirmationDearchiveSubcontinent = Are you sure you want to de-archive this subcontinent? +confirmationArchiveCountry = Are you sure you want to archive this country? +confirmationDearchiveCountry = Are you sure you want to de-archive this country? +confirmationArchiveRegion = Are you sure you want to archive this region? +confirmationDearchiveRegion = Are you sure you want to de-archive this region? +confirmationArchiveDistrict = Are you sure you want to archive this district? +confirmationDearchiveDistrict = Are you sure you want to de-archive this district? +confirmationArchiveCommunity = Are you sure you want to archive this community? +confirmationDearchiveCommunity = Are you sure you want to de-archive this community? +confirmationArchiveFacility = Are you sure you want to archive this facility? +confirmationDearchiveFacility = Are you sure you want to de-archive this facility? +confirmationArchiveLaboratory = Are you sure you want to archive this laboratory? +confirmationDearchiveLaboratory = Are you sure you want to de-archive this laboratory? +confirmationArchivePointOfEntry = Are you sure you want to archive this point of entry? +confirmationDearchivePointOfEntry = Are you sure you want to de-archive this point of entry? +confirmationArchiveAreas = Are you sure you want to archive all %d selected areas? +confirmationDearchiveAreas = Are you sure you want to de-archive all %d selected areas? +confirmationArchiveContinents = Are you sure you want to archive all %d selected continents? +confirmationDearchiveContinents = Are you sure you want to de-archive all %d selected continents? +confirmationArchiveSubcontinents = Are you sure you want to archive all %d selected subcontinents? +confirmationDearchiveSubcontinents = Are you sure you want to de-archive all %d selected subcontinents? +confirmationArchiveCountries = Are you sure you want to archive all %d selected countries? +confirmationDearchiveCountries = Are you sure you want to de-archive all %d selected countries? +confirmationArchiveRegions = Are you sure you want to archive all %d selected regions? +confirmationDearchiveRegions = Are you sure you want to de-archive all %d selected regions? +confirmationArchiveDistricts = Are you sure you want to archive all %d selected districts? +confirmationDearchiveDistricts = Are you sure you want to de-archive all %d selected districts? +confirmationArchiveCommunities = Are you sure you want to archive all %d selected communities? +confirmationDearchiveCommunities = Are you sure you want to de-archive all %d selected communities? +confirmationArchiveFacilities = Are you sure you want to archive all %d selected facilities? +confirmationDearchiveFacilities = Are you sure you want to de-archive all %d selected facilities? +confirmationDearchiveImmunization = Are you sure you want to de-archive this immunization? This will make it appear in the normal immunization directory again. +confirmationArchiveLaboratories = Are you sure you want to archive all %d selected laboratories? +confirmationDearchiveLaboratories = Are you sure you want to de-archive all %d selected laboratories? +confirmationDearchiveTask = Are you sure you want to de-archive this task? This will make it appear in the normal task directory again. +confirmationDearchiveTasks = Are you sure you want to de-archive all %d selected tasks? +confirmationDearchiveTravelEntry = Are you sure you want to de-archive this travel entry? This will make it appear in the normal travel entry directory again. +confirmationArchivePointsOfEntry = Are you sure you want to archive all %d selected points of entry? +confirmationDearchivePointsOfEntry = Are you sure you want to de-archive all %d selected points of entry? +confirmationContactSourceCaseDiscardUnsavedChanges = Changing or removing the source case of a contact will discard all unsaved changes you have made to the contact. Are you sure you want to continue? +confirmationRemoveUserAsOfficer = The user roles of this user have changed. Saving this user will remove it from any case or contact that they are assigned to as surveillance officer or contact officer. Do you still want to save the user? +confirmationExtendQuarantine=Are you sure you want to extend the quarantine? +confirmationReduceQuarantine=Are you sure you want to reduce the quarantine? +confirmationExtendFollowUp=Would you also want the follow-up period to be extended accordingly? +confirmationRemoveGridRowTitle=Confirm remove +confirmationRemoveGridRowMessage=Are you sure you want to remove this row? +confirmationRemoveGridRowConfirm=Yes +confirmationRemoveGridRowCancel=No +confirmationSetMissingGeoCoordinates=This action will fill in geo coordinates for every person which has an address given, but no geo coordinates entered. Please be aware that this action affects all persons in your jurisdiction, regardless of the filters set below. Warning\: Depending on the number of persons, this method might take quite long. +confirmationLocationFacilityAddressOverride = The selected facility has location details that are different from the ones you are currently editing. Do you want to overwrite them with those from the facility? +confirmationCancelExternalFollowUpPopup=Are you sure you want to cancel external follow-ups in the eDiary? +confirmationUnlinkCaseFromEvent = Are you sure you want to unlink this case from this event? +confirmationDeleteExternalMessages = Are you sure you want to delete all %d selected messages? +confirmationUnclearExternalMessage = Are you sure you want to mark this message as unclear? +confirmationManuallyForwardedExternalMessage = Are you sure you want to mark this message as forwarded? +confirmationManualDeleteCoreEntity=You are about to mark this data for deletion. If referenced by other data in the system, those references will be removed, which cannot be automatically undone. +confirmationFetchExternalMessages = Another user seems to be fetching messages at the moment. If you choose to proceed, this may result in duplicate messages. Are you sure you want to proceed? +confirmationRejectSormasToSormasShareRequest = Are you sure you want to reject the share request? +confirmationEnableUsers = Are you sure you want to enable all %d selected users? +confirmationDisableUsers = Are you sure you want to disable all %d selected users? +confirmationRevokeSormasToSormasShareRequest = Are you sure you want to revoke the share request? +confirmationSinceExternalMessages = This is the first time messages will be fetched. Do you want to select the start date from which to fetch messages? If you select no, all messages will be retrieved. +confirmationSeeAllPersons=Are you sure you want to search persons for all association types? This could result in a slow response. +confirmationExternalMessageCorrection = This message contains corrections to a previous one.
Do you want process those corrections from this message? +confirmationVaccinationStatusUpdate = Deleting this vaccination has lead to at least one case no longer having a valid vaccination. Do you want to remove the vaccination status from all affected cases? +confirmExternalMessageCorrectionThrough = No other new or changed information could automatically be determined from the message. Do you want to manually add or edit more information? +confirmationDeleteCaseContacts = Do you also want to delete all contacts of this case? +confirmationCancelBulkAction = Do you really want to cancel the bulk operation? The operation will be stopped after the current batch has been processed. + +# Entities +entityAutomaticSoftDeletion=Entity was automatically deleted +entityAction=Action +entityActions=Actions +entityActivityAsCase = Activity as Case +entityAdditionalTest=Additional test +entityAdditionalTests=Additional tests +entityBurial=Burial +entityCampaign=Campaign +entityCampaigns=Campaigns +entityCase=Case +entityCases=Cases +entityClinicalVisit=Clinical assessment +entityClinicalVisits=Clinical assessments +entityContact=Contact +entityContacts=Contacts +entityContinents=Continents +entityDistrict=District +entityDistricts=Districts +entityDocuments=Documents +entityEnvironment = Environment +entityEnvironments = Environments +entityEnvironmentSample = Environment sample +entityEnvironmentSamples = Environment samples +entityEvent=Event +entityEvents=Events +entityEventGroup=Event group +entityEventGroups=Event groups +entityEventParticipant=Event participant +entityEventParticipants=Event participants +entityGathering = Social event +entityImmunization = Immunization +entityImmunizations = Immunizations +entityPathogenTests = Pathogen tests +entityPrescription = Prescription +entityPrescriptions = Prescriptions +entityQuarantineOrder = Quarantine Order +entityRegion = Region +entityRegions = Regions +entitySample = Sample +entitySamples = Samples +entitySubcontinents=Subcontinents +entityTask = Task +entityTasks = Tasks +entityTravelEntry = Travel entry +entityTravelEntries = Travel Entries +entityTreatment = Treatment +entityTreatments = Treatments +entityUser = User +entityUsers = Users +entityExposure = Exposure +entityExternalMessages = External messages +entityCampaignData = Campaign Data +entityCampaignDataForm=campaign data form +entityStatistics = Statistics +entityAreas = Areas +entityCountries = Countries +entityPointsOfEntry = Points of entry +entityAggregateReports = Aggregate Reports +entityContactFollowUps = Contact follow ups +entityBagCases = BAG cases +entityBagContacts = BAG contacts +entityCaseVisits = Case visits +entityContactVisits = Contact visits +entityEventActions = Events actions +entityCaseManagement = Case management +entityCommunities = Communities +entityFacilities = Facilities +entityPersonContactDetail = Person contact details +entityUserRoles = User roles +entityDataDictionary= Data dictionary +entityDataProtectionDictionary= Data protection dictionary +entityPersons = Persons +entityVaccinations = Vaccinations +entityDiseaseConfigurations = Disease configurations +entityDiseaseClassifications = Disease classifications +entityFeatureConfigurations = Feature configurations +entityVisits = Visits +entityWeeklyReports = Weekly reports +entityOutbreaks = Outbreaks +entityCustomizableEnumValues = Customizable enum values +entityCampaignFormMeta = Campaign form meta +entityCampaignFormData = Campaign form data + +# Error Messages +errorAccessDenied=You do not have the required rights to view this page. +errorEntityOutdated=The data could not be saved because it has been changed in the meantime. +errorFieldValidationFailed=Please check the entered data. At least one field has errors. +errorIntegerFieldValidationFailed=Please check the entered data. At least one of the fields where an integer was expected contains something else. +errorLabResultsAdapterNotFound = The external lab results adapter could not be found. Please make sure it is installed in your system and specified properly in your sormas.properties. +errorNoAccessToWeb=Your user account does not have access to the web application +errorNotRequiredRights=You do not have the required rights to perform this action. +errorOccurred = An error has occurred +errorProblemOccurred = A problem has occurred +errorViewNotFound = You tried to navigate to a view (%s) that does not exist. +errorWasReported = An unexpected error occurred. Please contact your supervisor or administrator and inform them about it. +errorInvalidValue = Invalid value +errorCaseDuplicateDeletion = The duplicate case could not be deleted due to an internal error. +errorCaseMerging = The cases could not be merged due to an internal error. +errorContactDuplicateDeletion = The duplicate contact could not be deleted due to an internal error. +errorContactMerging = The contacts could not be merged due to an internal error. +errorSormasToSormasShare = The data could not be shared due to some errors. +errorSormasToSormasRequestToken = Could not request token. +errorSormasToSormasServerAccess = The selected health department is not configured. Please contact an admin and tell them about this issue. +errorSormasToSormasSend = Unexpected error occurred while sharing. Please contact an admin and tell them about this issue. +errorSormasToSormasConnection = Connection refused by the target health department. +errorSormasToSormasDataMissing = Share request data is missing +errorSormasToSormasResult = Unexpected error occurred while getting share result. Please contact the recipient health department and tell them about this issue. Please also contact your admin and tell them about this issue. +errorSormasToSormasCertNotGenerated = Sormas to sormas certificate is not yet generated. Please contact an admin and tell them about this issue. +errorSormasToSormasEncrypt = Could not encrypt the data. Please contact an admin and tell them about this issue. +errorSormasToSormasDecrypt = Could not decrypt the shared data. Please contact an admin and tell them about this issue. +unexpectedErrorSormasToSormasAccept = The share request could not be marked as accepted on the source system.

The following error occurred\: %s.

Please contact your admin and the admin of the source system and tell them about this issue. +errorSormasToSormasAccept = The share request could not be accepted. +errorSormasToSormasDeleteFromExternalSurveillanceTool = Failed to delete entities from external surveillance tool. +errorSormasToSormasInvalidRequestMethod = Invalid HTTP verb used +errorSormasToSormasLoadShares = Failed to load shares +errorSormasToSormasRequestProcessed = The request is already processed. +errorSormasToSormasShareContactWithoutCase = You can not share this contact because you need a source case. Please link the contact to a case. +errorSormasToSormasShareContactWithUnsharedSourceCase = If you want to share this contact, you have to send the associated case first to the same target system.
Please note that you can send the case and exclude personal data. +errorSormasToSormasAcceptContactsWithoutCaseShared = The contact %s cannot be accepted, because it was sent without a case. Please reject the contact and ask the source system to send the linked case first. +errorSormasToSormasAcceptContactsBeforeAcceptSourceCase = The contact %s cannot be accepted, because the contact belongs to a case that has not yet been accepted. Please accept the linked case first.
It is shared within the request %s. +errorSormasToSormasExistingPendingRequest = There is already a pending request to the same organization. Please revoke it before sending a new one. +errorSormasToSormasSharequestNotFound = The share request could not be found. It was either revoked by the source system or it has been rejected by someone else. +errorQuarantineOnlySupportedEntities = Quarantine can only be issued for cases, contacts, event participants and travel entries. +errorQuarantineBulkOnlySupportedEntities = Bulk quarantine can only be issued for cases, contacts, event participants. +errorCreatingTemplateDirectory = Could not create template directory. +errorDeletingDocumentTemplate = Error deleting document template +errorDeletingDocument = Error deleting document +errorDocumentGeneration = Error while generating document\: %s +errorDocumentGenerationMultipleDiseasses = The selected entries has different diseases. +errorIllegalFilename = Illegal file name\: %s +errorFileNotFound = File '%s' not found +errorReadingTemplate = Error reading template '%s' +errorReadingDocument = Error reading document '%s' +errorProcessingTemplate = Error processing template. +errorTemplateFileCorrupt = The template file is corrupt. +errorWritingTemplate = Could not write template file. +errorCampaignDiagramTotalsCalculationError=At least part of the percentage values for the diagram '%s' could not be calculated. Please check the diagram definitions for errors. +errorNoPopulationDataLocations=No population data was found for the following locations\: %s +errorNoPopulationDataFound=There is no population data available. Switching to absolute data view +errorFormIdPopulationAgeGroup=Both "Form Id" and "Population Age Group" options are set +errorNotifyingExternalSurveillanceTool=Error notifying external reporting tool +errorExternalSurveillanceToolNonCoronavirusCase=Could not send the selected cases to the reporting tool because the case %s is not a %s case. +errorExternalSurveillanceToolCasesNotSharable=%d of the selected %d cases can not be sent to the external reporting tool.
Please make sure that all of the cases below are owned and allowed to be shared with the external reporting tool. Then, re-try sending or only send the ones that can be sent. +errorExternalSurveillanceToolNonClusterEvent=Could not send the selected events to the reporting tool because the event %s is not a %s cluster. +errorExternalSurveillanceToolEventNotOwned=%d of the selected events can not be sent to the external reporting tool.
Please make sure that all of the events below are owned. Then, re-try sending or only send the ones that can be sent. +errorEventFromAnotherJurisdiction = The event is related to a jurisdiction you don't have access to +errorEventsFromAnotherJurisdiction = At least one of the selected events is related to a jurisdiction you don't have access to +errorEventUnlinkEventGroupFromAnotherJurisdiction = The event group has an event related to a jurisdiction you don't have access to +errorCaseNotEditable = The case is not editable anymore +errorCaseNotEditableOutsideJurisdiction = The case outside the user's jurisdiction can not be edited +errorEntityNotEditable = This entity is not editable anymore +errorCampaignNotEditable = This campaign is not editable anymore +errorContactNotEditable = The contact is not editable anymore +errorContactNotEditableOutsideJurisdiction = The contact outside the user's jurisdiction can not be edited +errorEventNotEditable = This event is not editable any more +errorEventParticipantNotEditable = This event participant is not editable any more +errorSampleNotEditable = This sample is not editable any more +errorImmunizationNotEditable = This immunization is not editable any more +errorForbidden = You do not have the necessary user rights to perform this action +errorNoRightsForChangingField = You have no rights for changing %s +errorNoRightsForChangingMultipleFields = You have no rights for changing %s and related fields +errorNotFound = The requested entity was not found +errorDeleteUserRoleUsedAlone = Cannot delete user role, because the following users would remain without a user role\:

%s

Please give them a different role and re-try to delete this one. +errorSurveillanceReportNotEditable = This report is not editable any more +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 +errorSendingExternalEmail = Email could not be sent. Please contact an admin and notify them about this problem. +errorExternalEmailAttachmentCannotEncrypt=Can't send email with attachments. The person has no national health id or primary phone number to send the password to or the SMS service is not set up in the system. + +# headings +headingAccessDenied = Access denied +headingActivityAsCase = Activity as Case +headingAdditionalTests = Additional tests +headingAllContacts = All Contacts +headingAnimalContacts = Animal Contacts +headingArchiveCampaign = Archive Campaign +headingArchiveCase = Archive case +headingArchiveContact = Archive contact +headingArchiveEnvironment = Archive environment +headingArchiveEvent = Archive event +headingArchiveEventParticipant = Archive event participant +headingArchiveEventGroup = Archive event group +headingArchiveImmunization = Archive immunization +headingArchiveTravelEntry = Archive travel entry +headingCampaignBasics = Campaign basics +headingCampaignData = Campaign data +headingCampaignDashboard = Campaign dashboard +headingCaseData = Case data +headingCaseFatalityRate=Case Fatality Rate +headingCaseFound = Case found +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 +headingChangePathogenTestResult = Change pathogen test result +headingClinicalMeasurements = Clinical measurements +headingClinicalVisitsDeleted = Clinical assessments deleted +headingComplications = Complications +headingConfirmArchiving = Confirm archiving +headingConfirmDearchiving = Confirm de-archiving +headingConfirmDeletion = Confirm Deletion +headingConfirmMerging = Confirm Merging +headingConfirmUpdateCompleteness = Update completeness values +headingContactData = Contact data +headingContactsArchived = Contacts archived +headingContactsDearchived = Contacts de-archived +headingConfirmEnabling = Confirm enabling +headingConfirmDisabling = Confirm disabling +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 +headingCasesNotLinked = None of the cases were linked +headingContactsNotRestored = \= None of the contacts were restored +headingCreateAdditionalTest = Create new additional test results +headingCreateEntry = Create entry +headingCreateNewAction = Create new action +headingCreateNewAggregateReport = Create a new aggregated report +headingCreateNewCampaign = Create new campaign +headingCreateNewCase = Create new case +headingCreateNewCaseIssue = Case creation issue +headingCreateNewClinicalVisit = Create new clinical assessment +headingCreateNewContact = Create new contact +headingCreateNewContactIssue = Contact creation issue +headingCreateNewTravelEntry=Create new travel entry +headingCreateNewEnvironment = Create new environment +headingCreateNewEvent = Create new event +headingCreateNewEventParticipant = Add new event participant +headingCreateNewEventGroup = Create new event group +headingCreateNewFacility = Create new facility +headingCreateNewImmunization = Create new immunization +headingCreateNewPerson = Create new person +headingCreateNewPrescription = Create new prescription +headingCreateNewSample = Create new sample +headingCreateNewTask = Create new task +headingCreateNewTaskQuestion = Create new task? +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 +headingDearchiveCase = De-Archive case +headingDearchiveContact = De-Archive contact +headingDearchiveEnvironment = De-Archive environment +headingDearchiveEvent = De-Archive event +headingDearchiveEventParticipant = De-Archive event participant +headingDearchiveEventGroup = De-Archive event group +headingDearchiveImmunization = De-Archive immunization +headingDearchiveTravelEntry = De-Archive travel entry +headingDefineOutbreakDistricts = Define which districts currently are affected by an outbreak. +headingDeleteConfirmation = Confirm deletion +headingRestoreConfirmation = Confirm restoration +headingDownloadDocumentTemplateGuide = Download the SORMAS Document Template Guide +headingDownloadEmailTemplateGuide = Download the SORMAS Email Template Guide +headingDownloadImportTemplate = Download the Import Template +headingDownloadErrorReport = Download Error Report +headingDownloadImportGuide = Download the SORMAS Import Guide and Data Dictionary +headingEditAction = Edit action +headingEditAdditionalTest = Edit additional test results +headingEditAggregateReport = Edit aggregated report +headingEditAssignee = Edit assignee +headingEditCampaign = Edit campaign +headingEditCases = Edit cases +headingEditClinicalVisit = Edit clinical assessment +headingEditContacts = Edit contacts +headingEditEventParticipant = Edit person +headingEditEvents = Edit events +headingEditPathogenTestResult = Edit pathogen test result +headingEditPrescription = Edit prescription +headingEditTask = Edit task +headingEditTreatment = Edit treatment +headingEditUser = Edit user +headingEditVaccination = Edit vaccination +headingEditVisit = Edit visit +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 +headingFilters = Filters +headingStoppedFollowUp = Stopped Follow-up +headingFollowUpStatus = Follow-up status +headingHealthConditions = Pre-existing conditions +headingHospitalization = Current Hospitalization +headingPreviousHospitalizations = Previous Hospitalizations +headingImportCaseContacts = Import Case Contacts +headingImportCases = Import Cases +headingImportCommunities = Import Communities +headingImportContacts = Import Contacts +headingImportCampaign = Import campaign form data +headingImportCsvFile = Import CSV File +headingImportDistricts = Import Districts +headingImportError = Import error +headingImportEvent = Import events +headingImportEventParticipant = Import event participants +headingImportedCaseInfo = Imported Case Information +headingImportedPersonInfo = Imported Person Information +headingImportFailed = Import failed +headingImportFacilities = Import Facilities +headingImportPointsOfEntry = Import Points of Entry +headingImportPopulationData = Import Population Data +headingImportContinents = Import Continents +headingImportSubcontinents = Import subcontinents +headingImportCountries = Import Countries +headingImportAllCountries = Import Default Countries +headingImportAllContinents = Import Default Continents +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 +headingLaboratorySample = Laboratory sample +headingLastReportedDistrict=Last reported district +headingLineListing = Line listing +headingLineListingImport = Line listing import +headingLocation = Location +headingLoginFailed = Login failed +headingMaternalHistory = Maternal history +headingMedicalInformation = Additional medical information +headingMissingDateFilter = Missing date filter +externalMessageMultipleSampleReports=Multiple samples +headingMyTasks = My Tasks +headingNewAccount = New account +headingNewCases = New Cases +headingNewEvents = New Events +headingNewPassword = New password +headingNewTestResults = New Test Results +headingNoCasesSelected = No cases selected +headingNoClinicalVisitsSelected = No clinical assessments selected +headingNoContactsSelected = No contacts selected +headingNoEnvironmentSelected = No environment selected +headingNoEventParticipantsSelected = No event participants selected +headingNoEventsSelected = No events selected +headingNoTravelEntriesSelected = No travel entries selected +headingNoImmunizationsSelected = No immunizations selected +headingNoFile = No file +headingNoPathogenTestsSelected = No pathogen tests selected +headingNoPrescriptionsSelected = No prescriptions selected +headingNoSamplesSelected = No samples selected +headingNoTasksSelected = No tasks selected +headingNoTreatmentsSelected = No treatments selected +headingNoVisitsSelected = No visits selected +headingNoUsersSelected = No users selected +headingOutbreakDistricts=Outbreak Districts +headingOutbreakIn = Outbreak in +headingPathogenTestsDeleted = Pathogen tests deleted +headingPaperFormDates = Reception dates of paper form +headingPersonData = Person data +headingPersonInformation = Person information +headingPersonOccupation = Occupation & education +headingPickEventGroup = Pick event group +headingPickEventParticipants = Pick or merge event participants +headingPickEventParticipantsIncompleteSelection = Incomplete selection +headingPickOrCreateCase = Pick or Create a Case +headingPickOrCreatePerson = Pick or create person +headingMergePersonError = Merge person error +headingMergeDuplicateEventParticipantSamePersonSameEvent = Duplicate event participants found +headingPickOrMergePerson = Pick or merge person +headingPickOrMergePersonConfirmation = Pick or merge person confirmation +headingSelectPerson = Select person +headingPickOrCreateEvent = Pick or create event +headingPickOrCreateEventGroup = Pick or create event group +headingPickOrCreateEntry = Pick or create entry +headingPickOrCreateImmunization = Pick or create immunization +headingPickOrCreatePathogenTest = Pick or create pathogen test +headingPickOrCreateSample = Pick or create sample +headingPointOfEntryInformation = Point of entry information +headingPrescriptionsDeleted = Prescriptions deleted +headingRecovery = Recovery +headingReferSample = Refer sample to another laboratory +headingRequestedAdditionalTests = Requested additional tests\: +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 +headingSetOutbreakStatus = Set status of all districts\: +headingShowExternalMessage = Message +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 +headingUpdatePassword = Update password +headingUploadSuccess = Upload Successful +headingUserData = User data +headingVaccination = Vaccination +headingViewNotFound = The view could not be found +headingViewPathogenTestResult = View pathogen test result +headingViewPrescription = View prescription +headingViewAdditionalTest = View additional test results +headingViewClinicalVisit = View clinical assessment +headingViewSurveillanceReport = Report view +headingViewTask = View task +headingViewTreatment = View treatment +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 +headingMissingEpiWeekFilter = Missing epi week filter +headingMergeGuide = Guide\: Merging Duplicate Cases +headingContactMergeGuide = Guide\: Merging Duplicate Contacts +# %d: 1 or 2; %s: Person name +headingComparisonCase = Case %d\: %s +headingCaseComparison = Case Comparison +headingConfirmChoice = Confirm Your Choice +headingHowToMergeCases = How to Merge Cases +headingHowToMergeContacts = How to Merge Contacts +headingExplanationOfTerms = Explanation of Terms +headingCompleteness = Completeness +headingDataImport = Data import +headingDisableLineListing = Disable Line Listing? +headingEditLineListing = Edit Line Listing +headingInvalidDateEntered = Invalid Date Entered +headingDearchivingNotPossible = De-archiving not possible +headingNoRowsSelected = No rows selected +headingUserSettings = User Settings +headingContactsPerCase = Contacts per Case +headingQuarantineForCases = Quarantine data for cases +headingCasesResultingFromContacts = Cases resulting from contacts +headingcasesWithReferenceDefinitionFulfilled = Cases with reference definition fulfilled +headingCasesInQuarantine = Cases in Quarantine +headingCasesPlacedInQuarantine = Cases placed in Quarantine +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 +headingContactsInQuarantine = Contacts in Quarantine +headingContactsPlacedInQuarantine = Contacts placed in Quarantine +headingContactsCancelFollowUp = Confirm canceling follow-up for contacts +headingContactsLostToFollowUp = Confirm setting contacts to lost to follow-up +headingPickOrCreateContact = Pick or create contact +headingNewSourceCases = New Cases not Previously Known to Be Contacts +headingNoCaseFound = No case found +headingNoEventFound = No event found +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 +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 +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 +headingRemoveCaseFromContact = Remove Case from Contact +headingDiscardUnsavedChanges = Discard Unsaved Changes +headingGenerateCases = Generate Cases +headingGenerateContacts = Generate Contacts +headingContactDataNotComplete = Contact data is not complete +headingSymptomJournalAccountCreation = PIA +headingSaveUser = Save User +headingCreateCampaignDataForm = New %s +headingExtendQuarantine = Extend quarantine +headingReduceQuarantine = Reduce quarantine +headingAdjustQuarantine = Adjust quarantine +headingExtendFollowUp = Extend follow-up period +headingExposureInvestigation = Exposure Investigation +headingEpiDataSourceCaseContacts = Contacts with Source Case +headingExposureDetails = Exposure Details +headingAnimalContactDetails = Animal Contact Details +headingBurialDetails = Burial Details +headingCampaignFormDataDuplicateNew = New Campaign Form Data +headingCampaignFormDataDuplicateExisting = Existing Campaign Form Data +headingCampaignFormDataAlreadyExisting = Campaign Form Data Already Existing +headingActivityAsCaseDetails = Activity as Case Details +headingUnlinkCaseFromEvent = Unlink case from event +headingUpdatePersonContactDetails = Update existing person contact details +headingEventGroupLinkEventIssue = Issue while linking events to event group +headingEventGroupUnlinkEventIssue = Issue while unlinking events to event group +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 +headingExternalMessageExistingPathogenTests = Existing pathogen tests +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 +headingConfirmManuallyForwardedLabMessage=Confirm forwarded +headingUpdateCaseWithNewDiseaseVariant=Update case disease variant +headingRejectSormasToSormasShareRequest=Reject share request +headingRevokeSormasToSormasShareRequest=Revoke share request +headingSormasToSormasCantShareContactWithoutCase=Can not share contact +headingSormasToSormasCanAcceptContactsWithoutCase=Can not accept contact(s) +headingSormasToSormasDuplicateDetection = Potential duplicates detected +headingSormasToSormasShareRequestNotFound = Share request not found +headingShareRequestDetails=Share request details +headingShareRequestCases=Cases +headingShareRequestContacts=Contacts +headingShareRequestEvents=Events +headingShareRequestEventParticipants=Event participants +headingCaseResponsibleJurisidction=Responsible jurisdiction +headingSeeAllPersons=See persons for all association types +headingPlaceOfStayInHospital = Place of stay in hospital +headingCurrentHospitalization = Current hospitalization +headingCorrectPerson = Correct person data +headingPreviousPersonInformation = Previous person information +headingUpdatedPersonInformation = Updated person information +headingCorrectSample = Correct sample data +headingPreviousSampleInformation = Previous sample information +headingUpdatedSampleInformation = Updated sample information +headingCorrectPathogenTest = Correct pathogent test data +headingPreviousPathogenTestInformation = Previous pathogen test information +headingUpdatedPathogenTestInformation = Updated pathogen test information +headingLabMessageCorrectionThrough = No more changes found +headingDeleteContacts = Delete contacts +headingProcessPhysiciansReport = Process message +headingDeleteUserRoleNotPossible = Cannot delete user role +headingSaveUserNotPossible = Cannot save user +immunizationVaccinationHeading = Vaccination +immunizationRecoveryHeading = Recovery +headingAutomaticDeletionStarted = Automatic deletion started +headingBulkOperationProgress = Bulk operation progress +headingSomeContactsAlreadyInEvent = Some contacts are already linked +headingSomeCasesAlreadyInEvent = Some cases are already linked +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 +headingLaboratoryEnvironmentSample = Laboratory sample +headingEnvironmentSampleMeasurements = Sample measurements +headingEnvironmentSampleLocation = Location of sampling site +headingEnvironmentSampleManagement = Sample management +headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested +headingLimitedDiseases=Disease restrictions +headingExternalEmailSend=Send email +headingExternalEmailDetails=Email details +headingCustomizableEnumConfigurationInfo=Customizable enum configuration + +# 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. +infoArchivedCases = Cases are automatically archived after %d days without changes to the data. +infoArchivedContacts = Contacts are automatically archived after %d days without changes to the data. +infoArchivedEvents = Events are automatically archived after %d days without changes to the data. +infoArchivedEventParticipants = Event participants are automatically archived after %d days without changes to the data. +infoArchivedTravelEntries = Travel entries are automatically archived after %d days without changes to the data. +infoAssigneeMissingEmail = The user assigned to this task does not have an e-mail address provided, and will therefore not be notified. +infoObserverMissingEmail = At least one of the observers of this task does not have an e-mail address provided, and will therefore not be notified. +infoAssigneeMissingEmailOrPhoneNumber = The user assigned to this task does not have an e-mail address nor a phone number provided, and will therefore not be notified. +infoAutomaticDeletion = Deletion scheduled for %s +infoAutomaticDeletionTooltip = Deletion scheduled for %s
%s\: %s
Deletion period\: %s +infoAutomaticDeletionTooltipDays = %s days +infoAutomaticDeletionTooltipMonths = %s months +infoAutomaticDeletionTooltipYears = %s years +infoObserverMissingEmailOrPhoneNumber = At least one of the observers of this task does not have an e-mail address nor a phone number provided, and will therefore not be notified. +infoBasicExport = Export the columns and rows that are shown in the table below. +infoCanceledBy = Canceled by %s using bulk action +infoCaseDate = By default, cases are filtered by the most relevant date available\:
  • Symptom onset date
  • Case report date
This means that, when a case e.g. has a symptom onset date, only this date will be taken into account when searching the list for cases in the specified date range. You can specify a date type in the dropdown menu to instead specifically filter by this date.

Example\: Case A has been created this week and therefore has a report date that lies in this week as well. However, Case A also has a symptom onset date that is set to last week (because it has been entered retrospectively). By default, when "Most relevant date" is selected and you have set the filter to only display cases of this week, Case A will not appear in the list because its symptom onset date lies in the previous week. For the case to appear in the list, you need to select "Case report date" which will result in only the report date being considered when filtering the list. +infoCaseIncidence = "Case incidence proportion" means the number of cases per 100,000 inhabitants. You can check the map key to see the thresholds that define how the districts are colorized. +infoCaseMap = If cases are shown by home address and there are no GPS coordinates available for it, the coordinates of the location where the case has been reported are used instead. +infoCheckProbableInfectionEnvironment = This checkbox should be checked if you are sure that this exposure was the most probable infection environment for this case. Only one exposure can be marked as the probable infection environment at the same time, and that exposure will be transmitted to SurvNet. +infoContactDashboard = All Dashboard elements that display general information about contacts use the follow-up period of the respective contact, starting with the contact report date. +infoConvertToCaseContacts = There are %s additional %s contacts of this person that do not have a resulting case set. Do you want to set the case you have just created as the resulting case of some or all of these contacts as well? +infoConvertToCaseContactsAndEventParticipants = There are %s additional %s contacts and %s additional %s event participants of this person that do not have a resulting case set. Do you want to set the case you have just created as the resulting case of some or all of these contacts and event participants as well? +infoConvertToCaseEventParticipants = There are %s additional %s event participants of this person that do not have a resulting case set. Do you want to set the case you have just created as the resulting case of some or all of these event participants as well? +infoConvertToCaseSelect = Please select the contacts and event participants for which you want to set the created case as the resulting case. +infoCreateEntry = The database contains no entry that seems to be similar to the details of the lab message.

Select one of the options and click on the Confirm button to create a new entry for the person.

If you are unsure, you can discard this window and cancel the process. +infoDashboardIncidence = Thresholds are calculated using quartiles. +infoDatabaseExportTables = Please select the database tables you want to export. +infoDefineOutbreaks = Click on a button to define which districts of the region currently have an outbreak of a specific disease. +infoDetailedExport = Export the rows that are shown in the table below with an extended set of columns. This may take a while. +infoCaseManagementExport = Export the rows that are shown in the table below with a customized set of columns that are relevant for the case management process. This may take a while. +infoDisplayNetworkDiagram = Please maximize to view the disease transmission chains +infoDocumentAlreadyExists = A Document with filename "%s" already exists. Are you sure you want to upload? +infoDocumentOverride = A Document with filename "%s" already exists. Overwrite? +infoDontShareCheckboxAlreadyShared = Case was already shared. It can not be set to don't share with external reporting tool. +infoDownloadDocumentTemplateImportGuide = If this is your first time uploading document templates to SORMAS, we strongly recommend to read the document template guide first. +infoDownloadEmailTemplateImportGuide = If this is your first time uploading email templates to SORMAS, we strongly recommend to read the email template guide first. +infoDownloadExport = The export is being prepared. This may take a while.
You can close this dialog after the download has completed. +infoDownloadCaseImportTemplate = You can use this template .csv file to bring your data into a format SORMAS can read. Please do this every time you import data, never use a file you have downloaded before. +infoDownloadImportTemplate = You can use this template .csv file to bring your data into a format SORMAS can read. Please do this every time you import data, never use a file you have downloaded before. +infoDownloadErrorReport = If there were any rows that could not be imported, you will be offered a .csv file containing all these rows as well as the error descriptions. +infoDownloadImportGuide = If this is your first time importing data into SORMAS, we strongly recommend to read the import guide first. +infoEventParticipantAlreadyExisting = For this person, an event participant already exists in this event. You can either continue with this event participant or go back to the event selection. +infoEventResponsibleUserFilter = The responsible user filter requires a region to be selected in the region filter. +infoExistingImmunizationPeriod = Immunization period of existing immunization +infoExpectedFollowUpUntilDateCase = The expected follow-up until date for this case is based on its %s (%s) +infoExpectedFollowUpUntilDateContact = The expected follow-up until date for this contact is based on its %s (%s) +infoExportNoFilters = Warning\: No filters have been selected. Export may take a while. +infoFacilityCsvImport = Name of a configured facility (requires FacilityType), OTHER_FACILITY (requires FacilityType and FacilityDetails) or NO_FACILITY +infoFacilityNeedsDistrict = Please define a district in order to select a facility. +infoImmunizationPeriod = Immunization period of this immunization +infoImportAllCountries = This will import all countries which are currently WHO members. You will receive a notification when the import process has finished. +infoImportAllContinents = This will import all default continents. You will receive a notification when the import process has finished. +infoImportAllSubcontinents = This will import all default subcontinents. You will receive a notification when the import process has finished. +infoImportCsvFile = Depending on the amount of rows you want to import, this may take a while. You will receive a notification when the import process has finished. +infoImportInfrastructureAllowOverwrite = Select this option if existing data should be overwritten with data from the import file. If an existing entry (based on the name or ISO/UNO-Code if available ) is found, all data will be updated with the content of the import file (if available). If no existing entry is found, a new one will be created. +infoImportProcess = %d rows are being imported. The import process might take a while.
You will be able to review and solve any errors after the import process has been completed. +infoImportSimilarity = One of the cases you tried to import is similar to an already existing case in the SORMAS database. Please check whether the case to import is a duplicate of any of the cases in the list and, if so, select that case and confirm. +infoLostToFollowUpBy = Set to lost to follow-up by %s using bulk action +infoNoAdditionalTests = No additional tests have been created for this sample +infoNoCasesFoundStatistics = No cases have been found for the selected filters and visualization options. +infoNoDiseaseSelected = Please select a disease to display the immunization overview. +infoCaseIncidenceNotPossible = The following regions have missing population data\:

%s.

As a result, case incidence cannot be calculated and case counts are displayed instead. +infoCaseIncidenceMissingPopulationData = The following regions and/or districts have missing population data\:

%s.

Incidence proportion cannot be calculated for these regions and/or districts. +infoCaseIncidenceIncompatible = No population data is available for communities and facilities. Case incidence cannot be calculated and case counts are displayed instead. If you want to view case incidence, please remove any community and facilitiy filters and groupings. +infoNoPathogenTests = No pathogen tests have been created for this sample +infoPickOrCreateCase = There are existing cases in the database that seem very similar to the one you are about to create. Please have a look at the list of existing cases and verify that the case you want to create is not a duplicate of one of them. If you find a case that is most likely the same as yours, please click on it in the list and confirm. +infoPickOrCreateCaseNewCase = Newly added case information +infoPickOrCreateImmunization = The system already contains at least one immunization for %s for this person and means of immunization that overlaps with the specified immunziation period. Please compare the most recent existing immunization with the one you created and decide whether to discard the new immunization, use its information to update the existing one, or create it anyway. +infoPickOrCreateImmunizationExisting = Existing immunization information +infoPickOrCreateImmunizationNew = Newly added immunization information +infoPickOrCreatePathogenTest = The database already contains at least one pathogen test that belongs to the sample.

Please look through the lists of pathogen tests. If you feel certain that one matches the lab message details, select it and click on the Confirm button. Otherwise, click on Create new sample to create a new sample for the entry.

If you are unsure, you can discard this window and cancel the process. +infoPickOrCreateSample = Please choose one of the options below.

The list of matching samples contains samples in the database that seem to be similar to the details of the lab message (if any).
The list of different samples contains samples related to the entry you chose, but not similar to the details of the lab message (if any).
You can also create a new sample.

If you are unsure, you can discard this window and cancel the process. +infoSampleAdditionalTesting = Please tick every type of additional test you would like to be performed on this sample. +infoSampleExport = Export the samples of all cases displayed in the table rows with an extended set of columns. This may take a while. +infoSamplePathogenTesting = Please tick every type of pathogen test you would like to be performed on this sample. +infoSimilarImmunization = The system already contains at least one immunization for %s for this person and means of immunization that overlaps with the specified immunization period. Do you still want to update the start and end date or go back and adjust your changes? +infoStatisticsDisclaimer = All statistics on this page are aggregated data of the whole country. This includes cases you might not have read and write access to and therefore are not visible in the case directory. +infoStatisticsFilter = Add filters to restrict the aggregated data.
If you use multiple filters, only cases that pass all restrictions will be aggregated. +infoStatisticsResults = Click the "Generate" button to create a new table, map or chart. +infoSurveillanceDashboard = All Dashboard elements that display cases (the "New Cases" statistics, the Epidemiological Curve and the Case Status Map) use the onset date of the first symptom for the date/epi week filter. If this date is not available, the date of report is used instead. +infoCampaignsDashboard=All Dashboard elements that display campaign diagrams. +infoUploadDocumentTemplate=Select a "%s"-Document Template you would like to upload. +infoUserEmail = Used to send E-Mail notifications. +infoUserPhoneNumber = Used to send SMS notifications. Needs to contain country code. +infoWeeklyReportsView = Number of officer/informant reports is the total number of reports that were submitted by the officers/informants associated with the displayed region or officer this week.

Percentage is the percentage of officers/informants that submitted their report for the respective week.

Number of officers/informants zero reports is the amount of zero reports, i.e. submitted reports with no cases. These are included in the total number of reports.

Officer/Informant report submission is either the date the report has been submitted at or a hint that no report has been submitted for this week yet. +infoMergingExplanation = This view is designed to assist you in detecting and merging duplicate cases. Cases are always displayed as pairs, the case with the earlier creation date being on top.

You can use the creation date filter to only view potential duplicates that were created in a specific time period. The creation date is automatically generated when a case is entered into SORMAS and can not be changed by users. Therefore, once you have reviewed all duplicates from a specific time period in the past, you will never have to do it again as there will be no new cases created during this time frame.

Please note that most likely not all displayed cases are actual duplicates. There is the potential for false positives, so please thoroughly review the cases before merging them\! In addition to the information provided in the table, you can also click on the IDs of the cases to open them in a new tab. Keep in mind that it is much worse to falsely merge unique cases together than to have some duplicates in the system. +infoContactMergingExplanation = This view is designed to assist you in detecting and merging duplicate contacts. Contacts are always displayed as pairs, the contact with the earlier creation date being on top.

You can use the creation date filter to only view potential duplicates that were created in a specific time period. The creation date is automatically generated when a contact is entered into SORMAS and can not be changed by users. Therefore, once you have reviewed all duplicates from a specific time period in the past, you will never have to do it again as there will be no new contacts created during this time frame.

Please note that most likely not all displayed contacts are actual duplicates. There is the potential for false positives, so please thoroughly review the contacts before merging them\! In addition to the information provided in the table, you can also click on the IDs of the contacts to open them in a new tab. Keep in mind that it is much worse to falsely merge unique contacts together than to have some duplicates in the system. +infoMergingMergeDescription = Choose this option only if you are sure that the two cases are the same\! You should click on this button next to the case with the most recent or more complete information. Click on the IDs of the cases to open them in new tabs in order to view all their data. When the case you chose is missing information that is present in the other case, it will be updated. Also, contacts, samples, tasks and case management information will be transfered. Afterwards, the case you did not choose will be deleted. +infoContactMergingMergeDescription = Choose this option only if you are sure that the two contacts are the same\! You should click on this button next to the contact with the most recent or more complete information. Click on the IDs of the contacts to open them in new tabs in order to view all their data. When the contact you chose is missing information that is present in the other contact, it will be updated. Also, samples, tasks and contact management information will be transfered. Afterwards, the contact you did not choose will be deleted. +infoMergingPickDescription = Clicking on this button will simply delete the case that was not picked. However, no information will be copied to the case that remains active. All contacts, samples and tasks will be lost as well. Choose this option if you are sure that both cases are the same, but the other case has not been updated with any information that needs to be transfered to the one that remains active. +infoContactMergingPickDescription = Clicking on this button will simply delete the contact that was not picked. However, no information will be copied to the contact that remains active. All samples and tasks will be lost as well. Choose this option if you are sure that both contacts are the same, but the other contact has not been updated with any information that needs to be transfered to the one that remains active. +infoMergingHideDescription = Choose this option if you are not sure whether the two cases are the same or if you know that they are not. This will hide the case pair from the list. Please note that, when you refresh the view or come back to it later, it will re-appear as long as you don't choose a different time period in the creation date filter. +infoContactMergingHideDescription = Choose this option if you are not sure whether the two contacts are the same or if you know that they are not. This will hide the contact pair from the list. Please note that, when you refresh the view or come back to it later, it will re-appear as long as you don't choose a different time period in the creation date filter. +infoPersonMergeDescription = Please select one of the persons below as the leading person. You have the following options to continue.
Merge\: Data of the discarded person will be linked and/or added to the remaining person but not overwritten. You will not be able to undo this action.
Pick\: Data of the remaining person will not be changed and the data of the other person will be discarded. However, entities linked to the discarded person will be linked to the remaining person. You will not be able to undo this action. +infoPersonMergeConfirmation = Are you certain you want to do this? The action is not reversible. +infoPersonMergeConfirmationBothShared = The persons you want to merge both have shared entities via S2S. If you merge these persons, the synchronization will be broken for the person who is not the leading one and the associated entities. Please discuss with your administrator if you would like to do this and verify which of the two persons you would like to have as the leading person.
Are you certain you want to do this? The action is not reversible. +infoPersonMergeSharedMustLead = Please note, you cannot choose this person as a leading person because then the synchronization of S2S would break.\nPlease select the other person as leading person +infoPickEventParticipantsForPersonMerge = The selected persons both have one event participant in at least one event. Merging the persons would lead to duplicate event participants.
For each event, please select one of the event participants below as the leading event participant.
'Merge'\: The discarded event participant will be removed from the event. Its associated entities and information will be linked and/or added to the remaining event participant, but not overwritten. You will not be able to undo this action.
'Pick'\: The discarded event participant will be removed from the event. Its associated entities and information will not be linked and/or added to the remaining event participant. You will not be able to undo this action. +infoPickorMergeEventParticipantDuplicateEventParticipantByPersonByEvent = One of the selected persons has multiple active or archived event participants in the same event(s).
Please review the events with the UUIDs presented below and delete duplicate event participants or ask a supervisor to do so in order to be able to merge these persons. +infoPersonMergeConfirmationForNonSimilarPersons = The two selected persons do not match the similarity requirements used by SORMAS to detect duplicate persons. Please ensure that the selected persons are indeed identical and supposed to be merged before proceeding. +infoHowToMergeCases = You can choose between two options when reviewing potentially duplicate cases\: +infoHowToMergeContacts = You can choose between two options when reviewing potentially duplicate contacts\: +infoCalculateCompleteness = The Calculate Completeness button on top can be used to calculate the completeness values for all cases in the table. This is only necessary if there are cases in the list that do not yet have a completeness value. Normally, this value is automatically updated whenever the details of a case or one of its contacts or samples change. +infoContactCalculateCompleteness = The Calculate Completeness button on top can be used to calculate the completeness values for all contacts in the table. This is only necessary if there are contacts in the list that do not yet have a completeness value. Normally, this value is automatically updated whenever the details of a contact or one of its samples change. +infoCaseCompleteness = Completeness is a measurement of how much vital data has already been entered into the case. This is composed of the following, weighted by their importance\:
  • Has the case been classified?
  • Has the case been investigated?
  • Has at least one sample been taken?
  • Has at least one symptom been documented?
  • Has at least one contact been created?
  • Is there an outcome for the case?
  • Does the case have a birth date or age?
  • Does the case have a sex?
  • Has an onset date been specified?
+infoContactCompleteness = Completeness is a measurement of how much vital data has already been entered into the contact. This is composed of the following, weighted by their importance\:
  • Has the contact been classified?
  • Has the contact status been modified?
  • Has at least one sample been taken?
  • Does the contact has a last contact date specified?
  • Does the contact have a sex?
  • Does the contact have its relation specified?
  • Does the contact have a category specified?
  • Does the contact have its birthdate specified?
+infoCompletenessMerge = You can use this measurement to get an idea about which case you should use as the one that remains active when merging. However, please make sure that you still have a detailed look at both cases to avoid mistakes. +infoContactCompletenessMerge = You can use this measurement to get an idea about which contact you should use as the one that remains active when merging. However, please make sure that you still have a detailed look at both contacts to avoid mistakes. +infoMergeIgnoreRegion = Selecting this option excludes the region as a criteria for detecting duplicates. Merging and picking are deactivated here because the probability of a real duplicate beyond region boundaries is very low. If a real duplicate is detected, this case can be deleted manually via the case directory. +infoContactMergeIgnoreRegion = Selecting this option excludes the region as a criteria for detecting duplicates. Merging and picking are deactivated here because the probability of a real duplicate beyond region boundaries is very low. If a real duplicate is detected, this contact can be deleted manually via the contact directory. +infoCustomExport = In this view, you can create and save export configurations with customized sets of columns. Saving these configurations allows you to quickly export only the information that you're interested, without having to manually edit the resulting CSV file afterwards. Please click on the blue export button next to one of your configurations or create a new configuration by using the button to the right. +infoEditExportConfiguration = Each of the checkboxes below represents a column in the export file. Please select all the columns you want to appear in your customized export and deselect those that you don't require. +infoPopulationDataView = Use one of the buttons below to manage population data for regions and districts within SORMAS. If you want to edit the data, please use the export function, copy the data you want to change into the import template, edit it, and import the template file containing the changed data. +infoPopulationCollectionDate = Please indicate the date the population data you want to import was collected on. If you only know the year, please choose the 1st of January of that year. +infoPopulationReferenceYear = The case incidence proportions are calculated by either projecting the population data to %s, which is the maximum year that was selected in the filters, or by taking the original population data if the maximum selected year is before the year the population data was collected in. +infoLineListingConfigurationRegion = Line listing is enabled for all districts listed next to the disease. Click on the Edit line listing button below a disease name to configure line listing for all districts. +infoLineListingConfigurationNation = Click on a region to open a detailed view with line listing information for all its districts. Click on the Edit line listing button below a disease to configure line listing for all regions. +# 1st %s: disease name; 2nd %s: region name +infoLineListingConfigurationRegionEdit = You're editing the regional line listing configuration for %s in %s. +# %s: disease name +infoLineListingConfigurationNationEdit = You're editing the country-wide line listing configuration for %s. +infoNoNetworkDiagram = Please select a disease above to view the disease transmission chains. +infoSyncUsers = Sync SORMAS users' data to the External Authentication Provider configured.
The sync is one way only SORMAS -> Authentication Provider.
Passwords are not updated for users which already exist in the External Authentication Provider +infoSpecificCaseSearch = Use the text field below to search for a specific case in the whole country. You can search by case ID, external ID or epid number. Click on "Search Case" when you're done to open the case if the search was successful. If more than one case is found, the case with the latest report date will be opened. +infoSpecificEventSearch = Use the text field below to search for a specific event in the whole country. You can search by case ID or person ID. Click on "Search Event" when you're done to open the event if the search was successful.

If more than one event is found, the event with the latest report date will be opened. +infoSearchCaseForContact = Use the text field below to search for any case in the system you have access to. You can search by name, case ID, external ID or epid number. When you're done, click on "Search Case" to see a list of all cases that match the text that you've entered. Select a case in this list and click on "Confirm" to use the selected case as the contact's source case. +infoNoSourceCaseSelected = Please select the source case for this contact, if known +infoNoSourceCaseSelectedLineListing = Please select the source case, if known +infoContactCreationSourceCase = Selected source case\:
%s +infoSelectOrCreateContact = The database already contains at least one contact that seems to be very similar to the details of the created contact.

Please look through the list of contacts. If you feel certain that one matches your contact, select it and click on the Save button. Otherwise, click on Create new contact to create a new contact for the person.

If you are unsure, you can discard this window and cancel the contact creation process. +infoSelectOrCreateContactImport = The database already contains at least one contact that seems to be very similar to the details of the imported contact.

Please look through the list of contacts. If you feel certain that one matches your contact, select it and click on the Save button. Otherwise, click on Create new contact to create a new contact for the person.

If you are unsure, you can discard this window to remove the contact from the current import. +infoSelectOrCreateEntry = The database already contains at least one entry that seems to be very similar to the details of the external message.

Please look through the lists of entries. If you feel certain that one matches the external message details, select it and click on the Confirm button. Otherwise, select one of the other options to create a new entry for the person.

If you are unsure, you can discard this window and cancel the process. +infoSelectOrCreatePersonForContact = The database already contains at least one person that seems to be very similar to the personal details of the created contact.

Please look through the list of persons. If you feel certain that one of those persons matches your contact person, select it and click on the Save button. Otherwise, click on Create New Person to create a new person for your contact.

If you are unsure, you can discard this window and cancel the contact creation process. +infoSelectOrCreatePersonForImmunization = The database already contains at least one person that seems to be very similar to the personal details of the created immunization.

Please look through the list of persons. If you feel certain that one of those persons matches your immunization person, select it and click on the Save button. Otherwise, click on Create New Person to create a new person for your immunization.

If you are unsure, you can discard this window and cancel the immunization creation process. +infoSelectOrCreatePersonForImport = The database already contains at least one person that seems to be very similar to the personal details of the imported entry.

Please look through the list of persons. If you feel certain that one of those persons matches the person of the imported entry, select it and click on the Save button. Otherwise, click on Create New Person to create a new person.

If you are unsure, you can discard this window to remove the entry from the current import. +infoSelectOrCreatePersonForEventParticipant = The database already contains at least one person that seems to be very similar to the personal details of the created event participant.

Please look through the list of persons. If you feel certain that one of those persons matches your event person, select it and click on the Save button. Otherwise, click on Create New Person to create a new event person for your event.

If you are unsure, you can discard this window and cancel the event participant creation process. +infoSelectOrCreatePersonForLabMessage = The database already contains at least one person that seems to be very similar to the personal details of the external message.

Please look through the list of persons. If you feel certain that one of those persons matches the external message person, select it and click on the Confirm button. Otherwise, click on Create New Person to create a new person for the message.

If you are unsure, you can discard this window and cancel the process. +infoSelectOrCreatePersonForLabMessageWithoutMatches = A person closely matching the person details of the external message could not automatically be determined.

You can manually search for matches, or you can create a new person. Once you selected an option, continue via the Confirm button.

If you are unsure, you can discard this window and cancel the process. +infoSkipOrOverrideDuplicateCampaignFormDataImport = The database already contains a dataset for the form %s in the campaign %s for the specified community and date. Please have a look at the details for the existing dataset and choose Skip if you want to keep the existing data or Overwrite if you want to replace the existing data with the data you have imported. +pseudonymizedCasesSelectedWarning = For the bulked-edited cases you have only limited access to the sensitive data. For those cases the value you put into "Place Description" will be ignored. +pseudonymizedEntitiesSelectedWarning = You only have limited access to some of the selected entities. Please deselect pseudonymized entities to continue. +infoPickOrCreateEventForCase = The list below contains all existing events having the same disease as the current case. Please check whether the event this case belongs to is already on this list or create a new one if it isn't. +infoPickOrCreateEventForCases = The list below contains all existing events having the same disease as the selected cases. Please check whether the event these cases belongs to is already on this list or create a new one if it isn't. +infoPickOrCreateEventForContact = The list below contains all existing events having the same disease as the current contact. Please check whether the event this contact belongs to is already on this list or create a new one if it isn't. +infoPickOrCreateEventForContacts = The list below contains all existing events having the same disease as the selected contacts. Please check whether the event these contacts belongs to is already on this list or create a new one if it isn't. +infoPickOrCreateEventForLabMessage = The list below contains all existing events having the same disease as the lab message. Please check whether the event the new event participant belongs to is already on this list or create a new one if it isn't. +infoPickOrCreateSuperordinateEventForEvent = The list below contains all existing events with an event date and the same disease as the current event. Please check whether the superordinate event for this event is already on this list or create a new one if it isn't. +infoPickOrCreateEventGroupForEvent = The list below contains all existing event groups. Please check whether the event group this event belongs to is already on this list or create a new one if it isn't. +infoSelectOrCreatePersonForCase = The database already contains at least one person that seems to be very similar to the personal details of the created case.

Please look through the list of persons. If you feel certain that one of those persons matches your case person, select them and click on the Save button. Otherwise, click on Create New Person to create a new person for your case.

If you are unsure, you can discard this window and cancel the case creation process. +infoSearchPerson = Use the filters below to search for any person in the system you have access to, based on\: First Name, Last Name, Person UUID,External ID, External Token. When you're done click on "Search" to see a list of persons that match the text that you have entered. Select person in the list and click on "Confirm" to choose the selected person. +infoContactsViewRegionDistrictFilter = When you select a region and/or district filter, the contact directory is primarily filtered by the responsible region and district of the contacts. If these are not filled in, the region and district of the contact's source case are used instead. +infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. +infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. +infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical +infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case +infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact +infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant +infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows +infoSaveOfTask = Saving this task will discard any unsaved changes made to the case. +populationDataByArea = Population data by Area +populationDataByRegion = Population data by Region +populationDataByCommunity = No population data available for communities +populationDataByDistrict = Population data by District +infoExposureInvestigation = Please document ALL relevant direct exposures (e.g. attended gatherings, travels, animal contacts, etc.) during the incubation period\: +infoExposureInvestigationContacts = Please document information about the exposure that led to this contact\: +infoEpiDataFieldsHint = Please indicate if any of the following is relevant for the patient during the incubation period\: +infoEpiDataSourceCaseContacts = Please indicate ALL contacts with potential source cases during the incubation period\: +infoNoSourceCase = No source case +infoCreateNewContactDiscardsChanges = Creating a new contact will discard all unsaved changes made to this case +infoExposuresInfectionEnvironmentHint = This exposure is marked as the probable infection environment. +infoExposuresRiskAreaHint = This exposure took place in a risk area. +infoUserSyncProcess = %d users are being synced to the External Authentication Provider. The import process might take a while.
You will be able to review and solve any errors after the import process has been completed. +infoNoSubordinateEvents=No subordinate events +infoNoSuperordinateEvent=No superordinate event +infoNoEventGroups=No event groups +infoMergeFiltersHint = Calculating and displaying potential duplicates may take a lot of time under specific circumstances. It is recommended to use the filters on top of this view to reduce the number of rows that have to be compared at the same time, e.g. by choosing a narrow creation date interval and a low result count limit. If the potential duplicates are loading fast, extending these values should be safe.

In order to avoid performance issues when entering this view, potential duplicates are only loaded once you click on "Confirm Filters". +infoPlaceOfStayInHospital = Please select a hospital as the place of stay. If the case is not currently admitted to a hospital as an inpatient, please document hospitalizations under previous hospitalizations. +infoMoreDetailsAboutHospitalization = For adding more details about the hospitalization, go to the hospitalization tab. +infoCountryNotEditableEventParticipantsWithoutJurisdiction = Changing the country is not permitted because at least one event participant in this event does not have a responsible region and/or responsible district set. +infoContactAlreadyConvertedToCase = This contact has already been converted to a case. Please add new visits to the case instead. +infoSearchPersonOnDependentForm = Search for another person +infoTasksWithMultipleJurisdictionsSelected = You have selected tasks connected to different jurisdictions, or that are connected to data that does not have facility or point of entry information. Only users on %s level or above will be selectable as assignees. +infoNoAccessToPersonEntities = You don't have the necessary user rights to view any entries associated with persons. +infoDashboardFinalLaboratoryResult = When a case has multiple samples, only the final laboratory result of the sample with the latest sample collection date is considered. +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. +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. +infoNoEnvironmentSamples = No samples have been created for this environment +infoRestrictDiseasesDescription=Mark all diseases that the user is supposed to have access to +infoNoCustomizableEnumTranslations = Click on the + button below to add translations to this customizable enum value. +infoCustomizableEnumConfigurationInfo = Customizable enums are value sets that can be customized in order to react to the individual needs of your country or a specific epidemiological situation. The table on this screen contains all customizable enum values in the database. Each value is associated with a data type, e.g. disease variants or occupation types. Some of these data types have default values that are automatically added to the database when SORMAS is set up or new data types are added to the system.

You can add new enum values or edit existing ones, add translations for languages supported by SORMAS, select the diseases that the value should be visible for (by default, customizable enum values are visible for all diseases), and configure additional properties.

Properties are used to further control the behaviour of customizable enum values. E.g. the "has details" property that is supported by most enum values toggles whether selecting this enum value would bring up an additional text field that users can add more information to. + +# Messages +messageActionOutsideJurisdictionDeletionDenied = The action outside user's jurisdiction cannot be deleted +messageActivateAccount = Account has to be activated +messageAdditionalTestDeleted = Additional test deleted +messageAdditionalTestSaved = Additional test saved +messageAggregateReportFound = Attention\: Duplicate reports have been found for the above criteria. Diseases marked with red already have reports. +messageAggregateReportDelete = Do you want to delete the selected aggregate report? +messageAggregateReportExpiredAgeGroups = Age groups marked "Expired" are based on existing data for an age group that is no longer used. +messageAggregatedReportEpiWeekFilterNotFilled = The epiWeek filter is not filled correctly +messageAllCasesAlreadyInEvent = All cases are already linked to the selected event. +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. +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 +messageCampaignArchived = Campaign has been archived +messageCampaignCreated = New campaign created +messageCampaignDearchived = Campaign has been de-archived +messageCampaignDeleted = Campaign deleted +messageCampaignFormOutsideJurisdictionDeletionDenied = The campaign form outside user's jurisdiction cannot be deleted +messageCampaignSaved = Campaign saved +messageCampaignFormSaved = %s saved +messageCaseArchived = Case has been archived +messageCaseCreated = New case created +messageCaseDearchived = Case has been de-archived +messageCaseDuplicateDeleted = The duplicate case has been deleted. +messageCaseIncidenceUnsupportedAgeGroup = Case incidence proportion can only be generated for 5 year intervals. Please remove all other age stratification filters and visualization groupings. +messageCaseReferredFromPoe = Case has been referred to the specified facility +messageCaseRelationToEventWithoutDisease=It is not possible to link a case to an event if the disease of the event has not been set +messageCaseSaved = Case saved +messageCaseSavedClassificationChanged = Case saved. The classification was automatically changed to %s. +messageCaseTransfered = Case has been transfered to another facility +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 +messageEventsRestored = All selected events have been restored +messageEventParticipantsRestored = All selected event participants have been restored +messageImmunizationsDeleted = All selected eligible immunizations have been deleted +messageImmunizationsRestored = All selected immunizations have been restored +messageSamplesRestored = All selected samples have been restored +messageTravelEntriesRestored = All selected travel entries have been 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 +messageClinicalVisitCreated = Clinical assessment created +messageClinicalVisitSaved = Clinical assessment saved +messageClinicalVisitsDeleted = All selected clinical assessments have been deleted +messageCloneCaseWithNewDisease = You have just created a positive pathogen test result for a different disease. Do you want SORMAS to automatically generate a new case with this new disease? All information from this case will be copied to the new case. +messageUpdateCaseWithNewDiseaseVariant = You have saved a positive pathogen test of a different disease variant than the variant specified in the case. Do you want to update the disease variant of the case? The case's current disease variant is %s, the pathogen test's disease variant is %s. +messageCompletenessValuesUpdated = Completeness values have been updated. +messageConfirmCaseAfterPathogenTest=The final laboratory result of the sample the saved pathogen test belongs to is positive. However, the case cannot be automatically classified as a confirmed case because it is missing some information. Do you want to set the case classification to confirmed anyway? +messageConvertContactToCase=You have just saved a positive laboratory result for the contact disease. Do you want to create a case for the contact person? The case will be set as the resulting case of this contact, and the final laboratory result of the sample will automatically be set to positive. +messageConvertContactToCaseDifferentDiseases=You have just saved a positive laboratory result for a different disease than the contact disease. Do you want to create a case with this disease for the contact person? The case will not be set as the resulting case of this contact. +messageConvertEventParticipantToCase=You have just saved a positive laboratory result for the event disease. Do you want to create a case for the event participant person? The case will automatically be linked to the event participant, and the final laboratory result of the sample will be set to positive. +messageConvertEventParticipantToCaseDifferentDiseases=You have just saved a positive laboratory result for a different disease than the event disease. Do you want to create a case with this disease for the event participant person? The case will not be linked to the event participant. +messageConvertEventParticipantToCaseNoDisease=You have just saved a positive laboratory result for an event with no disease. Do you want to create a case with this disease for the event participant person? The final laboratory result of the sample will automatically be set to positive but the case will not be linked to the event participant. +messageContactCreated=New contact created +messageContactArchived = Contact has been archived +messageContactDearchived = Contact has been de-archived +messageContactSaved = Contact data saved +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. +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 +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 +messageEpiDataHint = Please indicate if any of the following is relevant for the patient during the incubation period. +messageEpidNumberWarning = The entered epid number is already used by another case. Please assign a new epid number to this or the other case. +messageCaseExternalTokenWarning = The entered external token is already used by another case. Please assign a new external token to this or the other case. +messageCaseFound = A case that matches the entered search term has been found and linked to current immunization +messageCaseFoundNoValidPathogenTest = A case that matches the entered search term has been found however no valid pathogen tests on the case found +messageContactExternalTokenWarning = The entered external token is already used by another contact. Please assign a new external token to this or the other contact. +messageEventExternalTokenWarning = The entered external token is already used by another event. Please assign a new external token to this or the other event. +messagePersonExternalTokenWarning = The entered external token is already used by another person. Please assign a new external token to this or the other person. +messageErrorReportNotAvailable = The error report file is not available. Please contact an admin and tell them about this issue. +messageEventArchived = Event has been archived +messageEventGroupArchived = Event group has been archived +messageEventCreated = New event created +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 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 +messageEventParticipationUnlinked = The link between this case and the event was successfully removed +messageEventUnlinkedFromEventGroup = The link between this event and the event group was successfully removed +messageEventDearchived = Event has been de-archived +messageEventGroupDearchived = Event group has been de-archived +messageEventParticipantArchived = Event participant has been archived +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 +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 +messageEventParticipantToContactWithoutEventDisease=It is not possible to create a contact from an event participant if the disease of the event has not been set +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 +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\: %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 +messageCountCasesNotLinkableAccessDeniedReason = %s cases not linked because the case is not editable anymore or the user is missing the rights\: %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 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\: %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 +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 they are not in jurisdiction or owned\: %s +messageCountTravelEntriesNotDeleted = %s 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\: %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 +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 +messageFollowUpStatusChanged = Follow-up of all 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. +messageGdprCheck = I have read this information, please don't show this window again +messageImmunizationArchived = Immunization has been archived +messageImmunizationDearchived = Immunization has been de-archived +messageImmunizationOutsideJurisdictionDeletionDenied = The immunization outside user's jurisdiction cannot be deleted +messageImmunizationSaved = Immunization data saved. +messageImmunizationSavedVaccinationStatusUpdated = Immunization data saved. The vaccination status of matching cases, contacts, and event participants of the immunization person has been updated to vaccinated. +messageImportCanceled = Import canceled\!
The import has been canceled. All already processed rows have been successfully imported. You can now close this window. +messageImportCanceledErrors = Import canceled\!
The import has been canceled. Some of the already processed rows could not be imported due to malformed data.
Please close this window and download the error report. +messageImportError = Could not import file. +messageImportExtensionDoesNotMatchContent = The file extension does not match the file content. Please check the file extension. +messageImportFileTypeNotAllowed = This file type is not allowed. +messageImportFailed = The import failed due to a critical error. Please contact your admin and inform them about this issue. +messageImportFailedFull = Import failed\!
The import failed due to a critical error. Please contact your admin and inform them about this issue. +messageImportInvalidColumn = Invalid column\!
The column "%s" is not part of the imported data type or one of its connected entities. Please remove it from the .csv file and upload it again. +messageImportPartiallySuccessful = Import partially successful\!
The import has been successful, but some of the rows could not be imported due to malformed data.
Please close this window and download the error report. +messageImportSuccessful = Import successful\!
All rows have been imported. You can now close this window. +messageUploadSuccessful = Upload successful\! You can now close this window. +messageIncompleteGpsCoordinates = GPS coordinates are incomplete +messageExternalMessagesAssigned = The assignee has been changed for all selected messages +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 +messageMissingEpiWeekFilter = Please fill in both epi week filter fields +messageMultipleSampleReports=This message references multiple samples. You will be guided through the creation of the number of referenced samples.
Note that potential sample duplicates can be prevented by selecting the existing or previously selected sample in the respective 'pick or create sample' windows. +messageNoCasesSelected = You have not selected any cases +messageNoClinicalVisitsSelected = You have not selected any clinical assessments +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 +messageNoImmunizationsSelected = You have not selected any immunizations +messageNoTravelEntriesSelected = You have not selected any travel entries +messageNoPathogenTestsSelected = You have not selected any pathogen tests +messageNoPrescriptionsSelected = You have not selected any prescriptions +messageNoSamplesSelected = You have not selected any samples +messageNoTasksSelected = You have not selected any tasks +messageNoTreatmentsSelected = You have not selected any treatments +messageNoVisitsSelected = You have not selected any visits +messageNoUsersSelected = You have not selected any users +messageNoUserSelected = No user has been selected +messageOutbreakSaved = Outbreak information saved +messagePasswordReset = User's password was reset +messagePasswordResetEmailLink = A link to reset the password was sent to the user's email +messagePathogenTestSaved = Pathogen test saved. The classification of its associated case was automatically changed to %s. +messagePathogenTestSavedShort = Pathogen test saved +messagePathogenTestsSavedShort = Pathogen tests saved +messagePathogenTestsDeleted = All selected pathogen tests have been deleted +messagePersonSaved = Person data saved +messagePersonSavedClassificationChanged = Person data saved. The classification of at least one case associated with this person was automatically changed to %s. +messagePersonMergedAddressDescription = Adopted from discarded person during merge +messagePersonMergeNoEventParticipantRights = The merge process requires merging of event participants from the same event. You don't have user rights to process this type of merge. +messagePickEventParticipantsIncompleteSelection = Please select an event participant from each duplicate group +messagePlagueTypeChange = The symptoms selected match the clinical criteria for %s. The plague type is set to %s for this case. +messagePrescriptionCreated = Prescription created +messagePrescriptionSaved = Prescription saved +messagePrescriptionsDeleted = All selected prescriptions have been deleted +messageRelatedSampleFound = The sample referenced in this lab message seems to already exist.
Do you want to directly open that sample? There were no processed related lab messages found. +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 +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 +messageSpecifyRowAttribute = Please specify the row attribute you have chosen for the visualization +messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: +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 +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. +messageTravelEntryOutsideJurisdictionDeletionDenied = The travel entry outside user's jurisdiction cannot be deleted +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 +messageTravelEntriesDeleted = All selected eligible travel entries have been deleted +messageTreatmentCreated = Treatment created +messageTreatmentSaved = Treatment saved +messageTreatmentsDeleted = All selected treatments have been deleted +messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. +messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. +messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. +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 +messageLineListingSaved = Line listing configuration saved +messageNoEndDate = no end date +messageInvalidDatesLineListing = There are invalid dates in at least one of the line listing configurations. Please make sure that all entered dates are in the present or future and try again. +messageAreaArchived = Area has been archived +messageAreaDearchived = Area has been de-archived +messageContinentArchived = Continent has been archived +messageContinentDearchived = Continent has been de-archived +messageSubcontinentArchived = Subcontinent has been archived +messageSubcontinentDearchived = Subcontinent has been de-archived +messageCountryArchived = Country has been archived +messageCountryDearchived = Country has been de-archived +messageRegionArchived = Region has been archived +messageRegionDearchived = Region has been de-archived +messageDistrictArchived = District has been archived +messageDistrictDearchived = District has been de-archived +messageCommunityArchived = Community has been archived +messageCommunityDearchived = Community has been de-archived +messageFacilityArchived = Facility has been archived +messageFacilityDearchived = Facility has been de-archived +messageLaboratoryArchived = Laboratory has been archived +messageLaboratoryDearchived = Laboratory has been de-archived +messagePointOfEntryArchived = Point of entry has been archived +messagePointOfEntryDearchived = Point of entry has been de-archived +messageAreaArchivingNotPossible = This area can not be archived because it is still used in other infrastructure data. Please archive any region in this area first. +messageContinentArchivingNotPossible = This continent can not be archived because it is still used in other infrastructure data. Please archive any subcontinent in this continent first. +messageSubcontinentArchivingNotPossible = This subcontinent can not be archived because it is still used in other infrastructure data. Please archive any country in this subcontinent first. +messageRegionArchivingNotPossible = This region can not be archived because it is still used in other infrastructure data. Please archive any district, facility, laboratory and point of entry in this region first. +messageDistrictArchivingNotPossible = This district can not be archived because it is still used in other infrastructure data. Please archive any community, facility, laboratory and point of entry in this district first. +messageCommunityArchivingNotPossible = This community can not be archived because it is still used in other infrastructure data. Please archive any facility and laboratory in this community first. +messageCountryDearchivingNotPossible = This country can not be de-archived because its subcontinent is still archived. Please de-archive its subcontinent first. +messageSubcontinentDearchivingNotPossible = This subcontinent can not be de-archived because its continent is still archived. Please de-archive its continent first. +messageDistrictDearchivingNotPossible = This district can not be de-archived because its region is still archived. Please de-archive its region first. +messageCommunityDearchivingNotPossible = This community can not be de-archived because its district or region are still archived. Please de-archive its district and region first. +messageFacilityDearchivingNotPossible = This facility can not be de-archived because its community, district or region are still archived. Please de-archive its community, district and region first. +messageLaboratoryDearchivingNotPossible = This laboratory can not be de-archived because its community, district or region are still archived. Please de-archive its community, district and region first. +messagePointOfEntryDearchivingNotPossible = This point of entry can not be de-archived because its district or region are still archived. Please de-archive its district and region first. +messageLaboratoriesDearchivingNotPossible = At least one of the selected laboratories can not be de-archived because its community, district or region are still archived. Please de-archive the communities, districts and regions of all selected laboratories first. +messageNoRowsSelected = You have not selected any rows +messageAreasArchived = All selected areas have been archived +messageAreasDearchived = All selected areas have been de-archived +messageContinentsArchived = All selected continents have been archived +messageContinentsDearchived = All selected continents have been de-archived +messageSubcontinentsArchived = All selected subcontinents have been archived +messageSubcontinentsDearchived = All selected subcontinents have been de-archived +messageCountriesArchived = All selected countries have been archived +messageCountriesDearchived = All selected regions have been de-archived +messageRegionsArchived = All selected regions have been archived +messageRegionsDearchived = All selected regions have been de-archived +messageDistrictsArchived = All selected districts have been archived +messageDistrictsDearchived = All selected districts have been de-archived +messageCommunitiesArchived = All selected communities have been archived +messageCommunitiesDearchived = All selected communities have been de-archived +messageFacilitiesArchived = All selected facilities have been archived +messageFacilitiesDearchived = All selected facilities have been de-archived +messageLaboratoriesArchived = All selected laboratories have been archived +messageLaboratoriesDearchived = All selected laboratories have been de-archived +messagePointsOfEntryArchived = All selected points of entry have been archived +messagePointsOfEntryDearchived = All selected points of entry have been de-archived +messageForwardedExternalMessageFound = There exists at least one other message with the same report id that was forwarded. Do you want continue processing this message? +messageNoCaseFound = No case could be found that matches the entered search term. +messageNoCaseFoundToLinkImmunization = There is no case that matches the search criteria and link conditions. +messageNoEventFound = No event could be found that matches the entered search term. +messageContactToCaseConfirmationRequired = You can only convert contacts to cases that have been confirmed. Please confirm and save this contact before creating a case for its contact person. +messageContactConversionFollowUpCommentLarge = Performing this action will automatically cancel follow-up and append the following message to the follow-up comment\:

%s

The maximum length of the follow-up comment field would be exceeded by appending this message. Please choose whether you want to cancel the action, reduce the length of the follow-up comment and try it again, or omit the message displayed above. +messageContactConversionFollowUpCommentLargeAdjustComment = Adjust comment +messageContactConversionFollowUpCommentLargeOmitMessage = Omit message +messageContactCaseRemoved = The source case has been removed from this contact +messageContactCaseChanged = The source case of the contact has been changed +messageSampleOpened = Opened sample found for search string +messageSystemFollowUpCanceled = [System] Follow-up automatically canceled because contact was converted to a case +messageSystemFollowUpCanceledByDropping = [System] Follow-up automatically canceled because contact was dropped +messageSetContactRegionAndDistrict = Please choose a responsible region and responsible district and save the contact before removing the source case. +messageAllCampaignFormsValid = All campaign forms have been successfully validated +messageEnterSms = Please enter your SMS message here\: +messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. +messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. +messagePersonAddedAsEventParticipant = The new event participant was created. +messagePersonListAddedAsEventPerticipants = New event participants were created from person list submitted +messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. +messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? +messageUserSyncCanceled = Sync canceled\!
The sync has been canceled. All already processed users have been successfully synced. You can now close this window. +messageUserSyncCanceledErrors = Sync canceled\!
The sync has been canceled. Some of the already processed users could not be synced due to malformed data.
Please close this window and download the error report. +messageUserSyncFailedFull = Sync failed\!
The sync failed due to a critical error. Please contact your admin and inform them about this issue. +messageUserSyncPartiallySuccessful = Sync partially successful\!
The sync has been successful, but some of the users could not be synced due to malformed data.
Please close this window and download the error report. +messageUserSyncSuccessful = Sync successful\!
All users have been synced. You can now close this window. +messageUserRightsExportFailed = Please contact an admin and notify them about this problem +messageNoExternalMessagesSelected = You have not selected any messages +messageExternalLabResultsAdapterNotFound = The external lab results adapter could not be found. This probably means you system is not configured correctly. Please contact you system administrator. +messageExternalMessagesEligibleForDeletion = Only unprocessed messages can be deleted +messageExternalMessagesDeleted = All selected eligible messages have been deleted +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 +messageUsersDisabled = All 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. +messageBulkDontShareWithReportingToolWarning = The cases will be prevented from being sent to the external reporting tool +messageBulkLinkEventHint = All selected cases will be linked to the selected event if they are not linked to it already +messageInfrastructureLocked = Infrastructure data is locked and cannot be added/edited/imported/de-archived +messageDeleteImmunizationVaccinations = Changing the means of immunization will delete all vaccinations that have been added to this immunization. Are you sure you want to proceed with the change? +messageDeleteReasonNotFilled = Please choose a reason for deletion +messageOtherDeleteReasonNotFilled = Please add a reason for deletion +messageVaccinationNotRelevantForCase = This vaccination is not relevant for this case because the vaccination date is set after the symptom onset date or case report date. +messageVaccinationNoDateNotRelevantForCase = This vaccination is not relevant for this case because it does not have a vaccination date. +messageVaccinationNotRelevantForContact = This vaccination is not relevant for this contact because the vaccination date is set after the last contact date or contact report date. +messageVaccinationNoDateNotRelevantForContact = This vaccination is not relevant for this contact because it does not have a vaccination date. +messageVaccinationNotRelevantForEventParticipant = This vaccination is not relevant for this event participant because the vaccination date is after the event date or event report date. +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. +messageSormasToSormasSimilarContactFound = There is at least one similar contact in your system. If you accept the request the contact maybe will be in your system as a duplicate.
If so, you should consolidate the contacts after accepting.
Please make sure that you use the accepted contact for this purpose. +messageSormasToSormasSimilarConvertedContactFound = There is at least one similar contact in your system. If you accept the request the contact maybe will be in your system as a duplicate.
If so, you should consolidate the contacts after accepting.
After consolidating the contacts, it may be necessary to perform a manual conversion of the accepted contact.
Please make sure that you use the accepted contact for this purpose. +messageSormasToSormasSimilarCaseToContactFound = There is at least one similar case in your system.
After accepting the request, it may be necessary to perform a manual conversion of the accepted contacts. +messageSormasToSormasSimilarPersonFound = There is at least one similar person in your system. If you accept the request the case/contact maybe will create a person in your system as a duplicate.
Please check this after accepting. +messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. +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. +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 +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 +messageEnvironmentSampleSaved = Environment sample saved +messageRestoreNotPossibleAlreadyInEvent = Event participant can't be restored because the person already has another active event participant in this event +messageDuplicateEnvironmentFound = A similar environment already exists in the database (UUID\: %s) +messageCasePersonHasNoEmail=Case person has no email address specified +messageContactPersonHasNoEmail=Contact person has no email address specified +messageEventParticipantPersonHasNoEmail=Event participant person has no email address specified +messageTravelEntryPersonHasNoEmail=Travel entry person has no email address specified +messageNoExternalEmailToCaseSent=No email sent to case person +messageNoExternalEmailToContactSent=No email sent to contact person +messageNoExternalEmailToEventParticipantSent=No email sent to event participant person +messageNoExternalEmailToTravelEntrySent=No email sent to travel entry person +messageExternalEmailNoAttachments=No attachments +messageCustomizableEnumValueSaved = Customizable enum value saved +messageExternalEmailAttachmentPassword=Please use this password to open the documents sent to you via email from SORMAS\: %s +messageExternalEmailAttachmentNotAvailableInfo=Attaching documents is disabled because encryption would not be possible. To encrypt documents, the person needs to have either a national health ID specified, or a primary mobile phone number set with SMS sending set up on this system. +messagePersonNationalHealthIdInvalid=The entered national health ID does not seem to be correct +# Notifications +notificationCaseClassificationChanged = The classification of case %s has changed to %s. +notificationCaseInvestigationDone = The investigation of case %s has been done. +notificationEventParticipantCaseClassificationConfirmed = A person that was an event participant in the event %s was identified as a confirmed %s case %s. Please check if an explicit link should be created between the event participant and the case. +notificationContactSymptomatic = The contact %s of case %s has become symptomatic. +notificationContactWithoutCaseSymptomatic = The contact %s has become symptomatic. +notificationDiseaseChanged = The disease of case %s has changed from %s to %s. Please review all related cases and see if their diseases need to be changed as well. +notificationLabResultArrived = %s pathogen test result has arrived for %s case %s. Test type\: %s. Tested disease\: %s. +notificationLabResultArrivedContact = %s pathogen test result has arrived for %s contact %s. Test type\: %s. Tested disease\: %s. +notificationLabResultArrivedEventParticipant = %s pathogen test result has arrived for %s event participant %s. Test type\: %s. Tested disease\: %s. +notificationLabResultArrivedEventParticipantNoDisease = %s pathogen test result has arrived for %s event participant %s. Test type\: %s. +notificationLabSampleShipped = A new sample (sample code\: %s) for case %s is being shipped to your laboratory. +notificationLabSampleShippedShort = A new sample for case %s is being shipped to your laboratory. +notificationLabSampleShippedShortForContact = A new sample for contact %s is being shipped to your laboratory. +notificationLabSampleShippedShortForEventParticipant = A new sample for event participant %s is being shipped to your laboratory. +notificationPersonsUpdated = Updated %d Person(s) +notificationTaskObserverInformation = You are assigned as an observer to this task. +notificationTaskDueGeneral = Your %s task is overdue. +notificationTaskDueSpecific = Your %s task for %s is overdue. +notificationTaskStartGeneral = Your %s task should be started today. +notificationTaskStartSpecific = Your %s task for %s should be started today. +notificationTaskAssociatedCaseLink = Link to the associated case\: %s +notificationTaskAssociatedContactLink = Link to the associated contact\: %s +notificationTaskAssociatedEventLink = Link to the associated event\: %s +notificationTaskAssociatedTravelEntryLink = Link to the associated travel entry\: %s +notificationTaskAssociatedEnvironmentLink = Link to the associated environment entry\: %s +notificationTaskGeneralUpdatedAssigneeUserSource = Your %s task has been assigned to another user. You are no longer in charge of this task. +notificationTaskGeneralUpdatedAssigneeUserTarget = A(n) %s task has been assigned to you. +notificationTaskSpecificUpdatedAssigneeUserSource = Your %s task for %s has been assigned to another user. You are no longer in charge of this task. +notificationTaskSpecificUpdatedAssigneeUserTarget = A(n) %s task for %s has been assigned to you. +notificationVisitCompleted = A follow-up visit for contact %s assigned to user %s has been completed. +notificationEventParticipantRelatedToOtherEvents = The Person %s newly added as Participant %s to Event %s (responsible user\: %s) by %s is also related to these Events \:\n%s +notificationEventWithResponsibleUserLine = Event %s (responsible user\: %s) +notificationSmsSent = Message sent +notificationEventGroupCreated = Event Group %s (%s) created by %s.\n\n%s +notificationEventAddedToEventGroup = %s added to Event Group %s (%s) by %s .\n\n%s +notificationEventRemovedFromEventGroup = %s removed from Event Group %s (%s) by %s .\n\n%s +notificationEventGroupSummary = Here is a summary of the Events now contained in the Event Group\:\n%s +notificationEventGroupSummaryEmpty = This event group is empty. +notificationExternalEmailSent = Email message sent. + +#Labels +labelActualLongSeed = Actual Long seed +labelNumberOfUsers = No. of users +labelNumberOfContinents = No. of continents +labelNumberOfSubcontinents = No. of subcontinents +labelNumberOfCountries = No. of countries +labelNumberOfRegions = No. of regions +labelNumberOfDistricts = No. of districts +labelNumberOfCommunities = No. of communities +labelNumberOfPointofEntry = No. of points of entry +labelNumberOfFacilities = No. of facilities +labelNumberOfAreas = No. of areas +labelNumberOfTemplates = No. of Templates +labelNoVaccinationDate = No vaccination date +labelNoVaccineName = No vaccine name + +# Numbers +numberEight = eight +numberEleven = eleven +numberFive = five +numberFour = four +numberNine = nine +numberOne = one +numberSeven = seven +numberSix = six +numberTen = ten +numberThree = three +numberTwelve = twelve +numberTwo = two + +# Prompts +promptActionDateFrom = Date of action from... +promptActionDateTo = ... to +promptActionEpiWeekFrom = Date of action from epi week... +promptActionEpiWeekTo = ... to epi week +promptActionChangeDateFrom = Date of action change from... +promptActionChangeDateTo = ... to +promptActionChangeEpiWeekFrom = Date of action change from epi week... +promptActionChangeEpiWeekTo = ... to epi week +promptCampaignSearch = ID, name +promptCasesDateFrom = New cases from... +promptCasesEpiWeekFrom = New cases from epi week... +promptCasesEpiWeekTo = ... to epi week +promptCasesSearchField = ID, EPID number, external ID, facility +promptCaseOrContactEventSearchField = Event\: ID, title, description +promptPersonsSearchField = ID, name, phone number, email, city, street, postal code +promptCreationDateFrom = Creation date from ... +promptDateTo = ... to +promptNamePhoneEmail = Name, phone number and email address +promptContactDateType = Contact reference date +promptContactDateFrom = New contacts from... +promptContactDateTo = ... to +promptContactEpiWeekFrom = New contacts from epi week... +promptContactEpiWeekTo = ... to epi week +promptContactsSearchField = ID, case ID, case name, external ID +promptDisease = Disease +promptDistrict = District +promptEventDateType = Event reference date +promptEventDateFrom =Date of event from epi week +promptEventDateTo = ... to +promptEventEpiWeekFrom = Date of event from epi week +promptEventEpiWeekTo = ... to epi week +promptEventEvolutionDateFrom = Date of last evolution from... +promptEventEvolutionDateTo = ... to +promptEventSignalEvolutionEpiWeekFrom = Date of last evolution from epi week... +promptEventSignalEvolutionEpiWeekTo = ... to epi week +promptEventParticipantsSearchField = name, phone number +promptEventsSearchField = ID, title, description, source details +promptEventsSearchFieldEventParticipants = ID or personal details of event participants +promptEventsSearchFieldEventGroups = ID or name of event group +promptEventGroupSearchField = ID, name +promptEventGroupSearchFieldEvent = Event ID, title, description, source details, location +promptImmunizationDateType = Immunization reference date +promptImmunizationValidFrom = New immunizations valid from... +promptImmunizationDateFrom = Immunization report date from... +promptImmunizationDateTo = ... to +promptImmunizationEpiWeekFrom = New immunizations from epi week... +promptImmunizationEpiWeekTo = ... to epi week +promptEmail = Email\: +promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code +promptExternalMessagesContentSearchField = External message content +promptExternalMessagesDateFrom = Message date from... +promptExternalMessagesDateTo = ... to +promptExternalMessagesPersonBirthDateFrom = Birth date from... +promptExternalMessagesPersonBirthDateTo = ... to +promptNewCaseDateType = Case reference date +promptPrescriptionTextFilter = Prescription details or prescribing clinician +promptRegion = Region +promptRelatedPersonLikeField = Person ID/name/contact information/location +promptSamplesSearchField = Sample ID/name, case name/epid number/ID, contact name/ID, event participant name/ID +promptSampleDateFrom = Sample date from ... +promptSampleDateTo = ... to +promptSampleEpiWeekFrom = Sample date from epi week +promptSampleEpiWeekTo = ... to epi week +promtSampleDataType = Sample reference date +promptSearch = Search... +promptTaskSearchField = Case or contact ID/name, Event ID/title +promptTelephoneNumber = Phone number\: +promptTaskDateType = Task reference date +promptTaskDateFrom = Tasks from... +promptTaskDateTo = ... to +promptTaskEpiWeekFrom = Tasks from epi week... +promptTaskEpiWeekTo = ... to epi week +promptTravelEntrySearchField = Person first and last name, person UUID, person external ID, travel entry UUID, travel entry external ID +promptTreatmentTextFilter = Treatment details or executing staff member +promptTypeToAdd = Type here to add... +promptUserSearch = Search user +promptFilterByPeriod = Filter by period +promptSelectPeriod = Select period +promptCampaign = Campaign +promptArea = Area +promptAllAreas=All areas +promptAllRegions=All regions +promptAllDistricts=All districts +promptAllCommunities=All communities +promptExternalIdExternalSurveillanceTool=Will adopt external reporting tool GUID +promptExternalJournalForceDeletion=Do you want to force the cancellation in SORMAS? This would mark the person as deleted from the external journal in SORMAS, while there is a high probability of personal data still remaining in the external journal. +promptPersonDuplicateSearchIdExternalId=First Name, Last Name, ID, External ID, External token +#DiseaseNetworkDiagram +DiseaseNetworkDiagram.Classification.HEALTHY = Healthy +DiseaseNetworkDiagram.heading = Disease network diagram +DiseaseNetworkDiagram.highRisk = High risk +DiseaseNetworkDiagram.legend = Legend +DiseaseNetworkDiagram.lowRisk = Low risk +DiseaseNetworkDiagram.selectByClassification = Select by Classification +DiseaseNetworkDiagram.subheading = The arrows indicate the direction of transmission + +promptImmunizationStartDateFrom = Immunization start date from... +promptImmunizationPositiveTestResultDateFrom = Immunization positive test result date from... +promptImmunizationRecoveryDateFrom = Immunization recovery date from... + +promptTravelEntryDateFrom = Travel entry report date from... +promptTravelEntryDateTo = ... to +promptTravelEntryEpiWeekFrom = Travel entry from epi week... +promptTravelEntryEpiWeekTo = ... to epi week + +promptEnvironmentFreeTextSearch = UUID, External ID, Name, Description +promptEnvironmentDateFrom = Report date from... +promptEnvironmentDateTo = ... to +promptEnvironmentEpiWeekFrom = Report date from epi week... +promptEnvironmentEpiWeekTo = ... to epi week +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 + +promptCustomizableEnumTranslationLanguage = Language +promptCustomizableEnumTranslationCaption = Translated caption +promptCustomizableEnumSearchField = Search by value or caption... + +# Unsaved changes +unsavedChanges.warningTitle = Unsaved changes +unsavedChanges.warningMessage = This form contains unsaved changes. Please decide whether you want to cancel the action you have just taken in order to review them, or save or discard the changes and continue. +unsavedChanges.discard = Discard changes +unsavedChanges.save = Save changes +unsavedChanges.cancel = Cancel action + +headingNetworkDiagramTooManyContacts = Too many contacts +warningNetworkDiagramTooManyContacts = There are %d contacts and it is possible that your browser will freeze while displaying the diagram.
Please choose a smaller time window. +confirmNetworkDiagramTooManyContacts = Do you really want to update the diagram? + +headingContactTracingFirstContact = First contact with Contact Tracing + +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.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? +ExternalSurveillanceToolGateway.confirmSendCases=Are you sure you want to send the cases to the reporting tool? +ExternalSurveillanceToolGateway.confirmSendEvent=Are you sure you want to send the event to the reporting tool? +ExternalSurveillanceToolGateway.confirmSendEvents=Are you sure you want to send the events to the reporting tool? +ExternalSurveillanceToolGateway.confirmDeleteCase=Are you sure you want to delete the case in the reporting tool? +ExternalSurveillanceToolGateway.confirmDeleteEvent=Are you sure you want to delete the event in the reporting tool? +ExternalSurveillanceToolGateway.sharedAt = shared at +ExternalSurveillanceToolGateway.deletedAt = deleted at +ExternalSurveillanceToolGateway.notificationEntryNotDeleted = Entry could not be deleted in the reporting tool +warningDashboardMapTooManyMarkers = There are more than %d places to display and it is possible that your browser will freeze while displaying them. +ExternalSurveillanceToolGateway.notificationErrorDeleting = Error when deleting entry +ExternalSurveillanceToolGateway.versionRequestError = Error requesting version + +headingSurveillanceReports=Reports +headingCreateSurveillanceReport=Create new report +headingEditSurveillanceReport=Edit report + + +# Default password +DefaultPassword.ownUserIntroduction=You have just logged in using the default password for this user. This password is not secure, as it could be used by unauthorized third parties to gain access to your account. Please make sure to change your password as soon as possible. +DefaultPassword.otherUsersIntroduction=Your installation of SORMAS has default logins enabled, which were automatically created during setup. These logins have insecure default passwords, which could be used by unauthorized third parties to gain access to these accounts. Please make sure to change the default passwords of all affected users as soon as possible, or to entirely remove the accounts, if they are no longer required. +DefaultPassword.ownUserAction=By clicking the following button, a new random password will be generated and assigned to your account. The new password will be displayed below. +DefaultPassword.otherUsersAction=By clicking the GENERATE NEW PASSWORDS button, new random passwords will be generated and assigned to each of the selected user accounts. The new passwords will be displayed below next to the corresponding user. +DefaultPassword.ownUserNewPasswordSetHints=Your account has been successfully updated. Make sure to copy your new password and keep it safe. This new password is displayed only once. +DefaultPassword.otherUsersNewPasswordSetHints=Your accounts have been successfully updated. Make sure to copy the new passwords and to notify the affected users about the password change. The new passwords are displayed only once. +DefaultPassword.newPassword=New Password +DefaultPassword.newPasswordPlaceholder=New Password\: %s +DefaultPassword.unchanged=- unchanged - + +sormasToSormasLoadingShares = Loading shares... + +errorConstraintViolation = Invalid data + +reloadPageToSeeChanges = Please reload the page to see the latest changes. + +checkboxSetTickAnAnswerForAll = Please tick an answer for ALL + +promptSampleDashboardFilterDateType=Sample reference date +headingSampleDashboardEpiCurve=Final Laboratory Results Chart +headingSampleDashboardMap=Sample Status Map +infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address. +infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. diff --git a/sormas-api/src/main/resources/subcontinents_es-BO.properties b/sormas-api/src/main/resources/subcontinents_es-BO.properties new file mode 100644 index 00000000000..d67d2bb1d0b --- /dev/null +++ b/sormas-api/src/main/resources/subcontinents_es-BO.properties @@ -0,0 +1,49 @@ +############################################################################### +# SORMAS® - Surveillance Outbreak Response Management & Analysis System +# Copyright © 2016-2020 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 . +############################################################################### + +subcontinent.NORTHERN_AFRICA.name = Northern Africa +subcontinent.NORTHEAST_AFRICA.name = Northeast Africa +subcontinent.NORTHWEST_AFRICA.name = Northwest Africa +subcontinent.EASTERN_AFRICA.name = Eastern Africa +subcontinent.SOUTHERN_AFRICA.name = Southern Africa +subcontinent.SOUTHEAST_AFRICA.name = Southeast Africa +subcontinent.SOUTHWEST_AFRICA.name = Southwest Africa +subcontinent.WESTERN_AFRICA.name = Western Africa +subcontinent.CENTRAL_AFRICA.name = Central Africa + +subcontinent.CENTRAL_AMERICA.name = Central America +subcontinent.NORTH_AMERICA.name = North America +subcontinent.SOUTH_AMERICA.name = South America + +subcontinent.EASTERN_ASIA.name = Eastern Asia +subcontinent.SOUTHERN_ASIA.name = Southern Asia +subcontinent.SOUTHEAST_ASIA.name = Southeast Asia +subcontinent.SOUTHWEST_ASIA.name = Southwest Asia +subcontinent.MIDDLE_EAST.name = Middle East +subcontinent.CENTRAL_ASIA.name = Central Asia + +subcontinent.AUSTRALIA.name = Australia (Subcontinent) +subcontinent.OCEANIA.name = Oceania + +subcontinent.CENTRAL_EUROPE.name = Central Europe +subcontinent.NORTHERN_EUROPE.name = Northern Europe +subcontinent.NORTHEAST_EUROPE.name = Northeast Europe +subcontinent.EASTERN_EUROPE.name = Eastern Europe +subcontinent.SOUTHERN_EUROPE.name = Southern Europe +subcontinent.SOUTHEAST_EUROPE.name = Southeast Europe +subcontinent.WESTERN_EUROPE.name = Western Europe \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_es-BO.properties b/sormas-api/src/main/resources/validations_es-BO.properties new file mode 100644 index 00000000000..a2113fed499 --- /dev/null +++ b/sormas-api/src/main/resources/validations_es-BO.properties @@ -0,0 +1,295 @@ +############################################################################### +# SORMAS® - Surveillance Outbreak Response Management & Analysis System +# Copyright © 2016-2021 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 . +############################################################################### + +afterDate = %s has to be after or on the same day as %s +afterDateSoft = %s should normally not be before %s. You are still allowed to save. +afterDateWithDate = %s has to be after or on the same day as %s (%s) +beforeDate = %s has to be before or on the same day as %s +beforeDateSoft = %s should normally not be after %s. You are still allowed to save. +duplicateEpidNumber = This EPID number already exists. +duplicateExternalToken = This external token already exists. +futureDate = %s cannot be more than %s days in the future +futureDateStrict = %s cannot be in the future +importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases +importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants +importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events +importPropertyTypeNotAllowed = Property type %s not allowed +importCasesUnexpectedError = Unexpected error when trying to import this case. Please send your error report file to an administrator and remove this case from your import file. +importUnexpectedError = Unexpected error when trying to import this row. Please send your error report file to an administrator and remove this row from your import file. +importWrongDataTypeError = Value %s in column %s does not match expected data type. +importCommunityNotUnique = Invalid value %s in column %s; Community name is not unique in the chosen district, make sure there is only one community with this name belonging to the chosen district in the database +importDiseaseVariantNotExistOrDisease = Invalid value %s in column %s; Disease variant does not exist in the database or for the specified disease +importDiseaseVariantNotUniqueForDisease = Invalid value %s in column %s; Disease variant name is not unique for the chosen disease, make sure there is only one disease variant with this name belonging to the chosen disease in the database +importDistrictNotUnique = Invalid value %s in column %s; District name is not unique in the chosen region, make sure there is only one district with this name belonging to the chosen region in the database +importEntryDoesNotExist = Invalid value %s in column %s; Entry does not exist in the database or is archived +importEntryDoesNotExistDbOrCommunity = Invalid value %s in column %s; Entry does not exist in the database or in the specified community or is archived (Or maybe a wrong facility type was specified) +importEntryDoesNotExistDbOrDistrict = Invalid value %s in column %s; Entry does not exist in the database or in the specified district or is archived (Or maybe a wrong facility type was specified) +importEntryDoesNotExistDbOrRegion = Invalid value %s in column %s; Entry does not exist in the database or in the specified region or is archived +importEntryRegionNotInUsersJurisdiction = Invalid value %s in column %s; Specified region is not within your jurisdiction +importEntryDistrictNotInUsersJurisdiction = Invalid value %s in column %s; Specified district is not within your jurisdiction +importEntryCommunityNotInUsersJurisdiction = Invalid value %s in column %s; Specified community is not within your jurisdiction +importErrorInColumn = The import failed because of an error in column %s +importFacilityNotUniqueInCommunity = Invalid value %s in column %s; Facility name is not unique in the chosen community, make sure there is only one facility with this name belonging to the chosen community in the database +importFacilityNotUniqueInDistrict = Invalid value %s in column %s; Facility name is not unique in the chosen district, make sure there is only one facility with this name belonging to the chosen district in the database or specify a community +importPointOfEntryNotUniqueInDistrict = Invalid value %s in column %s; Point of entry name is not unique in the chosen district, make sure there is only one point of entry with this name belonging to the chosen district in the database +importLabNotUnique = Invalid value %s in column %s; Lab name is not unique in the database +importInvalidDate = Invalid date in column %s; Allowed date formats are %s +importLineTooLong = This line is longer than the header line +importAreaNotUnique = Invalid value %s in column %s; Area name is not unique, make sure there is only one area with this name in the database +importRegionNotUnique = Invalid value %s in column %s; Region name is not unique, make sure there is only one region with this name in the database +importRegionNotInServerCountry = Invalid value %s in column %s; Region is not in server country +importCountryNotUnique = Invalid value %s in column %s; Country name is not unique, make sure there is only one country with this name in the database +importCountryEmptyIso = The ISO code is empty. +importContinentAlreadyExists = The database already contains a continent with this name. +importContinentNotUnique = Invalid value %s in column %s; Continent name is not unique, make sure there is only one continent with this name in the database +importSubcontinentAlreadyExists = The database already contains a subcontinent with this name. +importSubcontinentNotUnique = Invalid value %s in column %s; Subcontinent name is not unique, make sure there is only one subcontinent with this name in the database +importCountryAlreadyExists = The database already contains a country with this ISO code or this UNO code. +importRegionAlreadyExists = The database already contains a region with this name. +importDistrictAlreadyExists = The database already contains a district with this name in the specified region. +importCommunityAlreadyExists = The database already contains a community with this name in the specified district. +importFacilityAlreadyExists = The database already contains a facility with this name in the specified community. +importLaboratoryAlreadyExists = The database already contains a laboratory with this name. +importPointOfEntryAlreadyExists = The database already contains a point of entry with this name in the specified district. +importAreaAlreadyExists = The database already contains an area with this name. +importErrorCustomizableEnumValue = Error when trying to import value %s in column %s +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. +noCommunityInDistrict = Could not find a database entry for the specified community in the specified district +noAddressCommunityInAddressDistrict = Could not find a database entry for the specified address community in the specified address district +noResponsibleCommunityInResponsibleDistrict = Could not find a database entry for the specified responsible community in the specified responsible district +noDistrictInRegion = Could not find a database entry for the specified district in the specified region +noAddressDistrictInAddressRegion = Could not find a database entry for the specified address district in the specified address region +noResponsibleDistrictInResponsibleRegion = Could not find a database entry for the specified responsible district in the specified responsible region +noFacilityInCommunity = Could not find a database entry for the specified facility in the specified community +noAddressFacilityInAddressCommunity = Could not find a database entry for the specified address facility in the specified address community +noFacilityInResponsibleCommunity = Could not find a database entry for the specified facility in the specified responsible community +noFacilityInDistrict = Could not find a database entry for the specified facility in the specified district +noAddressFacilityInAddressDistrict = Could not find a database entry for the specified address facility in the specified address district +noFacilityInResponsibleDistrict = Could not find a database entry for the specified facility in the specified responsible district +noFacilityInRegion = Could not find a database entry for the specified facility in the specified region +noAddressFacilityInAddressRegion = Could not find a database entry for the specified address facility in the specified address region +noFacilityInResponsibleRegion = Could not find a database entry for the specified facility in the specified responsible region +noFacilityType = The facility type has to be specified if a facility is specified +onlyDecimalNumbersAllowed = Only numbers (with decimal places) are allowed for %s +onlyGeoCoordinatesAllowed = Only geo coordinate values are allowed for %s +onlyNumbersAllowed = Only numbers are allowed for %s +onlyIntegerNumbersAllowed = Only integer numbers up to 9 digits are allowed for %s +patchWrongUuid = The value of the UUID in the json payload\: %s is not the same as the value of path variable uuid\: %s +patchUnsupportedCollectionFieldType = The field %s that represents a collection of objects must have a type that inherits from Collection class or to be an array but it is %s +patchNoSuchFieldException = No field %s in the class %s +phoneNumberValidation = Phone numbers have to start with a "+" followed by the country code. Using a different format will prevent the user from receiving SMS notifications. +required = %s is required +requiredField = This field is required +softAddEntryToList = Please add an entry to the list below if there is any data available to you. +specifyFirstName = You have to specify a first name +specifyLastName = You have to specify a last name +specifySex = You have to specify the sex +specifyYear = You have to specify the year +specifyEpiWeek = You have to specify the epi week +userNameNotUnique = User name is not unique\! +validCaseContactOrEventParticipant=You have to specify a valid case or contact from the SORMAS database +noCaseWithUuid=The database does not contain a case with this UUID. +noContactWithUuid=The database does not contain a contact with this UUID. +noEventParticipantWithUuid=The database does not contain an event participant with this UUID. +noLaboratoryWithUuid=The database does not contain a laboratory with this UUID. +noReportingUserWithUuid=The database does not contain a user with the UUID specified for the reporting user field. +validCommunity = You have to specify a valid community +validDateRange = Please specify a valid date range +validDisease = You have to specify a valid disease +validDistrict = You have to specify a valid district +validResponsibleDistrict = You have to specify a valid responsible district +validEventStatus = You have to specify a valid event status +validEventTitle = You have to specify a valid event title +validFacility = You have to specify a valid health facility +validLocation = You have to specify a valid location +validPerson = You have to specify a valid person from the SORMAS database +validRegion = You have to specify a valid region +validResponsibleRegion = You have to specify a valid responsible region +validReportDateTime = You have to specify a valid report date +pathogenTestValidSampleOrEnvironment = You have to specify a valid sample or environment from the SORMAS database +pathogenTestValidDisease = You have to specify a valid disease +pathogenTestValidPathogen = You have to specify a valid pathogen +validFacilityType = You have to specify a valid facility type +validHealthConditions = You have to link valid health conditions +validImmunization = You have to link a valid immunization +validReportingUser = You have to specify a valid user from the SORMAS database +validDateOfArrival = Please specify a valid date of arrival +validLaboratory = You have to specify a valid laboratory +visitAfterFollowUp = The visit cannot be more than %d days after the end of the follow-up duration. +visitBeforeCaseReport=The visit cannot be more than %d days before the case report date. +visitBeforeContactReport=The visit cannot be more than %d days before the contact report date. +visitBeforeLastContactDate=The visit cannot be more than %d days before the last contact date. +visitBeforeSymptomsOnSet=The visit cannot be more than %d days before the symptoms onset. +visitDate = You have to specify a visit date. +visitSymptoms = You have to specify symptoms for a visit. +visitStatus = You have to specify the status for a visit. +environmentName = You have to specify an environment name +environmentMedia = You have to specify the environment media +softApproximateAgeTooHigh = Please make sure that this approximate age value is correct; If applicable, change it to a value lower than 150. +validPointOfEntry = You have to specify a valid point of entry +exportNoNameSpecified = Please type in a name for your export configuration +caseMultipleInfectionEnvironments = This case already contains an exposure that has been marked as the probable infection environment. Setting this exposure as the probable infection environment will remove that mark from the other exposure. Do you want to set this exposure as the probable infection environment of this case? +statisticsIncidenceOnlyNumbersAllowed = The incidence divisor must be a number. It has been reset to the previous value. +noPastDateAllowed = You need to enter a date in the present or future +contactFollowUpUntilDate = The follow-up until date must at least be on the day the standard follow-up duration for the disease would end. +contactFollowUpUntilDateSoftValidation = The follow-up until date should at least be on the day the standard follow-up duration for the disease would end. +emptyOverwrittenFollowUpUntilDate = The follow-up until date cannot be overwritten with an empty value. +eventSuperordinateEventToDateFilterValidation = The End Date of the Filter Range selected is later than the event date of the current event +eventSubordinateEventFromDateFilterValidation = The Start Date of the Filter Range selected is earlier than the event date of the current event +textTooLong = The text you entered is too long. Maximum allowed length is {max} +textSizeNotInRange = The text you entered is not valid. It''s length must be between {min} and {max} +numberTooSmall = The number you entered is too small. The minimum allowed is {value} +numberTooBig = The number you entered is too big. The maximum allowed is {value} +numberNotInRange = The number you entered is not valid. It should be between {min} and {max} +uuidPatternNotMatching = The UUID you entered is not valid. Only numbers, letters and "-"(dash) is allowed +patternNotMatching = The text you entered is not valid. It must match "{regexp}" +contactWithoutInfrastructureData = A contact needs either a source case or a responsible region and district. +campaignFormElementNotExisting = Column %s does not exist in form meta definition. +campaignFormUnsupportedType = The type %s of element %s is not supported in campaign forms. +campaignFormUnsupportedStyle = The style %s of element %s is not supported in campaign forms. +campaignFormDependingOnNotFound = The campaign form does not contain a field with the ID %s that was specified in the dependingOn attribute of element %s. +campaignFormUnsupportedDependingOnValue = The value %s specified in the dependingOnValue attribute of element %s is not supported by type %s of element %s. +campaignFormElementTypeRequired = Campaign form element %s does not have a type. +campaignFormElementIdRequired = All campaign form elements must have a unique ID. +campaignFormDependingOnValuesMissing = No dependingOnValues have been specified for element %s that depends on another element. +campaignFormTranslationIdRequired = All translation elements must specify a valid element ID. +campaignFormTranslationCaptionRequired = Translation element %s for language code %s does not specify a caption. +campaignFormTranslationIdInvalid = The element ID %s in language code %s does not exist in the campaign form. +campaignFormTranslationLanguageCodeRequired = All translations must specify a language code. +campaignFormElementDuplicateId = Field IDs need to be unique, but the campaign form contains at least two fields with ID %s. +errorsInForm = There are errors in the form you tried to save. Please check the fields highlighted in red and make sure to only enter valid values. +campaignFormInvalidIdInListElements = The ID %s in the campaign form list definition is not associated to any element of the form. +campaignDashboardDataFormValueNull = Campaign dashboard data form element is missing\! +campaignDashboardDataFormValueDuplicate = Campaign dashboard data form element must be unique\! +campaignDashboardChartPercentage = Value must be a number that is multiple of 5\! +campaignDashboardChartValueNull = Campaign dashboard elements %s of campaign %s are missing\! +campaignDashboardChartIdDoesNotExist = Diagram %s from campaign %s does not exist\! +sormasToSormasCaseExists=This case already exists +sormasToSormasContactExists=This contact already exists +sormasToSormasEventExists=This event already exists +sormasToSormasEventParticipantExists=This event participant already exists +sormasToSormasExternalMessageExists=This message already exists +sormasToSormasContactCaseNotExists=The linked case does not exist +sormasToSormasShareInfoMissing = Sender information is missing +sormasToSormasOrganizationIdMissing = Sender organization is is missing +sormasToSormasSenderNameMissing = Sender name is missing +sormasToSormasCommentMissing = Comment is missing +sormasToSormasSampleExists = This sample already exists +sormasToSormasImmunizationExists = This immunization already exists +sormasToSormasSurveillanceReportExists = This report already exists +sormasToSormasReturnEntityNotExists = Object does not exist +sormasToSormasSaveException = %s could not be saved\: %s +sormasToSormasContinent = Unmatched continent\: %s +sormasToSormasSubcontinent = Unmatched subcontinent\: %s +sormasToSormasCountry = Unmatched country\: %s +sormasToSormasRegion = Unmatched region\: %s +sormasToSormasDistrict = Unmatched district\: %s +sormasToSormasCommunity = Unmatched community\: %s +sormasToSormasFacility = Unmatched facility\: %s +sormasToSormasPointOfEntry = Unmatched point of entry\: %s +sormasToSormasResponsibleRegion = Unmatched responsible regions\: %s +sormasToSormasResponsibleDistrict = Unmatched responsible district\: %s +sormasToSormasResponsibleCommunity = Unmatched responsible community\: %s +sormasToSormasInfrastructure = Infrastructure data does not match. Unmatched values\: %s +sormasToSormasNotEditable = Readonly data can not be shared. +sormasToSormasPersonEnrolled = The person is under external follow up. +sormasToSormasOwnershipAlreadyHandedOver = The ownership is already handed over, please revoke the request then try again. +sormasToSormasContactHasNoCase = Contact without a source case can not be shared. +sormasToSormasContactCaseNotShared = Contact can not be shared because the associated case is not yet shared to the same target system. Please note that you can send the case and exclude personal data. +sormasToSormasAcceptContactHasNoCase = Contact without a source case can not be accepted. +sormasToSormasAcceptCaseBeforeContact = Contact can not be accepted because the associated case is not yet accepted. Please accept the case first. +sormasToSormasAcceptContactWithoutCaseShared = Contact can not be accepted because the associated case is not yet shared. Please reject the contact and ask the source system to send the linked case first. +sormasToSormasExistingPendingRequest = There is already a pending request to the same target system. Please revoke it before sending a new one. +sormasToSormasContactSampleHasAssociatedCase = Sharing cannot be done because only contacts that do not have a sample that also refences a case can be shared. +sormasToSormasCaseSampleHasAssociatedContact = Sharing cannot be done because only cases that do not have a sample that also refences a contact can be shared. +validPhoneNumber = %s must be a valid phone number +validEmailAddress = %s must be a valid email address +externalJournalPersonSynchronizationFailure = The relevant changes could not be synchronized to the external journal. Please take care of the following error(s), otherwise the external journal will have different data than SORMAS\: %s +externalJournalPersonSynchronizationPartial = The relevant changes were partially synchronized to the external journal. Please take care of the following error(s), otherwise the external journal will have different data than SORMAS\: %s +externalJournalPersonSynchronizationSuccess = The relevant changes were successfully synchronized to the external journal. +externalJournalPersonValidationBirthdate = Invalid birthdate. +externalJournalPersonValidationEmail = Invalid email address. +externalJournalPersonValidationError = Invalid data provided for person exported to external journal\: +externalJournalPersonValidationPhone = Invalid phone number. +externalJournalPersonValidationPhoneTaken = A person with the same first name is already using the phone number in the external journal. +externalJournalPersonValidationEmailTaken = A person with the same first name is already using the email address in the external journal. +externalJournalPersonValidationNoEmail = Please provide an email address. +externalJournalPersonValidationNoEmailOrPhone = Please provide an email address or a phone number. +externalJournalPersonValidationSeveralEmails = This person has several email addresses, none of which is marked as primary. It is not clear which contact detail is supposed to be used by the external journal. +externalJournalPersonValidationSeveralPhonesOrEmails = This person has several email addresses and/or phone numbers, none of which is marked as primary. It is not clear which contact detail is supposed to be used by the external journal. +campaignFormMetaValidationUnexpectedError = There was an unexpected error while trying to validate this form. Please forward the following error message to a system administrator\: %s +vaccineDosesFormat=Vaccine dose should be a number between 1 and 10 +externalMessageAlreadyProcessedError = The message was processed by another user in the meantime. +externalMessageCorrectionsMade = The changes you have previously saved while processing this message will remain in the system. +externalMessagePdfConversionError = The messages could not be converted to PDF. +taskMissingCaseLink = Tasks with case context have to be linked to an existing case +taskMissingContactLink = Tasks with contact context have to be linked to an existing contact +taskMissingEventLink = Tasks with event context have to be linked to an existing event +externalMessageConversionError = The external messages could not be converted. +externalMessageDisplayError = The external message could not be converted to a graphical representation. +externalMessageFetchError = The external messages could not be fetched from the external system. +externalMessageInitError = The external message adapter could not be initialised. +externalMessageDecryptError = The external messages could not be decrypted. +externalMessageConfigError = The external message adapter is not configured properly. +personMultiplePrimaryPhoneNumbers = The person has multiple primary phone numbers. Only one primary phone number is allowed. +personMultiplePrimaryEmailAddresses = The person has multiple primary email addresses. Only one primary email address is allowed. +birthDateInFuture = Birth date must not be in the future +birthDateInvalid = The specified birth date is not a valid date +nameOrAnyOtherFieldShouldBeFilled=At least one name field or an other field should be filled +notAccomodationFacilityType = Facility type %s can not be used for place of stay +fileTooBig = File too big. The maximum file size allowed is %dMB +infrastructureDataLocked = Infrastructure data is locked and cannot be updated +feverTemperatureAboveThreshold = A body temperature of at least 38 °C has been specified. It is recommended to also set %s to "Yes". +feverTemperatureBelowThreshold = A body temperature of less than 38 °C has been specified. It is recommended to also set %s to "No". +specifyCaption = You have to specify a caption +specifyJurisdictionLevel = You have to specify a jurisdiction level +captionNotUnique = Caption is not unique +missingRequiredUserRightsBaseText = The following user right(s) are required based on other user right(s)\:
%s +missingRequiredUserRightsLargeDependency = [%s] required by %d enabled user rights, e. g. '%s'
+missingRequiredUserRightsNoDependency = [%s]
+missingRequiredUserRightsSmallDependency = [%s] required by '%s'
+cantRemoveLastRole = Cannot remove the last user role of the user +removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit user right of currently logged in user +removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user +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 +latitudeBetween = Latitude must be between -90 and 90 +longitudeBetween = Longitude must be between -180 and 180 +defaultInfrastructureAlreadyExisting = There already is another default %s in the database. Only one default %s is allowed. +defaultInfrastructureInvalidParentRegion = This district is in a different region than the default region, or there is no default region. +defaultInfrastructureInvalidParentDistrict = This community is in a different district than the default district, or there is no default district. +defaultInfrastructureNotRemovableChildCommunity = You have to remove the default community before removing the default district. +defaultInfrastructureNotRemovableChildDistrict = You have to remove the default district before removing the default region. +emailTemplateSubjectInvalid=The first line of the email template needs to start with a "\#" character followed by at most 50 characters +customizableEnumValueAllowedCharacters = Value may only consist of uppercase letters, numbers, and the characters "_" and ".". +customizableEnumValueEmptyTranslations = Please select languages and enter captions for all translations in the list. +customizableEnumValueDuplicateLanguage = Please only add one translation per language. +customizableEnumValueDuplicateValue = The value %s already exists for data type %s. Enum values have to be unique. +attachedDocumentNotRelatedToEntity=The attached document is not related to the entity. +invalidNationalHealthId=This value does not seem to be a correct national health ID \ No newline at end of file diff --git a/sormas-app/app/src/main/res/values-es-rBO/strings.xml b/sormas-app/app/src/main/res/values-es-rBO/strings.xml new file mode 100644 index 00000000000..27c4cf1cbc3 --- /dev/null +++ b/sormas-app/app/src/main/res/values-es-rBO/strings.xml @@ -0,0 +1,704 @@ + + + + + SORMAS + and + No + Not answered + System + Yes + All + completed + Add Missing Case + Allow GPS Access + Apply filters + Back to settings + Cancel + Change PIN + Change Settings + Clear + Clear All + Close SORMAS + Confirm + Create + Create a case for this contact person + Create a case for this event participant + Create treatment + Edit data + Delete + Dismiss + Done + Download + Download in background + Later + Edit + Edit Case + Edit Contact + Edit Environment + Edit Event + Edit Sample + Edit Environment Sample + Forgot PIN? + Help + Install + Install later + Load more + Sign in + Sign in as demo user + Logout + Logout anyway + Mark all as read + New + New Case + New Immunization + New Campaign Form Data + New Contact + New Environment + New Event + New Sample + New Environment Sample + New Task + Not Executable + OK + Open Case of Event Participant + Open Prescription + Open Resulting Case + Open Source Case + Open Linked Case + Link Case + Synchronization conflicts + Options + Pick current GPS for address + Redownload + Redownload later + Refer case from Point of Entry + Report Problem + Re-synchronize data + Reset filters + Save + Save Case + Save Clinical Visit + Save Contact + Save Event + Save Event Participant + Save Prescription + Save Sample + Save Environment Sample + Save Task + Save Treatment + Save Follow-up Visit + Select + Send + Set Cleared to No + Set Cleared to Unknown + View classification rules + Submit Weekly Report + Sync + Transfer case + Try again + Turn On GPS + Update search + Save Pathogen Test + Edit Pathogen Test + Submit Case Numbers + LBDS Key Exchange + LBDS Sync Persons + LBDS Sync Cases + Save Vaccination + Edit Vaccination + Address + Age + Attended by + Clinical Assessments + Case Contacts + Epidemiological Info + Case Fatality Rate + Pre-Existing Conditions + Hospitalization Info + Case Information + Maternal History + Port Health Info + Prescriptions + Case Samples + Case Tasks + Case Events + Case Immunizations + Case Vaccinations + Treatments + Create a new case + Changed data lost during re-sync. + Clinical Measurements + Date of Assessment + Assessment Information + Time of Assessment + Confirmation Date: %1$s + Confirmed + Confirmed Case + Confirmed Events + Contact Information + Contact Tasks + Epidemiological info + Follow-Up Information + Contact Immunizations + Contact Vaccinations + Converted to Case + Date of birth (year / month / day) + Date of Sampling + Close navigation drawer + Open navigation drawer + Dropped + Epi Week + Report + E-mail: + Environment Information + Environment Samples + Environment Tasks + Environment Sample Information + Description + Event Information + Location + Event Participant + Event participant Immunizations + Event participant Vaccinations + Event Participants + Date of event + Event Tasks + Executed by + Place of stay + Fatalities + First Name + Sex + Inadequate Specimen + Indeterminate + Informant Reports + Issued on + Last case + Last Name + Localisation of the lesions + Message + My Reports + Negative + New Case + New Contact + New Event Participant + New Sample + New Pathogen Test + New Task + Not a Contact + Not an Event + Outbreaks + Password + Patient Information + Pending + Period End + Period Start + Person Information + Phone number: + Positive + Possible Events + Prescribed by + Present Condition + Probable Case + Use Rapid Case Entry + Report Date: %1$s + Number of cases you have reported + Number of cases informants have reported + Resulting Case Status + Resulting Case UUID + SYNC + Signals + Sample Information + Server URL + Smallpox Vaccination Scar + Suspected Case + Symptom Information + Symptom onset + Filter Task Assignees + Task Information + Tasks Done + Tasks Not Executable + Tasks Pending + Tasks Removed + Time of Sampling + Total Cases + Total Contacts + Total Events + Total Samples + Total Tasks + Unconfirmed + Username + Date of Visit + Visit Information + Symptom Information + Time of Visit + Year + Latest Submission: %1$s + LBDS Server Debug URL + Immunization details + Vaccinations + Vaccination Information + New Immunization + Overwrite immunization management status + Search case + New cases + Lab confirmations + Deaths + C + L + D + Existing start date + Existing end date + %1$s. Sending new data… + %1$s. Pulling infrastructure data… + %1$s. Clearing up infrastructure data… + %1$s. Deleting obsolete data… + %1$s. Clearing up data… + %1$s. Synchronizing data… + %1$s. Pulling modified data… + %1$s. Repulling all data… + %1$s pulled + %1$s/%2$s pushed + %1$s deleted + ID, title, description + Are you sure you want to do this? + Are you sure you want to delete this record? + Are you in this place right now? + Are you sure you want to extend the quarantine? + Are you sure you want to reduce the quarantine? + Would you also want the follow-up period to be extended accordingly? + 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? + Epi Week + First Name + Last Name + Password + Period End + Period Start + Your Message + SORMAS Logo + Username + Year + Report + Case + Contact + Event + Sample + Task + An error occurred while trying to transfer the case. + An error occurred while trying to refer the case. + Changes dropped because you have no longer access to this entity. + An internal error occurred. Please contact an administrator. + A list entry you modified was deleted: + Could not connect to SORMAS server. Try again later. + Synchronization failed. Please try again later. + Could not communicate with SORMAS server. Try again later. + the pathogen test has no lab user + General comment + Additional Medical Information + Addresses + Animal Contacts + App download failed + Downloading + App update required + Burial + Burials Visited + Campaign Data Listing + Case disease has changed + Edit Case + New Case + Read Case + Case Summary + Infrastructure data has changed + Case Listing + Classification for + Clinical Assessment + New Clinical Assessment + Complications + Confirm PIN + Confirmation + Edit Contact + Contact information + New Contact + Read Contact + Contact Summary + Contact Visit + Contact Listing + Create New PIN + Create PIN + Disease Detection + Disease Prevention + Enter PIN + Environmental Exposure + Epidemiological Info + Error! + Oops, something went wrong. + Edit Event + New Event + Event Participant + New Event Participant + Read Event + Event Summary + Event Listing + Existing Persons + Existing Cases + Existing Immunizations + Existing Events + Gathering + Turn On GPS + Allow GPS Access + Pre-Existing Conditions + Help + Informant Reports + Ready to install + App installation failed + Location + Missing Weekly Report + Most Recent Additional Tests + Most Recent Hospitalization + Most Recent Pathogen Test + New SORMAS version + Outbreak Response + Person contact details + Pick or Create Person + Pick or Create a Case + Pick or Create an Immunization + Pick or Create a Event + Prescription + Edit Prescription + New Prescription + Previous Hospitalization + Previous Hospitalizations + Refer Case from Point of Entry + Reset PIN + Response Management & Analysis System + 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 + Read Environment + Environment location update + Edit Immunization + New Immunization + Read Immunization + Immunization Listing + Edit Pathogen Test + New Pathogen Test + Read Pathogen Test + Pathogen Test Summary + Pathogen Test Listing + Sign In + Social Events + Source Case + Source of Information + Surveillance Outbreak + Signs & Symptoms + Synchronization Conflicts + Synchronizing with server… + Task + Check sormas task + Read Task + Task Summary + Task Listing + Transfer Case + Travel + Travels + Treatment + Edit Treatment + New Treatment + Unsynchronized Changes + Report a problem + Change Laboratory Result + Change case disease + Extend quarantine + Reduce quarantine + Extend follow-up period + First contact with Contact Tracing + Exposure + Activity as Case + Edit Campaign Data + New Campaign Data + Read Campaign Data + Campaign Data Summary + Select Campaign Form + Place of stay + Vaccination + 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. + Please enter the PIN again. + No summary to display for the %1$s section. + Please enter your authentication PIN. + Enter your current PIN. + Please enter a location + First Name + Last Name + Your Password + Username + Please choose a new four-digit PIN to authenticate when opening the SORMAS app in the future. + Please enter the new PIN again. + No coordinates picked + No entries + There were no records found. + There were no records found. To add a new record, press the \"+\" symbol at the top right of the toolbar. + There are no synchronization conflicts to display. + Your Message + No report submitted + Pick a Date + Pick a Time + Select Day + Select Option + Select Month + Select Epi Week + Select Year + Select Report + e.g. https://sormas.helmholtz-hzi.de/sormas-rest/ + You need to confirm the report for last week. + No data available for this epi week. + Case numbers not submitted yet + Contact ID or contact person name + e.g. https://localhost:6070/sormas-rest/ + ERROR + * + * + WARN + Are you sure you want to submit these case numbers for the selected epi week? + Downloading new SORMAS version... Depending on your internet connection, this may take a while. + If you could not find a person that matches the personal details you have entered, click the \"Create\" button. + If you could not find the Event in the list above, click the \"Create\" button. + Please indicate if any of the following is relevant for the patient during the incubation period or illness. + Initial synchronizing with SORMAS server.\nPulling infrastructure data will take a few minutes. + LBDS Sync: Key Exchange started + LBDS Sync: Key Exchange successful + LBDS Sync. No case to transfer + LBDS Sync. No person to transfer + No additional tests performed on this sample yet + Sample has not been tested yet + Please look through this list of persons. If you feel certain that the personal details you have entered belong to one of these persons, select that person by tapping on them and then click the \"Select\" button below. + To reset your PIN you will need your SORMAS user password. + Re-sync will probably take several minutes. + Please select a person or click \'Create\' to create a new one. + Sign into SORMAS to continue the journey of saving lives. + SORMAS already contains at least one person that seems to be very similar to the personal details you have entered. + Please select an answer for ALL symptoms indicating if they occurred during this illness between symptom onset and case detection: + Synchronizing with SORMAS server... + Please briefly describe the problem you have experienced. Don\'t enter any personal or otherwise sensitive data! + There is at least one existing case in the database that seems very similar to the one you are about to create. Please do one of the following:\n\n\u2022 Tap on a case that you are sure is the same case that you were about to create\n\u2022 Scroll to the bottom of this window and check the check box if you are sure that your case is a new case\n\nClick on the button in the bottom right to confirm your choice. + The list below contains all existing events having the same disease as the current case from your Region. Please check whether the event this case belongs to is already on this list or create a new one if it is not. + This case is a new case and not a duplicate of one of the cases above + This event is a new event and not a duplicate of one of the events above + Please select a campaign form for which you want to enter data! + Override existing immunization> + Cases + Contacts + Dashboard + Events + Reports + Samples + Environments + Environment Samples + Immunizations + Settings + Tasks + mSERS + Already saving.. + Attention: Duplicate reports have been found for the above criteria. Diseases marked with red already have reports. + Age groups marked \"Expired\" are based on existing data for an age group that is no longer used. + You have changed the infrastructure data of this case. Do you want to transfer the case to the new health facility (the hospitalization data will be updated) or do you only want to edit the data to correct a mistake? + The download of the new SORMAS version failed. Please make sure you have the best internet connection possible and try again or inform a supervisor if you keep getting this error despite a good internet connection. + Please enter a password. + Please enter a username. + SORMAS requires device encryption to be activated on your device to ensure data security.\n\nPlease note that you cannot use the application as long as device encryption is disabled. + Please enter a first and last name for the new person. + %1$s refreshed. Unsaved changes discarded. + SORMAS needs access to your GPS location for all of its features to work as intended. Please click on \"Turn On GPS\" to enable the required functionality on your device. + SORMAS needs access to your GPS location for all of its features to work as intended. Please click on \"Allow GPS Access\" to allow SORMAS to access the required functionality on your device. + No GPS coordinates could be found. + Could not authenticate. Please check your username and password. + You do not have the needed permissions. Please contact the support. + Could not find a SORMAS server at \'%s\' + No SORMAS server defined in settings. + SORMAS server is temporarily not available. + A new SORMAS version is ready to install. Please click on \'Install\' to continue. You will need to restart the app after the update has been completed. + There was an error installing the new SORMAS version. Maybe the downloaded file was incomplete because of an interrupted download. Please click on \'Redownload\' to try again or inform a supervisor if this error occurs again. + There was an error installing the new SORMAS version. Your supervisor will automatically be notified about this issue. + You are not connected to the internet. + No matching persons found. + There are no more entries to display. + No user has been selected + Not specified + PIN has been successfully changed. + PIN correct. Starting SORMAS ... + PIN must not be made of consecutive numbers. + PIN must not have more than 2 equal numbers. + The PINs you\'ve entered do not match. Please try again. + PIN has to be four digits long. + You\'ve entered an incorrect PIN. + Unable to send report at this time. + Problem report successfully sent. + %1$s could not be saved because of an internal error. + You do not have permission to edit the record from this jurisdiction. + %1$s saved successfully. + Application settings has been changed. + Welcome! Please start by entering the URL of your SORMAS server. Afterwards you can log-in with your user name and password. + Synchronization conflicts detected. Please check the Sync Log to review them. + Some entries could not be synchronized. Please try again later. + Synchronization successful. + An assignee reply is required when setting the task status to not executable. + There are unsynchronized changes on your device.\nIf you proceed, they will be lost and you will not be able to restore them. + A new version of the SORMAS app is available. It is strongly recommended to download it by clicking the \'Download\' button below. + Could not synchronize because the app version is newer than the server version. + Thank you for submitting your weekly report. + Thank you for submitting your collected case numbers. + The result of this pathogen test differs from the current final laboratory result of the sample. Do you want to update the final laboratory result? + Really change case disease? + Yes, change disease + The language could not be changed due to an internal error. + The new event to be linked to case has a different disease than case disease + The event has already been linked to this case + It is not possible to create cases from an event participant if the disease of the event has not been set + New or Updated Tasks + Receive a notification when a new task is assigned to you or a task assigned to you has been edited + Important Case Changes + Receive a notification when important details of your cases have changed + Server: + Yours: + rowItemSelectOrCreatePerson + rowItemSelectOrCreateEvent + rowItemPickOrCreatePerson + rowItemImmunizationPickOrCreatePerson + within almost two years + tomorrow + within about an hour + within one minute + within about a month + next week + within about a year + within over a year + within %1$s days + within %1$s hours + within %1$s minutes + within %1$s months + within %1$s weeks + within %1$s years + just now + almost two years ago + today + yesterday + about an hour ago + a min ago + about a month ago + last week + about a year ago + over a year ago + %1$s days ago + %1$s hours ago + %1$s mins ago + %1$s months ago + %1$s weeks ago + %1$s years ago + To learn more about the error on a specific field and how to solve it, click on the ERROR indicator next to its caption. + Please enter a valid value for + A value is required for this field. Please make sure to type in or select a value before continuing. + Please add an entry to the list if there is any data available to you. + This case should be classified as soon as the required information is available. + Case classification does not correspond to lab results and symptoms of the case. + The EPID number does not match the required pattern. You may still save the case and enter the correct number later. + An EPID number has to be provided. You may still save the case and enter the correct number later. + Temperature is in fever range. Fever should be set to \'Yes\'. + The visit cannot be more than 30 days after the end of the follow-up duration. + The visit cannot be more than 30 days before the last contact date. + The visit cannot be more than 30 days before the contact report date. + Unknown + Age N/A + Blood Pressure N/A + Case ID N/A + Comment N/A + Proximity N/A + Contact ID N/A + Date N/A + Description N/A + Disease N/A + Event N/A + Executing Clinician N/A + Health Facility N/A + Frequency N/A + Sex N/A + Heart Rate N/A + Specimen condition not adequate + Lab N/A + Location N/A + Missing report + No Resulting Case + No Username + N/A + Person N/A + Point of Entry N/A + Prescribing Clinician N/A + Date Prescription Issued N/A + Prescription Period N/A + Report Date N/A + Role Unassigned + Sampling Date N/A + Material N/A + Test Result N/A + Status N/A + Task Date N/A + Priority N/A + Type N/A + Temperature N/A + Treatment Date N/A + Type N/A + ID N/A + ExternalID N/A + Visit Date N/A + Remarks N/A + Visit Time N/A + Attending Clinician N/A + Investigation Status N/A + Could not find sample + No camera permission + Access to the camera is needed for detection + Scan field sample id + Facility category + Facility type + Vaccination Date N/A + Vaccine N/A + Manufacturer N/A + Environment Name N/A + Use rapid event participant entry + Environment Media N/A + diff --git a/sormas-app/app/src/main/res/values-es-rBO/strings_format.xml b/sormas-app/app/src/main/res/values-es-rBO/strings_format.xml new file mode 100644 index 00000000000..917b686687e --- /dev/null +++ b/sormas-app/app/src/main/res/values-es-rBO/strings_format.xml @@ -0,0 +1,37 @@ + + + + %1$s %2$s (%3$s) + %1$s: %2$s %3$s (%4$s) + %1$s - %2$s + due %1$s + LBDS Sync Response. Cases transferred: %1$d , ignored: %2$d + LBDS Sync Response. Persons transferred: %1$d , ignored: %2$d + LBDS Sync. Sending cases: %1$d + LBDS Sync. Sending persons: %1$d + There are unsynchronized changes on your device.\nIf you proceed, they will be lost and you will not be able to restore them. Type the word %1$s into the text field below to continue. + %1$s + %1$d visits (%2$d missed) + %1$s %2$s + Report submitted %1$s + %1$s: %2$s + %1$s %2$s + %1$s (%2$s) + %1$s - %2$s + From bf1488debfb96b537a76b0501e235251e0ae44a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 7 Feb 2024 10:41:37 +0100 Subject: [PATCH 16/65] #12662 - Don't show case creation prompt --- .../ui/samples/PathogenTestController.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) 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 82c91e88f42..b649828a8d2 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 @@ -405,12 +405,10 @@ private void handleAssociatedContact(List pathogenTests, Contac .filter(t -> t.getTestResult() == PathogenTestResultType.NEGATIVE && t.getTestResultVerified()) .findFirst(); - final boolean isCaseSurveillanceFeatureEnabled = - FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CASE_SURVEILANCE); + final boolean caseCreationPossible = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CASE_SURVEILANCE) + && UserProvider.getCurrent().hasUserRight(UserRight.CASE_CREATE); if (positiveWithSameDisease.isPresent()) { - if (contact.getResultingCase() == null - && !ContactStatus.CONVERTED.equals(contact.getContactStatus()) - && isCaseSurveillanceFeatureEnabled) { + if (contact.getResultingCase() == null && !ContactStatus.CONVERTED.equals(contact.getContactStatus()) && caseCreationPossible) { showConvertContactToCaseDialog( contact, converted -> handleCaseCreationFromContactOrEventParticipant(converted, positiveWithSameDisease.get())); @@ -421,7 +419,7 @@ private void handleAssociatedContact(List pathogenTests, Contac showChangeAssociatedSampleResultDialog(negativeWithSameDisease.get(), null); } - if (isCaseSurveillanceFeatureEnabled) { + if (caseCreationPossible) { testsByDisease.keySet().stream().filter(disease -> disease != contact.getDisease()).forEach((disease) -> { List tests = testsByDisease.get(disease); @@ -471,11 +469,11 @@ private void handleAssociatedEventParticipant(List pathogenTest .filter(t -> t.getTestResult() == PathogenTestResultType.NEGATIVE && t.getTestResultVerified()) .findFirst(); - final boolean isCaseSurveillanceFeatureEnabled = - FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CASE_SURVEILANCE); + final boolean caseCreationPossible = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CASE_SURVEILANCE) + && UserProvider.getCurrent().hasUserRight(UserRight.CASE_CREATE); if (positiveWithSameDisease.isPresent()) { - if (eventParticipant.getResultingCase() == null && isCaseSurveillanceFeatureEnabled) { + if (eventParticipant.getResultingCase() == null && caseCreationPossible) { showConvertEventParticipantToCaseDialog(eventParticipant, positiveWithSameDisease.get().getTestedDisease(), caseCreated -> { handleCaseCreationFromContactOrEventParticipant(caseCreated, positiveWithSameDisease.get()); }); @@ -486,7 +484,7 @@ private void handleAssociatedEventParticipant(List pathogenTest showChangeAssociatedSampleResultDialog(negativeWithSameDisease.get(), null); } - if (isCaseSurveillanceFeatureEnabled) { + if (caseCreationPossible) { testsByDisease.keySet().stream().filter(disease -> disease != eventDisease).forEach((disease) -> { List tests = testsByDisease.get(disease); From cf3a62e4385533d8b9103c67aeee45f9397538ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 7 Feb 2024 11:14:03 +0100 Subject: [PATCH 17/65] #12859 - Only display restore bulk action in delete grids (#12938) * #12859 - Only display restore bulk action in delete grids --- .../de/symeda/sormas/ui/caze/CasesView.java | 188 +++++++++--------- .../sormas/ui/contact/ContactsView.java | 108 +++++----- .../ui/events/EventParticipantsView.java | 80 ++++---- .../symeda/sormas/ui/events/EventsView.java | 143 ++++++------- 4 files changed, 263 insertions(+), 256 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 3e4d5406288..04eb4da0136 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 @@ -717,110 +717,116 @@ public HorizontalLayout createStatusFilterBar() { final List menuBarItems = new ArrayList<>(); - menuBarItems.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkEdit), VaadinIcons.ELLIPSIS_H, mi -> { - grid.bulkActionHandler( - items -> ControllerProvider.getCaseController().showBulkCaseDataEditComponent(items, (AbstractCaseGrid) grid)); - }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_EDIT))); if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + menuBarItems.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkEdit), VaadinIcons.ELLIPSIS_H, mi -> { + grid.bulkActionHandler( + items -> ControllerProvider.getCaseController().showBulkCaseDataEditComponent(items, (AbstractCaseGrid) grid)); + }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_EDIT))); menuBarItems.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, mi -> { grid.bulkActionHandler( items -> ControllerProvider.getCaseController().deleteAllSelectedItems(items, (AbstractCaseGrid) grid), true); }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE))); - } else { - menuBarItems - .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, mi -> { + + final boolean externalMessagesEnabled = + FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.MANUAL_EXTERNAL_MESSAGES); + final boolean isSmsServiceSetUp = FacadeProvider.getConfigFacade().isSmsServiceSetUp(); + if (isSmsServiceSetUp + && externalMessagesEnabled + && UserProvider.getCurrent().hasUserRight(UserRight.SEND_MANUAL_EXTERNAL_MESSAGES)) { + menuBarItems.add( + new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.messagesSendSMS), VaadinIcons.MOBILE_RETRO, mi -> { + grid.bulkActionHandler( + items -> ControllerProvider.getCaseController().sendSmsToAllSelectedItems(items, () -> navigateTo(criteria))); + }, hasBulkOperationsRight)); + } + menuBarItems.add( + new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.actionArchiveCoreEntity), VaadinIcons.ARCHIVE, mi -> { grid.bulkActionHandler( - items -> ControllerProvider.getCaseController().restoreSelectedCases(items, (AbstractCaseGrid) grid), + items -> ControllerProvider.getCaseController().archiveAllSelectedItems(items, (AbstractCaseGrid) grid), true); - }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE))); - } - final boolean externalMessagesEnabled = - FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.MANUAL_EXTERNAL_MESSAGES); - final boolean isSmsServiceSetUp = FacadeProvider.getConfigFacade().isSmsServiceSetUp(); - if (isSmsServiceSetUp - && externalMessagesEnabled - && UserProvider.getCurrent().hasUserRight(UserRight.SEND_MANUAL_EXTERNAL_MESSAGES)) { + }, + 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 + && UserProvider.getCurrent().hasUserRight(UserRight.CASE_ARCHIVE) + && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); menuBarItems - .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.messagesSendSMS), VaadinIcons.MOBILE_RETRO, mi -> { + .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.sormasToSormasShare), VaadinIcons.SHARE, mi -> { grid.bulkActionHandler( - items -> ControllerProvider.getCaseController().sendSmsToAllSelectedItems(items, () -> navigateTo(criteria))); - }, hasBulkOperationsRight)); - } - menuBarItems - .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.actionArchiveCoreEntity), VaadinIcons.ARCHIVE, mi -> { - grid.bulkActionHandler( - items -> ControllerProvider.getCaseController().archiveAllSelectedItems(items, (AbstractCaseGrid) grid), - true); - }, - 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 - && 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))); - }, - FacadeProvider.getFeatureConfigurationFacade() - .isPropertyValueTrue(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS, FeatureTypeProperty.S2S_SHARING) - && FacadeProvider.getSormasToSormasFacade().isSharingCasesEnabledForUser())); - menuBarItems.add( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.ExternalSurveillanceToolGateway_send), - VaadinIcons.SHARE, - mi -> { - grid.bulkActionHandler(items -> { - if (getSelectedCases(caseGrid).isEmpty()) { - showNoCasesSelectedWarning(caseGrid); - return; - } - - ControllerProvider.getCaseController().sendCasesToExternalSurveillanceTool(items, (AbstractCaseGrid) grid); - }); + items -> ControllerProvider.getSormasToSormasController().shareSelectedCases(items, () -> navigateTo(criteria))); }, - UserProvider.getCurrent().hasUserRight(UserRight.EXTERNAL_SURVEILLANCE_SHARE) - && FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); - - if (isDocGenerationAllowed()) { - menuBarItems.add( - new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkActionCreatDocuments), VaadinIcons.FILE_TEXT, mi -> { - grid.bulkActionHandler(items -> { - List references = caseGrid.asMultiSelect() - .getSelectedItems() - .stream() - .map(CaseIndexDto::toReference) - .collect(Collectors.toList()); - - if (references.size() == 0) { - new Notification( - I18nProperties.getString(Strings.headingNoCasesSelected), - I18nProperties.getString(Strings.messageNoCasesSelected), - Notification.Type.WARNING_MESSAGE, - false).show(Page.getCurrent()); - return; - } - - ControllerProvider.getDocGenerationController() - .showBulkQuarantineOrderDocumentDialog(references, DocumentWorkflow.QUARANTINE_ORDER_CASE); - }); - })); - } - - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EVENT_SURVEILLANCE)) { + FacadeProvider.getFeatureConfigurationFacade() + .isPropertyValueTrue(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS, FeatureTypeProperty.S2S_SHARING) + && FacadeProvider.getSormasToSormasFacade().isSharingCasesEnabledForUser())); menuBarItems.add( new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkLinkToEvent), - VaadinIcons.PHONE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getCaseController().linkSelectedCasesToEvent(items, (AbstractCaseGrid) grid)))); + I18nProperties.getCaption(Captions.ExternalSurveillanceToolGateway_send), + VaadinIcons.SHARE, + mi -> { + grid.bulkActionHandler(items -> { + if (getSelectedCases(caseGrid).isEmpty()) { + showNoCasesSelectedWarning(caseGrid); + return; + } + + ControllerProvider.getCaseController().sendCasesToExternalSurveillanceTool(items, (AbstractCaseGrid) grid); + }); + }, + UserProvider.getCurrent().hasUserRight(UserRight.EXTERNAL_SURVEILLANCE_SHARE) + && FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); + + if (isDocGenerationAllowed()) { + menuBarItems.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkActionCreatDocuments), + VaadinIcons.FILE_TEXT, + mi -> { + grid.bulkActionHandler(items -> { + List references = caseGrid.asMultiSelect() + .getSelectedItems() + .stream() + .map(CaseIndexDto::toReference) + .collect(Collectors.toList()); + + if (references.size() == 0) { + new Notification( + I18nProperties.getString(Strings.headingNoCasesSelected), + I18nProperties.getString(Strings.messageNoCasesSelected), + Notification.Type.WARNING_MESSAGE, + false).show(Page.getCurrent()); + return; + } + + ControllerProvider.getDocGenerationController() + .showBulkQuarantineOrderDocumentDialog(references, DocumentWorkflow.QUARANTINE_ORDER_CASE); + }); + })); + } + + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EVENT_SURVEILLANCE)) { + menuBarItems.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkLinkToEvent), + VaadinIcons.PHONE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getCaseController() + .linkSelectedCasesToEvent(items, (AbstractCaseGrid) grid)))); + } + } 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 && UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE))); } bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, menuBarItems); 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 b6c172a6d1c..5d5d74d636b 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 @@ -514,9 +514,10 @@ public HorizontalLayout createStatusFilterBar() { boolean hasBulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS); - List bulkActions = new ArrayList<>( - Arrays - .asList( + List bulkActions; + if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + bulkActions = new ArrayList<>( + Arrays.asList( new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.bulkEdit), VaadinIcons.ELLIPSIS_H, @@ -538,23 +539,13 @@ public HorizontalLayout createStatusFilterBar() { items -> ControllerProvider.getContactController() .setAllSelectedItemsToLostToFollowUp(items, null, (AbstractContactGrid) grid)), hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EDIT)), - 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.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.actionArchiveCoreEntity), VaadinIcons.ARCHIVE, @@ -568,8 +559,7 @@ public HorizontalLayout createStatusFilterBar() { I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), VaadinIcons.ARCHIVE, mi -> grid.bulkActionHandler( - items -> ControllerProvider - .getContactController() + items -> ControllerProvider.getContactController() .dearchiveAllSelectedItems(items, (AbstractContactGrid) grid), true), hasBulkOperationsRight @@ -585,41 +575,51 @@ public HorizontalLayout createStatusFilterBar() { .isPropertyValueTrue(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS, FeatureTypeProperty.S2S_SHARING) && FacadeProvider.getSormasToSormasFacade().isSharingContactsEnabledForUser()))); - if (isDocGenerationAllowed() && grid instanceof AbstractContactGrid) { - bulkActions.add( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkActionCreatDocuments), - VaadinIcons.FILE_TEXT, - mi -> grid.bulkActionHandler(items -> { - List references = ((AbstractContactGrid) grid).asMultiSelect() - .getSelectedItems() - .stream() - .map(ContactIndexDto::toReference) - .collect(Collectors.toList()); - - if (references.size() == 0) { - new Notification( - I18nProperties.getString(Strings.headingNoContactsSelected), - I18nProperties.getString(Strings.messageNoContactsSelected), - Notification.Type.WARNING_MESSAGE, - false).show(Page.getCurrent()); - - return; - } - - ControllerProvider.getDocGenerationController() - .showBulkQuarantineOrderDocumentDialog(references, DocumentWorkflow.QUARANTINE_ORDER_CONTACT); - }))); - } + if (isDocGenerationAllowed() && grid instanceof AbstractContactGrid) { + bulkActions.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkActionCreatDocuments), + VaadinIcons.FILE_TEXT, + mi -> grid.bulkActionHandler(items -> { + List references = ((AbstractContactGrid) grid).asMultiSelect() + .getSelectedItems() + .stream() + .map(ContactIndexDto::toReference) + .collect(Collectors.toList()); + + if (references.size() == 0) { + new Notification( + I18nProperties.getString(Strings.headingNoContactsSelected), + I18nProperties.getString(Strings.messageNoContactsSelected), + Notification.Type.WARNING_MESSAGE, + false).show(Page.getCurrent()); + + return; + } + + ControllerProvider.getDocGenerationController() + .showBulkQuarantineOrderDocumentDialog(references, DocumentWorkflow.QUARANTINE_ORDER_CONTACT); + }))); + } - if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EVENT_SURVEILLANCE)) { - bulkActions.add( + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EVENT_SURVEILLANCE)) { + bulkActions.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkLinkToEvent), + VaadinIcons.PHONE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getContactController() + .linkSelectedContactsToEvent(items, (AbstractContactGrid) grid)))); + } + } else { + bulkActions = List.of( new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkLinkToEvent), - VaadinIcons.PHONE, + I18nProperties.getCaption(Captions.bulkRestore), + VaadinIcons.ARROW_BACKWARD, mi -> grid.bulkActionHandler( - items -> ControllerProvider.getContactController() - .linkSelectedContactsToEvent(items, (AbstractContactGrid) grid)))); + items -> ControllerProvider.getContactController().restoreSelectedContacts(items, (AbstractContactGrid) grid), + true), + hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_DELETE))); } bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, bulkActions); 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 7c04d978b57..969ef9838f9 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 @@ -214,53 +214,53 @@ public HorizontalLayout createTopBar() { topLayout.setWidth(100, Unit.PERCENTAGE); List bulkActions = new ArrayList<>(); - bulkActions - .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkEventParticipantsToContacts), VaadinIcons.HAND, mi -> { - grid.bulkActionHandler(items -> { - EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); - ControllerProvider.getContactController().openLineListingWindow(eventDto, items); - }, true); - })); - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_DELETE)) { - if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { - bulkActions.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, mi -> { + if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + bulkActions + .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkEventParticipantsToContacts), VaadinIcons.HAND, mi -> { grid.bulkActionHandler(items -> { - ControllerProvider.getEventParticipantController().deleteAllSelectedItems(items, grid, () -> grid.reload()); + EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); + ControllerProvider.getContactController().openLineListingWindow(eventDto, items); }, true); })); - } else { - bulkActions.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, mi -> { + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_DELETE)) { + bulkActions.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, mi -> { grid.bulkActionHandler(items -> { - ControllerProvider.getEventParticipantController().restoreSelectedEventParticipants(items, grid, () -> grid.reload()); + ControllerProvider.getEventParticipantController().deleteAllSelectedItems(items, grid, () -> grid.reload()); }, true); })); } - } - if (isDocGenerationAllowed()) { - bulkActions - .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkActionCreatDocuments), VaadinIcons.FILE_TEXT, mi -> { - grid.bulkActionHandler(items -> { - List references = grid.asMultiSelect() - .getSelectedItems() - .stream() - .map(EventParticipantIndexDto::toReference) - .collect(Collectors.toList()); - if (references.size() == 0) { - new Notification( - I18nProperties.getString(Strings.headingNoEventParticipantsSelected), - I18nProperties.getString(Strings.messageNoEventParticipantsSelected), - Notification.Type.WARNING_MESSAGE, - false).show(Page.getCurrent()); - - return; - } - - EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); - - ControllerProvider.getDocGenerationController() - .showBulkEventParticipantQuarantineOrderDocumentDialog(references, eventDto.getDisease()); - }); - })); + if (isDocGenerationAllowed()) { + bulkActions.add( + new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkActionCreatDocuments), VaadinIcons.FILE_TEXT, mi -> { + grid.bulkActionHandler(items -> { + List references = grid.asMultiSelect() + .getSelectedItems() + .stream() + .map(EventParticipantIndexDto::toReference) + .collect(Collectors.toList()); + if (references.size() == 0) { + new Notification( + I18nProperties.getString(Strings.headingNoEventParticipantsSelected), + I18nProperties.getString(Strings.messageNoEventParticipantsSelected), + Notification.Type.WARNING_MESSAGE, + false).show(Page.getCurrent()); + + return; + } + + EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); + + ControllerProvider.getDocGenerationController() + .showBulkEventParticipantQuarantineOrderDocumentDialog(references, eventDto.getDisease()); + }); + })); + } + } else if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_DELETE)) { + bulkActions.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, mi -> { + grid.bulkActionHandler(items -> { + ControllerProvider.getEventParticipantController().restoreSelectedEventParticipants(items, grid, () -> grid.reload()); + }, true); + })); } bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, bulkActions); 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 dfd151ef9aa..18fec95c498 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 @@ -539,16 +539,16 @@ public HorizontalLayout createStatusFilterBar() { if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_EVENT) && isDefaultViewType()) { EventGrid eventGrid = (EventGrid) grid; List bulkActions = new ArrayList<>(); - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_EDIT)) { - bulkActions.add( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkEdit), - VaadinIcons.ELLIPSIS_H, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getEventController().showBulkEventDataEditComponent(items, (EventGrid) grid)))); - } - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_DELETE)) { - if (eventCriteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + if (eventCriteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_EDIT)) { + bulkActions.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkEdit), + VaadinIcons.ELLIPSIS_H, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getEventController().showBulkEventDataEditComponent(items, (EventGrid) grid)))); + } + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_DELETE)) { bulkActions.add( new MenuBarHelper.MenuBarItem( I18nProperties.getCaption(Captions.bulkDelete), @@ -556,78 +556,79 @@ public HorizontalLayout createStatusFilterBar() { mi -> grid.bulkActionHandler( items -> ControllerProvider.getEventController().deleteAllSelectedItems(items, (EventGrid) grid), true))); - } else { + } + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_ARCHIVE)) { bulkActions.add( new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkRestore), - VaadinIcons.ARROW_BACKWARD, + I18nProperties.getCaption(Captions.actionArchiveCoreEntity), + VaadinIcons.ARCHIVE, mi -> grid.bulkActionHandler( - items -> ControllerProvider.getEventController().restoreSelectedEvents(items, (EventGrid) grid), - true))); + items -> ControllerProvider.getEventController().archiveAllSelectedItems(items, eventGrid), + true), + EntityRelevanceStatus.ACTIVE.equals(eventCriteria.getRelevanceStatus()))); + bulkActions.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), + VaadinIcons.ARCHIVE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getEventController() + .dearchiveAllSelectedItems(eventGrid.asMultiSelect().getSelectedItems(), eventGrid), + true), + EntityRelevanceStatus.ARCHIVED.equals(eventCriteria.getRelevanceStatus()))); + } + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTGROUP_CREATE) + && UserProvider.getCurrent().hasUserRight(UserRight.EVENTGROUP_LINK)) { + bulkActions.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionGroupEvent), + VaadinIcons.FILE_TREE, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getEventController() + .linkAllToGroup(eventGrid.asMultiSelect().getSelectedItems(), eventGrid)))); } - } - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_ARCHIVE)) { - bulkActions.add( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.actionArchiveCoreEntity), - VaadinIcons.ARCHIVE, - mi -> grid - .bulkActionHandler(items -> ControllerProvider.getEventController().archiveAllSelectedItems(items, eventGrid), true), - EntityRelevanceStatus.ACTIVE.equals(eventCriteria.getRelevanceStatus()))); bulkActions.add( new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.actionDearchiveCoreEntity), - VaadinIcons.ARCHIVE, + I18nProperties.getCaption(Captions.ExternalSurveillanceToolGateway_send), + VaadinIcons.SHARE, mi -> grid.bulkActionHandler( items -> ControllerProvider.getEventController() - .dearchiveAllSelectedItems(eventGrid.asMultiSelect().getSelectedItems(), eventGrid), - true), - EntityRelevanceStatus.ARCHIVED.equals(eventCriteria.getRelevanceStatus()))); - } - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTGROUP_CREATE) - && UserProvider.getCurrent().hasUserRight(UserRight.EVENTGROUP_LINK)) { + .sendAllSelectedToExternalSurveillanceTool(eventGrid.asMultiSelect().getSelectedItems(), eventGrid)), + UserProvider.getCurrent().hasUserRight(UserRight.EXTERNAL_SURVEILLANCE_SHARE) + && FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); + + if (isDocGenerationAllowed()) { + bulkActions.add( + new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkActionCreatDocuments), VaadinIcons.FILE_TEXT, mi -> { + grid.bulkActionHandler(items -> { + + EventGrid eventGrid1 = (EventGrid) this.grid; + List references = eventGrid1.asMultiSelect() + .getSelectedItems() + .stream() + .map(EventIndexDto::toReference) + .collect(Collectors.toList()); + if (references.size() == 0) { + new Notification( + I18nProperties.getString(Strings.headingNoEventsSelected), + I18nProperties.getString(Strings.headingNoEventsSelected), + Notification.Type.WARNING_MESSAGE, + false).show(Page.getCurrent()); + + return; + } + + ControllerProvider.getDocGenerationController().showEventDocumentDialog(references); + }); + })); + } + } else if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_DELETE)) { bulkActions.add( new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.actionGroupEvent), - VaadinIcons.FILE_TREE, + I18nProperties.getCaption(Captions.bulkRestore), + VaadinIcons.ARROW_BACKWARD, mi -> grid.bulkActionHandler( - items -> ControllerProvider.getEventController() - .linkAllToGroup(eventGrid.asMultiSelect().getSelectedItems(), eventGrid)))); - } - bulkActions.add( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.ExternalSurveillanceToolGateway_send), - VaadinIcons.SHARE, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getEventController() - .sendAllSelectedToExternalSurveillanceTool(eventGrid.asMultiSelect().getSelectedItems(), eventGrid)), - UserProvider.getCurrent().hasUserRight(UserRight.EXTERNAL_SURVEILLANCE_SHARE) - && FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled())); - - if (isDocGenerationAllowed()) { - bulkActions.add( - new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkActionCreatDocuments), VaadinIcons.FILE_TEXT, mi -> { - grid.bulkActionHandler(items -> { - - EventGrid eventGrid1 = (EventGrid) this.grid; - List references = eventGrid1.asMultiSelect() - .getSelectedItems() - .stream() - .map(EventIndexDto::toReference) - .collect(Collectors.toList()); - if (references.size() == 0) { - new Notification( - I18nProperties.getString(Strings.headingNoEventsSelected), - I18nProperties.getString(Strings.headingNoEventsSelected), - Notification.Type.WARNING_MESSAGE, - false).show(Page.getCurrent()); - - return; - } - - ControllerProvider.getDocGenerationController().showEventDocumentDialog(references); - }); - })); + items -> ControllerProvider.getEventController().restoreSelectedEvents(items, (EventGrid) grid), + true))); } bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, bulkActions); From e48f971e7da4bd69587e55c8abc8bd75bbbf9082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 7 Feb 2024 11:24:58 +0100 Subject: [PATCH 18/65] New Crowdin updates (#12943) * 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 (Spanish, Cuba) * New translations captions.properties (Czech) * 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 (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 captions.properties (Spanish, Cuba) * New translations enum.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) * 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) * 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 captions.properties (Czech) * New translations enum.properties (Czech) * New translations captions.properties (Spanish, Bolivia) * New translations descriptions.properties (Spanish, Bolivia) * New translations enum.properties (Spanish, Bolivia) * New translations strings.properties (Spanish, Bolivia) * New translations validations.properties (Spanish, Bolivia) * New translations strings.xml (Spanish, Bolivia) * New translations strings_format.xml (Spanish, Bolivia) * New translations countries.properties (Spanish, Bolivia) * New translations continents.properties (Spanish, Bolivia) * New translations subcontinents.properties (Spanish, Bolivia) * New translations captions.properties (Polish) * New translations captions.properties (Polish) --- .../main/resources/captions_pl-PL.properties | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index edfde41853e..07e9319837f 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -47,7 +47,7 @@ system=System to=Do total=W sumie notSpecified=Nie określono -noUserSelected=No user selected +noUserSelected=Nie wybrano użytkownika creationDate=Data utworzenia changeDate=Ostatnia aktualizacja notAvailableShort=nd. @@ -2802,16 +2802,16 @@ BAGExport=BAG Export ExternalSurveillanceToolGateway.title=Reporting Tool ExternalSurveillanceToolGateway.send=Send to reporting tool ExternalSurveillanceToolGateway.unableToSend=Unable to send -ExternalSurveillanceToolGateway.confirmSend=Confirm sending +ExternalSurveillanceToolGateway.confirmSend=Potwierdź wysyłanie ExternalSurveillanceToolGateway.notTransferred=Not yet sent to reporting tool -ExternalSurveillanceToolGateway.confirmDelete=Confirm delete +ExternalSurveillanceToolGateway.confirmDelete=Potwierdź usunięcie ExternalSurveillanceToolGateway.excludeAndSend=Send %d of %d patientDiaryRegistrationError=Could not register person in the patient diary. patientDiaryCancelError=Could not cancel external journal follow-up patientDiaryPersonNotExportable=Cannot export the person to the patient diary. The person needs a valid birthdate and either a valid phone number or email address. -showPlacesOnMap=Show -changeUserEmail=Change user email -SurveillanceReport=Report +showPlacesOnMap=Pokaż +changeUserEmail=Zmień adres e-mail użytkownika +SurveillanceReport=Zgłoś SurveillanceReport.uuid=Report-Id SurveillanceReport.reportingType=Type of reporting SurveillanceReport.externalId=External Id @@ -2849,9 +2849,9 @@ userRoleNewUserRole=New User Role UserRole.uuid=Uuid UserRole.userRights=User rights UserRole.emailNotificationTypes=Email notification types -UserRole.enabled=Enabled -UserRole.caption=Caption -UserRole.description=Description +UserRole.enabled=Włączone +UserRole.caption=Podpis +UserRole.description=Opis UserRole.hasOptionalHealthFacility=Has optional health facility UserRole.hasAssociatedDistrictUser=Has associated district user UserRole.jurisdictionLevel=Jurisdiction level @@ -2862,25 +2862,25 @@ UserRole.templateUserRole=User role template UserRole.restrictAccessToAssignedEntities=Restrict access to assigned entities userRoleShowOnlyRestrictedAccessToAssignCases=Only show user roles with access restricted to assigned entities userRoleUserrolesView=User role list -userRoleNotifications=Notifications +userRoleNotifications=Powiadomienia userRoleNotificationTypeSms = SMS -userRoleNotificationTypeEmail = EMAIL -userrole.main=User role -userrole.notifications=Notifications -userrole.applyUserRoleTemplate=Apply user role template +userRoleNotificationTypeEmail = E-MAIL +userrole.main=Rola użytkownika +userrole.notifications=Powiadomienia +userrole.applyUserRoleTemplate=Zastosuj szablon roli użytkownika -notificationType=Notification type -notificationType.group = Group -notificationType.caption = Caption -notificationType.description = Description +notificationType=Typ powiadomienia +notificationType.group = Grupa +notificationType.caption = Podpis +notificationType.description = Opis -SormasToSormasShareRequest.uuid=Request ID -SormasToSormasShareRequest.creationDate=Share date -SormasToSormasShareRequest.dataType=Type +SormasToSormasShareRequest.uuid=ID zapytania +SormasToSormasShareRequest.creationDate=Data udostępnienia +SormasToSormasShareRequest.dataType=Typ SormasToSormasShareRequest.status=Status SormasToSormasShareRequest.cases=Cases SormasToSormasShareRequest.contacts=Contacts -SormasToSormasShareRequest.events=Events +SormasToSormasShareRequest.events=Wydarzenia SormasToSormasShareRequest.organizationName=Sender organization SormasToSormasShareRequest.senderName=Sender name SormasToSormasShareRequest.ownershipHandedOver=Ownership handed over @@ -2888,14 +2888,14 @@ SormasToSormasShareRequest.comment=Comment SormasToSormasShareRequest.responseComment=Response comment SormasToSormasShareRequestIndex.uuid=Share ID SormasToSormasShareRequestIndex.organizationName=From / To (Counterpart) -SormasToSormasPerson.personName=Person name -SormasToSormasPerson.sex=Sex -SormasToSormasPerson.birthdDate=Birth date -SormasToSormasPerson.address=Address +SormasToSormasPerson.personName=Imię i nazwisko +SormasToSormasPerson.sex=Płeć +SormasToSormasPerson.birthdDate=Data urodzenia +SormasToSormasPerson.address=Adres TaskExport.personFirstName=Imię osoby -TaskExport.personLastName=Person last name -TaskExport.personSex=Person sex -TaskExport.personBirthDate=Person birth date +TaskExport.personLastName=Nazwisko osoby +TaskExport.personSex=Płeć osoby +TaskExport.personBirthDate=Data urodzenia osoby TaskExport.personAddressRegion=Person address region TaskExport.personAddressDistrict=Person address district TaskExport.personAddressCommunity=Person address community @@ -2916,13 +2916,13 @@ environmentSampleActiveSamples=Active environment samples environmentSampleArchivedSamples=Archived environment samples environmentSampleAllActiveAndArchivedSamples=All active and archived environment samples environmentSampleDeletedSamples=Deleted environment samples -humanSampleViewType=Human -environmentSampleViewType=Environment -environmentSampleNewSample=New sample -ExternalEmailOptions.templateName=Choose template -ExternalEmailOptions.recipientEmail=Email address -ExternalEmailOptions.attachedDocuments=Attach document(s) -externalEmailUsedTemplate=Template -externalEmailSentBy=Sent by -externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +humanSampleViewType=Człowiek +environmentSampleViewType=Środowisko +environmentSampleNewSample=Nowa próbka +ExternalEmailOptions.templateName=Wybierz szablon +ExternalEmailOptions.recipientEmail=Adres e-mail +ExternalEmailOptions.attachedDocuments=Załącz dokumenty +externalEmailUsedTemplate=Szablon +externalEmailSentBy=Wysłane przez +externalEmailSentTo=Wysłane do +externalEmailAttachedDocuments=Załączone dokumenty \ No newline at end of file From 428fd6eb25030cb85d0ee45b5f99b350aa93c0f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 7 Feb 2024 11:48:35 +0100 Subject: [PATCH 19/65] #12852 - Show layers based on user rights (#12942) * #12852 - Show layers based on user rights --- .../map/BaseDashboardMapComponent.java | 8 +- .../dashboard/map/DashboardMapComponent.java | 156 ++++++++++-------- .../SampleDashboardMapComponent.java | 125 +++++++------- 3 files changed, 153 insertions(+), 136 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java index aca18453ac9..cf463c40fc4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java @@ -207,10 +207,12 @@ private HorizontalLayout createFooter() { addLayerOptions(layersLayout); } - PopupButton layersDropdown = ButtonHelper.createPopupButton(Captions.dashboardMapLayers, layersLayout, CssStyles.BUTTON_SUBTLE); + if (layersLayout.getComponentCount() > 0) { + PopupButton layersDropdown = ButtonHelper.createPopupButton(Captions.dashboardMapLayers, layersLayout, CssStyles.BUTTON_SUBTLE); - mapFooterLayout.addComponent(layersDropdown); - mapFooterLayout.setComponentAlignment(layersDropdown, Alignment.MIDDLE_RIGHT); + mapFooterLayout.addComponent(layersDropdown); + mapFooterLayout.setComponentAlignment(layersDropdown, Alignment.MIDDLE_RIGHT); + } return mapFooterLayout; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 0ddd890c1ad..60b74bf0832 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -66,6 +66,7 @@ import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; import de.symeda.sormas.ui.ControllerProvider; @@ -259,88 +260,97 @@ protected void addLayerOptions(VerticalLayout layersLayout) { refreshMap(true); }); - HorizontalLayout showCasesLayout = new HorizontalLayout(); - { - showCasesLayout.setMargin(false); - showCasesLayout.setSpacing(false); - CheckBox showCasesCheckBox = new CheckBox(); - showCasesCheckBox.setId(Captions.dashboardShowCases); - showCasesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowCases)); - showCasesCheckBox.setValue(showCases); - showCasesCheckBox.addValueChangeListener(e -> { - showCases = (boolean) e.getProperty().getValue(); - mapCaseDisplayModeSelect.setEnabled(showCases); - mapCaseDisplayModeSelect.setValue(mapCaseDisplayMode); - caseClassificationOptions.setEnabled(showCases); - refreshMap(true); - }); - showCasesLayout.addComponent(showCasesCheckBox); - - Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); - infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseMap)); - CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); - infoLabel.setHeightUndefined(); - showCasesLayout.addComponent(infoLabel); - showCasesLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); + if (UserProvider.getCurrent().hasUserRight(UserRight.CASE_VIEW)) { + HorizontalLayout showCasesLayout = new HorizontalLayout(); + { + showCasesLayout.setMargin(false); + showCasesLayout.setSpacing(false); + CheckBox showCasesCheckBox = new CheckBox(); + showCasesCheckBox.setId(Captions.dashboardShowCases); + showCasesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowCases)); + showCasesCheckBox.setValue(showCases); + showCasesCheckBox.addValueChangeListener(e -> { + showCases = (boolean) e.getProperty().getValue(); + mapCaseDisplayModeSelect.setEnabled(showCases); + mapCaseDisplayModeSelect.setValue(mapCaseDisplayMode); + caseClassificationOptions.setEnabled(showCases); + refreshMap(true); + }); + showCasesLayout.addComponent(showCasesCheckBox); + + Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseMap)); + CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); + infoLabel.setHeightUndefined(); + showCasesLayout.addComponent(infoLabel); + showCasesLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); + } + layersLayout.addComponent(showCasesLayout); + + layersLayout.addComponent(mapCaseDisplayModeSelect); + mapCaseDisplayModeSelect.setEnabled(showCases); + + layersLayout.addComponent(caseClassificationOptions); + caseClassificationOptions.setEnabled(showCases); } - layersLayout.addComponent(showCasesLayout); - layersLayout.addComponent(mapCaseDisplayModeSelect); - mapCaseDisplayModeSelect.setEnabled(showCases); + if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_VIEW)) { + CheckBox showConfirmedContactsCheckBox = new CheckBox(); + showConfirmedContactsCheckBox.setId(Captions.dashboardShowConfirmedContacts); + CheckBox showUnconfirmedContactsCheckBox = new CheckBox(); + showUnconfirmedContactsCheckBox.setId(Captions.dashboardShowUnconfirmedContacts); + + CheckBox showContactsCheckBox = new CheckBox(); + showContactsCheckBox.setId(Captions.dashboardShowContacts); + showContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowContacts)); + showContactsCheckBox.setValue(showContacts); + showContactsCheckBox.addValueChangeListener(e -> { + showContacts = (boolean) e.getProperty().getValue(); + showConfirmedContactsCheckBox.setEnabled(showContacts); + showConfirmedContactsCheckBox.setValue(true); + showUnconfirmedContactsCheckBox.setEnabled(showContacts); + showUnconfirmedContactsCheckBox.setValue(true); + refreshMap(true); + }); + layersLayout.addComponent(showContactsCheckBox); - layersLayout.addComponent(caseClassificationOptions); - caseClassificationOptions.setEnabled(showCases); + showConfirmedContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowConfirmedContacts)); + showConfirmedContactsCheckBox.setValue(showConfirmedContacts); + showConfirmedContactsCheckBox.addValueChangeListener(e -> { + showConfirmedContacts = (boolean) e.getProperty().getValue(); + refreshMap(true); + }); + layersLayout.addComponent(showConfirmedContactsCheckBox); - CheckBox showConfirmedContactsCheckBox = new CheckBox(); - showConfirmedContactsCheckBox.setId(Captions.dashboardShowConfirmedContacts); - CheckBox showUnconfirmedContactsCheckBox = new CheckBox(); - showUnconfirmedContactsCheckBox.setId(Captions.dashboardShowUnconfirmedContacts); + CssStyles.style(showUnconfirmedContactsCheckBox, CssStyles.VSPACE_3); + showUnconfirmedContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowUnconfirmedContacts)); + showUnconfirmedContactsCheckBox.setValue(showUnconfirmedContacts); + showUnconfirmedContactsCheckBox.addValueChangeListener(e -> { + showUnconfirmedContacts = (boolean) e.getProperty().getValue(); + refreshMap(true); + }); + layersLayout.addComponent(showUnconfirmedContactsCheckBox); - CheckBox showContactsCheckBox = new CheckBox(); - showContactsCheckBox.setId(Captions.dashboardShowContacts); - showContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowContacts)); - showContactsCheckBox.setValue(showContacts); - showContactsCheckBox.addValueChangeListener(e -> { - showContacts = (boolean) e.getProperty().getValue(); showConfirmedContactsCheckBox.setEnabled(showContacts); - showConfirmedContactsCheckBox.setValue(true); showUnconfirmedContactsCheckBox.setEnabled(showContacts); - showUnconfirmedContactsCheckBox.setValue(true); - refreshMap(true); - }); - layersLayout.addComponent(showContactsCheckBox); + } - showConfirmedContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowConfirmedContacts)); - showConfirmedContactsCheckBox.setValue(showConfirmedContacts); - showConfirmedContactsCheckBox.addValueChangeListener(e -> { - showConfirmedContacts = (boolean) e.getProperty().getValue(); - refreshMap(true); - }); - layersLayout.addComponent(showConfirmedContactsCheckBox); + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENT_VIEW)) { + CheckBox showEventsCheckBox = new CheckBox(); + showEventsCheckBox.setId(Captions.dashboardShowEvents); + CssStyles.style(showEventsCheckBox, CssStyles.VSPACE_3); + showEventsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowEvents)); + showEventsCheckBox.setValue(showEvents); + showEventsCheckBox.addValueChangeListener(e -> { + showEvents = (boolean) e.getProperty().getValue(); + refreshMap(true); + }); + layersLayout.addComponent(showEventsCheckBox); + } - CssStyles.style(showUnconfirmedContactsCheckBox, CssStyles.VSPACE_3); - showUnconfirmedContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowUnconfirmedContacts)); - showUnconfirmedContactsCheckBox.setValue(showUnconfirmedContacts); - showUnconfirmedContactsCheckBox.addValueChangeListener(e -> { - showUnconfirmedContacts = (boolean) e.getProperty().getValue(); - refreshMap(true); - }); - layersLayout.addComponent(showUnconfirmedContactsCheckBox); - - showConfirmedContactsCheckBox.setEnabled(showContacts); - showUnconfirmedContactsCheckBox.setEnabled(showContacts); - - CheckBox showEventsCheckBox = new CheckBox(); - showEventsCheckBox.setId(Captions.dashboardShowEvents); - CssStyles.style(showEventsCheckBox, CssStyles.VSPACE_3); - showEventsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowEvents)); - showEventsCheckBox.setValue(showEvents); - showEventsCheckBox.addValueChangeListener(e -> { - showEvents = (boolean) e.getProperty().getValue(); - refreshMap(true); - }); - layersLayout.addComponent(showEventsCheckBox); - if (nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasNationJurisdictionLevel()) { + if (nonNull(UserProvider.getCurrent()) + && UserProvider.getCurrent().hasNationJurisdictionLevel() + && UserProvider.getCurrent().hasUserRight(UserRight.CASE_VIEW)) { OptionGroup regionMapVisualizationSelect = new OptionGroup(); regionMapVisualizationSelect.setWidth(100, Unit.PERCENTAGE); regionMapVisualizationSelect.addItems((Object[]) CaseMeasure.values()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/components/SampleDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/components/SampleDashboardMapComponent.java index fb293ed1a91..c100648a95e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/components/SampleDashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/components/SampleDashboardMapComponent.java @@ -39,6 +39,7 @@ import de.symeda.sormas.api.sample.SampleAssociationType; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.UiUtil; +import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.dashboard.map.BaseDashboardMapComponent; import de.symeda.sormas.ui.dashboard.sample.SampleDashboardDataProvider; import de.symeda.sormas.ui.map.LeafletMarker; @@ -120,70 +121,74 @@ protected void loadMapData(Date fromDate, Date toDate) { @Override protected void addLayerOptions(VerticalLayout layersLayout) { - CheckBox showCaseSamplesCheckBox = new CheckBox(); - showCaseSamplesCheckBox.setId(Captions.sampleDashboardShowCaseSamples); - showCaseSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowCaseSamples)); - showCaseSamplesCheckBox.setValue(shouldShowCaseSamples()); - showCaseSamplesCheckBox.addValueChangeListener(e -> { - if ((boolean) e.getProperty().getValue()) { - displayedHumanSamples.add(SampleAssociationType.CASE); - } else { - displayedHumanSamples.remove(SampleAssociationType.CASE); - } - - refreshMap(true); - }); - - layersLayout.addComponent(showCaseSamplesCheckBox); - - CheckBox showContactSamplesCheckBox = new CheckBox(); - showContactSamplesCheckBox.setId(Captions.sampleDashboardShowContactSamples); - showContactSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowContactSamples)); - showContactSamplesCheckBox.setValue(shouldShowContactSamples()); - showContactSamplesCheckBox.addValueChangeListener(e -> { - if ((boolean) e.getProperty().getValue()) { - displayedHumanSamples.add(SampleAssociationType.CONTACT); - } else { - displayedHumanSamples.remove(SampleAssociationType.CONTACT); - } - - refreshMap(true); - }); - - layersLayout.addComponent(showContactSamplesCheckBox); - - CheckBox showEventParticipantSamplesCheckBox = new CheckBox(); - showEventParticipantSamplesCheckBox.setId(Captions.sampleDashboardShowEventParticipantSamples); - showEventParticipantSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowEventParticipantSamples)); - showEventParticipantSamplesCheckBox.setValue(shouldShowEventParticipantSamples()); - showEventParticipantSamplesCheckBox.addValueChangeListener(e -> { - if ((boolean) e.getProperty().getValue()) { - displayedHumanSamples.add(SampleAssociationType.EVENT_PARTICIPANT); - } else { - displayedHumanSamples.remove(SampleAssociationType.EVENT_PARTICIPANT); - } - - refreshMap(true); - }); - layersLayout.addComponent(showEventParticipantSamplesCheckBox); - - CheckBox showEnvironmentSamplesCheckBox = new CheckBox(); - showEnvironmentSamplesCheckBox.setId(Captions.sampleDashboardShowEnvironmentSamples); - showEnvironmentSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowEnvironmentSamples)); - showEnvironmentSamplesCheckBox.setValue(shouldShowEventParticipantSamples()); - showEnvironmentSamplesCheckBox.addValueChangeListener(e -> { - if ((boolean) e.getProperty().getValue()) { - showEnvironmentalSamples = true; - } else { - showEnvironmentalSamples = false; - } + if (UserProvider.getCurrent().hasUserRight(UserRight.CASE_VIEW)) { + CheckBox showCaseSamplesCheckBox = new CheckBox(); + showCaseSamplesCheckBox.setId(Captions.sampleDashboardShowCaseSamples); + showCaseSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowCaseSamples)); + showCaseSamplesCheckBox.setValue(shouldShowCaseSamples()); + showCaseSamplesCheckBox.addValueChangeListener(e -> { + if ((boolean) e.getProperty().getValue()) { + displayedHumanSamples.add(SampleAssociationType.CASE); + } else { + displayedHumanSamples.remove(SampleAssociationType.CASE); + } + + refreshMap(true); + }); + layersLayout.addComponent(showCaseSamplesCheckBox); + } - refreshMap(true); - }); + if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_VIEW)) { + CheckBox showContactSamplesCheckBox = new CheckBox(); + showContactSamplesCheckBox.setId(Captions.sampleDashboardShowContactSamples); + showContactSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowContactSamples)); + showContactSamplesCheckBox.setValue(shouldShowContactSamples()); + showContactSamplesCheckBox.addValueChangeListener(e -> { + if ((boolean) e.getProperty().getValue()) { + displayedHumanSamples.add(SampleAssociationType.CONTACT); + } else { + displayedHumanSamples.remove(SampleAssociationType.CONTACT); + } + + refreshMap(true); + }); + layersLayout.addComponent(showContactSamplesCheckBox); + } - layersLayout.addComponent(showEnvironmentSamplesCheckBox); + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_VIEW)) { + CheckBox showEventParticipantSamplesCheckBox = new CheckBox(); + showEventParticipantSamplesCheckBox.setId(Captions.sampleDashboardShowEventParticipantSamples); + showEventParticipantSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowEventParticipantSamples)); + showEventParticipantSamplesCheckBox.setValue(shouldShowEventParticipantSamples()); + showEventParticipantSamplesCheckBox.addValueChangeListener(e -> { + if ((boolean) e.getProperty().getValue()) { + displayedHumanSamples.add(SampleAssociationType.EVENT_PARTICIPANT); + } else { + displayedHumanSamples.remove(SampleAssociationType.EVENT_PARTICIPANT); + } + + refreshMap(true); + }); + layersLayout.addComponent(showEventParticipantSamplesCheckBox); + } + if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_VIEW)) { + CheckBox showEnvironmentSamplesCheckBox = new CheckBox(); + showEnvironmentSamplesCheckBox.setId(Captions.sampleDashboardShowEnvironmentSamples); + showEnvironmentSamplesCheckBox.setCaption(I18nProperties.getCaption(Captions.sampleDashboardShowEnvironmentSamples)); + showEnvironmentSamplesCheckBox.setValue(shouldShowEventParticipantSamples()); + showEnvironmentSamplesCheckBox.addValueChangeListener(e -> { + if ((boolean) e.getProperty().getValue()) { + showEnvironmentalSamples = true; + } else { + showEnvironmentalSamples = false; + } + + refreshMap(true); + }); + layersLayout.addComponent(showEnvironmentSamplesCheckBox); + } } @Override From 8ddda228c6fa094fc02a9cd13e7d7eb6e13b6596 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Wed, 7 Feb 2024 17:12:57 +0200 Subject: [PATCH 20/65] #12940 - Display the event participant's district --- .../de/symeda/sormas/backend/sample/SampleQueryContext.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleQueryContext.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleQueryContext.java index 7bc136f8b77..88e25e29ef7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleQueryContext.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleQueryContext.java @@ -59,6 +59,7 @@ public Expression getDistrictNameExpression() { final Join caseDistrict = joins.getCaseResponsibleDistrict(); final Join contactDistrict = joins.getContactDistrict(); final Join contactCaseDistrict = joins.getContactCaseResponsibleDistrict(); + final Join eventParticipantDistrict = joins.getEventParticipantDistrict(); final Join eventDistrict = joins.getEventDistrict(); return criteriaBuilder. selectCase() @@ -69,7 +70,10 @@ criteriaBuilder. selectCase() .otherwise( criteriaBuilder. selectCase() .when(criteriaBuilder.isNotNull(contactCaseDistrict), contactCaseDistrict.get(District.NAME)) - .otherwise(eventDistrict.get(District.NAME)))); + .otherwise( + criteriaBuilder. selectCase() + .when(criteriaBuilder.isNotNull(eventParticipantDistrict), eventParticipantDistrict.get(District.NAME)) + .otherwise(eventDistrict.get(District.NAME))))); } } From b2c8ea038e43a53112585d4002dcd3f41abe8e95 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Thu, 8 Feb 2024 16:00:17 +0100 Subject: [PATCH 21/65] qa-auto/HSP-6576 [Event Actions] Error appears when clicking on 'Actions' if the user does not have 'Delete events from the system' right - initial commit --- .../application/events/EditEventPage.java | 6 ++ .../application/users/UserRolesPage.java | 11 +++- .../configuration/LineListingSteps.java | 1 - .../application/events/EditEventSteps.java | 50 +++++++++++++++ .../web/application/users/UserRolesSteps.java | 44 +++++++++++++ .../features/sanity/web/Event.feature | 62 ++++++++++++++++++- 6 files changed, 171 insertions(+), 3 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java index bc42cdd7d55..0e7bd12a3c0 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java @@ -56,11 +56,17 @@ public class EditEventPage { public static final By SOURCE_TYPE_COMBOBOX = By.cssSelector("#srcType div"); public static final By TYPE_OF_PLACE_COMBOBOX = By.cssSelector(" #typeOfPlace div"); public static final By NEW_ACTION_BUTTON = By.id("actionNewAction"); + public static final By EVENTS_ACTIONS_TAB = By.cssSelector("#tab-events-eventactions"); + public static final By EDIT_EVENT_ACTION = By.cssSelector("div[id^='edit-action']"); public static final By NEW_TASK_BUTTON = By.cssSelector("[id='New task']"); public static final By EDIT_FIRST_TASK = By.cssSelector("#edit0"); public static final By DELETE_BUTTON_DISABLED = By.xpath("//div[@id='delete' and @aria-disabled='true']"); public static final By UNDO_DELETION_BUTTON = By.id("deleteRestore"); + public static final By DELETE_EVENT_ACTION_BUTTON = By.cssSelector("#deleteRestore"); + public static final By CONFIRM_EVENT_DELETE_ACTION_BUTTON = By.cssSelector("#actionConfirm"); + public static final By NO_EVENT_ACTION_CAPTION = + By.xpath("//div[contains(text(), 'There are no actions for this Event')]"); public static final By LINK_EVENT_GROUP_BUTTON = By.cssSelector("div#Link\\ event\\ group"); public static final By NEW_EVENT_GROUP_RADIOBUTTON = By.xpath("//*[contains(text(),'New event group')]/.."); diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java index d92639805bc..c4b0ee03026 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java @@ -96,7 +96,16 @@ public class UserRolesPage { By.xpath("//label[contains(text(),'Work with messages')]"); public static By WORK_WITH_MESSAGES_CHECKBOX_VALUE = By.xpath("//label[contains(text(),'Work with messages')]/preceding-sibling::input"); - + public static By DELETE_ACTIONS_FROM_THE_CHECKBOX = + By.xpath("//label[contains(text(),'Delete actions from the system')]"); + public static By DELETE_ACTIONS_FROM_THE_CHECKBOX_VALUE = + By.xpath( + "//label[contains(text(),'Delete actions from the system')]/preceding-sibling::input"); + public static By DELETE_EVENTS_FROM_THE_CHECKBOX = + By.xpath("//label[contains(text(),'Delete events from the system')]"); + public static By DELETE_EVENTS_FROM_THE_CHECKBOX_VALUE = + By.xpath( + "//label[contains(text(),'Delete events from the system')]/preceding-sibling::input"); public static final By GRID_RESULTS_FIRST_UUID = By.cssSelector("tr:nth-of-type(1) > td:nth-of-type(1)"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/LineListingSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/LineListingSteps.java index 40c01717d15..006d57b00e0 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/LineListingSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/LineListingSteps.java @@ -114,7 +114,6 @@ public LineListingSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { NOTIFICATION_LINE_LISTING_CONFIGURATION); String notificationText = webDriverHelpers.getTextFromWebElement(NOTIFICATION_LINE_LISTING_CONFIGURATION); - System.out.println(notificationText); softly.assertEquals(notificationText, "Line listing has been disabled"); softly.assertAll(); }); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 9c753fbd857..282346cddcb 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -51,6 +51,7 @@ import static org.sormas.e2etests.pages.application.events.EditEventPage.CASE_CONTROL_STUDY_EPIDEMIOLOGICAL_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.COHORT_STUDY_EPIDEMIOLOGICAL_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.COMPLIANT_PATHOGEN_FINE_TYPING_LABORATORY_DIAGNOSTIC_EVIDENCE_BUTTON_DE; +import static org.sormas.e2etests.pages.application.events.EditEventPage.CONFIRM_EVENT_DELETE_ACTION_BUTTON; import static org.sormas.e2etests.pages.application.events.EditEventPage.CONTACT_TO_CONTAMINATED_MATERIALS_EPIDEMIOLOGICAL_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.CONTACT_TO_SICK_PERSON_EPIDEMIOLOGICAL_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.COUNTRY_COMBOBOX; @@ -64,13 +65,16 @@ import static org.sormas.e2etests.pages.application.events.EditEventPage.CREATE_QUARANTINE_ORDER_EVENT_PARTICIPANT_BY_TEXT; import static org.sormas.e2etests.pages.application.events.EditEventPage.DEFAULT_COMBOBOX_VALUE; import static org.sormas.e2etests.pages.application.events.EditEventPage.DELETE_BULK_EDIT_BUTTON_EVENT_PARTICIPANT; +import static org.sormas.e2etests.pages.application.events.EditEventPage.DELETE_EVENT_ACTION_BUTTON; import static org.sormas.e2etests.pages.application.events.EditEventPage.DESCRIPTIVE_ANALYSIS_OF_ASCETAINED_DATA_EPIDEMIOLOGICAL_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.DISEASE_COMBOBOX; import static org.sormas.e2etests.pages.application.events.EditEventPage.DISEASE_INPUT; +import static org.sormas.e2etests.pages.application.events.EditEventPage.EDIT_EVENT_ACTION; import static org.sormas.e2etests.pages.application.events.EditEventPage.EDIT_EVENT_GROUP_BUTTON; import static org.sormas.e2etests.pages.application.events.EditEventPage.EDIT_EVENT_PAGE_SAVE_BUTTON; import static org.sormas.e2etests.pages.application.events.EditEventPage.EDIT_FIRST_TASK; import static org.sormas.e2etests.pages.application.events.EditEventPage.EPIDEMIOLOGICAL_EVIDENCE_OPTIONS; +import static org.sormas.e2etests.pages.application.events.EditEventPage.EVENTS_ACTIONS_TAB; import static org.sormas.e2etests.pages.application.events.EditEventPage.EVENT_ACTIONS_TAB; import static org.sormas.e2etests.pages.application.events.EditEventPage.EVENT_CLUSTER_EDIT; import static org.sormas.e2etests.pages.application.events.EditEventPage.EVENT_DATA_SAVED_MESSAGE; @@ -113,6 +117,7 @@ import static org.sormas.e2etests.pages.application.events.EditEventPage.NEW_IMMUNIZATION_BUTTON; import static org.sormas.e2etests.pages.application.events.EditEventPage.NEW_IMMUNIZATION_CARD_WITH_COVID; import static org.sormas.e2etests.pages.application.events.EditEventPage.NEW_TASK_BUTTON; +import static org.sormas.e2etests.pages.application.events.EditEventPage.NO_EVENT_ACTION_CAPTION; import static org.sormas.e2etests.pages.application.events.EditEventPage.OTHER_LABORATORY_DIAGNOSTIC_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.PATHOGEN_FINE_TYPING_COMPLIANT_WITH_THE_ONE_OF_CASES_LABORATORY_DIAGNOSTIC_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.PERSON_EPIDEMIOLOGICAL_EVIDENCE_BUTTON_DE; @@ -1369,6 +1374,51 @@ public EditEventSteps( EditEventPage.UUID_INPUT); }); + When( + "I navigate to Event Actions tab from Event tab", + () -> { + webDriverHelpers.clickOnWebElementBySelector(EVENTS_ACTIONS_TAB); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(EVENTS_ACTIONS_TAB); + }); + + When( + "I click on to Edit Event Actions from Event Actions tab", + () -> { + webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_ACTION); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(EDIT_EVENT_ACTION); + }); + + And( + "^I check that the Delete button is not available from Edit Event Actions page$", + () -> { + softly.assertFalse( + webDriverHelpers.isElementVisibleWithTimeout(DELETE_EVENT_ACTION_BUTTON, 2), + "Delete event action button is visible!"); + softly.assertAll(); + }); + + When( + "I click on DELETE button from Edit Event Actions page", + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsPresent(DELETE_EVENT_ACTION_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(DELETE_EVENT_ACTION_BUTTON); + }); + + When( + "I click on Confirm DELETE button Edit Event Actions", + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsPresent(CONFIRM_EVENT_DELETE_ACTION_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(CONFIRM_EVENT_DELETE_ACTION_BUTTON); + }); + + When( + "I check that Event Actions hasn't got any actions on Event Action page", + () -> { + String caption = webDriverHelpers.getTextFromWebElement(NO_EVENT_ACTION_CAPTION); + softly.assertEquals(caption, "There are no actions for this Event"); + softly.assertAll(); + }); + When( "I click on New Action button from Event tab", () -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java index cbf0e4813a8..e40805e155e 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java @@ -27,7 +27,11 @@ import static org.sormas.e2etests.pages.application.users.UserRolesPage.CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.CAPTION_INPUT; import static org.sormas.e2etests.pages.application.users.UserRolesPage.CREATE_NEW_USERS_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_ACTIONS_FROM_THE_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_ACTIONS_FROM_THE_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_CONFIRMATION_BUTTON; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_EVENTS_FROM_THE_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_EVENTS_FROM_THE_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_USER_ROLES_FROM_THE_SYSTEM_CHECKBOX; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_USER_ROLE_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DISCARD_BUTTON; @@ -188,6 +192,31 @@ public UserRolesSteps( 3); }); + Then( + "I check that checkbox \"([^\"]*)\" is \"([^\"]*)\"", + (String checkboxName, String option) -> { + TimeUnit.SECONDS.sleep(2); + webDriverHelpers.scrollToElement( + By.xpath(String.format("//label[text()='%s']", checkboxName))); + + Boolean checkboxValue = + webDriverHelpers.isElementChecked( + By.xpath( + String.format( + "//label[text()='%s']/preceding-sibling::input", checkboxName))); + System.out.print(checkboxValue); + switch (option) { + case "checked": + softly.assertTrue(checkboxValue, "Right is not checked"); + softly.assertAll(); + break; + case "unchecked": + softly.assertFalse(checkboxValue, "Right is checked"); + softly.assertAll(); + break; + } + }); + And( "^I click checkbox to uncheck \"([^\"]*)\"$", (String checkboxLabel) -> { @@ -291,6 +320,21 @@ public UserRolesSteps( checkboxState = webDriverHelpers.isElementChecked(WORK_WITH_MESSAGES_CHECKBOX_VALUE); uncheckCheckbox(checkboxState, WORK_WITH_MESSAGES_CHECKBOX); break; + case "Delete actions from the system": + webDriverHelpers.scrollToElement(DELETE_ACTIONS_FROM_THE_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent( + DELETE_ACTIONS_FROM_THE_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked(DELETE_ACTIONS_FROM_THE_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, DELETE_ACTIONS_FROM_THE_CHECKBOX); + break; + case "Delete events from the system": + webDriverHelpers.scrollToElement(DELETE_EVENTS_FROM_THE_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(DELETE_EVENTS_FROM_THE_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked(DELETE_EVENTS_FROM_THE_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, DELETE_EVENTS_FROM_THE_CHECKBOX); + break; } }); 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 a92fdd77fd4..f8fb795ef82 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 @@ -1413,4 +1413,64 @@ Feature: Create events Examples: | user | | Contact Supervisor | - | Surveillance Supervisor | \ No newline at end of file + | Surveillance Supervisor | + + @tmsLink=HSP-6576 @env_main + Scenario: [Event Actions] Error appears when clicking on 'Actions' if the user does not have 'Delete events from the system' right [1] + Given I log in as a Admin User + And I click on the Users from navbar + And I check if there is any user with the "EventUserWithDeleteActionRights" role and change his role + And I click on User roles tab from Users Page + And I check if the "EventUserWithDeleteActionRights" user role exist and delete it + And I click on New user role button on User Roles Page + And I choose "National User" as the user role template + And I fill caption input as "EventUserWithDeleteActionRights" on Create New User Role form + And I click SAVE button on User Role Page + And I check that checkbox "Delete actions from the system" is "checked" + And I click SAVE button on User Role Page + And I back to the User role list + Then I click on User Management tab from Users directory Page + And I click on the NEW USER button + And I create new "EventUserWithDeleteActionRights" with english language for test + Then I click on logout button from navbar + And I login with new created user with chosen new role + And I click on the Events button from navbar + And I click on the NEW EVENT button + When I create a new event with specific data + Then I navigate to Event Actions tab from Event tab + And I click on New Action from Event Actions tab + And I create New Action from event tab + Then I click on to Edit Event Actions from Event Actions tab + And I click on DELETE button from Edit Event Actions page + And I click on Confirm DELETE button Edit Event Actions + Then I check that Event Actions hasn't got any actions on Event Action page + + @tmsLink=HSP-6576 @env_main + Scenario: [Event Actions] Error appears when clicking on 'Actions' if the user does not have 'Delete events from the system' right [2] + Given I log in as a Admin User + And I click on the Users from navbar + And I check if there is any user with the "EventUserWithoutDeleteActionRights" role and change his role + And I click on User roles tab from Users Page + And I check if the "EventUserWithoutDeleteActionRights" user role exist and delete it + And I click on New user role button on User Roles Page + And I choose "National User" as the user role template + And I fill caption input as "EventUserWithoutDeleteActionRights" on Create New User Role form + And I click SAVE button on User Role Page + Then I click checkbox to uncheck "Delete actions from the system" + And I check that checkbox "Delete actions from the system" is "unchecked" + And I click checkbox to uncheck "Delete events from the system" + And I click SAVE button on User Role Page + And I back to the User role list + Then I click on User Management tab from Users directory Page + And I click on the NEW USER button + And I create new "EventUserWithoutDeleteActionRights" with english language for test + Then I click on logout button from navbar + And I login with new created user with chosen new role + And I click on the Events button from navbar + And I click on the NEW EVENT button + When I create a new event with specific data + Then I navigate to Event Actions tab from Event tab + And I click on New Action from Event Actions tab + And I create New Action from event tab + Then I click on to Edit Event Actions from Event Actions tab + And I check that the Delete button is not available from Edit Event Actions page \ No newline at end of file From c4275d31837a21f03e1ec9ed94753dbbf4fbf287 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Thu, 8 Feb 2024 18:26:06 +0200 Subject: [PATCH 22/65] #12851 - Display 'Confidential' instead of no user when rights to see personal/sensitive data inside/outside jurisdiction are missing - web --- .../de/symeda/sormas/api/i18n/Captions.java | 1 + .../de/symeda/sormas/api/i18n/Strings.java | 3 - .../src/main/resources/captions.properties | 1 - .../src/main/resources/strings.properties | 2 - .../symeda/sormas/ui/caze/CaseDataForm.java | 6 +- .../sormas/ui/contact/ContactDataForm.java | 6 +- .../ui/environment/EnvironmentDataForm.java | 5 +- .../sormas/ui/events/EventDataForm.java | 6 +- .../ui/events/EventParticipantEditForm.java | 5 +- .../components/form/ImmunizationDataForm.java | 3 +- .../sormas/ui/samples/AbstractSampleForm.java | 5 +- .../EnvironmentSampleEditForm.java | 6 +- .../ui/travelentry/TravelEntryDataForm.java | 4 +- .../de/symeda/sormas/ui/utils/UserField.java | 135 +++++++++++------- .../ui/vaccination/VaccinationEditForm.java | 4 +- 15 files changed, 123 insertions(+), 69 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 a3b5a16b05a..32bdf3661b7 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 @@ -1543,6 +1543,7 @@ public interface Captions { String HealthConditions_otherConditions = "HealthConditions.otherConditions"; String HealthConditions_sickleCellDisease = "HealthConditions.sickleCellDisease"; String HealthConditions_tuberculosis = "HealthConditions.tuberculosis"; + String hiddenValue = "hiddenValue"; String humanSampleViewType = "humanSampleViewType"; String Immunization = "Immunization"; String Immunization_additionalDetails = "Immunization.additionalDetails"; 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 fadd698da1f..112332c2594 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 @@ -1594,7 +1594,6 @@ public interface Strings { String promptDateTo = "promptDateTo"; String promptDisease = "promptDisease"; String promptDistrict = "promptDistrict"; - String promptEmail = "promptEmail"; String promptEnvironmentDateFrom = "promptEnvironmentDateFrom"; String promptEnvironmentDateTo = "promptEnvironmentDateTo"; String promptEnvironmentEpiWeekFrom = "promptEnvironmentEpiWeekFrom"; @@ -1671,7 +1670,6 @@ public interface Strings { String promptTaskEpiWeekFrom = "promptTaskEpiWeekFrom"; String promptTaskEpiWeekTo = "promptTaskEpiWeekTo"; String promptTaskSearchField = "promptTaskSearchField"; - String promptTelephoneNumber = "promptTelephoneNumber"; String promptTravelEntryDateFrom = "promptTravelEntryDateFrom"; String promptTravelEntryDateTo = "promptTravelEntryDateTo"; String promptTravelEntryEpiWeekFrom = "promptTravelEntryEpiWeekFrom"; @@ -1688,7 +1686,6 @@ public interface Strings { String reloadPageToSeeChanges = "reloadPageToSeeChanges"; String reportedBy = "reportedBy"; String reportedOn = "reportedOn"; - String reportingUser = "reportingUser"; String setTo = "setTo"; String sormasToSormasLoadingShares = "sormasToSormasLoadingShares"; String step = "step"; diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index b5e788f5747..2ca37078427 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test: unknown=Unknown diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 4c5d537912f..e0f823a6823 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1618,7 +1618,6 @@ promptImmunizationDateFrom = New immunizations from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1636,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java index 738c70b048d..504d6a094e9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java @@ -405,7 +405,8 @@ protected void addFields() { CaseDataDto.CLINICIAN_PHONE, CaseDataDto.CLINICIAN_EMAIL); - addField(CaseDataDto.REPORTING_USER, UserField.class); + UserField reportingUser = addField(CaseDataDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); TextField epidField = addField(CaseDataDto.EPID_NUMBER, TextField.class); epidField.setInvalidCommitted(true); @@ -775,8 +776,9 @@ protected void addFields() { Collections.singletonList(Boolean.TRUE), true); - final UserField surveillanceOfficerField = addField(CaseDataDto.SURVEILLANCE_OFFICER, UserField.class); + UserField surveillanceOfficerField = addField(CaseDataDto.SURVEILLANCE_OFFICER, UserField.class); surveillanceOfficerField.setEnabled(true); + surveillanceOfficerField.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); differentPlaceOfStayJurisdiction = addCustomField(DIFFERENT_PLACE_OF_STAY_JURISDICTION, Boolean.class, CheckBox.class); differentPlaceOfStayJurisdiction.addStyleName(VSPACE_3); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java index a880637b5c9..d340e4cb610 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java @@ -240,7 +240,10 @@ protected void addFields() { getContent().addComponent(externalTokenWarningLabel, EXTERNAL_TOKEN_WARNING_LOC); addField(ContactDto.INTERNAL_TOKEN, TextField.class); - addField(ContactDto.REPORTING_USER, UserField.class); + + UserField reportingUser = addField(CaseDataDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); + multiDayContact = addField(ContactDto.MULTI_DAY_CONTACT, CheckBox.class); firstContactDate = addDateField(ContactDto.FIRST_CONTACT_DATE, DateField.class, 0); lastContactDate = addField(ContactDto.LAST_CONTACT_DATE, DateField.class); @@ -466,6 +469,7 @@ protected void addFields() { contactOfficerField = addField(ContactDto.CONTACT_OFFICER, UserField.class); contactOfficerField.setEnabled(true); + contactOfficerField.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); region = addInfrastructureField(ContactDto.REGION); region.setDescription(I18nProperties.getPrefixDescription(ContactDto.I18N_PREFIX, ContactDto.REGION)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java index c9590db9323..ec2d5a31ca8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java @@ -95,7 +95,9 @@ protected void addFields() { TextField externalIdField = addField(EnvironmentDto.EXTERNAL_ID, TextField.class); style(externalIdField, ERROR_COLOR_PRIMARY); - addField(EnvironmentDto.REPORTING_USER, UserField.class).setReadOnly(true); + UserField reportingUser = addField(EnvironmentDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); + reportingUser.setReadOnly(true); addField(EnvironmentDto.INVESTIGATION_STATUS, ComboBox.class); ComboBox environmentMedia = addField(EnvironmentDto.ENVIRONMENT_MEDIA, ComboBox.class); @@ -151,6 +153,7 @@ protected void addFields() { ComboBox districtField = (ComboBox) locationForm.getFieldGroup().getField(LocationDto.DISTRICT); UserField responsibleUserField = addField(EnvironmentDto.RESPONSIBLE_USER, UserField.class); + responsibleUserField.setParentPseudonymizedSupplier(()-> getValue().isPseudonymized()); responsibleUserField.setEnabled(true); addField(EnvironmentDto.DELETION_REASON); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java index c014d086bfd..a519b96b6b9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java @@ -362,7 +362,10 @@ protected void addFields() { }); DateField reportDate = addField(EventDto.REPORT_DATE_TIME, DateField.class); - addField(EventDto.REPORTING_USER, UserField.class); + + UserField reportingUser = addField(EventDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); + addField(EventDto.TRANSREGIONAL_OUTBREAK, NullableOptionGroup.class); ComboBox srcType = addField(EventDto.SRC_TYPE); @@ -405,6 +408,7 @@ protected void addFields() { ComboBox districtField = (ComboBox) locationForm.getFieldGroup().getField(LocationDto.DISTRICT); UserField responsibleUserField = addField(EventDto.RESPONSIBLE_USER, UserField.class); + responsibleUserField.setParentPseudonymizedSupplier(()-> getValue().isPseudonymized()); responsibleUserField.setEnabled(true); addField(EventDto.DELETION_REASON); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantEditForm.java index bf83e485ca9..c4358da0635 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantEditForm.java @@ -97,7 +97,10 @@ protected void addFields() { district.setRequired(shouldBeRequired); addField(EventParticipantDto.UUID, TextField.class); - addField(EventParticipantDto.REPORTING_USER, UserField.class); + + UserField reportingUser = addField(EventParticipantDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); + setReadOnly(true, EventParticipantDto.UUID, EventParticipantDto.REPORTING_USER); initializeVisibilitiesAndAllowedVisibilities(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java index d720c609f87..7d8c1bced6f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java @@ -162,7 +162,8 @@ protected void addFields() { style(externalIdField, ERROR_COLOR_PRIMARY); addField(ImmunizationDto.REPORT_DATE, DateField.class); - addField(ImmunizationDto.REPORTING_USER, UserField.class); + UserField reportingUser = addField(ImmunizationDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); ComboBox cbDisease = addDiseaseField(ImmunizationDto.DISEASE, false); addField(ImmunizationDto.DISEASE_DETAILS, TextField.class); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleForm.java index 3acbde18e2d..c0ca1eec8d6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleForm.java @@ -245,8 +245,9 @@ protected void defaultValueChangeListener() { Label reportInfoLabel = new Label(reportInfoText.toString()); reportInfoLabel.setEnabled(false); getContent().addComponent(reportInfoLabel, REPORT_INFO_LABEL_LOC); - addField(SampleDto.REPORTING_USER, UserField.class).setReadOnly(true); - + UserField reportingUserField = addField(SampleDto.REPORTING_USER, UserField.class); + reportingUserField.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); + reportingUserField.setReadOnly(true); } protected void updateLabDetailsVisibility(TextField labDetails, Property.ValueChangeEvent event) { 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 index af74bd89825..e5b2bfe973a 100644 --- 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 @@ -250,7 +250,9 @@ protected void addFields() { true, true); - addField(EnvironmentSampleDto.REPORTING_USER, UserField.class).setReadOnly(true); + UserField reportingUser = addField(EnvironmentSampleDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); + reportingUser.setReadOnly(true); addField(EnvironmentSampleDto.SPECIMEN_CONDITION); @@ -270,7 +272,7 @@ private void disableFieldsBasedOnRights(EnvironmentSampleDto sample) { boolean hasEditDispatchRight = currentUserProvider.hasUserRight(UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH); boolean isOwner = isCreate || DataHelper.isSame(sample.getReportingUser(), currentUserProvider.getUser()); boolean canEditDispatchField = - isCreate || (hasEditDispatchRight && (isOwner || jurisdictionLevel.getOrder() <= JurisdictionLevel.REGION.getOrder())); + isCreate || (hasEditDispatchRight && (isOwner || jurisdictionLevel.getOrder() <= JurisdictionLevel.REGION.getOrder())); getFieldGroup().getFields().forEach(f -> { if (f.isEnabled()) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataForm.java index 924d9341aee..962739487a0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataForm.java @@ -144,7 +144,9 @@ protected void addFields() { addField(TravelEntryDto.REPORT_DATE, DateField.class); addFields(TravelEntryDto.UUID); - addField(TravelEntryDto.REPORTING_USER, UserField.class); + + UserField reportingUser = addField(TravelEntryDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); TextField externalIdField = addField(TravelEntryDto.EXTERNAL_ID, TextField.class); style(externalIdField, ERROR_COLOR_PRIMARY); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java index 5869d5e5e58..7a817e7cfc7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java @@ -1,11 +1,11 @@ package de.symeda.sormas.ui.utils; +import static de.symeda.sormas.ui.utils.CssStyles.INACCESSIBLE_LABEL; import static de.symeda.sormas.ui.utils.CssStyles.LABEL_BOLD; import java.util.ArrayList; import java.util.List; - -import org.apache.commons.lang3.StringUtils; +import java.util.function.Supplier; import com.vaadin.icons.VaadinIcons; import com.vaadin.server.ExternalResource; @@ -20,6 +20,7 @@ import com.vaadin.v7.ui.VerticalLayout; import de.symeda.sormas.api.FacadeProvider; +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.UserDto; @@ -31,6 +32,8 @@ public class UserField extends CustomField { private boolean readOnly; private boolean enabled; private List items = new ArrayList<>(); + private boolean parentPseudonymizedFlag; + private Supplier parentPseudonymizedSupplier; public UserField() { } @@ -50,6 +53,7 @@ protected Component initContent() { } userCombo.setNullSelectionAllowed(true); userCombo.setValue(getValue()); + parentPseudonymizedFlag = parentPseudonymizedSupplier.get(); userCombo.setEnabled(enabled); userCombo.setReadOnly(readOnly); userLayout.addComponent(userCombo); @@ -67,6 +71,7 @@ protected Component initContent() { addValueChangeListener(c -> { userCombo.setValue(c.getProperty().getValue()); + parentPseudonymizedFlag = parentPseudonymizedSupplier.get(); }); return userLayout; @@ -132,58 +137,41 @@ protected void triggerUserContactPopUpWindow() { VerticalLayout verticalLayout = new VerticalLayout(); verticalLayout.setMargin(false); - if (userDto != null) { - if (userCombo.isReadOnly()) { - HorizontalLayout reportingUserLayout = new HorizontalLayout(); - Label reportingUserLabel = new Label(I18nProperties.getString(Strings.reportingUser)); - reportingUserLabel.addStyleName(LABEL_BOLD); - reportingUserLayout.addComponent(reportingUserLabel); - - Label reportingUser = new Label(getValue().getCaption()); - reportingUserLayout.addComponent(reportingUser); - - verticalLayout.addComponent(reportingUserLayout); - } - - HorizontalLayout telephoneNumberLayout = new HorizontalLayout(); - Label telephoneLabel = new Label(I18nProperties.getString(Strings.promptTelephoneNumber)); - telephoneLabel.addStyleName(LABEL_BOLD); - telephoneNumberLayout.addComponent(telephoneLabel); - - final String phone = userDto.getPhone(); - if (StringUtils.isBlank(phone)) { - Label telephoneNumber = new Label(); - telephoneNumber.setValue(I18nProperties.getString(Strings.notSpecified)); - telephoneNumberLayout.addComponent(telephoneNumber); + if (userCombo.isReadOnly()) { + if (userDto == null) { + verticalLayout.addComponent(createFieldLayout(I18nProperties.getCaption(Captions.User_userName), null, null, true)); + verticalLayout.addComponent(createFieldLayout(I18nProperties.getCaption(Captions.User_phone), null, LinkType.PHONE, true)); + verticalLayout.addComponent(createFieldLayout(I18nProperties.getCaption(Captions.User_userEmail), null, LinkType.EMAIL, true)); } else { - Link telephoneNumber = new Link(phone, new ExternalResource("tel:" + phone)); - telephoneNumberLayout.addComponent(telephoneNumber); + verticalLayout.addComponent(createFieldLayout(I18nProperties.getCaption(Captions.User_userName), userDto.getUserName(), null, false)); + verticalLayout + .addComponent(createFieldLayout(I18nProperties.getCaption(Captions.User_phone), userDto.getPhone(), LinkType.PHONE, false)); + verticalLayout.addComponent( + createFieldLayout(I18nProperties.getCaption(Captions.User_userEmail), userDto.getUserEmail(), LinkType.EMAIL, false)); } - - verticalLayout.addComponent(telephoneNumberLayout); - - HorizontalLayout emailLayout = new HorizontalLayout(); - Label emailLabel = new Label(I18nProperties.getString(Strings.promptEmail)); - emailLabel.addStyleName(LABEL_BOLD); - emailLayout.addComponent(emailLabel); - final String userEmail = userDto.getUserEmail(); - if (StringUtils.isBlank(userEmail)) { - Label email = new Label(); - email.setValue(I18nProperties.getString(Strings.notSpecified)); - emailLayout.addComponent(email); + } else { + if (userDto == null && !parentPseudonymizedFlag) { + HorizontalLayout labelLayout = new HorizontalLayout(); + Label noUserMessageLabel = new Label(); + final String noUserMessage; + noUserMessage = I18nProperties.getString(Strings.messageNoUserSelected); + noUserMessageLabel.setValue(noUserMessage); + labelLayout.addComponent(noUserMessageLabel); + verticalLayout.addComponent(labelLayout); } else { - Link email = new Link(userEmail, new ExternalResource("mailto:" + userEmail)); - emailLayout.addComponent(email); + verticalLayout.addComponent( + createFieldLayout( + I18nProperties.getCaption(Captions.User_phone), + userDto != null ? userDto.getPhone() : null, + LinkType.PHONE, + parentPseudonymizedFlag)); + verticalLayout.addComponent( + createFieldLayout( + I18nProperties.getCaption(Captions.User_userEmail), + userDto != null ? userDto.getUserEmail() : null, + LinkType.EMAIL, + parentPseudonymizedFlag)); } - - verticalLayout.addComponent(emailLayout); - } else { - HorizontalLayout labelLayout = new HorizontalLayout(); - Label noUserMessageLabel = new Label(); - final String noUSerMessage = I18nProperties.getString(Strings.messageNoUserSelected); - noUserMessageLabel.setValue(noUSerMessage); - labelLayout.addComponent(noUserMessageLabel); - verticalLayout.addComponent(labelLayout); } VaadinUiUtil.showConfirmationPopup( @@ -197,6 +185,53 @@ protected void triggerUserContactPopUpWindow() { }); } + private static HorizontalLayout createFieldLayout(String fieldLabelCaption, String fieldValue, LinkType linkType, boolean inaccessible) { + HorizontalLayout fieldLayout = new HorizontalLayout(); + Label fieldLabel = new Label(fieldLabelCaption + ":"); + fieldLabel.addStyleName(LABEL_BOLD); + fieldLayout.addComponent(fieldLabel); + + if (inaccessible) { + Label fieldValueLabel = new Label(fieldValue != null ? fieldValue : I18nProperties.getCaption(Captions.inaccessibleValue)); + fieldValueLabel.addStyleName(INACCESSIBLE_LABEL); + fieldLayout.addComponent(fieldValueLabel); + } else { + if (fieldValue == null || fieldValue.isEmpty()) { + Label valueLabel = new Label(I18nProperties.getString(Strings.notSpecified)); + fieldLayout.addComponent(valueLabel); + } else { + if (linkType != null) { + Link fieldLink = new Link(fieldValue, new ExternalResource(linkType.getLinkType() + fieldValue)); + fieldLayout.addComponent(fieldLink); + } else { + Label valueLabel = new Label(fieldValue); + fieldLayout.addComponent(valueLabel); + } + } + } + return fieldLayout; + } + + public void setParentPseudonymizedSupplier(Supplier parentPseudonymizedSupplier) { + this.parentPseudonymizedSupplier = parentPseudonymizedSupplier; + } + + private enum LinkType { + + PHONE("tel:"), + EMAIL("mailto:"); + + private final String linkType; + + LinkType(String linkType) { + this.linkType = linkType; + } + + public String getLinkType() { + return linkType; + } + } + @Override public Class getType() { return UserReferenceDto.class; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java index 53e93e92ec9..3b53a01ea31 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java @@ -77,7 +77,9 @@ protected String createHtmlLayout() { protected void addFields() { addField(VaccinationDto.REPORT_DATE).setRequired(true); - addField(VaccinationDto.REPORTING_USER, UserField.class).setReadOnly(true); + UserField reportingUser = addField(VaccinationDto.REPORTING_USER, UserField.class); + reportingUser.setParentPseudonymizedSupplier(() -> getValue().isPseudonymized()); + reportingUser.setReadOnly(true); addField(VaccinationDto.VACCINATION_DATE); Field vaccineName = addField(VaccinationDto.VACCINE_NAME); From ccacc0cae673e1b6f08576ccaf3d83fac0fd59fc Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Thu, 8 Feb 2024 18:30:16 +0200 Subject: [PATCH 23/65] #12851 - Display 'Confidential' instead of no user when rights to see personal/sensitive data inside/outside jurisdiction are missing - web --- .../src/main/java/de/symeda/sormas/api/i18n/Captions.java | 2 -- sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java | 1 + 2 files changed, 1 insertion(+), 2 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 32bdf3661b7..b1c56b5c050 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 @@ -1543,7 +1543,6 @@ public interface Captions { String HealthConditions_otherConditions = "HealthConditions.otherConditions"; String HealthConditions_sickleCellDisease = "HealthConditions.sickleCellDisease"; String HealthConditions_tuberculosis = "HealthConditions.tuberculosis"; - String hiddenValue = "hiddenValue"; String humanSampleViewType = "humanSampleViewType"; String Immunization = "Immunization"; String Immunization_additionalDetails = "Immunization.additionalDetails"; @@ -1991,7 +1990,6 @@ public interface Captions { String regionName = "regionName"; String registerInPatientDiaryButton = "registerInPatientDiaryButton"; String remove = "remove"; - String reportingUser = "reportingUser"; String requiredUserRights = "requiredUserRights"; String Sample = "Sample"; String Sample_additionalTestingRequested = "Sample.additionalTestingRequested"; 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 112332c2594..142adf4a38b 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 @@ -1686,6 +1686,7 @@ public interface Strings { String reloadPageToSeeChanges = "reloadPageToSeeChanges"; String reportedBy = "reportedBy"; String reportedOn = "reportedOn"; + String reportingUser = "reportingUser"; String setTo = "setTo"; String sormasToSormasLoadingShares = "sormasToSormasLoadingShares"; String step = "step"; From 7858a1041beed35bc1761f98a0165403c9de07ac Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Thu, 8 Feb 2024 18:30:36 +0200 Subject: [PATCH 24/65] #12851 - Display 'Confidential' instead of no user when rights to see personal/sensitive data inside/outside jurisdiction are missing - app --- .../app/caze/edit/CaseEditFragment.java | 3 + .../app/caze/read/CaseReadFragment.java | 3 + .../controls/ControlUserEditField.java | 11 +++- .../controls/ControlUserReadField.java | 15 ++++- .../app/contact/edit/ContactEditFragment.java | 2 + .../app/contact/read/ContactReadFragment.java | 1 + .../edit/EnvironmentEditFragment.java | 2 + .../read/EnvironmentReadFragment.java | 5 +- .../edit/EnvironmentSampleEditFragment.java | 1 + .../read/EnvironmentSampleReadFragment.java | 1 + .../app/event/edit/EventEditFragment.java | 1 + .../app/event/read/EventReadFragment.java | 2 + .../edit/ImmunizationEditFragment.java | 1 + .../read/ImmunizationReadFragment.java | 1 + .../vaccination/VaccinationEditFragment.java | 1 + .../vaccination/VaccinationReadFragment.java | 5 ++ .../de/symeda/sormas/app/util/ViewHelper.java | 55 ++++++++++++++----- 17 files changed, 94 insertions(+), 16 deletions(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java index 2d90b97b14b..a745274ebc9 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java @@ -712,6 +712,9 @@ public void onAfterLayoutBinding(final FragmentCaseEditLayoutBinding contentBind // reinfection contentBinding.caseDataPreviousInfectionDate.initializeDateField(getChildFragmentManager()); + + contentBinding.caseDataReportingUser.setPseudonymized(record.isPseudonymized()); + contentBinding.caseDataSurveillanceOfficer.setPseudonymized(record.isPseudonymized()); } private void updateDiseaseVariantsField(FragmentCaseEditLayoutBinding contentBinding) { diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java index 32f7c463df7..077d9d9aaa3 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java @@ -222,6 +222,9 @@ public void onAfterLayoutBinding(FragmentCaseReadLayoutBinding contentBinding) { contentBinding.facilityOrHome.setValue(TypeOfPlace.FACILITY); contentBinding.facilityTypeGroup.setValue(record.getFacilityType().getFacilityTypeGroup()); } + + contentBinding.caseDataReportingUser.setPseudonymized(record.isPseudonymized()); + contentBinding.caseDataSurveillanceOfficer.setPseudonymized(record.isPseudonymized()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserEditField.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserEditField.java index a37393a81c9..83ad7230227 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserEditField.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserEditField.java @@ -12,6 +12,8 @@ public class ControlUserEditField extends ControlSpinnerField { + boolean pseudonymized = false; + public ControlUserEditField(Context context) { super(context); } @@ -40,8 +42,15 @@ protected void onFinishInflate() { userContactButton.setOnClickListener(click -> { User user = (User) getValue(); Resources resources = getResources(); - ViewHelper.showUserContactInfo(user, resources, getContext()); + ViewHelper.showUserContactInfo(user, resources, getContext(), pseudonymized); }); } + public boolean isPseudonymized() { + return pseudonymized; + } + + public void setPseudonymized(boolean pseudonymized) { + this.pseudonymized = pseudonymized; + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserReadField.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserReadField.java index 4df4160627f..9f6f050ef7d 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserReadField.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/controls/ControlUserReadField.java @@ -16,11 +16,17 @@ @BindingMethods({ @BindingMethod(type = ControlUserReadField.class, attribute = "valueFormat", method = "setValueFormat") }) public class ControlUserReadField extends ControlTextReadField { + boolean pseudonymized = false; public ControlUserReadField(Context context) { super(context); } + public ControlUserReadField(Context context, boolean pseudonymized) { + super(context); + this.pseudonymized = pseudonymized; + } + public ControlUserReadField(Context context, AttributeSet attrs) { super(context, attrs); } @@ -44,8 +50,15 @@ protected void onFinishInflate() { userContactButton.setOnClickListener(click -> { User user = (User) getValue(); Resources resources = getResources(); - ViewHelper.showUserContactInfo(user, resources, getContext()); + ViewHelper.showUserContactInfo(user, resources, getContext(), pseudonymized); }); } + public boolean isPseudonymized() { + return pseudonymized; + } + + public void setPseudonymized(boolean pseudonymized) { + this.pseudonymized = pseudonymized; + } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java index fb41d908cc4..aa7562c8386 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java @@ -424,6 +424,8 @@ public void onAfterLayoutBinding(FragmentContactEditLayoutBinding contentBinding contentBinding.contactProhibitionToWorkFrom.initializeDateField(getChildFragmentManager()); contentBinding.contactProhibitionToWorkUntil.initializeDateField(getChildFragmentManager()); + + contentBinding.contactReportingUser.setPseudonymized(record.isPseudonymized()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/read/ContactReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/read/ContactReadFragment.java index 06f8a90471f..7ca072e0c8b 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/read/ContactReadFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/read/ContactReadFragment.java @@ -109,6 +109,7 @@ public void onLayoutBinding(FragmentContactReadLayoutBinding contentBinding) { @Override public void onAfterLayoutBinding(FragmentContactReadLayoutBinding contentBinding) { setUpFieldVisibilities(contentBinding); + contentBinding.contactReportingUser.setPseudonymized(record.isPseudonymized()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditFragment.java index 4154237648c..5e4304ca39e 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/edit/EnvironmentEditFragment.java @@ -150,5 +150,7 @@ public void onAfterLayoutBinding(FragmentEnvironmentEditLayoutBinding contentBin contentBinding.environmentOtherWaterUse.setValue(null); } }); + + contentBinding.environmentResponsibleUser.setPseudonymized(record.isPseudonymized()); } } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadFragment.java index 7af9d9caa15..e867e084bf2 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/environment/read/EnvironmentReadFragment.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.view.View; +import de.symeda.sormas.api.environment.EnvironmentDto; import de.symeda.sormas.api.environment.WaterUse; import de.symeda.sormas.api.immunization.ImmunizationDto; import de.symeda.sormas.api.user.UserRight; @@ -47,8 +48,10 @@ protected void onLayoutBinding(FragmentEnvironmentReadLayoutBinding contentBindi @Override public void onAfterLayoutBinding(FragmentEnvironmentReadLayoutBinding contentBinding) { super.onAfterLayoutBinding(contentBinding); - setFieldVisibilitiesAndAccesses(ImmunizationDto.class, contentBinding.mainContent); + setFieldVisibilitiesAndAccesses(EnvironmentDto.class, contentBinding.mainContent); + contentBinding.environmentReportingUser.setPseudonymized(record.isPseudonymized()); + contentBinding.environmentResponsibleUser.setPseudonymized(record.isPseudonymized()); } @Override 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 341ac554bed..43962036f0a 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 @@ -168,6 +168,7 @@ public void onAfterLayoutBinding(final FragmentEnvironmentSampleEditLayoutBindin } else { contentBinding.environmentSampleRequestedPathogenTestsTags.setVisibility(GONE); } + contentBinding.environmentSampleReportingUser.setPseudonymized(record.isPseudonymized()); } private void openAddressPopup(FragmentEnvironmentSampleEditLayoutBinding contentBinding) { 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 index 01515042f4b..d9d4bbd78c9 100644 --- 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 @@ -72,6 +72,7 @@ public void onAfterLayoutBinding(FragmentEnvironmentSampleReadLayoutBinding cont contentBinding.environmentSampleRequestedPathogenTestsTags.setVisibility(GONE); contentBinding.environmentSampleOtherRequestedPathogenTests.setVisibility(GONE); } + contentBinding.environmentSampleReportingUser.setPseudonymized(record.isPseudonymized()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java index bbf24f45553..846c622e9db 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java @@ -308,6 +308,7 @@ public void onAfterLayoutBinding(FragmentEventEditLayoutBinding contentBinding) contentBinding.eventParenteralTransmissionMode, ParenteralTransmissionMode.MEDICALLY_ASSOCIATED); } + contentBinding.eventResponsibleUser.setPseudonymized(record.isPseudonymized()); } private void updateCustomizableEnumFields(FragmentEventEditLayoutBinding contentBinding) { diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/event/read/EventReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/event/read/EventReadFragment.java index 4504abf8035..e7d2419f264 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/event/read/EventReadFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/event/read/EventReadFragment.java @@ -39,6 +39,7 @@ import de.symeda.sormas.app.backend.common.DatabaseHelper; import de.symeda.sormas.app.backend.config.ConfigProvider; import de.symeda.sormas.app.backend.event.Event; +import de.symeda.sormas.app.component.controls.ControlUserReadField; import de.symeda.sormas.app.databinding.FragmentEventReadLayoutBinding; public class EventReadFragment extends BaseReadFragment { @@ -131,6 +132,7 @@ protected void onAfterLayoutBinding(FragmentEventReadLayoutBinding contentBindin if (isVisibleAllowed(EventDto.class, contentBinding.eventSpecificRisk)) { contentBinding.eventSpecificRisk.setVisibility(record.getSpecificRisk() != null ? VISIBLE : GONE); } + contentBinding.eventResponsibleUser.setPseudonymized(record.isPseudonymized()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/edit/ImmunizationEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/edit/ImmunizationEditFragment.java index 4f22a74dde0..14fb57f8182 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/edit/ImmunizationEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/edit/ImmunizationEditFragment.java @@ -255,6 +255,7 @@ public void onAfterLayoutBinding(final FragmentImmunizationEditLayoutBinding con if(!isFieldAccessible(ImmunizationDto.class, contentBinding.immunizationHealthFacility)){ FieldVisibilityAndAccessHelper.setFieldInaccessibleValue(contentBinding.facilityTypeGroup); } + contentBinding.immunizationReportingUser.setPseudonymized(record.isPseudonymized()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/read/ImmunizationReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/read/ImmunizationReadFragment.java index 142f61c25bb..b3d0dab8cf8 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/read/ImmunizationReadFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/read/ImmunizationReadFragment.java @@ -86,6 +86,7 @@ public void onAfterLayoutBinding(FragmentImmunizationReadLayoutBinding contentBi if (record.getRelatedCase() == null) { contentBinding.openLinkedCase.setVisibility(View.GONE); } + contentBinding.immunizationReportingUser.setPseudonymized(record.isPseudonymized()); } private void setUpControlListeners(FragmentImmunizationReadLayoutBinding contentBinding) { diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationEditFragment.java index f3f7d388757..27bc4b6aa33 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationEditFragment.java @@ -111,6 +111,7 @@ public void onAfterLayoutBinding(FragmentVaccinationEditLayoutBinding contentBin contentBinding.vaccinationVaccinationInfoSource.initializeSpinner(vaccineInfoSourceList); contentBinding.immunizationReportDate.initializeDateField(getFragmentManager()); contentBinding.vaccinationVaccinationDate.initializeDateField(getFragmentManager()); + contentBinding.immunizationReportingUser.setPseudonymized(record.isPseudonymized()); } @Override diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationReadFragment.java index b945604d61b..f10e7117941 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationReadFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/immunization/vaccination/VaccinationReadFragment.java @@ -56,6 +56,11 @@ public void onLayoutBinding(FragmentVaccinationReadLayoutBinding contentBinding) } } + @Override + public void onAfterLayoutBinding(FragmentVaccinationReadLayoutBinding contentBinding) { + contentBinding.immunizationReportingUser.setPseudonymized(record.isPseudonymized()); + } + @Override protected String getSubHeadingTitle() { return getResources().getString(R.string.heading_vaccination); diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java index 7b4a38d7595..57e5bc4cbf9 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java @@ -82,7 +82,7 @@ public static String getLatLonLocation(Location location) { } } - public static void showUserContactInfo(User user, Resources resource, Context context) { + public static void showUserContactInfo(User user, Resources resource, Context context, boolean isPseudonymized) { StringBuilder sb = new StringBuilder(); String userPhone = null; String userEmail = null; @@ -93,21 +93,50 @@ public static void showUserContactInfo(User user, Resources resource, Context co sb.append("

" + resource.getString(R.string.heading_contact_information) + "

"); - if (user == null) { +// if (user == null) { +// sb.append(resource.getString(R.string.message_no_user_selected)); +// } else { +// sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); +// if (userPhone == null || userPhone.isEmpty()) { +// sb.append(resource.getString(R.string.message_not_specified)); +// } else { +// sb.append("" + userPhone + ""); +// } +// sb.append("
"); +// sb.append("").append(resource.getString(R.string.caption_email)).append(""); +// if (userEmail == null || userEmail.isEmpty()) { +// sb.append(resource.getString(R.string.message_not_specified)); +// } else { +// sb.append("" + userEmail + ""); +// } +// } + + if (user == null && !isPseudonymized) { sb.append(resource.getString(R.string.message_no_user_selected)); } else { - sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); - if (userPhone == null || userPhone.isEmpty()) { - sb.append(resource.getString(R.string.message_not_specified)); - } else { - sb.append("" + userPhone + ""); - } - sb.append("
"); - sb.append("").append(resource.getString(R.string.caption_email)).append(""); - if (userEmail == null || userEmail.isEmpty()) { - sb.append(resource.getString(R.string.message_not_specified)); + + if (isPseudonymized) { + sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); + String inaccessibleValue = I18nProperties.getCaption(Captions.inaccessibleValue); + sb.append("").append(inaccessibleValue).append(""); + sb.append("
"); + sb.append("").append(resource.getString(R.string.caption_email)).append(""); + sb.append("").append(inaccessibleValue).append(""); + } else { - sb.append("" + userEmail + ""); + sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); + if (userPhone == null || userPhone.isEmpty()) { + sb.append(resource.getString(R.string.message_not_specified)); + } else { + sb.append("" + userPhone + ""); + } + sb.append("
"); + sb.append("").append(resource.getString(R.string.caption_email)).append(""); + if (userEmail == null || userEmail.isEmpty()) { + sb.append(resource.getString(R.string.message_not_specified)); + } else { + sb.append("" + userEmail + ""); + } } } From 50314e1c925d0adc833d32dbe5650887d8b155ae Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Fri, 9 Feb 2024 10:50:38 +0200 Subject: [PATCH 25/65] #12851 - Display 'Confidential' instead of no user when rights to see personal/sensitive data inside/outside jurisdiction are missing - app --- .../de/symeda/sormas/app/util/ViewHelper.java | 38 ++++++------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java index 57e5bc4cbf9..09f8db8fe35 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/util/ViewHelper.java @@ -93,36 +93,11 @@ public static void showUserContactInfo(User user, Resources resource, Context co sb.append("

" + resource.getString(R.string.heading_contact_information) + "

"); -// if (user == null) { -// sb.append(resource.getString(R.string.message_no_user_selected)); -// } else { -// sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); -// if (userPhone == null || userPhone.isEmpty()) { -// sb.append(resource.getString(R.string.message_not_specified)); -// } else { -// sb.append("" + userPhone + ""); -// } -// sb.append("
"); -// sb.append("").append(resource.getString(R.string.caption_email)).append(""); -// if (userEmail == null || userEmail.isEmpty()) { -// sb.append(resource.getString(R.string.message_not_specified)); -// } else { -// sb.append("" + userEmail + ""); -// } -// } - if (user == null && !isPseudonymized) { - sb.append(resource.getString(R.string.message_no_user_selected)); + showPseudonymized(resource, sb); } else { - if (isPseudonymized) { - sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); - String inaccessibleValue = I18nProperties.getCaption(Captions.inaccessibleValue); - sb.append("").append(inaccessibleValue).append(""); - sb.append("
"); - sb.append("").append(resource.getString(R.string.caption_email)).append(""); - sb.append("").append(inaccessibleValue).append(""); - + showPseudonymized(resource, sb); } else { sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); if (userPhone == null || userPhone.isEmpty()) { @@ -146,4 +121,13 @@ public static void showUserContactInfo(User user, Resources resource, Context co userContactDialog.show(); } + private static void showPseudonymized(Resources resource, StringBuilder sb) { + sb.append("").append(resource.getString(R.string.caption_phone_number)).append(""); + String inaccessibleValue = I18nProperties.getCaption(Captions.inaccessibleValue); + sb.append("").append(inaccessibleValue).append(""); + sb.append("
"); + sb.append("").append(resource.getString(R.string.caption_email)).append(""); + sb.append("").append(inaccessibleValue).append(""); + } + } From a07cad7e2f1f9d3c0890888c33389d9879e610e2 Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Fri, 9 Feb 2024 12:05:53 +0100 Subject: [PATCH 26/65] qa-auto/HSP-6579 Stabilize "Create and check a new task data" - added method that wait for spinner not visible * qa-auto/HSP-6579 Stabilize "Create and check a new task data" - added method that wait for spinner not visible * qa-auto/HSP-6579 Stabilize "Create and check a new task data" - added test tag * qa-auto/HSP-6579 Stabilize "Create and check a new task data" - removed test tag --- .../steps/web/application/tasks/TaskManagementSteps.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java index 07bbda16036..0e9994bccbe 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java @@ -93,8 +93,11 @@ public TaskManagementSteps( When( "^I click on the NEW TASK button$", - () -> - webDriverHelpers.clickWhileOtherButtonIsDisplayed(NEW_TASK_BUTTON, TASK_TYPE_COMBOBOX)); + () ->{ + webDriverHelpers.waitForSpinnerNotVisible(10); + webDriverHelpers.clickWhileOtherButtonIsDisplayed(NEW_TASK_BUTTON, TASK_TYPE_COMBOBOX); + }); + And( "I click on SHOW MORE FILTERS BUTTON on Task directory page", () -> { From a98014e401769b74a4f41e46cbea74f536a8c581 Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Fri, 9 Feb 2024 13:25:24 +0100 Subject: [PATCH 27/65] qa-auto/HSP-6583 Check Language risky tests - added test that check language settings for test-de2, added all language checking tests to @precon suites (#12953) --- .../features/sanity/web/LanguageChecks.feature | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/LanguageChecks.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/LanguageChecks.feature index 6da7b22630a..fae08997a5e 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/LanguageChecks.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/LanguageChecks.feature @@ -1,7 +1,7 @@ @UI @Sanity @LanguageChecks Feature: Application language checks - @tmsLink=SORDEV-12126 @env_main @LanguageRisk + @tmsLink=SORDEV-12126 @env_main @LanguageRisk @precon Scenario: Test language Urdu-Pk Given I log in as a National Language User When I click on the User Settings button from navbar @@ -10,7 +10,7 @@ Feature: Application language checks Then I click on the User Settings button from navbar And I select "جرمن" language from Combobox in User settings - @tmsLink=SORQA-69 @env_de @LanguageRisk + @tmsLink=SORQA-69 @env_de @LanguageRisk @precon Scenario: Check Settings directory is written in German for german market Given I log in as a National User When I click on the User Settings button from navbar @@ -31,7 +31,7 @@ Feature: Application language checks Then I click on the User Settings button from navbar And I select "English" language from Combobox in User settings - @tmsLink=SORQA-7139 @env_de @Configuration @LanguageRisk + @tmsLink=SORQA-7139 @env_de @Configuration @LanguageRisk @precon Scenario: Check continent display language in German Given I log in as a National User And I click on the Configuration button from navbar @@ -45,7 +45,7 @@ Feature: Application language checks When I navigate to continents tab in Configuration And I check that continent list is correctly displayed - @tmsLink=SORQA-7139 @env_main @Configuration @LanguageRisk + @tmsLink=SORQA-7139 @env_main @Configuration @LanguageRisk @precon Scenario: Check continent display language in English Given I log in as a National User And I click on the Configuration button from navbar @@ -57,4 +57,11 @@ Feature: Application language checks And I select "Deutsch" language from Combobox in User settings And I click on the Configuration button from navbar When I navigate to continents tab in Configuration - And I check that continent list is correctly displayed in German \ No newline at end of file + And I check that continent list is correctly displayed in German + + @tmsLink=HSP-6583 @env_d2s @LanguageRisk @precon + Scenario: Check Settings directory is written in German for german market [2] + Given I log in as a National User + When I click on the User Settings button from navbar + And I select "Deutsch" language from Combobox in User settings + Then I check that German word for Configuration is present in the left main menu \ No newline at end of file From 0b45fff5cd9a2db07fb53dd57b79e536fc4eb52d Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:56:36 +0200 Subject: [PATCH 28/65] #5298 - Change DiseaseConfigurationFacadeEjb and CustomizableEnumFacadeEjb to use static cache fields --- .../CustomizableEnumFacadeEjb.java | 8 ++--- .../DiseaseConfigurationFacadeEjb.java | 30 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java index 34fc2b3dfa9..b921e7024fa 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java @@ -81,21 +81,21 @@ public class CustomizableEnumFacadeEjb /** * Maps a customizable enum type to all enum value entities of that type in the database. */ - private final EnumMap> enumValueEntities = new EnumMap<>(CustomizableEnumType.class); + private static final EnumMap> enumValueEntities = new EnumMap<>(CustomizableEnumType.class); /** * Maps a customizable enum type to all enum value strings of that type in the database. */ - private final EnumMap> enumValues = new EnumMap<>(CustomizableEnumType.class); + private static final EnumMap> enumValues = new EnumMap<>(CustomizableEnumType.class); /** * Maps a customizable enum type to a map with all enum values of this type as its keys and info, e.g. properties and active status, * defined for these enum values as its values. */ - private final EnumMap> enumInfo = new EnumMap<>(CustomizableEnumType.class); + private static final EnumMap> enumInfo = new EnumMap<>(CustomizableEnumType.class); /** * Maps a customizable enum type (defined by its class) to a map which in turn maps all languages for which translations exist to * the possible enum values of this type, which then finally map to their translated captions. */ - private final Map, Map>> enumValuesByLanguage = new HashMap<>(); + private static final Map, Map>> enumValuesByLanguage = new HashMap<>(); /** * Maps a customizable enum type (defined by its class) to a map which in turn maps all diseases that are relevant for this enum type * to all enum values that are used for the disease. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseConfigurationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseConfigurationFacadeEjb.java index 7b025f97af7..77c0f3d8efb 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseConfigurationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseConfigurationFacadeEjb.java @@ -54,21 +54,21 @@ public class DiseaseConfigurationFacadeEjb implements DiseaseConfigurationFacade @EJB private UserService userService; - private List activeDiseases = new ArrayList<>(); - private List inactiveDiseases = new ArrayList<>(); - private List primaryDiseases = new ArrayList<>(); - private List nonPrimaryDiseases = new ArrayList<>(); - private List caseSurveillanceDiseases = new ArrayList<>(); - private List aggregateReportingDiseases = new ArrayList<>(); - private List followUpEnabledDiseases = new ArrayList<>(); - - private Map extendedClassificationDiseases = new EnumMap<>(Disease.class); - private Map extendedClassificationMultiDiseases = new EnumMap<>(Disease.class); - - private Map followUpDurations = new EnumMap<>(Disease.class); - private Map caseFollowUpDurations = new EnumMap<>(Disease.class); - private Map eventParticipantFollowUpDurations = new EnumMap<>(Disease.class); - private Map automaticSampleAssignmentThresholds = new EnumMap<>(Disease.class); + private static final List activeDiseases = new ArrayList<>(); + private static final List inactiveDiseases = new ArrayList<>(); + private static final List primaryDiseases = new ArrayList<>(); + private static final List nonPrimaryDiseases = new ArrayList<>(); + private static final List caseSurveillanceDiseases = new ArrayList<>(); + private static final List aggregateReportingDiseases = new ArrayList<>(); + private static final List followUpEnabledDiseases = new ArrayList<>(); + + private static final Map extendedClassificationDiseases = new EnumMap<>(Disease.class); + private static final Map extendedClassificationMultiDiseases = new EnumMap<>(Disease.class); + + private static final Map followUpDurations = new EnumMap<>(Disease.class); + private static final Map caseFollowUpDurations = new EnumMap<>(Disease.class); + private static final Map eventParticipantFollowUpDurations = new EnumMap<>(Disease.class); + private static final Map automaticSampleAssignmentThresholds = new EnumMap<>(Disease.class); @Override @PermitAll From 8d925d6b2fba3758f533951dd0ef55f6748ad6a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Mon, 12 Feb 2024 12:46:29 +0100 Subject: [PATCH 29/65] #12869 - Fixed broken test --- .../ExternalMessageFacadeEjbTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbTest.java index a69ff747a70..dab8e822bb3 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjbTest.java @@ -28,11 +28,14 @@ import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.Consumer; +import javax.persistence.Query; + import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -51,6 +54,9 @@ import de.symeda.sormas.api.externalmessage.ExternalMessageType; import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto; import de.symeda.sormas.api.externalmessage.labmessage.TestReportDto; +import de.symeda.sormas.api.feature.FeatureConfigurationIndexDto; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityType; import de.symeda.sormas.api.person.PersonDto; @@ -68,6 +74,7 @@ import de.symeda.sormas.backend.MockProducer; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.customizableenum.CustomizableEnumValue; +import de.symeda.sormas.backend.feature.FeatureConfiguration; public class ExternalMessageFacadeEjbTest extends AbstractBeanTest { @@ -361,6 +368,19 @@ private ExternalMessageDto createLabMessageWithDiseaseVariants( @Test public void testSaveAndProcess() { + FeatureConfigurationIndexDto featureConfiguration = + new FeatureConfigurationIndexDto(DataHelper.createUuid(), null, null, null, null, null, true, null); + getFeatureConfigurationFacade().saveFeatureConfiguration(featureConfiguration, FeatureType.EXTERNAL_MESSAGES); + + executeInTransaction(em -> { + Query query = em.createQuery("select f from featureconfiguration f"); + FeatureConfiguration singleResult = (FeatureConfiguration) query.getSingleResult(); + HashMap properties = new HashMap<>(); + properties.put(FeatureTypeProperty.FORCE_AUTOMATIC_PROCESSING, true); + singleResult.setProperties(properties); + em.persist(singleResult); + }); + ExternalMessageDto labMessage = createLabMessage(m -> m.setAutomaticProcessingPossible(true)); ExternalMessageDto savedLabMessage = getExternalMessageFacade().saveAndProcessLabmessage(labMessage); From 0d0ad6769b6717934fb6ba9ae6e05f4684dbfe21 Mon Sep 17 00:00:00 2001 From: Carina Paul <47103965+carina29@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:49:19 +0200 Subject: [PATCH 30/65] #11551 - Add columns for event participant region, district, community (#12945) * #11551 - Add columns for event participant region, district, community * #11551 - Typo fix --- .../de/symeda/sormas/api/i18n/Captions.java | 3 +++ .../sormas/api/sample/SampleExportDto.java | 27 +++++++++++++++++-- .../src/main/resources/captions.properties | 5 +++- .../backend/sample/SampleFacadeEjb.java | 2 ++ .../sormas/backend/sample/SampleJoins.java | 8 ++++++ 5 files changed, 42 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 a3b5a16b05a..1d3e246e9e4 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 @@ -2094,6 +2094,9 @@ public interface Captions { String SampleExport_contactReportDate = "SampleExport.contactReportDate"; String SampleExport_contactUuid = "SampleExport.contactUuid"; String SampleExport_creatinine = "SampleExport.creatinine"; + String SampleExport_eventParticipantCommunity = "SampleExport.eventParticipantCommunity"; + String SampleExport_eventParticipantDistrict = "SampleExport.eventParticipantDistrict"; + String SampleExport_eventParticipantRegion = "SampleExport.eventParticipantRegion"; String SampleExport_gasOxygenTherapy = "SampleExport.gasOxygenTherapy"; String SampleExport_haemoglobin = "SampleExport.haemoglobin"; String SampleExport_haemoglobinuria = "SampleExport.haemoglobinuria"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java index 1cc96f891e9..b6ce974e43f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java @@ -127,6 +127,9 @@ public class SampleExportDto extends AbstractUuidDto { private final Date lastContactDate; private final ContactClassification contactClassification; private final ContactStatus contactStatus; + private String eventParticipantRegion; + private String eventParticipantDistrict; + private String eventParticipantCommunity; private String caseResponsibleRegion; private String caseResponsibleDistrict; private String caseResponsibleCommunity; @@ -152,8 +155,8 @@ public SampleExportDto(long id, String uuid, String labSampleId, Date sampleRepo String eventAddressRegion, String eventAddressDistrict, String eventAddressCommunity, String eventAddressCity, String eventAddressStreet, String eventAddressHouseNumber, String eventAddressAdditionalInformation, Date caseReportDate, CaseClassification caseClassification, CaseOutcome caseOutcome, String caseRegion, String caseDistrict, String caseCommunity, String caseHealthFacility, String caseFacilityDetails, String contactRegion, String contactDistrict, String contactCommunity, - Date contactReportDate, Date lastContactDate, ContactClassification contactClassification, ContactStatus contactStatus, String labUuid, String caseHealthFacilityUuid, - String caseResponsibleRegion, String caseResponsibleDistrict, String caseResponsibleCommunity, + Date contactReportDate, Date lastContactDate, ContactClassification contactClassification, ContactStatus contactStatus, String eventParticipantRegion, String eventParticipantDistrict, + String labUuid, String caseHealthFacilityUuid, String caseResponsibleRegion, String caseResponsibleDistrict, String caseResponsibleCommunity, boolean isInJurisdiction, boolean isCaseInJurisdiction, boolean isContactInJurisdiction, boolean isContactCaseInJurisdiction, boolean isEventParticipantInJurisdiction) { //@formatter:on super(uuid); @@ -183,6 +186,11 @@ public SampleExportDto(long id, String uuid, String labSampleId, Date sampleRepo if (eventParticipantUuid != null) { this.associatedEventParticipant = new EventParticipantReferenceDto(eventParticipantUuid, eventParticipantFirstName, eventParticipantLastName); + + boolean isEventParticipantJurisdictionDataFilled = eventParticipantRegion != null; + this.eventParticipantRegion = isEventParticipantJurisdictionDataFilled ? eventParticipantRegion : eventAddressRegion; + this.eventParticipantDistrict = isEventParticipantJurisdictionDataFilled ? eventParticipantDistrict : eventAddressDistrict; + this.eventParticipantCommunity = isEventParticipantJurisdictionDataFilled ? null : eventAddressCommunity; } this.disease = caseUuid != null @@ -688,6 +696,21 @@ public String getContactCommunity() { return contactCommunity; } + @Order(68) + public String getEventParticipantRegion() { + return eventParticipantRegion; + } + + @Order(69) + public String getEventParticipantDistrict() { + return eventParticipantDistrict; + } + + @Order(70) + public String getEventParticipantCommunity() { + return eventParticipantCommunity; + } + @Order(71) public String getPathogenTestType1() { return pathogenTest1.formatType(); diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index b5e788f5747..9f0241740a0 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -2099,6 +2099,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2928,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents 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 fc1ad181f92..8494e1ac1cb 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 @@ -622,6 +622,8 @@ private List getExportList( joins.getContact().get(Contact.LAST_CONTACT_DATE), joins.getContact().get(Contact.CONTACT_CLASSIFICATION), joins.getContact().get(Contact.CONTACT_STATUS), + joins.getEventParticipantRegion().get(Region.NAME), + joins.getEventParticipantDistrict().get(District.NAME), joins.getLab().get(AbstractDomainObject.UUID), joins.getCaseFacility().get(AbstractDomainObject.UUID), joins.getCaseResponsibleRegion().get(Region.NAME), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java index 25ab7f2e161..23da7b2beb9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java @@ -176,6 +176,14 @@ public void setEventParticipantJoins(EventParticipantJoins eventParticipantJoins this.eventParticipantJoins = eventParticipantJoins; } + public Join getEventParticipantRegion() { + return getEventParticipantJoins().getEventParticipantResponsibleRegion(); + } + + public Join getEventParticipantDistrict() { + return getEventParticipantJoins().getEventParticipantResponsibleDistrict(); + } + public Join getPathogenTest() { return getOrCreate(pathogenTest, Sample.PATHOGENTESTS, JoinType.LEFT, this::setPathogenTest); } From 21011844597a84053fe71b2824ed3948d2cbc1c2 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 12 Feb 2024 14:25:08 +0100 Subject: [PATCH 31/65] qa-auto/HSP-6580 Stabilize "Sormas - Progress window for bulk delete and restore" - bulk action selectors was updated --- .../pages/application/cases/CaseDirectoryPage.java | 10 ++++++---- .../web/application/cases/CaseDirectorySteps.java | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) 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 74e7c36952c..b4a976e1792 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 @@ -111,9 +111,11 @@ public static final By getCaseResultsUuidLocator(String uuid) { By.cssSelector("[id='ownershipStatus'] [class='v-filterselect-button']"); 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 BULK_ACTIONS_ARCHIVE = By.xpath("//span[contains(text(),'Archive')]"); + public static final By BULK_ACTIONS_DE_ARCHIVE = + By.xpath("//span[contains(text(),'De-Archive')]\n"); + public static final By BULK_CREATE_QUARANTINE_ORDER = + By.xpath("//span[contains(text(),'Create quarantine order documents')]"); public static final By CASE_REPORTING_USER_FILTER = By.cssSelector("[id='reportingUserLike']"); public static final By CASE_YEAR_FILTER = By.cssSelector("[id='birthdateYYYY'] [class='v-filterselect-button']"); @@ -314,7 +316,7 @@ public static By getCaseUUIDBasedOnRowInTable(Integer index) { public static final By PROGRESSBAR_TOTAL_NUMBER_OF_SKIPPED_CASES_LABEL = By.xpath("//div[contains(text(), 'Skipped')]"); public static final By BULK_MODE_SUCCESS_IMAGE = By.cssSelector(".popupContent .v-image"); - public static final By BULK_RESTORE_BUTTON = By.id("bulkActions-4"); + public static final By BULK_RESTORE_BUTTON = By.xpath("//span[contains(text(),'Restore')]"); public static final By CONFIRM_RESTORATION_WINDOWS_HEADER = By.xpath("//div[contains(text(), 'Confirm restoration')]"); } 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 ef357afc30b..9d593c436c8 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 @@ -1575,7 +1575,7 @@ public CaseDirectorySteps( And( "^I check that Relevance Status Filter is set to \"([^\"]*)\" on Case Directory page$", (String relevanceStatus) -> { - webDriverHelpers.waitForPageLoadingSpinnerToDisappear(300); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(400); softly.assertEquals( webDriverHelpers.getValueFromWebElement(RELEVANT_STATUS_INPUT), relevanceStatus, From 91eef00492560d5c4187ea1560f96e7e0f2f1e5e Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Mon, 12 Feb 2024 16:47:31 +0200 Subject: [PATCH 32/65] #11528 - Rename See samples for this person" to "See sample for this..." based on the associated entity --- .../src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java | 3 --- .../main/java/de/symeda/sormas/ui/contact/ContactDataView.java | 3 --- .../de/symeda/sormas/ui/events/EventParticipantDataView.java | 3 --- 3 files changed, 9 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java index c793bb8bbd1..366588ba6c8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java @@ -140,9 +140,6 @@ protected void initView(String params) { this::showUnsavedChangesPopup, isEditAllowed, SampleAssociationType.CASE); -// SampleListComponentLayout sampleListComponentLayout = -// new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesCase), isEditAllowed); -// isEditAllowed); SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, null, isEditAllowed); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java index d26cf46baf4..16b75a1b839 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java @@ -218,9 +218,6 @@ protected void initView(String params) { this::showUnsavedChangesPopup, editAllowed, SampleAssociationType.CONTACT); -// SampleListComponentLayout sampleListComponentLayout = -// new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesContact)); -// editAllowed); SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, null); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java index 416251c88c0..e7634d7bb99 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java @@ -116,9 +116,6 @@ protected void initView(String params) { this::showUnsavedChangesPopup, editAllowed, SampleAssociationType.EVENT_PARTICIPANT); -// SampleListComponentLayout sampleListComponentLayout = -// new SampleListComponentLayout(sampleList, I18nProperties.getString(Strings.infoCreateNewSampleDiscardsChangesEventParticipant)); -// editAllowed); SampleListComponentLayout sampleListComponentLayout = new SampleListComponentLayout(sampleList, null); layout.addSidePanelComponent(sampleListComponentLayout, SAMPLES_LOC); } From e4d640d661d0a19e4cf07ea1c2d4af9753557780 Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:58:18 +0100 Subject: [PATCH 33/65] qa-auto/HSP-6585 Stabilize "[S2S] Simultaneous Work on Person [4]" - the method for waiting for element has been exchanges (#12959) --- .../e2etests/steps/web/application/cases/EditCaseSteps.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/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index f8ef8cf8386..c4441909f59 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 @@ -2997,7 +2997,7 @@ public EditCaseSteps( And( "^I check if editable fields are read only for shared case/contact$", () -> { - webDriverHelpers.waitUntilIdentifiedElementIsPresent(EditCasePage.UUID_INPUT); + webDriverHelpers.waitForElementPresent(EditCasePage.UUID_INPUT, 15); webDriverHelpers.isElementGreyedOut(EditCasePage.UUID_INPUT); webDriverHelpers.isElementGreyedOut(EditCasePage.SAVE_BUTTON); }); From 3fa3e35c41156dfd595db2944bc8ade51bfab836 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Tue, 13 Feb 2024 10:03:48 +0200 Subject: [PATCH 34/65] #12851 - Display 'Confidential' instead of no user when rights to see personal/sensitive data inside/outside jurisdiction are missing --- .../src/main/java/de/symeda/sormas/ui/utils/UserField.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java index 7a817e7cfc7..ec53a669bfe 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java @@ -53,7 +53,6 @@ protected Component initContent() { } userCombo.setNullSelectionAllowed(true); userCombo.setValue(getValue()); - parentPseudonymizedFlag = parentPseudonymizedSupplier.get(); userCombo.setEnabled(enabled); userCombo.setReadOnly(readOnly); userLayout.addComponent(userCombo); @@ -71,7 +70,6 @@ protected Component initContent() { addValueChangeListener(c -> { userCombo.setValue(c.getProperty().getValue()); - parentPseudonymizedFlag = parentPseudonymizedSupplier.get(); }); return userLayout; @@ -150,6 +148,7 @@ protected void triggerUserContactPopUpWindow() { createFieldLayout(I18nProperties.getCaption(Captions.User_userEmail), userDto.getUserEmail(), LinkType.EMAIL, false)); } } else { + parentPseudonymizedFlag = parentPseudonymizedSupplier.get(); if (userDto == null && !parentPseudonymizedFlag) { HorizontalLayout labelLayout = new HorizontalLayout(); Label noUserMessageLabel = new Label(); From 16b851ebea219f2fd911d9468f66d3ac1d99229f Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Tue, 13 Feb 2024 10:45:58 +0200 Subject: [PATCH 35/65] #12949 Error when assigning a user a role that has national level jurisdiction after it was assigned a surveillance officer role --- .../sormas/backend/user/UserFacadeEjb.java | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) 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 fb8df2ca8d9..d9f6db3f8e0 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 @@ -72,7 +72,7 @@ import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.infrastructure.InfrastructureHelper; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; -import de.symeda.sormas.api.infrastructure.facility.FacilityDto; +import de.symeda.sormas.api.infrastructure.facility.FacilityType; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.task.TaskContext; import de.symeda.sormas.api.task.TaskContextIndexCriteria; @@ -962,19 +962,14 @@ private List getUsersFromCasesByDistricts(List districtsUuidsAmong } private Set getPossibleUsersBasedOnCasesFacility(List cases) { - Set possibleFacilities = cases.stream().map(Case::getHealthFacility).collect(Collectors.toSet()); - - Set possibleUsersForAvailableFacilities = new HashSet<>(); - - possibleFacilities.forEach(facility -> { - if (facility != null - && !FacilityDto.NONE_FACILITY_UUID.equals(facility.getUuid()) - && !FacilityDto.OTHER_FACILITY_UUID.equals(facility.getUuid())) { - possibleUsersForAvailableFacilities.addAll(userService.getFacilityUsersOfHospital(facility)); - } - }); - - return possibleUsersForAvailableFacilities; + return cases.stream() + .map(Case::getHealthFacility) + .filter(Objects::nonNull) + .filter(f -> f.getType() == FacilityType.HOSPITAL) + .distinct() + .map(userService::getFacilityUsersOfHospital) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); } @Override From cd705bb699b390f94bc53ff01cf3ea872e5174a2 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Tue, 13 Feb 2024 12:55:14 +0200 Subject: [PATCH 36/65] #12957 Inconsistent and not pre-filled jurisdiction in immunization directory for users restricted by jurisdiction --- .../de/symeda/sormas/ui/caze/CaseFilterForm.java | 6 +++--- .../components/filter/ImmunizationFilterForm.java | 12 ++++++------ .../de/symeda/sormas/ui/person/PersonFilterForm.java | 6 +++--- .../symeda/sormas/ui/utils/AbstractFilterForm.java | 9 +++++++-- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java index 3131758a495..217f849c79d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java @@ -734,11 +734,11 @@ protected void applyDependenciesOnNewValue(CaseCriteria criteria) { // Disable fields according to user & jurisdiction if (userJurisdictionLevel == JurisdictionLevel.DISTRICT) { - clearAndDisableFields(districtField); + disableFields(districtField); } else if (userJurisdictionLevel == JurisdictionLevel.COMMUNITY) { - clearAndDisableFields(districtField, communityField); + disableFields(districtField, communityField); } else if (userJurisdictionLevel == JurisdictionLevel.HEALTH_FACILITY) { - clearAndDisableFields(districtField, communityField, facilityTypeGroupField, facilityTypeField, facilityField); + disableFields(districtField, communityField, facilityTypeGroupField, facilityTypeField, facilityField); } if (UserProvider.getCurrent().hasUserRight(UserRight.PORT_HEALTH_INFO_VIEW)) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/filter/ImmunizationFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/filter/ImmunizationFilterForm.java index 3dde895c3fc..6bb3ad0184e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/filter/ImmunizationFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/filter/ImmunizationFilterForm.java @@ -99,15 +99,15 @@ protected void addFields() { @Override public void addMoreFilters(CustomLayout moreFiltersContainer) { + UserDto user = currentUserDto(); + if (user.getRegion() == null) { ComboBox regionFilter = addField(moreFiltersContainer, FieldConfiguration.pixelSized(ImmunizationCriteria.REGION, 140)); regionFilter.addItems(FacadeProvider.getRegionFacade().getAllActiveByServerCountry()); + } ComboBox districtFilter = addField(moreFiltersContainer, FieldConfiguration.pixelSized(ImmunizationCriteria.DISTRICT, 140)); districtFilter.setDescription(I18nProperties.getDescription(Descriptions.descDistrictFilter)); - if (currentUserDto().getDistrict() != null) { - districtFilter.setVisible(false); - } addField(moreFiltersContainer, FieldConfiguration.pixelSized(ImmunizationCriteria.COMMUNITY, 140)); @@ -344,11 +344,11 @@ protected void applyDependenciesOnNewValue(ImmunizationCriteria criteria) { // Disable fields according to user & jurisdiction if (userJurisdictionLevel == JurisdictionLevel.DISTRICT) { - clearAndDisableFields(districtFilter); + disableFields(districtFilter); } else if (userJurisdictionLevel == JurisdictionLevel.COMMUNITY) { - clearAndDisableFields(districtFilter, communityFilter); + disableFields(districtFilter, communityFilter); } else if (userJurisdictionLevel == JurisdictionLevel.HEALTH_FACILITY) { - clearAndDisableFields(districtFilter, communityFilter, facilityTypeGroupField, facilityTypeField, facilityField); + disableFields(districtFilter, communityFilter, facilityTypeGroupField, facilityTypeField, facilityField); } ComboBox birthDateDD = getField(ImmunizationCriteria.BIRTHDATE_DD); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonFilterForm.java index 75813adaa97..94cb4943f63 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonFilterForm.java @@ -154,11 +154,11 @@ protected void applyDependenciesOnNewValue(PersonCriteria criteria) { // Disable fields according to user & jurisdiction if (userJurisdictionLevel == JurisdictionLevel.DISTRICT) { - clearAndDisableFields(districtFilter); + disableFields(districtFilter); } else if (userJurisdictionLevel == JurisdictionLevel.COMMUNITY) { - clearAndDisableFields(districtFilter, communityFilter); + disableFields(districtFilter, communityFilter); } else if (userJurisdictionLevel == JurisdictionLevel.HEALTH_FACILITY) { - clearAndDisableFields(districtFilter, communityFilter); + disableFields(districtFilter, communityFilter); } ComboBox birthDateDD = getField(PersonCriteria.BIRTHDATE_DD); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java index fc79477b314..88376ef1d18 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java @@ -4,6 +4,7 @@ import static de.symeda.sormas.ui.utils.LayoutUtil.filterLocs; import static de.symeda.sormas.ui.utils.LayoutUtil.locCss; +import java.util.Collections; import java.util.Objects; import java.util.function.Supplier; import java.util.stream.Stream; @@ -245,16 +246,20 @@ protected void applyDependenciesOnNewValue(T newValue) { protected void applyRegionFilterDependency(RegionReferenceDto region, String districtFieldId) { final UserDto user = UserProvider.getCurrent().getUser(); final ComboBox districtField = getField(districtFieldId); - if (user.getRegion() != null && user.getDistrict() == null) { + DistrictReferenceDto userDistrict = user.getDistrict(); + + if (user.getRegion() != null && userDistrict == null) { FieldHelper.updateItems(districtField, FacadeProvider.getDistrictFacade().getAllActiveByRegion(user.getRegion().getUuid())); districtField.setEnabled(true); } else if (region != null) { FieldHelper.updateItems(districtField, FacadeProvider.getDistrictFacade().getAllActiveByRegion(region.getUuid())); - if (user.getDistrict() == null) { + if (userDistrict == null) { districtField.setEnabled(true); } } else { districtField.setEnabled(false); + FieldHelper.updateItems(districtField, Collections.singletonList(userDistrict)); + districtField.setValue(userDistrict); } } From d66a62144c54e1e62e818e60839d6eb31e0ebdb3 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Tue, 13 Feb 2024 13:38:55 +0200 Subject: [PATCH 37/65] #12851 - Display 'Confidential' instead of no user when rights to see personal/sensitive data inside/outside jurisdiction are missing --- .../src/main/java/de/symeda/sormas/ui/utils/UserField.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java index ec53a669bfe..8e60032fd48 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/UserField.java @@ -32,7 +32,6 @@ public class UserField extends CustomField { private boolean readOnly; private boolean enabled; private List items = new ArrayList<>(); - private boolean parentPseudonymizedFlag; private Supplier parentPseudonymizedSupplier; public UserField() { @@ -148,7 +147,7 @@ protected void triggerUserContactPopUpWindow() { createFieldLayout(I18nProperties.getCaption(Captions.User_userEmail), userDto.getUserEmail(), LinkType.EMAIL, false)); } } else { - parentPseudonymizedFlag = parentPseudonymizedSupplier.get(); + boolean parentPseudonymizedFlag = parentPseudonymizedSupplier.get(); if (userDto == null && !parentPseudonymizedFlag) { HorizontalLayout labelLayout = new HorizontalLayout(); Label noUserMessageLabel = new Label(); From b60c5f3ba0bfedabcd696f9282d7651fd05c4bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 14 Feb 2024 14:18:35 +0100 Subject: [PATCH 38/65] #12887 - Update environment delete dependencies --- .../de/symeda/sormas/api/user/UserRight.java | 4 +-- .../src/main/resources/sql/sormas_schema.sql | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java index cbab9a2e49a..3927b04d7ae 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java @@ -217,7 +217,7 @@ public enum UserRight { ENVIRONMENT_CREATE(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_VIEW), ENVIRONMENT_EDIT(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_VIEW), ENVIRONMENT_ARCHIVE(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_VIEW), - ENVIRONMENT_DELETE(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_VIEW), + ENVIRONMENT_DELETE(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_VIEW, UserRight._ENVIRONMENT_SAMPLE_DELETE), ENVIRONMENT_IMPORT(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_CREATE), ENVIRONMENT_EXPORT(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_VIEW), @@ -226,7 +226,7 @@ public enum UserRight { ENVIRONMENT_SAMPLE_EDIT(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_VIEW), ENVIRONMENT_SAMPLE_EDIT_DISPATCH(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_EDIT), ENVIRONMENT_SAMPLE_EDIT_RECEIVAL(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_EDIT), - ENVIRONMENT_SAMPLE_DELETE(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_VIEW), + ENVIRONMENT_SAMPLE_DELETE(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_VIEW, UserRight._ENVIRONMENT_PATHOGEN_TEST_DELETE), ENVIRONMENT_SAMPLE_IMPORT(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_CREATE), ENVIRONMENT_SAMPLE_EXPORT(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_VIEW), ENVIRONMENT_PATHOGEN_TEST_CREATE(UserRightGroup.ENVIRONMENT, UserRight._ENVIRONMENT_SAMPLE_VIEW), diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index b8314b70261..df4e1d68c1c 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12880,4 +12880,38 @@ ALTER TABLE customizableenumvalue_history ADD COLUMN active boolean; INSERT INTO schema_version (version_number, comment) VALUES (539, 'Add active column to customizable enum values #12804'); +-- 2024-02-14 Update environment sample deletion dependencies #12887 +DO +$$ + DECLARE + user_role_id BIGINT; + BEGIN + FOR user_role_id IN SELECT DISTINCT(ur.id) + FROM userroles ur + JOIN userroles_userrights urur ON ur.id = urur.userrole_id + WHERE urur.userright = 'ENVIRONMENT_DELETE' + AND urur.userright != 'ENVIRONMENT_SAMPLE_DELETE' + LOOP + INSERT INTO userroles_userrights (userrole_id, userright) + VALUES (user_role_id, 'ENVIRONMENT_SAMPLE_DELETE'); + + UPDATE userroles set changedate = now() WHERE id = user_role_id; + END LOOP; + + FOR user_role_id IN SELECT DISTINCT(ur.id) + FROM userroles ur + JOIN userroles_userrights urur ON ur.id = urur.userrole_id + WHERE urur.userright = 'ENVIRONMENT_SAMPLE_DELETE' + AND urur.userright != 'ENVIRONMENT_PATHOGEN_TEST_DELETE' + LOOP + INSERT INTO userroles_userrights (userrole_id, userright) + VALUES (user_role_id, 'ENVIRONMENT_PATHOGEN_TEST_DELETE'); + + UPDATE userroles set changedate = now() WHERE id = user_role_id; + END LOOP; + END; +$$ LANGUAGE plpgsql; + +INSERT INTO schema_version (version_number, comment) VALUES (540, 'Update environment sample deletion dependencies #12887'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** From 16936e8f6f0e61d035ffaa51ff311bc154915e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Feb 2024 09:22:36 +0100 Subject: [PATCH 39/65] New Crowdin updates (#12948) * 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 captions.properties (Czech) * New translations enum.properties (Czech) * New translations captions.properties (Spanish, Bolivia) * New translations descriptions.properties (Spanish, Bolivia) * New translations enum.properties (Spanish, Bolivia) * New translations strings.properties (Spanish, Bolivia) * New translations validations.properties (Spanish, Bolivia) * New translations strings.xml (Spanish, Bolivia) * New translations strings_format.xml (Spanish, Bolivia) * New translations countries.properties (Spanish, Bolivia) * New translations continents.properties (Spanish, Bolivia) * New translations subcontinents.properties (Spanish, Bolivia) * New translations captions.properties (Polish) * New translations captions.properties (Polish) * New translations captions.properties (Hindi) * New translations strings.properties (Czech) * New translations captions.properties (Czech) * New translations captions.properties (Spanish, Bolivia) * New translations strings.properties (Spanish, Bolivia) * New translations captions.properties (Polish) * New translations captions.properties (Hindi) * New translations captions.properties (Romanian) * New translations strings.properties (Romanian) * New translations captions.properties (French) * New translations strings.properties (French) * New translations captions.properties (Spanish) * New translations strings.properties (Spanish) * New translations captions.properties (Arabic) * New translations strings.properties (Arabic) * New translations captions.properties (German) * New translations strings.properties (German) * New translations captions.properties (Finnish) * New translations strings.properties (Finnish) * New translations captions.properties (Italian) * New translations strings.properties (Italian) * New translations captions.properties (Japanese) * New translations strings.properties (Japanese) * New translations captions.properties (Dutch) * New translations strings.properties (Dutch) * New translations captions.properties (Norwegian) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations captions.properties (Portuguese) * New translations strings.properties (Portuguese) * New translations captions.properties (Russian) * New translations strings.properties (Russian) * New translations captions.properties (Swedish) * New translations strings.properties (Swedish) * New translations captions.properties (Turkish) * New translations strings.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations strings.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations strings.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations strings.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations captions.properties (Filipino) * New translations strings.properties (Filipino) * New translations captions.properties (Fijian) * New translations strings.properties (Fijian) * New translations captions.properties (Swahili) * New translations strings.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations strings.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations strings.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations strings.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations strings.properties (Dari) * New translations captions.properties (Pashto) * New translations strings.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations strings.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations strings.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations strings.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations strings.properties (French, Tunisia) * New translations captions.properties (French) * New translations captions.properties (Czech) * New translations captions.properties (Spanish, Bolivia) * New translations captions.properties (Polish) * New translations captions.properties (Hindi) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * 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 (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 (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 (Urdu (Pakistan)) * New translations validations.properties (Urdu (Pakistan)) * New translations strings.properties (Czech) * New translations captions.properties (Czech) * New translations captions.properties (Spanish, Bolivia) * New translations strings.properties (Spanish, Bolivia) * New translations captions.properties (Polish) * New translations captions.properties (Hindi) * New translations captions.properties (Romanian) * New translations strings.properties (Romanian) * New translations captions.properties (French) * New translations strings.properties (French) * New translations captions.properties (Spanish) * New translations strings.properties (Spanish) * New translations captions.properties (Arabic) * New translations strings.properties (Arabic) * New translations captions.properties (German) * New translations strings.properties (German) * New translations captions.properties (Finnish) * New translations strings.properties (Finnish) * New translations captions.properties (Italian) * New translations strings.properties (Italian) * New translations captions.properties (Japanese) * New translations strings.properties (Japanese) * New translations captions.properties (Dutch) * New translations strings.properties (Dutch) * New translations captions.properties (Norwegian) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations captions.properties (Portuguese) * New translations strings.properties (Portuguese) * New translations captions.properties (Russian) * New translations strings.properties (Russian) * New translations captions.properties (Swedish) * New translations strings.properties (Swedish) * New translations captions.properties (Turkish) * New translations strings.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations strings.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations strings.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations strings.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations captions.properties (Filipino) * New translations strings.properties (Filipino) * New translations captions.properties (Fijian) * New translations strings.properties (Fijian) * New translations captions.properties (Swahili) * New translations strings.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations strings.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations strings.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations strings.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations strings.properties (Dari) * New translations captions.properties (Pashto) * New translations strings.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations strings.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations strings.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations strings.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations strings.properties (French, Tunisia) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Urdu (Pakistan)) * New translations enum.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Cuba) --- .../main/resources/captions_ar-SA.properties | 9 +- .../main/resources/captions_cs-CZ.properties | 9 +- .../main/resources/captions_de-CH.properties | 9 +- .../main/resources/captions_de-DE.properties | 9 +- .../main/resources/captions_en-AF.properties | 9 +- .../main/resources/captions_en-GH.properties | 9 +- .../main/resources/captions_en-NG.properties | 9 +- .../main/resources/captions_es-BO.properties | 7 +- .../main/resources/captions_es-CU.properties | 9 +- .../main/resources/captions_es-ES.properties | 9 +- .../main/resources/captions_fa-AF.properties | 9 +- .../main/resources/captions_fi-FI.properties | 9 +- .../main/resources/captions_fil-PH.properties | 9 +- .../main/resources/captions_fj-FJ.properties | 9 +- .../main/resources/captions_fr-CD.properties | 9 +- .../main/resources/captions_fr-CH.properties | 9 +- .../main/resources/captions_fr-FR.properties | 9 +- .../main/resources/captions_fr-TN.properties | 9 +- .../main/resources/captions_hi-IN.properties | 45 ++-- .../main/resources/captions_hr-HR.properties | 9 +- .../main/resources/captions_it-CH.properties | 9 +- .../main/resources/captions_it-IT.properties | 9 +- .../main/resources/captions_ja-JP.properties | 9 +- .../main/resources/captions_ne-NP.properties | 9 +- .../main/resources/captions_nl-NL.properties | 9 +- .../main/resources/captions_no-NO.properties | 9 +- .../main/resources/captions_pl-PL.properties | 9 +- .../main/resources/captions_ps-AF.properties | 9 +- .../main/resources/captions_pt-PT.properties | 9 +- .../main/resources/captions_ro-RO.properties | 9 +- .../main/resources/captions_ru-RU.properties | 9 +- .../main/resources/captions_sv-SE.properties | 9 +- .../main/resources/captions_sw-KE.properties | 9 +- .../main/resources/captions_tr-TR.properties | 9 +- .../main/resources/captions_uk-UA.properties | 9 +- .../main/resources/captions_ur-PK.properties | 245 +++++++++--------- .../main/resources/captions_zh-CN.properties | 9 +- .../src/main/resources/enum_ur-PK.properties | 30 +-- .../main/resources/strings_ar-SA.properties | 3 - .../main/resources/strings_cs-CZ.properties | 3 - .../main/resources/strings_de-CH.properties | 3 - .../main/resources/strings_de-DE.properties | 3 - .../main/resources/strings_en-AF.properties | 3 - .../main/resources/strings_en-GH.properties | 3 - .../main/resources/strings_en-NG.properties | 3 - .../main/resources/strings_es-BO.properties | 3 - .../main/resources/strings_es-CU.properties | 3 - .../main/resources/strings_es-ES.properties | 3 - .../main/resources/strings_fa-AF.properties | 3 - .../main/resources/strings_fi-FI.properties | 3 - .../main/resources/strings_fil-PH.properties | 3 - .../main/resources/strings_fj-FJ.properties | 3 - .../main/resources/strings_fr-CD.properties | 3 - .../main/resources/strings_fr-CH.properties | 3 - .../main/resources/strings_fr-FR.properties | 3 - .../main/resources/strings_fr-TN.properties | 3 - .../main/resources/strings_hi-IN.properties | 3 - .../main/resources/strings_hr-HR.properties | 3 - .../main/resources/strings_it-CH.properties | 3 - .../main/resources/strings_it-IT.properties | 3 - .../main/resources/strings_ja-JP.properties | 3 - .../main/resources/strings_ne-NP.properties | 3 - .../main/resources/strings_nl-NL.properties | 3 - .../main/resources/strings_no-NO.properties | 3 - .../main/resources/strings_pl-PL.properties | 3 - .../main/resources/strings_ps-AF.properties | 3 - .../main/resources/strings_pt-PT.properties | 3 - .../main/resources/strings_ro-RO.properties | 3 - .../main/resources/strings_ru-RU.properties | 3 - .../main/resources/strings_sv-SE.properties | 3 - .../main/resources/strings_sw-KE.properties | 3 - .../main/resources/strings_tr-TR.properties | 3 - .../main/resources/strings_uk-UA.properties | 3 - .../main/resources/strings_ur-PK.properties | 3 - .../main/resources/strings_zh-CN.properties | 3 - .../resources/validations_ur-PK.properties | 2 +- 76 files changed, 410 insertions(+), 336 deletions(-) diff --git a/sormas-api/src/main/resources/captions_ar-SA.properties b/sormas-api/src/main/resources/captions_ar-SA.properties index a711b7f3304..f1a0c5bc805 100644 --- a/sormas-api/src/main/resources/captions_ar-SA.properties +++ b/sormas-api/src/main/resources/captions_ar-SA.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index 7f9c32793f7..57b674607db 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -54,7 +54,6 @@ notAvailableShort=Není dostupné inaccessibleValue=Důvěrné numberOfCharacters=Počet znaků\: %d / %d remove=Smazat -reportingUser=Oznamující uživatel notTestedYet=Zatím netestováno latestPathogenTest=Nejnovější test patogenu\: unknown=Neznámý @@ -1795,6 +1794,9 @@ personLinkToEvents=Zobrazit události pro tuto osobu personLinkToCases=Zobrazit případy této osoby personLinkToContacts=Zobrazit kontakty pro tuto osobu personLinkToSamples = Zobrazit vzorky této osoby +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Také nahradí existující souřadnice. Varování\: To by mohlo nahradit souřadnice, které byly záměrně nastaveny jinak\! personsSetMissingGeoCoordinates=Nastavit chybějící geo souřadnice personsUpdated=Osoby aktualizovány @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Datum zprávy o případu SampleExport.caseResponsibleCommunity=Komunita zodpovědná za případy SampleExport.caseResponsibleDistrict=Odpovědný okres SampleExport.caseResponsibleRegion=Odpovědný region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Pohlaví případu/kontaktu/události účastnící se osoby SampleExport.caseUuid=UUID případu SampleExport.contactUuid=UUID kontaktu @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Přiložit dokument(y) externalEmailUsedTemplate=Šablona externalEmailSentBy=Odeslal externalEmailSentTo=Příjemce -externalEmailAttachedDocuments=Připojené dokumenty \ No newline at end of file +externalEmailAttachedDocuments=Připojené dokumenty diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index d6329821a69..6992dcc7d6e 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -54,7 +54,6 @@ notAvailableShort=k. A inaccessibleValue=Vertraulich numberOfCharacters=Anzahl der Zeichen\: %d / %d remove=Entfernen -reportingUser=Meldender Nutzer notTestedYet=Noch nicht getestet latestPathogenTest=Neuester Erregertest\: unknown=Unbekannt @@ -1795,6 +1794,9 @@ personLinkToEvents=Ereignisse für diese Person ansehen personLinkToCases=Fälle für diese Person ansehen personLinkToContacts=Kontakte für diese Person ansehen personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Auch bestehende Koordinaten ersetzen. Warnung\: Dies könnte Koordinaten ersetzen, die absichtlich anders gesetzt wurden\! personsSetMissingGeoCoordinates=Fehlende Geo-Koordinaten generieren personsUpdated=Aktualisierte Personen @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Fallmeldedatum SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Geschlecht des Falls/Kontakts/Ereignisteilnehmers/in SampleExport.caseUuid=Fall UUID (Universally Unique Identifier) SampleExport.contactUuid=Kontakt-UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_de-DE.properties b/sormas-api/src/main/resources/captions_de-DE.properties index e66f0327fa6..9483cc390a5 100644 --- a/sormas-api/src/main/resources/captions_de-DE.properties +++ b/sormas-api/src/main/resources/captions_de-DE.properties @@ -54,7 +54,6 @@ notAvailableShort=k. A inaccessibleValue=Vertraulich numberOfCharacters=Anzahl der Zeichen\: %d / %d remove=Entfernen -reportingUser=Meldender Nutzer notTestedYet=Noch nicht getestet latestPathogenTest=Neuester Erregertest\: unknown=Unbekannt @@ -1795,6 +1794,9 @@ personLinkToEvents=Ereignisse für diese Person ansehen personLinkToCases=Fälle für diese Person ansehen personLinkToContacts=Kontakte für diese Person ansehen personLinkToSamples = Proben für diese Person ansehen +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Auch bestehende Koordinaten ersetzen. Warnung\: Dies könnte Koordinaten ersetzen, die absichtlich anders gesetzt wurden\! personsSetMissingGeoCoordinates=Fehlende Geo-Koordinaten generieren personsUpdated=Aktualisierte Personen @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Fallmeldedatum SampleExport.caseResponsibleCommunity=Zuständige Gemeinde SampleExport.caseResponsibleDistrict=Zuständige/r Landkreis/Kreisfreie Stadt SampleExport.caseResponsibleRegion=Zuständiges Bundesland +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Geschlecht von Fall/Kontakt/Ereignisteilnehmer/in SampleExport.caseUuid=Fall UUID (Universally Unique Identifier) SampleExport.contactUuid=Kontakt-UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_en-AF.properties b/sormas-api/src/main/resources/captions_en-AF.properties index 1e767a361ea..913e807d4f9 100644 --- a/sormas-api/src/main/resources/captions_en-AF.properties +++ b/sormas-api/src/main/resources/captions_en-AF.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_en-GH.properties b/sormas-api/src/main/resources/captions_en-GH.properties index 5eca23c8810..8a0891a8f57 100644 --- a/sormas-api/src/main/resources/captions_en-GH.properties +++ b/sormas-api/src/main/resources/captions_en-GH.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_en-NG.properties b/sormas-api/src/main/resources/captions_en-NG.properties index 71ed97d0d6c..e9274806809 100644 --- a/sormas-api/src/main/resources/captions_en-NG.properties +++ b/sormas-api/src/main/resources/captions_en-NG.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_es-BO.properties b/sormas-api/src/main/resources/captions_es-BO.properties index 0a4ce4d66ed..e7605fab90d 100644 --- a/sormas-api/src/main/resources/captions_es-BO.properties +++ b/sormas-api/src/main/resources/captions_es-BO.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID diff --git a/sormas-api/src/main/resources/captions_es-CU.properties b/sormas-api/src/main/resources/captions_es-CU.properties index 1b2bc909d01..b9bd07d4646 100644 --- a/sormas-api/src/main/resources/captions_es-CU.properties +++ b/sormas-api/src/main/resources/captions_es-CU.properties @@ -54,7 +54,6 @@ notAvailableShort=ND inaccessibleValue=Confidencial numberOfCharacters=Número de caracteres\: %d / %d remove=Eliminar -reportingUser=Usuario informante notTestedYet=Aún no probado latestPathogenTest=Última prueba de patógeno\: unknown=Desconocido @@ -1795,6 +1794,9 @@ personLinkToEvents=Ver eventos de esta persona personLinkToCases=Ver casos de esta persona personLinkToContacts=Ver contactos de esta persona personLinkToSamples = Ver muestras para esta persona +caseLinkToSamples = Ver muestras para este caso +contactLinkToSamples = Ver muestras para este contacto +eventParticipantLinkToSamples = Ver muestras para este participante de evento personsReplaceGeoCoordinates=También reemplazar las coordenadas existentes. Advertencia\: ¡Esto podría reemplazar coordenadas que fueron configuradas intencionalmente de forma diferente\! personsSetMissingGeoCoordinates=Establecer geo-coordenadas faltantes personsUpdated=Personas actualizadas @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Fecha de informe del caso SampleExport.caseResponsibleCommunity=Área de salud responsable del caso SampleExport.caseResponsibleDistrict=Municipio responsable del caso SampleExport.caseResponsibleRegion=Provincia responsable del caso +SampleExport.eventParticipantCommunity = Área de salud del participante de evento +SampleExport.eventParticipantDistrict = Municipio del participante de evento +SampleExport.eventParticipantRegion = Provincia del participante de evento SampleExport.personSex=Sexo de caso/contacto/participante del evento SampleExport.caseUuid=UUID del caso SampleExport.contactUuid=UUID del contacto @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Adjuntar documento(s) externalEmailUsedTemplate=Plantilla externalEmailSentBy=Enviado por externalEmailSentTo=Enviado a -externalEmailAttachedDocuments=Documentos adjuntos \ No newline at end of file +externalEmailAttachedDocuments=Documentos adjuntos diff --git a/sormas-api/src/main/resources/captions_es-ES.properties b/sormas-api/src/main/resources/captions_es-ES.properties index 8ff51babe41..e7b4a6b2dd2 100644 --- a/sormas-api/src/main/resources/captions_es-ES.properties +++ b/sormas-api/src/main/resources/captions_es-ES.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fa-AF.properties b/sormas-api/src/main/resources/captions_fa-AF.properties index 73c385a771d..36503bf43e2 100644 --- a/sormas-api/src/main/resources/captions_fa-AF.properties +++ b/sormas-api/src/main/resources/captions_fa-AF.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=برداشتن -reportingUser=راپور دهنده notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fi-FI.properties b/sormas-api/src/main/resources/captions_fi-FI.properties index 6c79de7cfa9..4a585461016 100644 --- a/sormas-api/src/main/resources/captions_fi-FI.properties +++ b/sormas-api/src/main/resources/captions_fi-FI.properties @@ -54,7 +54,6 @@ notAvailableShort=Havainto puuttuu inaccessibleValue=Luottamuksellinen numberOfCharacters=Merkkien määrä\: %d / %d remove=Poista -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Potilaan raportointipäivä SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Potilas UUID SampleExport.contactUuid=Kontaktin UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fil-PH.properties b/sormas-api/src/main/resources/captions_fil-PH.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_fil-PH.properties +++ b/sormas-api/src/main/resources/captions_fil-PH.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fj-FJ.properties b/sormas-api/src/main/resources/captions_fj-FJ.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_fj-FJ.properties +++ b/sormas-api/src/main/resources/captions_fj-FJ.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fr-CD.properties b/sormas-api/src/main/resources/captions_fr-CD.properties index 4a827adccc6..0dc47e090da 100644 --- a/sormas-api/src/main/resources/captions_fr-CD.properties +++ b/sormas-api/src/main/resources/captions_fr-CD.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fr-CH.properties b/sormas-api/src/main/resources/captions_fr-CH.properties index ffd13843f26..a181d60893f 100644 --- a/sormas-api/src/main/resources/captions_fr-CH.properties +++ b/sormas-api/src/main/resources/captions_fr-CH.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidentiel numberOfCharacters=Nombre de caractères\: %d / %d remove=Supprimer -reportingUser=Utilisateur rapporteur notTestedYet=Pas encore testé latestPathogenTest=Dernier test de pathogène\: unknown=Inconnu @@ -1795,6 +1794,9 @@ personLinkToEvents=Voir les événements pour cette personne personLinkToCases=Voir les cas pour cette personne personLinkToContacts=Voir les contacts pour cette personne personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Personnes mises à jour @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Date du signalement de cas SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sexe du cas/contact/participant à l'événement SampleExport.caseUuid=UUID de cas SampleExport.contactUuid=UUID du contact @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index 53c044cc48b..7f529662793 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -54,7 +54,6 @@ notAvailableShort=ND inaccessibleValue=Confidentiel numberOfCharacters=Nombre de caractères\: %d / %d remove=Retirer -reportingUser=Rapport fait par notTestedYet=Pas encore testé latestPathogenTest=Dernier test de pathogène\: unknown=Inconnu @@ -1795,6 +1794,9 @@ personLinkToEvents=Voir les événements pour cette personne personLinkToCases=Voir les cas pour cet événement personLinkToContacts=Voir les contacts pour cet événement personLinkToSamples = Voir les échantillons pour cette personne +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Remplacez également les coordonnées existantes. Attention \: cela pourrait remplacer les coordonnées qui ont été définies intentionnellement différemment \! personsSetMissingGeoCoordinates=Définir les coordonnées géographiques manquantes personsUpdated=Personnes mises à jour @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Date de signalement du cas SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Région du participant à l'événement SampleExport.personSex=Sexe du cas/ contact/ personne participant à l'événement SampleExport.caseUuid=UUID du cas SampleExport.contactUuid=UUID du contact @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_fr-TN.properties b/sormas-api/src/main/resources/captions_fr-TN.properties index 2c14987797c..6a1a6407755 100644 --- a/sormas-api/src/main/resources/captions_fr-TN.properties +++ b/sormas-api/src/main/resources/captions_fr-TN.properties @@ -54,7 +54,6 @@ notAvailableShort=ND inaccessibleValue=Confidentiel numberOfCharacters=Nombre de caractères\: %d / %d remove=Retirer -reportingUser=Rapport fait par notTestedYet=Pas encore testé latestPathogenTest=Dernier test de pathogène\: unknown=Inconnu @@ -1795,6 +1794,9 @@ personLinkToEvents=Voir les événements pour cette personne personLinkToCases=Voir les cas pour cet événement personLinkToContacts=Voir les contacts pour cet événement personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Remplacez également les coordonnées existantes. Attention \: cela pourrait remplacer les coordonnées qui ont été définies intentionnellement différemment \! personsSetMissingGeoCoordinates=Définir les coordonnées géographiques manquantes personsUpdated=Personnes mises à jour @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Date de signalement du cas SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sexe du cas/ contact/ personne participant à l'événement SampleExport.caseUuid=UUID du cas SampleExport.contactUuid=UUID du contact @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_hi-IN.properties b/sormas-api/src/main/resources/captions_hi-IN.properties index a27128b152b..b616ffb8374 100644 --- a/sormas-api/src/main/resources/captions_hi-IN.properties +++ b/sormas-api/src/main/resources/captions_hi-IN.properties @@ -16,24 +16,24 @@ ############################################################################### # General Captions all=All -area=Area -city=City -postcode=Postcode -address=Address -communityName=Community -date=Date -description=Description -disease=Disease -districtName=District -edit=Edit -view=View -epiWeekFrom=From Epi Week -epiWeekTo=To Epi Week -facilityType=Facility type -facilityTypeGroup=Facility category -firstName=First name -sex=Sex -nationalHealthId=National health ID +area=क्षेत्र +city=शहर +postcode=पोस्टकोड +address=पता +communityName=समुदाय +date=तारीख +description=विवरण +disease=बीमारी +districtName=ज़िला +edit=संपादन करना +view=देखना +epiWeekFrom=एपी वीक से +epiWeekTo=एपि वीक के लिए +facilityType=सुविधा का प्रकार +facilityTypeGroup=सुविधा श्रेणी +firstName=पहला नाम +sex=लिंग +nationalHealthId=राष्ट्रीय स्वास्थ्य आईडी passportNumber=Passport number from=From info=Info @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_hr-HR.properties b/sormas-api/src/main/resources/captions_hr-HR.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_hr-HR.properties +++ b/sormas-api/src/main/resources/captions_hr-HR.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_it-CH.properties b/sormas-api/src/main/resources/captions_it-CH.properties index 12f249fc4e8..ba00432798e 100644 --- a/sormas-api/src/main/resources/captions_it-CH.properties +++ b/sormas-api/src/main/resources/captions_it-CH.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidenziale numberOfCharacters=Numero di caratteri\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Data del rapporto del caso SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sesso della persona caso/contatto/partecipante all'evento SampleExport.caseUuid=UUID del caso SampleExport.contactUuid=UUID di contatto @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_it-IT.properties b/sormas-api/src/main/resources/captions_it-IT.properties index 15b4e718992..937dd5f0ac2 100644 --- a/sormas-api/src/main/resources/captions_it-IT.properties +++ b/sormas-api/src/main/resources/captions_it-IT.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Numero di caratteri\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Data del rapporto del caso SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sesso della persona caso/contatto/partecipante all'evento SampleExport.caseUuid=UUID del caso SampleExport.contactUuid=UUID di contatto @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_ja-JP.properties b/sormas-api/src/main/resources/captions_ja-JP.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_ja-JP.properties +++ b/sormas-api/src/main/resources/captions_ja-JP.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_ne-NP.properties b/sormas-api/src/main/resources/captions_ne-NP.properties index a711b7f3304..f1a0c5bc805 100644 --- a/sormas-api/src/main/resources/captions_ne-NP.properties +++ b/sormas-api/src/main/resources/captions_ne-NP.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_nl-NL.properties b/sormas-api/src/main/resources/captions_nl-NL.properties index ecbea55be98..45a96c60f06 100644 --- a/sormas-api/src/main/resources/captions_nl-NL.properties +++ b/sormas-api/src/main/resources/captions_nl-NL.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_no-NO.properties b/sormas-api/src/main/resources/captions_no-NO.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_no-NO.properties +++ b/sormas-api/src/main/resources/captions_no-NO.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index 07e9319837f..a327e008096 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -54,7 +54,6 @@ notAvailableShort=nd. inaccessibleValue=Poufne numberOfCharacters=Ilość znaków\: %d / %d remove=Usuń -reportingUser=Zgłaszanie użytkownika notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Nieznane @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Załącz dokumenty externalEmailUsedTemplate=Szablon externalEmailSentBy=Wysłane przez externalEmailSentTo=Wysłane do -externalEmailAttachedDocuments=Załączone dokumenty \ No newline at end of file +externalEmailAttachedDocuments=Załączone dokumenty diff --git a/sormas-api/src/main/resources/captions_ps-AF.properties b/sormas-api/src/main/resources/captions_ps-AF.properties index f878894d394..0513ef54833 100644 --- a/sormas-api/src/main/resources/captions_ps-AF.properties +++ b/sormas-api/src/main/resources/captions_ps-AF.properties @@ -54,7 +54,6 @@ notAvailableShort=موجود نه دی\nد دسترسي وړ نه دی inaccessibleValue=محرم numberOfCharacters=د ځانګړنو شمیر remove=لری کول -reportingUser=راپور ورکونکی notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_pt-PT.properties b/sormas-api/src/main/resources/captions_pt-PT.properties index 857bdf279c1..7d1448bfd76 100644 --- a/sormas-api/src/main/resources/captions_pt-PT.properties +++ b/sormas-api/src/main/resources/captions_pt-PT.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_ro-RO.properties b/sormas-api/src/main/resources/captions_ro-RO.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_ro-RO.properties +++ b/sormas-api/src/main/resources/captions_ro-RO.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_ru-RU.properties b/sormas-api/src/main/resources/captions_ru-RU.properties index 08c4e50c6f0..091e72fdcba 100644 --- a/sormas-api/src/main/resources/captions_ru-RU.properties +++ b/sormas-api/src/main/resources/captions_ru-RU.properties @@ -54,7 +54,6 @@ notAvailableShort=не применимо inaccessibleValue=Конфиденциально numberOfCharacters=Количество символов\: %d / %d remove=Удалить -reportingUser=Должностное лицо notTestedYet=Тест пока не осуществлён latestPathogenTest=Последний патогенный тест\: unknown=Неизвестен @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_sv-SE.properties b/sormas-api/src/main/resources/captions_sv-SE.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_sv-SE.properties +++ b/sormas-api/src/main/resources/captions_sv-SE.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_sw-KE.properties b/sormas-api/src/main/resources/captions_sw-KE.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_sw-KE.properties +++ b/sormas-api/src/main/resources/captions_sw-KE.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_tr-TR.properties b/sormas-api/src/main/resources/captions_tr-TR.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_tr-TR.properties +++ b/sormas-api/src/main/resources/captions_tr-TR.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_uk-UA.properties b/sormas-api/src/main/resources/captions_uk-UA.properties index a27128b152b..994f0898223 100644 --- a/sormas-api/src/main/resources/captions_uk-UA.properties +++ b/sormas-api/src/main/resources/captions_uk-UA.properties @@ -54,7 +54,6 @@ notAvailableShort=NA inaccessibleValue=Confidential numberOfCharacters=Number of characters\: %d / %d remove=Remove -reportingUser=Reporting user notTestedYet=Not tested yet latestPathogenTest=Latest Pathogen test\: unknown=Unknown @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index 7b7337caea5..0aa294eeeaf 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -47,14 +47,13 @@ system=سسٹم to=کے لیے total=کل notSpecified=متعین نہیں ہے -noUserSelected=No user selected +noUserSelected=کوئی صارف منتخب نہیں کیا گیا۔ creationDate=بنانے کی تاریخ changeDate=آخری تبدیلی کی تاریخ notAvailableShort=دستیاب نہیں ہے inaccessibleValue=رازدارانہ numberOfCharacters=حروف کی تعداد\: %d /%d remove=مٹا دیا -reportingUser=رپورٹنگ صارف notTestedYet=ابھی تک ٹیسٹ نہیں ہوا latestPathogenTest=تازہ ترین پیتھوجن ٹیسٹ\: unknown=نامعلوم @@ -71,7 +70,7 @@ adoptHomeAddressOfCasePerson=کیس والے کے گھر کا پتہ اپنائ adoptHomeAddressOfCasePersonIfRelationMatches=اگر وہ ایک ہی گھر میں رہتے ہیں تو کیس والے کے گھر کا پتہ اپنا لیں casePersonAddress=کیس والے کا پتہ viewMessage=پیغام دیکھیں -primarySuffix=primary +primarySuffix=پرائمری # About about=متعلق aboutAdditionalInfo=اضافی معلومات @@ -269,7 +268,7 @@ areaArchivedAreas=آرکائیو شدہ خطے areaAllAreas=تمام خطے Area.archived=آرکائیوڈ Area.externalId=بیرونی شناخت -Area.defaultInfrastructure=Default +Area.defaultInfrastructure=طے شدہ years=سال months=مہینے days=دن @@ -363,7 +362,7 @@ caseFilterWithoutResponsibleUser=صرف ذمہ دار صارف کے بغیر ک caseFilterWithExtendedQuarantine=صرف توسیع شدہ قرنطینہ والے کیسز caseFilterWithReducedQuarantine=صرف قرنطینہ کم والے کیسز caseFilterOnlyQuarantineHelpNeeded=قرنطینہ میں مدد درکار ہے -caseFilterIncludeCasesFromOtherJurisdictions=Include cases from other jurisdictions +caseFilterIncludeCasesFromOtherJurisdictions=دیگر دائرہ اختیار کے کیسز شامل کریں caseFilterOnlyCasesWithFulfilledReferenceDefinition=صرف مکمل حوالہ تعریف والے کیسز caseFilterRelatedToEvent=صرف تقریبات والے کیسز caseFilterOnlyFromOtherInstances=صرف دیگر سسٹمز سے کیسز @@ -677,7 +676,7 @@ Community.archived=آرکائیوڈ Community.externalID=بیرونی شناخت Community.region=علاقہ Community.district=ضلع -Community.defaultInfrastructure=Default +Community.defaultInfrastructure=طے شدہ communityActiveCommunities=فعال کمیونٹیز communityArchivedCommunities=آرکائیو شدہ کمیونٹیز communityAllCommunities=تمام کمیونٹیز @@ -718,7 +717,7 @@ contactChooseSourceCase=سورس کیس کا انتخاب کریں contactOnlyQuarantineHelpNeeded=قرنطینہ میں مدد درکار ہے contactOnlyWithExtendedQuarantine=صرف توسیع شدہ قرنطینہ والے رابطے contactOnlyWithReducedQuarantine=صرف کم قرنطینہ والے رابطے -contactIncludeContactsFromOtherJurisdictions=Include contacts from other jurisdictions +contactIncludeContactsFromOtherJurisdictions=دوسرے دائرہ اختیار سے رابطے شامل کریں contactOnlyWithSharedEventWithSourceCase=صرف سورس کیس والے رابطے مخصوص تقریب سے منسلک ہیں contactOnlyWithSourceCaseInGivenEvent=صرف وہ رابطے, جن کا سورس کیس اس تقریب سے منسلک ہے contactFollowUpDay=دن @@ -860,20 +859,20 @@ ContactExport.reportingUserRoles=صارف کے کردار کی رپورٹنگ ContactExport.followUpStatusChangeUserName=ذمہ دار صارف ContactExport.followUpStatusChangeUserRoles=ذمہ دار صارف کردار # Customizable enums -CustomizableEnum.hasDetails=Show an additional details text field when this value is selected -CustomizableEnum.hasDetails.short=Has details +CustomizableEnum.hasDetails=جب اس کو منتخب کیا جائے تو ایک اضافی تفصیلات کے ٹیکسٹ فیلڈ کو دکھائیں۔ +CustomizableEnum.hasDetails.short=تفصیلات موجود ہیں # Customizable enum values -customizableEnumValueAllDiseases=All diseases -customizableEnumValueDiseaseCount=%d diseases -customizableEnumValueNoProperties=No properties -customizableEnumValueActiveValues=Active values -customizableEnumValueInactiveValues=Inactive values -CustomizableEnumValue.dataType=Data type -CustomizableEnumValue.value=Value -CustomizableEnumValue.caption=Caption -CustomizableEnumValue.diseases=Diseases -CustomizableEnumValue.properties=Properties -CustomizableEnumValue.active=Active +customizableEnumValueAllDiseases=تمام بیماریاں +customizableEnumValueDiseaseCount=%d بیماریاں +customizableEnumValueNoProperties=کوئی خاصیت نہیں +customizableEnumValueActiveValues=فعال اقدار +customizableEnumValueInactiveValues=غیر فعال اقدار +CustomizableEnumValue.dataType=ڈیٹا کی قسم +CustomizableEnumValue.value=ويليو +CustomizableEnumValue.caption=عنوان +CustomizableEnumValue.diseases=بیماریاں +CustomizableEnumValue.properties=خصوصیات +CustomizableEnumValue.active=فعال # Dashboard dashboardAlive=زندہ dashboardApplyCustomFilter=حسب ضرورت فلٹر لگائیں @@ -1010,11 +1009,11 @@ sampleDashboardTestResults=ٹیسٹ کے نتائج sampleDashboardCaseSamples=کیس کے نمونے sampleDashboardContactSamples=رابطے والے کے نمونے sampleDashboardEventParticipantSamples=تقریب کے شرکاء کے نمونے -sampleDashboardEnvironmentsSamples=Environment Samples +sampleDashboardEnvironmentsSamples=ماحولیاتی نمونے sampleDashboardShowCaseSamples=کیس کے نمونے دکھائیں sampleDashboardShowContactSamples=رابطہ کے نمونے دکھائیں sampleDashboardShowEventParticipantSamples=تقریب کے شرکاء کے نمونے دکھائیں -sampleDashboardShowEnvironmentSamples=Show Environment Samples +sampleDashboardShowEnvironmentSamples=ماحولیات کے نمونے دکھائیں captionDefault=طے شدہ defaultRegion=پہلے سے طے شدہ علاقہ defaultDistrict=پہلے سے طے شدہ ضلع @@ -1089,7 +1088,7 @@ District.growthRate=اضافے کی شرح District.population=آبادی District.externalID=بیرونی شناخت District.region=علاقہ -District.defaultInfrastructure=Default +District.defaultInfrastructure=طے شدہ epiDataNoSourceContacts=اس کیس کے لیے کوئی سورس رابطہ نہیں بنایا گیا ہے EpiData=وبائی امراض کا ڈیٹا EpiData.areaInfectedAnimals=کسی ایسے خطے میں رہنا، کام کرنا یا سفر کرنا جہاں متاثرہ جانوروں کی تصدیق ہوئی ہو @@ -1121,10 +1120,10 @@ DocumentTemplate.exampleTemplateContacts=مثال کے لۓ رابطے کا ٹی DocumentTemplate.exampleTemplateEventHandout=مثال کے لۓ تقریب ہینڈ آؤٹ کا ٹیمپلیٹ DocumentTemplate.exampleTemplateEventParticipants=مثال کے لۓ تقریب کے شرکاہ کا ٹیمپلیٹ DocumentTemplate.exampleTemplateTravelEntries=مثال کے لۓ سفری اندراجات کا ٹیمپلیٹ -DocumentTemplate.exampleTemplateCaseEmail=Example Template Case Email -DocumentTemplate.exampleTemplateContactEmail=Example Template Contact Email -DocumentTemplate.exampleTemplateEventParticipantEmail=Example Template Event Participant Email -DocumentTemplate.exampleTemplateTravelEntryEmail=Example Template Travel Entry Email +DocumentTemplate.exampleTemplateCaseEmail=ٹیمپلیٹ کیس ای میل کی مثال +DocumentTemplate.exampleTemplateContactEmail=ٹیمپلیٹ رابطہ ای میل کی مثال +DocumentTemplate.exampleTemplateEventParticipantEmail=مثال کے لۓ تقریب کے شرکاہ کا ای میل ٹیمپلیٹ +DocumentTemplate.exampleTemplateTravelEntryEmail=مثال کے لۓ سفری اندراجات کا ای میل ٹیمپلیٹ DocumentTemplate.uploadGeneratedDocumentToEntity=تیار کردہ دستاویز کو بھی اس اینٹيٹی پر اپ لوڈ کریں DocumentTemplate.uploadGeneratedDocumentsToEntities=تیار کردہ دستاویز کو بھی منتخب شدہ اینٹيٹیز پر اپ لوڈ کریں DocumentTemplate.documentUploadWarning=دستاویز اپ لوڈ کرنے کی وارننگ @@ -1158,8 +1157,8 @@ environmentNewEnvironment= نیا ماحول environmentEnvironmentsList=ماحولیات کی فہرست # EnvironmentSample -EnvironmentSample = Environment Sample -EnvironmentSample.uuid = Sample ID +EnvironmentSample = ماحولیاتی نمونے +EnvironmentSample.uuid = نمونہ کی شناخت EnvironmentSample.environment = ماحول EnvironmentSample.sampleDateTime = نمونے لینے کی تاریخ EnvironmentSample.sampleMaterial = نمونہ کا مواد @@ -1168,26 +1167,26 @@ EnvironmentSample.sampleVolume = حجم (ایم ایل میں) EnvironmentSample.fieldSampleId = فیلڈ کے نمونے کی شناخت EnvironmentSample.turbidity = ٹربائڈیٹی (این ٹی یو میں) EnvironmentSample.phValue = نمونے کا پی ایچ -EnvironmentSample.sampleTemperature = Temperature (in °C) -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.positivePathogenTests = Positive pathogen tests -EnvironmentSample.latestPathogenTest = Latest pathogen test -EnvironmentSample.numberOfTests = Number of tests +EnvironmentSample.sampleTemperature = درجہ حرارت ( سیلسیس میں) +EnvironmentSample.chlorineResiduals = کل کلورین کی باقیات (ملی گرام فی لیٹر) +EnvironmentSample.laboratory = لیبارٹری +EnvironmentSample.laboratoryDetails = لیبارٹری کی تفصیلات +EnvironmentSample.requestedPathogenTests = درخواست کردہ پیتھوجینز کے ٹیسٹ +EnvironmentSample.otherRequestedPathogenTests = دیگر درخواست کردہ پیتھوجینز کی جانچ کی جائے +EnvironmentSample.weatherConditions = نمونے لینے کے وقت موسمی حالات +EnvironmentSample.heavyRain = نمونے لینے سے پہلے گزشتہ 24 گھنٹوں میں شدید بارش؟ +EnvironmentSample.dispatched = بھیجیا/ڈسپیچ کردیا +EnvironmentSample.dispatchDate = ڈسپیچمنٹ کی تاریخ +EnvironmentSample.dispatchDetails = ڈسپیچمنٹ کی تفصیلات +EnvironmentSample.received = موصول ہوا +EnvironmentSample.receivalDate = وصول کرنے کی تاریخ +EnvironmentSample.labSampleId = لیب کے نمونے کی شناخت +EnvironmentSample.specimenCondition = نمونہ کی حالت +EnvironmentSample.location = نمونے لینے کی جگہ کا مقام +EnvironmentSample.generalComment = عمومی تبصرہ +EnvironmentSample.positivePathogenTests = مثبت پیتھوجین ٹیسٹ +EnvironmentSample.latestPathogenTest = تازہ ترین پیتھوجن ٹیسٹ +EnvironmentSample.numberOfTests = ٹیسٹ کی تعداد # Event eventActiveEvents=فعال تقریبات @@ -1501,7 +1500,7 @@ Facility.contactPersonFirstName=رابطہ کرنے والے شخص کا پہل Facility.contactPersonLastName=رابطہ شخص کا آخری نام Facility.contactPersonPhone=رابطہ کرنے والے شخص کا فون نمبر Facility.contactPersonEmail=رابطہ شخص کا ای میل پتہ -Facility.defaultInfrastructure=Default +Facility.defaultInfrastructure=طے شدہ FeatureConfiguration.districtName=ضلع FeatureConfiguration.enabled=لائن لسٹنگ فعال ہے؟ FeatureConfiguration.endDate=تاریخ اختتام @@ -1593,11 +1592,11 @@ ExternalMessage.sampleOverallTestResult=مجموعی طور پر ٹیسٹ کا ExternalMessage.assignee=مقرر کردہ ExternalMessage.type=قسم ExternalMessage.surveillanceReport=منسلک رپورٹ -ExternalMessage.caseReportDate=Case report date -ExternalMessage.personExternalId=External ID -ExternalMessage.personNationalHealthId=National health ID -ExternalMessage.personPhoneNumberType=Phone number type -ExternalMessage.personCountry=Country +ExternalMessage.caseReportDate=کیس رپورٹ کی تاریخ +ExternalMessage.personExternalId=بیرونی شناخت +ExternalMessage.personNationalHealthId=قومی صحت کی شناخت +ExternalMessage.personPhoneNumberType=فون نمبر کی قسم +ExternalMessage.personCountry=ملک externalMessageFetch=پیغامات حاصل کریں externalMessageProcess=پروسیس externalMessageNoDisease=کوئی بیماری نہیں ملی @@ -1609,7 +1608,7 @@ externalMessageCriteria.messageDateFrom=پیغام کی تاریخ سے... ExternalMessageCriteria.messageDateTo=... تک ExternalMessageCriteria.birthDateFrom=تاریخ پیدائش سے... ExternalMessageCriteria.birthDateTo=... تک -externalMessageValueNotSpecified=Value not specified in external message +externalMessageValueNotSpecified=بیرونی پیغام میں ویلیو متعین نہیں ہے #Physician report physiciansReportCaseImmunizations=امیونائزیشنز @@ -1621,7 +1620,7 @@ lineListingDiseaseOfSourceCase=سورس کیس کی بیماری lineListingInfrastructureData=آخری لائن سےانفراسٹرکچر ڈیٹا کو حاصل کریں lineListingNewCasesList=نئے کیسز کی فہرست lineListingNewContactsList=نئے رابطوں کی فہرست -lineListingNewEventParticipantsList = List of new event participants +lineListingNewEventParticipantsList = تقریب کے نئے شرکاء کی فہرست lineListingSharedInformation=شیئر کی گئی معلومات lineListingEdit=لائن لسٹنگ میں ترمیم کریں lineListingDisableAll=تمام لائن لسٹنگ کو غیر فعال کریں @@ -1674,8 +1673,8 @@ messagesNoSmsSentForCase=کیس والے شخص کو کوئی SMS نہیں بھ messagesNoPhoneNumberForCasePerson=کیس والے شخص کا کوئی فون نمبر نہیں ہے messagesSms=SMS messagesEmail=ای میل -messagesEmails=Emails -messagesSendEmail=Send email +messagesEmails=ای میلز +messagesSendEmail=ای میل بھیجیں messagesSendingSms=نیا SMS بھیجیں۔ messagesNumberOfMissingPhoneNumbers=فون نمبر کے بغیر منتخب کیسز کی تعداد\: %s messagesCharacters=حروف\: %d / 160 @@ -1753,8 +1752,8 @@ PathogenTest.testTypeText=ٹیسٹ کی تفصیلات بتائیں PathogenTest.testedDisease=ٹیسٹڈ بیماری PathogenTest.testedDiseaseVariant=ٹیسٹڈ بیماری کی قسم PathogenTest.testedDiseaseDetails=ٹیسٹڈ بیماری کا نام -PathogenTest.testedPathogen=Tested pathogen -PathogenTest.testedPathogenDetails=Tested pathogen details +PathogenTest.testedPathogen=ٹیسٹ شدہ پیتھوجین +PathogenTest.testedPathogenDetails=ٹیسٹ شدہ پیتھوجین کی تفصیلات PathogenTest.typingId=ٹائپنگ شناخت PathogenTest.serotype=سیروٹائپ PathogenTest.cqValue=CQ/CT ویلیو @@ -1766,21 +1765,21 @@ PathogenTest.viaLims=LIMS کے ذریعے PathogenTest.testedDiseaseVariantDetails=بیماری کے مختلف قسم کی تفصیلات PathogenTest.externalOrderId=بیرونی آرڈر کی شناخت PathogenTest.preliminary=ابتدائی -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=سی ٹی ہدف ای +PathogenTest.ctValueN=سی ٹی ہدف این +PathogenTest.ctValueRdrp=Ct ہدف RDRP +PathogenTest.ctValueS=سی ٹی ہدف ایس +PathogenTest.ctValueOrf1=Ct ہدف ORF1 +PathogenTest.ctValueRdrpS=Ct ہدف RDRP/S +PathogenTest.prescriber=تجویز کنندہ +PathogenTest.prescriberPhysicianCode=معالج کا کوڈ +PathogenTest.prescriberFirstName=پہلا نام +PathogenTest.prescriberLastName=آخری نام +PathogenTest.prescriberPhoneNumber=فون نمبر +PathogenTest.prescriberAddress=پتہ +PathogenTest.prescriberPostalCode=پوسٹل کوڈ +PathogenTest.prescriberCity=شہر +PathogenTest.prescriberCountry=ملک # Person personPersonsList=افراد کی فہرست personCreateNew=ایک نیا شخص بنائیں @@ -1795,6 +1794,9 @@ personLinkToEvents=اس شخص کی تقریبات دیکھیں personLinkToCases=اس شخص کے کیسز دیکھیں personLinkToContacts=اس شخص کے رابطے دیکھیں personLinkToSamples = اس شخص کے نمونے دیکھیں +caseLinkToSamples = اس کیس کے نمونے دیکھیں +contactLinkToSamples = اس رابطے کے نمونے دیکھیں +eventParticipantLinkToSamples = اس تقریب کے شرکاء کے نمونے دیکھیں personsReplaceGeoCoordinates=موجودہ کوآرڈینیٹس کو بھی تبدیل کریں۔ انتباہ\: یہ کوآرڈینیٹس کی جگہ لے سکتا ہے جو جان بوجھ کر مختلف طریقے سے سیٹ کیے گئے تھے\! personsSetMissingGeoCoordinates=لاپتہ جیو کوآرڈینیٹس سیٹ کریں personsUpdated=اشخاص کو اپ ڈیٹ کر دیا گیا @@ -1900,7 +1902,7 @@ PointOfEntry.externalID=بیرونی شناخت PointOfEntry.archived=آرکائیوڈ PointOfEntry.region=علاقہ PointOfEntry.district=ضلع -PointOfEntry.defaultInfrastructure=Default +PointOfEntry.defaultInfrastructure=طے شدہ populationDataMaleTotal=کل مرد populationDataFemaleTotal=کل خواتین PortHealthInfo=پورٹ کی صحت کی معلومات @@ -1960,7 +1962,7 @@ Continent.archived=آرکائیوڈ Continent.externalId=بیرونی شناخت Continent.defaultName=پہلے سے طے شدہ نام Continent.displayName=نام -Continent.defaultInfrastructure=Default +Continent.defaultInfrastructure=طے شدہ # Subcontinent subcontinentActiveSubcontinents=فعال برصغیر subcontinentArchivedSubcontinents=آرکائیوڈ برصغیر @@ -1971,7 +1973,7 @@ Subcontinent.externalId=بیرونی شناخت Subcontinent.defaultName=پہلے سے طے شدہ نام Subcontinent.displayName=نام Subcontinent.continent=براعظم کا نام -Subcontinent.defaultInfrastructure=Default +Subcontinent.defaultInfrastructure=طے شدہ # Country countryActiveCountries=فعال ممالک countryArchivedCountries=آرکائیوڈ شدہ ممالک @@ -1984,7 +1986,7 @@ Country.displayName=نام Country.isoCode=ISO کوڈ Country.unoCode=UNO کوڈ Country.subcontinent=برصغیر -Country.defaultInfrastructure=Default +Country.defaultInfrastructure=طے شدہ # Region regionActiveRegions=فعال علاقے regionArchivedRegions=آرکائیوڈ علاقے @@ -1996,7 +1998,7 @@ Region.growthRate=اضافے کی شرح Region.population=آبادی Region.externalID=بیرونی شناخت Region.country=ملک -Region.defaultInfrastructure=Default +Region.defaultInfrastructure=طے شدہ # Sample sampleCreateNew=نیا نمونہ بنائیں sampleDeletedSamples=حذف شدہ نمونے @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=کیس رپورٹ کی تاریخ SampleExport.caseResponsibleCommunity=کیس ذمہ دار کمیونٹی SampleExport.caseResponsibleDistrict=کیس کا ذمہ دار ضلع SampleExport.caseResponsibleRegion=کیس کا ذمہ دار علاقہ +SampleExport.eventParticipantCommunity = تقریب کے شرکاء کی کمیونٹی +SampleExport.eventParticipantDistrict = تقریب کے شرکاء کا ضلع +SampleExport.eventParticipantRegion = ایونٹ کے شرکاء کا علاقہ SampleExport.personSex=کیس/رابطہ/تقریب میں شریک شخص کا جنس SampleExport.caseUuid=کیس UUID SampleExport.contactUuid=رابطہ UUID @@ -2445,7 +2450,7 @@ Task.contextReference=منسلک لنک Task.creatorComment=کام پر تبصرے Task.creatorUser=کی طرف بنایا گیا Task.dueDate=آخری تاریخ -Task.environment = Associated environment +Task.environment = وابستہ ماحول Task.event=وابستہ تقریب Task.observerUsers=مشاہدہ کرنے والا Task.perceivedStart=خیالی آغاز @@ -2470,20 +2475,20 @@ TestReport.testLabName=لیب کا نام TestReport.testLabPostalCode=لیب پوسٹل کوڈ TestReport.testResult=ٹیسٹ کا نتیجہ TestReport.testType=ٹیسٹ کی قسم -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=سی ٹی ہدف ای +TestReport.ctValueN=سی ٹی ہدف این +TestReport.ctValueRdrp=Ct ہدف RDRP +TestReport.ctValueS=سی ٹی ہدف ایس +TestReport.ctValueOrf1=Ct ہدف ORF1 +TestReport.ctValueRdrpS=Ct ہدف RDRP/S +TestReport.prescriberPhysicianCode=معالج کا کوڈ +TestReport.prescriberFirstName=پہلا نام +TestReport.prescriberLastName=آخری نام +TestReport.prescriberPhoneNumber=فون نمبر +TestReport.prescriberAddress=پتہ +TestReport.prescriberPostalCode=پوسٹل کوڈ +TestReport.prescriberCity=شہر +TestReport.prescriberCountry=ملک # TravelEntry travelEntryCreateCase=کیس بنائیں travelEntryOnlyRecoveredEntries=صرف بازیافت شدہ اندراجات @@ -2589,7 +2594,7 @@ User.uuid=UUID User.region=علاقہ User.district=ضلع User.community=کمیونیٹی -userRestrictDiseases=Restrict access to specific diseases +userRestrictDiseases=مخصوص بیماریوں تک رسائی کو محدود کریں # Vaccination vaccinationNewVaccination=نئی ویکسینیشن vaccinationNoVaccinationsForPerson=اس شخص کے لیے کوئی ویکسینیشن نہیں ہے @@ -2678,10 +2683,10 @@ View.configuration.populationdata=آبادی کا ڈیٹا View.configuration.populationdata.short=آبادی View.configuration.linelisting=لائن لسٹنگ کنفیگریشن View.configuration.linelisting.short=لائن لسٹنگ -View.configuration.emailTemplates=Email Templates -View.configuration.emailTemplates.short=Email Templates -View.configuration.customizableEnums=Customizable Enum Configuration -View.configuration.customizableEnums.short=Customizable Enums +View.configuration.emailTemplates=ای میل ٹیمپلیٹس +View.configuration.emailTemplates.short=ای میل ٹیمپلیٹس +View.configuration.customizableEnums=حسب ضرورت اینوم کنفیگریشن +View.configuration.customizableEnums.short=مرضی کے مطابق اینومس View.contacts=رابطہ کی ڈائرکٹری View.contacts.archive=آرکائیو رابطہ View.contacts.epidata=رابطے کے وبائی امراض کا ڈیٹا @@ -2859,8 +2864,8 @@ UserRole.linkedDefaultUserRole=منسلک ڈیفالٹ صارف کا کردار UserRole.portHealthUser=پورٹ ہیلتھ صارف UserRole.smsNotificationTypes=ایس ایم ایس کی اطلاعات کی اقسام UserRole.templateUserRole=صارف کے کردار کا ٹیمپلیٹ -UserRole.restrictAccessToAssignedEntities=Restrict access to assigned entities -userRoleShowOnlyRestrictedAccessToAssignCases=Only show user roles with access restricted to assigned entities +UserRole.restrictAccessToAssignedEntities=تفویض کردہ چیزوں تک رسائی کو محدود کریں +userRoleShowOnlyRestrictedAccessToAssignCases=تفویض کردہ چیزوں تک محدود رسائی کے ساتھ صرف صارف کے کردار دکھائیں userRoleUserrolesView=صارف کے کردار کی فہرست userRoleNotifications=نوٹیفیکیشنز userRoleNotificationTypeSms = SMS @@ -2909,20 +2914,20 @@ 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 -humanSampleViewType=Human -environmentSampleViewType=Environment -environmentSampleNewSample=New sample -ExternalEmailOptions.templateName=Choose template -ExternalEmailOptions.recipientEmail=Email address -ExternalEmailOptions.attachedDocuments=Attach document(s) -externalEmailUsedTemplate=Template -externalEmailSentBy=Sent by -externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +environmentSampleNotShipped = بھیجا نہیں گیا +environmentSampleShipped = بھیج دیا گیا +environmentSampleReceived = موصول ہوا +environmentSampleActiveSamples=فعال ماحول کے نمونے +environmentSampleArchivedSamples=محفوظ شدہ ماحول کے نمونے +environmentSampleAllActiveAndArchivedSamples=تمام فعال اور محفوظ شدہ ماحول کے نمونے +environmentSampleDeletedSamples=حذف شدہ ماحول کے نمونے +humanSampleViewType=انسان +environmentSampleViewType=ماحول +environmentSampleNewSample=نیا نمونہ +ExternalEmailOptions.templateName=ٹیمپلیٹ کا انتخاب کریں +ExternalEmailOptions.recipientEmail=ای میل اڈریس +ExternalEmailOptions.attachedDocuments=دستاویز منسلک کریں +externalEmailUsedTemplate=ٹیمپلیٹ +externalEmailSentBy=کی طرف سے بھیجا +externalEmailSentTo=کو بھیجا گیا +externalEmailAttachedDocuments=منسلک دستاویزات diff --git a/sormas-api/src/main/resources/captions_zh-CN.properties b/sormas-api/src/main/resources/captions_zh-CN.properties index cef77aeae54..c68db6f11af 100644 --- a/sormas-api/src/main/resources/captions_zh-CN.properties +++ b/sormas-api/src/main/resources/captions_zh-CN.properties @@ -54,7 +54,6 @@ notAvailableShort=不可用 inaccessibleValue=保密 numberOfCharacters=字符数: %d / %d remove=移除 -reportingUser=报告用户 notTestedYet=尚未测试。 latestPathogenTest=最新病原体测试: unknown=未知的 @@ -1795,6 +1794,9 @@ personLinkToEvents=See events for this person personLinkToCases=See cases for this person personLinkToContacts=See contacts for this person personLinkToSamples = See samples for this person +caseLinkToSamples = See samples for this case +contactLinkToSamples = See samples for this contact +eventParticipantLinkToSamples = See samples for this event participant personsReplaceGeoCoordinates=Also replace existing coordinates. Warning\: This might replace coordinates which were intentionally set differently\! personsSetMissingGeoCoordinates=Set Missing Geo Coordinates personsUpdated=Persons Updated @@ -2099,6 +2101,9 @@ SampleExport.caseReportDate=Case report date SampleExport.caseResponsibleCommunity=Case responsible community SampleExport.caseResponsibleDistrict=Case responsible district SampleExport.caseResponsibleRegion=Case responsible region +SampleExport.eventParticipantCommunity = Community of event participant +SampleExport.eventParticipantDistrict = District of event participant +SampleExport.eventParticipantRegion = Region of event participant SampleExport.personSex=Sex of case/contact/event participant person SampleExport.caseUuid=Case UUID SampleExport.contactUuid=Contact UUID @@ -2925,4 +2930,4 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents diff --git a/sormas-api/src/main/resources/enum_ur-PK.properties b/sormas-api/src/main/resources/enum_ur-PK.properties index 186192e1801..960e7e205ef 100644 --- a/sormas-api/src/main/resources/enum_ur-PK.properties +++ b/sormas-api/src/main/resources/enum_ur-PK.properties @@ -282,10 +282,10 @@ ConveyanceType.BUS = بس ConveyanceType.MOTORBIKE = موٹر سائیکل ConveyanceType.OTHER = دیگر -CustomizableEnumType.DISEASE_VARIANT = Disease variant -CustomizableEnumType.SPECIFIC_EVENT_RISK = Specific event risk -CustomizableEnumType.OCCUPATION_TYPE = Occupation type -CustomizableEnumType.PATHOGEN = Pathogen +CustomizableEnumType.DISEASE_VARIANT = بیماری کی قسم +CustomizableEnumType.SPECIFIC_EVENT_RISK = مخصوص تقریب کا خطرہ +CustomizableEnumType.OCCUPATION_TYPE = پیشے کی قسم +CustomizableEnumType.PATHOGEN = پیتھوجین # DashboardType DashboardType.CONTACTS = روابط @@ -311,7 +311,7 @@ DatabaseTable.EPIDATA = وبائی امراض کا ڈیٹا DatabaseTable.EVENTS = تقریبات DatabaseTable.EVENTS_EVENTGROUPS = تقریبات ← تقریب گروپس DatabaseTable.EVENTGROUPS = تقریب کے گروہ -DatabaseTable.EVENTPARTICIPANTS = Event participants +DatabaseTable.EVENTPARTICIPANTS = ملوث اشخاص DatabaseTable.EXPOSURES = ایکسپوژر/سامنا DatabaseTable.ACTIVITIES_AS_CASE = سرگرمیاں بطور کیس DatabaseTable.FACILITIES = سہولت کے مقامات @@ -597,10 +597,10 @@ DocumentWorkflow.QUARANTINE_ORDER_CONTACT = دستاویز ٹیمپلیٹس را DocumentWorkflow.QUARANTINE_ORDER_EVENT_PARTICIPANT = دستاویز ٹیمپلیٹس تقریب کے شرکاہ DocumentWorkflow.QUARANTINE_ORDER_TRAVEL_ENTRY = دستاویز ٹیمپلیٹس سفری اندراج DocumentWorkflow.EVENT_HANDOUT = ٹیمپلیٹس تقریب کا ہینڈ آؤٹ -DocumentWorkflow.CASE_EMAIL = Case email templates -DocumentWorkflow.CONTACT_EMAIL = Contact email templates -DocumentWorkflow.EVENT_PARTICIPANT_EMAIL = Event participant email templates -DocumentWorkflow.TRAVEL_ENTRY_EMAIL = Travel entry email templates +DocumentWorkflow.CASE_EMAIL = کیس ای میل ٹیمپلیٹس +DocumentWorkflow.CONTACT_EMAIL = رابطہ ای میل ٹیمپلیٹس +DocumentWorkflow.EVENT_PARTICIPANT_EMAIL = تقریب کے شرکاء کے ای میل ٹیمپلیٹس +DocumentWorkflow.TRAVEL_ENTRY_EMAIL = سفر کے اندراج کے ای میل ٹیمپلیٹس EducationType.NONE = کوئی تعلیم نہیں EducationType.NURSERY = نرسری @@ -1025,7 +1025,7 @@ PathogenTestType.GRAM_STAIN = گرام سٹين PathogenTestType.LATEX_AGGLUTINATION = لیٹیکس ایگلوٹینیشن PathogenTestType.CQ_VALUE_DETECTION = CQ ویلیو کا پتہ لگانا PathogenTestType.SEQUENCING = ترتیب دینا -PathogenTestType.TMA = Transcription-mediated amplification (TMA) +PathogenTestType.TMA = ٹرانسکرپشن میڈیٹیڈ ایمپلیفیکیشن (TMA) PCRTestSpecification.VARIANT_SPECIFIC = متغیر مخصوص PCRTestSpecification.N501Y_MUTATION_DETECTION = N501Y میوٹیشن کا پتہ لگانا @@ -1260,7 +1260,7 @@ TaskContext.CONTACT = رابطہ شخص TaskContext.EVENT = تقریب TaskContext.GENERAL = عمومی TaskContext.TRAVEL_ENTRY = سفری اندراج -TaskContext.ENVIRONMENT = Environment +TaskContext.ENVIRONMENT = ماحول # TaskDateType TaskDateType.SUGGESTED_START_DATE = تجویز کردہ آغاز کی تاریخ @@ -1306,7 +1306,7 @@ TaskType.SURVEILLANCE_REPORT_GENERATION = نگرانی کی رپورٹ تیار TaskType.TREATMENT_CENTER_ESTABLISHMENT = مقامی علاج کے مرکز کا قیام TaskType.VACCINATION_ACTIVITIES = ویکسینیشن کی سرگرمیاں TaskType.WEEKLY_REPORT_GENERATION = ہفتہ وار رپورٹ بنائیں -TaskType.ENVIRONMENT_INVESTIGATION = environment investigation +TaskType.ENVIRONMENT_INVESTIGATION = ماحولیاتی تحقیقات # TemperatureSource TemperatureSource.AXILLARY=بغل @@ -1565,7 +1565,7 @@ UserRight.SORMAS_REST = Sormas REST تک رسائی UserRight.EXTERNAL_VISITS = بیرونی دورے UserRight.SORMAS_UI = Sormas UI تک رسائی UserRight.DEV_MODE = ڈویلپر کے اختیارات تک رسائی -UserRight.CUSTOMIZABLE_ENUM_MANAGEMENT = Manage customizable enums +UserRight.CUSTOMIZABLE_ENUM_MANAGEMENT = حسب ضرورت اینومس کا نظم کریں UserRight.DOCUMENT_VIEW = موجودہ دستاویزات دیکھیں UserRight.DOCUMENT_UPLOAD = دستاویزات اپ لوڈ کریں UserRight.DOCUMENT_DELETE = سسٹم سے دستاویزات مٹا دیں @@ -1577,8 +1577,8 @@ UserRight.ENVIRONMENT_ARCHIVE = آرکائیو ماحول UserRight.ENVIRONMENT_DELETE = سسٹم سے ماحول کو مٹا دیں UserRight.ENVIRONMENT_IMPORT = ماحول امپورٹ کریں UserRight.ENVIRONMENT_EXPORT = ایکسپورٹ ماحول -UserRight.ENVIRONMENT_SAMPLE_VIEW = View existing environment samples -UserRight.ENVIRONMENT_SAMPLE_CREATE = Create new environment samples +UserRight.ENVIRONMENT_SAMPLE_VIEW = موجودہ ماحول کے نمونے دیکھیں +UserRight.ENVIRONMENT_SAMPLE_CREATE = ماحول کے نئے نمونے بنائیں UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = Edit environment samples dispatch information UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = Edit environment samples receival information diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index 2d0700018e9..143279107fb 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 73ffe6d231c..4d3f1e8a705 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Pokud zvolíte region a/nebo filtr okresu infoDeveloperOptions = Ovládacími prvky níže můžete vytvořit zástupné případy a kontakty na základě vybraných omezení. Vezměte prosím na vědomí, že vytváření spousty dat najednou může nějakou dobu trvat.
Vytvořené údaje nejsou ani plně určující, ani náhodné a jsou určeny pouze pro účely zkoušení a předvedení. infoDeveloperOptionsContactGeneration = Při generování kontaktů generátor náhodně vybere existující případy jako zdroj. Ujistěte se, že před vytvořením kontaktů není databáze případů prázdná. infoDeveloperOptionsSeedUsage = Pomocí seedu vytvoří identické datové soubory za předpokladu, že počáteční podmínky (konfigurace a databáze) jsou také totožné -infoCreateNewSampleDiscardsChangesCase = Vytvoření nového vzorku zruší všechny neuložené změny provedené v tomto případu infoCreateNewSampleDiscardsChangesContact = Vytvoření nového vzorku zruší všechny neuložené změny provedené v tomto kontaktu infoCreateNewSampleDiscardsChangesEventParticipant = Vytvoření nového vzorku zruší všechny neuložené změny provedené u tohoto účastníka události infoUsageOfEditableCampaignGrids = Můžete upravovat data kampaně a ovládacího panelu kliknutím na jednu z buněk v mřížce, a můžete změnit pořadí prvků ovládacího panelu přetažením a umístěním řádků mřížky @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Datum zprávy o imunizaci od... promptImmunizationDateTo = ... do promptImmunizationEpiWeekFrom = Nová imunizace od epi týdne... promptImmunizationEpiWeekTo = ... do epi týdne -promptEmail = E-mail\: promptExternalMessagesSearchField = UUID, jméno, poštovní směrovací číslo, jméno reportéra, poštovní směrovací číslo promptExternalMessagesContentSearchField = Obsah externí zprávy promptExternalMessagesDateFrom = Datum zprávy od... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... do epi týdne promtSampleDataType = Referenční datum vzorku promptSearch = Hledat... promptTaskSearchField = Případ nebo ID kontaktu/jméno, ID události/název události -promptTelephoneNumber = Telefonní číslo\: promptTaskDateType = Referenční datum úkolu promptTaskDateFrom = Úkoly od... promptTaskDateTo = ... do diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index c4cc70667da..83eb784316f 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = Sie können die folgenden Kontrollelemente verwenden, um Dummy-Fälle und Kontakte basierend auf den ausgewählten Beschränkungen zu generieren. Bitte beachten Sie, dass es einige Zeit dauern kann, viele Daten gleichzeitig zu erzeugen.
Generierte Daten sind weder vollständig deterministisch, noch vollständig zufällig und nur für Testzwecke und Demonstrationszwecke bestimmt. infoDeveloperOptionsContactGeneration = Beim Generieren von Kontakten wird der Generator zufällige existierende Fälle als Index auswählen. Bitte stellen Sie sicher, dass die Falldatenbank nicht leer ist, bevor Sie Kontakte generieren. infoDeveloperOptionsSeedUsage = Mit dem Seed werden identische Datensätze erzeugt, sofern die Ausgangsbedingungen (Konfiguration & Datenbank) ebenfalls identisch sind -infoCreateNewSampleDiscardsChangesCase = Die Erstellung neuer Proben wird alle gemachten ungespeicherten Änderungen für diesen Fall verwerfen infoCreateNewSampleDiscardsChangesContact = Die Erstellung neuer Proben wird alle nicht gespeicherten Änderungen dieses Kontaktes verwerfen infoCreateNewSampleDiscardsChangesEventParticipant = Die Erstellung einer neuen Probe verwirft alle nicht gespeicherten Änderungen dieses Ereignisteilnehmers infoUsageOfEditableCampaignGrids = Sie können die Kampagnendaten und Dashboard-Definitionen bearbeiten, indem Sie innerhalb einer der Zellen im Raster klicken, und Sie können die Dashboard-Elemente durch Ziehen und Ablegen der Gitterzeilen neu ordnen @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunisierung Meldedatum vom... promptImmunizationDateTo = ... bis promptImmunizationEpiWeekFrom = Neue Immunisierung von Epi Woche... promptImmunizationEpiWeekTo = ... bis Epi Woche -promptEmail = Email\: promptExternalMessagesSearchField = UUID, Name, Postleitzahl, Melder Name, Melder Postleitzahl promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Meldungsdatum von... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... bis Epi Woche promtSampleDataType = Referenzdatum der Probe promptSearch = Suche... promptTaskSearchField = Fall oder Kontakt ID/Name, Ereignis ID/Titel -promptTelephoneNumber = Phone number\: promptTaskDateType = Referenzdatum der Aufgabe promptTaskDateFrom = Aufgaben von... promptTaskDateTo = ... bis diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index b43aab471fc..8f08a3eb363 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Wenn Sie einen Bundesland- und/oder einen infoDeveloperOptions = Sie können die folgenden Kontrollelemente verwenden, um Dummy-Fälle und Kontakte basierend auf den ausgewählten Beschränkungen zu generieren. Bitte beachten Sie, dass es einige Zeit dauern kann, viele Daten gleichzeitig zu erzeugen.
Generierte Daten sind weder vollständig deterministisch, noch vollständig zufällig und nur für Testzwecke und Demonstrationszwecke bestimmt. infoDeveloperOptionsContactGeneration = Beim Generieren von Kontakten wird der Generator zufällige existierende Fälle als Index auswählen. Bitte stellen Sie sicher, dass die Falldatenbank nicht leer ist, bevor Sie Kontakte generieren. infoDeveloperOptionsSeedUsage = Mit dem Seed werden identische Datensätze erzeugt, sofern die Ausgangsbedingungen (Konfiguration & Datenbank) ebenfalls identisch sind -infoCreateNewSampleDiscardsChangesCase = Die Erstellung neuer Proben wird alle nicht gespeicherten Änderungen dieses Falles verwerfen infoCreateNewSampleDiscardsChangesContact = Die Erstellung neuer Proben wird alle nicht gespeicherten Änderungen dieses Kontaktes verwerfen infoCreateNewSampleDiscardsChangesEventParticipant = Die Erstellung neuer Proben wird alle nicht gespeicherten Änderungen dieses Ereignisteilnehmers verwerfen infoUsageOfEditableCampaignGrids = Sie können die Kampagnendaten und Dashboard-Definitionen bearbeiten, indem Sie innerhalb einer der Zellen im Raster klicken, und Sie können die Dashboard-Elemente durch Ziehen und Ablegen der Gitterzeilen neu ordnen @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunisierung Meldedatum vom... promptImmunizationDateTo = ... bis promptImmunizationEpiWeekFrom = Neue Immunisierung von Epi Woche... promptImmunizationEpiWeekTo = ... bis Epi Woche -promptEmail = Email\: promptExternalMessagesSearchField = UUID, Name, Postleitzahl, Melder Name, Melder Postleitzahl promptExternalMessagesContentSearchField = Inhalt externer Nachrichten promptExternalMessagesDateFrom = Meldungsdatum von... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... bis Epi Woche promtSampleDataType = Referenzdatum der Probe promptSearch = Suche... promptTaskSearchField = Fall oder Kontakt ID/Name, Event ID/Titel -promptTelephoneNumber = Phone number\: promptTaskDateType = Referenzdatum der Aufgabe promptTaskDateFrom = Aufgaben vom... promptTaskDateTo = ... bis diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index f4b0caca1f3..5a4e0518eab 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index f3cf428cf05..301fbf4a9b1 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index dd4efa2a14d..178a97a3295 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_es-BO.properties b/sormas-api/src/main/resources/strings_es-BO.properties index b91efd3e5bb..a0b5ece201f 100644 --- a/sormas-api/src/main/resources/strings_es-BO.properties +++ b/sormas-api/src/main/resources/strings_es-BO.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 45e01fe437f..79e1841f7d8 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Cuando se selecciona un filtro de provinc infoDeveloperOptions = Utilice los controles siguientes para generar casos y contactos ficticios en base a las restricciones seleccionadas. Por favor, tenga en cuenta que generar muchos datos a la vez puede tomar algún tiempo.
Los datos generados no son completamente deterministas, ni completamente aleatorios, y están destinados a pruebas y demostraciones solamente. infoDeveloperOptionsContactGeneration = Al generar contactos, el generador seleccionará casos existentes aleatorios como fuente. Por favor, asegure que la base de datos de casos no esté vacía antes de generar contactos. infoDeveloperOptionsSeedUsage = Usar la semilla creará conjuntos de datos idénticos, siempre y cuando las condiciones de inicio (configuración y base de datos) también sean idénticas -infoCreateNewSampleDiscardsChangesCase = Crear una nueva muestra descartará todos los cambios no guardados de este caso infoCreateNewSampleDiscardsChangesContact = Crear una nueva muestra descartará todos los cambios no guardados de este contacto infoCreateNewSampleDiscardsChangesEventParticipant = Crear una nueva muestra descartará todos los cambios no guardados de este participante de evento infoUsageOfEditableCampaignGrids = Puede editar los datos de campaña y las definiciones del tablero de control haciendo clic dentro de una de las celdas de la cuadrícula, y puede reordenar los elementos del tablero de control arrastrando y soltando las filas de la cuadrícula @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Fecha de informe de inmunización desde... promptImmunizationDateTo = ... hasta promptImmunizationEpiWeekFrom = Nuevas inmunizaciones desde la semana epi... promptImmunizationEpiWeekTo = ... hasta la semana epi -promptEmail = Correo electrónico\: promptExternalMessagesSearchField = UUID, nombre, código postal, nombre de reportador, código postal de reportador promptExternalMessagesContentSearchField = Contenido de mensajes externos promptExternalMessagesDateFrom = Fecha de mensaje desde... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... a la semana epi promtSampleDataType = Fecha de referencia de la muestra promptSearch = Buscar... promptTaskSearchField = ID/nombre de caso o contacto, ID/título de evento -promptTelephoneNumber = Número telefónico\: promptTaskDateType = Fecha de referencia de tarea promptTaskDateFrom = Tareas desde... promptTaskDateTo = ... hasta diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index 05ce1403ee8..479d0bc23e7 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Kun valitset Erva-alue- ja / tai sairaanh infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... epidemiaviikkoon asti promtSampleDataType = Näytteen referenssipäivämäärä promptSearch = Haku... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_fr-CD.properties b/sormas-api/src/main/resources/strings_fr-CD.properties index aa31e536daf..6d4f3b7823c 100644 --- a/sormas-api/src/main/resources/strings_fr-CD.properties +++ b/sormas-api/src/main/resources/strings_fr-CD.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index 2ec96563590..dfc0e401429 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = La création d'un nouvel échantillon rejètera toutes les modifications non sauvegardées apportées à ce participant à l'événement infoUsageOfEditableCampaignGrids = Vous pouvez modifier les données de la campagne et les définitions du tableau de bord en cliquant à l'intérieur d'une des cellules de la grille, et vous pouvez réorganiser les éléments du tableau de bord en glissant et en déposant les lignes de la grille @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... à la semaine épidémiologique promtSampleDataType = Date de référence de l'échantillon promptSearch = Recherche... promptTaskSearchField = ID/nom de cas ou contact, ID/titre d'événement -promptTelephoneNumber = Phone number\: promptTaskDateType = Date de référence de tâche promptTaskDateFrom = Tâches depuis... promptTaskDateTo = ... à diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index b415fde8883..6796327e25e 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Lorsque vous sélectionnez un filtre de p infoDeveloperOptions = Vous pouvez utiliser les commandes ci-dessous pour générer des cas factices et des contacts en fonction des contraintes sélectionnées. Veuillez noter que la génération de nombreuses données à la fois peut prendre un certain temps.
Les données générées ne sont ni totalement déterministes, ni entièrement aléatoires, et ne sont destinées qu'à des fins de test et de démonstration. infoDeveloperOptionsContactGeneration = Lors de la génération de contacts, le générateur choisira des cas existants aléatoirement comme source. Veuillez vous assurer que la base de données de cas n'est pas vide avant de générer des contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = La création d'un nouvel échantillon éliminera toutes les modifications non sauvegardées apportées à ce participant à l'événement infoUsageOfEditableCampaignGrids = Vous pouvez modifier les données de la campagne et les définitions du tableau de bord en cliquant à l'intérieur d'une des cellules de la grille, et vous pouvez réorganiser les éléments du tableau de bord en glissant et en déposant les lignes de la grille @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Date du rapport d'immunisation de... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... à la Semaine de l’Epi promtSampleDataType = Date de référence de l'échantillon promptSearch = Recherche... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Numéro de téléphone\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_fr-TN.properties b/sormas-api/src/main/resources/strings_fr-TN.properties index 05a108a14d1..e883b1eeb6d 100644 --- a/sormas-api/src/main/resources/strings_fr-TN.properties +++ b/sormas-api/src/main/resources/strings_fr-TN.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Lorsque vous sélectionnez un filtre de p infoDeveloperOptions = Vous pouvez utiliser les commandes ci-dessous pour générer des cas factices et des contacts en fonction des contraintes sélectionnées. Veuillez noter que la génération de nombreuses données à la fois peut prendre un certain temps.
Les données générées ne sont ni totalement déterministes, ni entièrement aléatoires, et ne sont destinées qu'à des fins de test et de démonstration. infoDeveloperOptionsContactGeneration = Lors de la génération de contacts, le générateur choisira des cas existants aléatoirement comme source. Veuillez vous assurer que la base de données de cas n'est pas vide avant de générer des contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = La création d'un nouvel échantillon éliminera toutes les modifications non sauvegardées apportées à ce participant à l'événement infoUsageOfEditableCampaignGrids = Vous pouvez modifier les données de la campagne et les définitions du tableau de bord en cliquant à l'intérieur d'une des cellules de la grille, et vous pouvez réorganiser les éléments du tableau de bord en glissant et en déposant les lignes de la grille @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Date du rapport d'immunisation de... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... à la Semaine de l’Epi promtSampleDataType = Date de référence de l'échantillon promptSearch = Recherche... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index 9994005645d..fc6e9e965a3 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Quando si seleziona come filtro un Canton infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = La creazione di un nuovo campione scarterà tutte le modifiche non salvate apportate a questo participante all'evento infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... alla settimana Epi promtSampleDataType = Data di riferimento del capione promptSearch = Cerca... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index 7c5a3cdbb60..0dd2484fdd3 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = Quando si seleziona come filtro un Canton infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... alla settimana Epi promtSampleDataType = Data di riferimento del capione promptSearch = Cerca... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index 2d0700018e9..143279107fb 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index d6c192f1ec0..4743e2e39a2 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index 1ca076e3e47..ad6ecba4518 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index 71fde68a288..6823645d3d5 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 0091ff3dc78..7a3f058763d 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 97e988efb1e..0b6a24aaf96 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = جب آپ کوئی علاقہ اور/یا infoDeveloperOptions = منتخب کردہ پابندیوں پر مبنی ڈمی کیسز اور رابطے بنانے کے لیے آپ نیچے دیئے گئے کنٹرولز کا استعمال کر سکتے ہیں۔ براہ کرم نوٹ کریں کہ ایک ساتھ بہت زیادہ ڈیٹا تیار کرنے میں کچھ وقت لگ سکتا ہے۔
جنریٹڈ ڈیٹا نہ تو پوری طرح سے طے شدہ ہے اور نہ ہی مکمل طور پر بے ترتیب، اور صرف جانچ اور نمائش کے مقاصد کے لیے ہے۔ infoDeveloperOptionsContactGeneration = رابطے بناتے وقت، جنریٹر بے ترتیب موجودہ کیسز کو بطور ذریعہ منتخب کرے گا۔ براہ کرم رابطے بنانے سے پہلے یقینی بنائیں کہ کیس کا ڈیٹا بیس خالی نہیں ہے۔ infoDeveloperOptionsSeedUsage = بیج کے استعمال سے ایک جیسے ڈیٹاسیٹس بنیں گے، بشرطیکہ ابتدائی حالات (کنفیگریشن اور ڈیٹا بیس) بھی ایک جیسے ہوں -infoCreateNewSampleDiscardsChangesCase = نیا نمونہ بنانے سے اس کیس میں کی گئی تمام غیر محفوظ شدہ تبدیلیاں رد ہو جائیں گی infoCreateNewSampleDiscardsChangesContact = نیا نمونہ بنانے سے اس رابطے میں کی گئی تمام غیر محفوظ شدہ تبدیلیاں رد ہو جائیں گی۔ infoCreateNewSampleDiscardsChangesEventParticipant = نیا نمونہ بنانے سے اس تقریب کے شریک میں کی گئی تمام غیر محفوظ شدہ تبدیلیاں رد ہو جائیں گی۔ infoUsageOfEditableCampaignGrids = آپ گرڈ میں کسی ایک سیل کے اندر کلک کر کے مہم کے ڈیٹا اور ڈیش بورڈ کی تعریفوں میں ترمیم کر سکتے ہیں، اور آپ گرڈ کی قطاروں کو گھسیٹ کر اور چھوڑ کر ڈیش بورڈ عناصر کو دوبارہ ترتیب دے سکتے ہیں @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = امیونائزیشن رپورٹ کی تاریخ promptImmunizationDateTo = ... تک promptImmunizationEpiWeekFrom = EPI ہفتہ سے نئے امیونائزیشنز... promptImmunizationEpiWeekTo = ...EPI ہفتہ تک -promptEmail = Email\: promptExternalMessagesSearchField = UUID، نام، پوسٹل کوڈ، رپورٹرکا نام، رپورٹر کا پوسٹل کوڈ promptExternalMessagesContentSearchField = بیرونی پیغام کا مواد promptExternalMessagesDateFrom = پیغام کی تاریخ سے... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... EPI ہفتہ تک promtSampleDataType = نمونہ حوالہ کی تاریخ promptSearch = تلاش کریں... promptTaskSearchField = کیس یا رابطہ ID/نام، تقریب ID/عنوان -promptTelephoneNumber = Phone number\: promptTaskDateType = کام حوالہ کی تاریخ promptTaskDateFrom = سے کام... promptTaskDateTo = ... تک diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index d0e2835ccad..7e3ee10115e 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -1025,7 +1025,6 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
Generated data is neither fully deterministic, nor fully random, and intended for testing and demonstration purposes only. infoDeveloperOptionsContactGeneration = When generating contacts, the generator will pick random existing cases as source. Please make sure the case database is not empty before generating contacts. infoDeveloperOptionsSeedUsage = Using the seed will create identical datasets, provided the starting conditions (configuration & database) are also identical -infoCreateNewSampleDiscardsChangesCase = Creating a new sample will discard all unsaved changes made to this case infoCreateNewSampleDiscardsChangesContact = Creating a new sample will discard all unsaved changes made to this contact infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows @@ -1618,7 +1617,6 @@ promptImmunizationDateFrom = Immunization report date from... promptImmunizationDateTo = ... to promptImmunizationEpiWeekFrom = New immunizations from epi week... promptImmunizationEpiWeekTo = ... to epi week -promptEmail = Email\: promptExternalMessagesSearchField = UUID, name, postal code, reporter name, reporter postal code promptExternalMessagesContentSearchField = External message content promptExternalMessagesDateFrom = Message date from... @@ -1637,7 +1635,6 @@ promptSampleEpiWeekTo = ... to epi week promtSampleDataType = Sample reference date promptSearch = Search... promptTaskSearchField = Case or contact ID/name, Event ID/title -promptTelephoneNumber = Phone number\: promptTaskDateType = Task reference date promptTaskDateFrom = Tasks from... promptTaskDateTo = ... to diff --git a/sormas-api/src/main/resources/validations_ur-PK.properties b/sormas-api/src/main/resources/validations_ur-PK.properties index 3719965a46d..f417b7b83ea 100644 --- a/sormas-api/src/main/resources/validations_ur-PK.properties +++ b/sormas-api/src/main/resources/validations_ur-PK.properties @@ -71,7 +71,7 @@ importErrorCustomizableEnumValue = %sکالم میں%s معلومات امپو importPersonContactDetailsWithoutFacilityType = آپ کو اس ایڈریس کے لیے کم از کم ایک سہولت گاہ کی قسم بتانا ہو گی جس کے لیے آپ نے شخص سے رابطہ کی تفصیلات بتائی ہیں۔ importProbablyInvalidSeparator=اپ لوڈ کردہ csv فائل شاید پہلے سے طے شدہ سیپریٹر سے مختلف سیپریٹر استعمال کرتی ہے۔ براہ کرم امپورٹ کرنے سے پہلے درست سیپریٹرمنتخب کریں۔ importIncompleteContent=فائل کا مواد نامکمل ہے۔ سرخی غائب ہیں یا امپورٹ کرنے کے لیے کوئی ڈیٹا نہیں ہے۔ ایک درست امپورٹ فائل بنانے کے لیے براہ کرم امپورٹ والی ہدایات کو چیک کریں۔ -importEnvironmentPropertyTypeNotAllowed = Property type %s not allowed when importing environments +importEnvironmentPropertyTypeNotAllowed = ماحولیات کو امپورٹ کرتے وقت پراپرٹی کی قسم %s کی اجازت نہیں ہے 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 = کسی غیر درجہ بند کیس کے لیے تفتیش کی حیثیت کو سب ٹھیک ہے کرنے کی اجازت نہیں ہے۔ From 71a12eb8b3e90998ff046e624272474eabd3cfbd Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Thu, 15 Feb 2024 12:37:32 +0100 Subject: [PATCH 40/65] qa-auto/HSP-6587 Create automated test to check that Event tasks display the correct region and district in Task Management Directory * qa-auto/HSP-6587 Create automated test to check that Event tasks display the correct region and district in Task Management Directory - initial commit * qa-auto/HSP-6587 Create automated test to check that Event tasks display the correct region and district in Task Management Directory - cleaning comment --- .../events/EventDirectorySteps.java | 8 ++++ .../tasks/TaskManagementSteps.java | 39 +++++++++++++++++-- .../features/sanity/web/Event.feature | 15 ++++++- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java index 5f6a664b026..b3653ff9e68 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java @@ -33,6 +33,7 @@ import static org.sormas.e2etests.pages.application.cases.EditCasePage.VACCINATION_CARD_INFO_POPUP_TEXT; import static org.sormas.e2etests.pages.application.configuration.DocumentTemplatesPage.FILE_PICKER; import static org.sormas.e2etests.pages.application.contacts.ContactDirectoryPage.FIRST_CONTACT_ID; +import static org.sormas.e2etests.pages.application.contacts.EditContactPage.UUID_INPUT; import static org.sormas.e2etests.pages.application.events.CreateNewEventPage.LINKED_CASES_TO_THE_SELECTED_EVENT_POPUP; import static org.sormas.e2etests.pages.application.events.CreateNewEventPage.LINKED_CONTACTS_TO_THE_SELECTED_EVENT_POPUP; import static org.sormas.e2etests.pages.application.events.EditEventPage.*; @@ -177,6 +178,7 @@ public class EventDirectorySteps implements En { private final List oldEventUUIDs = new ArrayList<>(); static Map headersMap; public String createdEventUUID; + public static List eventsUUID = new ArrayList<>(); @Inject public EventDirectorySteps( @@ -958,6 +960,12 @@ public EventDirectorySteps( webDriverHelpers.clickOnWebElementBySelector(CHANGE_EVENT_MANAGEMENT_STATUS_CHECKBOX); webDriverHelpers.clickWebElementByText(EVENT_MANAGEMENT_STATUS_COMBOBOX, "PENDING"); }); + + When( + "I collect uuid of the event", + () -> { + eventsUUID.add(webDriverHelpers.getValueFromWebElement(UUID_INPUT)); + }); When( "I check if Event Management Status is set to {string}", (String eventManagementStatus) -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java index 0e9994bccbe..d69b588ff74 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java @@ -36,6 +36,7 @@ import static org.sormas.e2etests.pages.application.samples.SamplesDirectoryPage.CONFIRM_BUTTON; import static org.sormas.e2etests.pages.application.tasks.CreateNewTaskPage.*; import static org.sormas.e2etests.pages.application.tasks.TaskManagementPage.*; +import static org.sormas.e2etests.steps.web.application.events.EventDirectorySteps.eventsUUID; import com.opencsv.CSVParser; import com.opencsv.CSVParserBuilder; @@ -64,11 +65,14 @@ import org.openqa.selenium.WebElement; import org.sormas.e2etests.entities.pojo.web.Task; import org.sormas.e2etests.helpers.AssertHelpers; +import org.sormas.e2etests.helpers.RestAssuredClient; import org.sormas.e2etests.helpers.WebDriverHelpers; +import org.sormas.e2etests.helpers.environmentdata.manager.EnvironmentManager; import org.sormas.e2etests.pages.application.tasks.TaskManagementPage; import org.sormas.e2etests.state.ApiState; import org.sormas.e2etests.steps.BaseSteps; import org.sormas.e2etests.steps.web.application.cases.EditCaseSteps; +import org.sormas.e2etests.steps.web.application.events.EventsTableColumnsHeaders; import org.testng.Assert; import org.testng.asserts.SoftAssert; @@ -87,15 +91,17 @@ public TaskManagementSteps( ApiState apiState, AssertHelpers assertHelpers, SoftAssert softly, - Properties properties) { + Properties properties, + RestAssuredClient restAssuredClient) { this.webDriverHelpers = webDriverHelpers; this.baseSteps = baseSteps; + EnvironmentManager manager = new EnvironmentManager(restAssuredClient); When( "^I click on the NEW TASK button$", () ->{ - webDriverHelpers.waitForSpinnerNotVisible(10); - webDriverHelpers.clickWhileOtherButtonIsDisplayed(NEW_TASK_BUTTON, TASK_TYPE_COMBOBOX); + webDriverHelpers.waitForSpinnerNotVisible(10); + webDriverHelpers.clickWhileOtherButtonIsDisplayed(NEW_TASK_BUTTON, TASK_TYPE_COMBOBOX); }); And( @@ -180,6 +186,16 @@ public TaskManagementSteps( webDriverHelpers.clickOnWebElementBySelector(getByEventUuid(eventUuid)); }); + When( + "^I am search the last created event by API in task management directory$", + () -> { + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(70); + webDriverHelpers.fillAndSubmitInWebElement(GENERAL_SEARCH_INPUT, eventsUUID.get(0)); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(15); + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + getByEventUuid(eventsUUID.get(0))); + }); + When( "^I filter Task context by ([^\"]*)$", (String filterType) -> { @@ -202,6 +218,23 @@ public TaskManagementSteps( softly.assertAll(); }); + When( + "^I check that region and district are correct displayed for the last created event by API in task management$", + () -> { + List> tableRowsData = getTableRowsData(); + softly.assertEquals( + manager.getRegionName( + apiState.getCreatedEvent().getEventLocation().getRegion().getUuid()), + tableRowsData.get(0).get(EventsTableColumnsHeaders.REGION_HEADER.toString()), + "Regions are not equal"); + softly.assertEquals( + manager.getDistrictName( + apiState.getCreatedEvent().getEventLocation().getDistrict().getUuid()), + tableRowsData.get(0).get(EventsTableColumnsHeaders.DISTRICT_HEADER.toString()), + "Districts are not equal"); + softly.assertAll(); + }); + When( "^I check displayed task's context is ([^\"]*)$", (String taskContext) -> { 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 f8fb795ef82..fe33dac6cc8 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 @@ -1473,4 +1473,17 @@ Feature: Create events And I click on New Action from Event Actions tab And I create New Action from event tab Then I click on to Edit Event Actions from Event Actions tab - And I check that the Delete button is not available from Edit Event Actions page \ No newline at end of file + And I check that the Delete button is not available from Edit Event Actions page + + @tmsLink=HSP-6587 @env_main + Scenario: Check that Event tasks display the correct region and district in Task Management 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 am accessing the event tab using the created event via api + And I collect uuid of the event + Then I click on New Task from event tab + And I create a new task with specific data for an event + And I click on the Tasks button from navbar + And I am search the last created event by API in task management directory + And I check that region and district are correct displayed for the last created event by API in task management \ No newline at end of file From 9cb169c6a3e2de162d5f880e5fa9ba31d75b921e Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Thu, 15 Feb 2024 16:13:07 +0100 Subject: [PATCH 41/65] qa-auto/HSP-6591 Stabilize "Document Templates create quarantine order for Case bulk DE" - modyfied step, and split quarantine selector into two for EN and DE * qa-auto/HSP-6591 Stabilize "Document Templates create quarantine order for Case bulk DE" - modyfied step, and split quarantine selector into two for EN and DE * qa-auto/HSP-6591 Stabilize "Document Templates create quarantine order for Case bulk DE" - removed print --- .../pages/application/cases/CaseDirectoryPage.java | 2 ++ .../web/application/cases/CaseDirectorySteps.java | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) 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 b4a976e1792..0da74874de4 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 @@ -116,6 +116,8 @@ public static final By getCaseResultsUuidLocator(String uuid) { By.xpath("//span[contains(text(),'De-Archive')]\n"); public static final By BULK_CREATE_QUARANTINE_ORDER = By.xpath("//span[contains(text(),'Create quarantine order documents')]"); + public static final By BULK_CREATE_QUARANTINE_ORDER_DE = + By.xpath("//span[contains(text(),'Dokumente erstellen')]"); public static final By CASE_REPORTING_USER_FILTER = By.cssSelector("[id='reportingUserLike']"); public static final By CASE_YEAR_FILTER = By.cssSelector("[id='birthdateYYYY'] [class='v-filterselect-button']"); 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 9d593c436c8..93c8c946070 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 @@ -29,6 +29,7 @@ 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_CREATE_QUARANTINE_ORDER_DE; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_EDIT_INFORMATION; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_MODE_SUCCESS_IMAGE; import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.BULK_OPERATION_PROGRESS_BAR; @@ -516,7 +517,15 @@ public CaseDirectorySteps( And( "I click on Create Quarantine Order from Bulk Actions combobox on Case Directory Page", - () -> webDriverHelpers.clickOnWebElementBySelector(BULK_CREATE_QUARANTINE_ORDER)); + () -> { + String languageSample = + webDriverHelpers.getTextFromWebElement(By.cssSelector(".v-label.v-widget.h1")); + if (languageSample.equalsIgnoreCase("Fallverzeichnis")) { + webDriverHelpers.clickOnWebElementBySelector(BULK_CREATE_QUARANTINE_ORDER_DE); + } else if (languageSample.equalsIgnoreCase("Case Directory")) { + webDriverHelpers.clickOnWebElementBySelector(BULK_CREATE_QUARANTINE_ORDER); + } + }); And( "I click on checkbox to upload generated document to entities in Create Quarantine Order form in Case directory", From c1543b50f6b9f0fe9bd8b84830cfc5066ac01483 Mon Sep 17 00:00:00 2001 From: Levente Gal <62599627+leventegal-she@users.noreply.github.com> Date: Fri, 16 Feb 2024 10:28:23 +0200 Subject: [PATCH 42/65] #12758 grant users to see case personal data (#12956) * #12758 Grant users special access to specific cases' personal data for a limited time - WIP * #12758 Grant users special access to specific cases' personal data for a limited time - bulk * #12758 Grant users special access to specific cases' personal data for a limited time - cron for deleting expired accesses * #12758 Grant users special access to specific cases' personal data for a limited time - refactor pseudonymization WIP * #12758 Grant users special access to specific cases' personal data for a limited time * #12758 Grant users special access to specific cases' personal data for a limited time - fixed merge conflicts * #12758 Grant users special access to specific cases' personal data for a limited time - fixed issues found during the review * #12758 Grant users special access to specific cases' personal data for a limited time - fix person end event participant pseudonymization * #12758 Grant users special access to specific cases' personal data for a limited time - missing classes * #12758 Grant users special access to specific cases' personal data for a limited time - fixed failing test * #12758 Grant users special access to specific cases' personal data for a limited time - contact personal data --------- Co-authored-by: Levente Gal --- .../de/symeda/sormas/api/FacadeProvider.java | 5 + .../symeda/sormas/api/caze/CaseDataDto.java | 9 +- .../symeda/sormas/api/caze/CaseExportDto.java | 9 +- .../sormas/api/caze/CaseFollowUpDto.java | 2 +- .../symeda/sormas/api/caze/CaseIndexDto.java | 4 +- .../sormas/api/caze/CaseListEntryDto.java | 2 +- .../sormas/api/caze/CaseReferenceDto.java | 6 +- .../sormas/api/caze/CaseSelectionDto.java | 5 +- .../de/symeda/sormas/api/caze/IsCase.java | 21 ++ .../de/symeda/sormas/api/caze/MapCaseDto.java | 6 +- .../SurveillanceReportDto.java | 20 +- .../api/clinicalcourse/ClinicalVisitDto.java | 2 + .../api/common/progress/ProcessedEntity.java | 9 + .../symeda/sormas/api/contact/ContactDto.java | 11 +- .../sormas/api/contact/ContactExportDto.java | 11 +- .../api/contact/ContactFollowUpDto.java | 13 +- .../sormas/api/contact/ContactIndexDto.java | 2 +- .../api/contact/ContactListEntryDto.java | 12 +- .../api/contact/ContactReferenceDto.java | 35 +-- .../symeda/sormas/api/contact/IsContact.java | 24 ++ .../api/contact/MergeContactIndexDto.java | 5 +- .../sormas/api/contact/SimilarContactDto.java | 6 +- .../sormas/api/event/EventParticipantDto.java | 2 +- .../api/event/EventParticipantExportDto.java | 13 +- .../api/event/EventParticipantIndexDto.java | 3 +- .../event/EventParticipantListEntryDto.java | 2 +- .../sormas/api/event/IsEventParticipant.java | 21 ++ .../api/event/SimilarEventParticipantDto.java | 2 +- .../sormas/api/exposure/ExposureDto.java | 4 + .../de/symeda/sormas/api/i18n/Captions.java | 9 + .../de/symeda/sormas/api/i18n/Strings.java | 9 + .../symeda/sormas/api/i18n/Validations.java | 1 + .../api/immunization/ImmunizationDto.java | 5 +- .../immunization/ImmunizationIndexDto.java | 4 +- .../ImmunizationListEntryDto.java | 2 +- .../ImmunizationReferenceDto.java | 2 +- .../api/immunization/IsImmunization.java | 24 ++ .../api/importexport/DatabaseTable.java | 1 + .../de/symeda/sormas/api/person/IsPerson.java | 21 ++ .../symeda/sormas/api/person/PersonDto.java | 3 +- .../sormas/api/person/PersonExportDto.java | 5 +- .../sormas/api/person/PersonIndexDto.java | 6 +- .../de/symeda/sormas/api/sample/IsSample.java | 24 ++ .../symeda/sormas/api/sample/SampleDto.java | 9 +- .../sormas/api/sample/SampleExportDto.java | 10 +- .../sormas/api/sample/SampleIndexDto.java | 5 +- .../sormas/api/sample/SampleReferenceDto.java | 16 +- .../SpecialCaseAccessDto.java | 106 ++++++++ .../SpecialCaseAccessFacade.java | 43 +++ .../de/symeda/sormas/api/task/IsTask.java | 27 ++ .../de/symeda/sormas/api/task/TaskDto.java | 2 +- .../symeda/sormas/api/task/TaskExportDto.java | 18 +- .../symeda/sormas/api/task/TaskIndexDto.java | 8 +- .../api/therapy/PrescriptionIndexDto.java | 3 + .../sormas/api/therapy/TreatmentIndexDto.java | 3 + .../sormas/api/travelentry/IsTravelEntry.java | 24 ++ .../api/travelentry/TravelEntryDto.java | 4 +- .../api/travelentry/TravelEntryIndexDto.java | 2 +- .../travelentry/TravelEntryListEntryDto.java | 2 +- .../sormas/api/user/DefaultUserRole.java | 1 + .../de/symeda/sormas/api/user/UserRight.java | 2 + .../utils/fieldaccess/FieldAccessChecker.java | 4 +- .../fieldaccess/FieldAccessCheckers.java | 61 +++-- .../fieldaccess/UiFieldAccessCheckers.java | 36 +-- .../AnnotationBasedFieldAccessChecker.java | 19 +- .../PersonalDataFieldAccessChecker.java | 18 +- .../PseudonymizedFieldAccessChecker.java | 50 +++- .../SensitiveDataFieldAccessChecker.java | 18 +- .../checkers/UserRightFieldAccessChecker.java | 4 +- .../pseudonymization/DtoPseudonymizer.java | 246 ++++++++++------- .../de/symeda/sormas/api/visit/IsVisit.java | 24 ++ .../de/symeda/sormas/api/visit/VisitDto.java | 9 +- .../sormas/api/visit/VisitExportDto.java | 4 +- .../sormas/api/visit/VisitIndexDto.java | 2 +- .../api/visit/VisitSummaryExportDto.java | 25 +- .../src/main/resources/captions.properties | 12 + sormas-api/src/main/resources/enum.properties | 2 + .../src/main/resources/enum_fj-FJ.properties | 1 + .../src/main/resources/strings.properties | 10 + .../src/main/resources/validations.properties | 1 + .../backend/campaign/CampaignFacadeEjb.java | 4 +- .../de/symeda/sormas/backend/caze/Case.java | 16 +- .../sormas/backend/caze/CaseFacadeEjb.java | 175 ++++++------ .../symeda/sormas/backend/caze/CaseJoins.java | 10 + .../sormas/backend/caze/CaseService.java | 14 +- .../PortHealthInfoFacadeEjb.java | 8 +- .../SurveillanceReportFacadeEjb.java | 21 +- .../ClinicalVisitFacadeEjb.java | 59 ++-- .../backend/common/AbstractBaseEjb.java | 41 ++- .../backend/common/AbstractCoreFacadeEjb.java | 2 +- .../sormas/backend/common/CronService.java | 9 +- .../sormas/backend/contact/Contact.java | 6 +- .../backend/contact/ContactFacadeEjb.java | 146 +++++----- .../ContactFollowUpDtoResultTransformer.java | 2 +- .../backend/contact/ContactService.java | 1 + .../ContactListEntryDtoResultTransformer.java | 13 +- .../CustomizableEnumFacadeEjb.java | 8 +- .../backend/document/DocumentFacadeEjb.java | 22 +- .../environment/EnvironmentFacadeEjb.java | 13 +- .../EnvironmentSampleFacadeEjb.java | 17 +- .../sormas/backend/event/EventFacadeEjb.java | 24 +- .../backend/event/EventParticipant.java | 11 +- .../event/EventParticipantFacadeEjb.java | 58 ++-- .../DirectoryImmunizationService.java | 17 +- .../immunization/ImmunizationFacadeEjb.java | 34 ++- .../immunization/ImmunizationService.java | 15 +- .../immunization/entity/Immunization.java | 3 +- .../importexport/DatabaseExportService.java | 2 + .../AbstractInfrastructureFacadeEjb.java | 4 +- .../ManualMessageLogFacadeEjb.java | 59 ++-- .../symeda/sormas/backend/person/Person.java | 3 +- .../backend/person/PersonFacadeEjb.java | 54 ++-- .../sample/AdditionalTestFacadeEjb.java | 11 +- .../backend/sample/PathogenTestFacadeEjb.java | 44 ++- .../symeda/sormas/backend/sample/Sample.java | 3 +- .../backend/sample/SampleFacadeEjb.java | 83 +++--- .../backend/sample/SamplePseudonymizer.java | 30 ++ .../sormas/backend/sample/SampleService.java | 61 +++-- .../share/ExternalShareInfoFacadeEjb.java | 9 +- .../entities/caze/CaseShareDataBuilder.java | 14 +- .../contact/ContactShareDataBuilder.java | 14 +- .../entities/event/EventShareDataBuilder.java | 14 +- .../EventParticipantShareDataBuilder.java | 17 +- .../ImmunizationShareDataBuilder.java | 8 +- .../sample/SampleShareDataBuilder.java | 28 +- .../SurveillanceReportShareDataBuilder.java | 8 +- .../share/ShareDataBuilder.java | 5 +- .../share/ShareDataBuilderHelper.java | 10 +- .../share/SormasToSormasPseudonymizer.java | 31 +++ .../outgoing/ShareRequestInfoFacadeEjb.java | 4 +- .../specialcaseaccess/SpecialCaseAccess.java | 88 ++++++ .../SpecialCaseAccessFacadeEjb.java | 127 +++++++++ .../SpecialCaseAccessService.java | 215 +++++++++++++++ .../de/symeda/sormas/backend/task/Task.java | 3 +- .../sormas/backend/task/TaskFacadeEjb.java | 121 ++++++--- .../task/TaskIndexDtoResultTransformer.java | 2 +- .../therapy/PrescriptionFacadeEjb.java | 34 +-- .../backend/therapy/TreatmentFacadeEjb.java | 37 +-- .../backend/travelentry/TravelEntry.java | 3 +- .../travelentry/TravelEntryFacadeEjb.java | 32 ++- .../services/BaseTravelEntryService.java | 12 + .../services/TravelEntryService.java | 1 - .../util/AssociableDtoPseudonymizer.java | 88 ++++++ .../sormas/backend/util/IterableHelper.java | 3 +- .../sormas/backend/util/Pseudonymizer.java | 121 +++++---- .../vaccination/VaccinationFacadeEjb.java | 33 ++- .../de/symeda/sormas/backend/visit/Visit.java | 3 +- .../sormas/backend/visit/VisitFacadeEjb.java | 42 +-- .../resources/META-INF/glassfish-ejb-jar.xml | 5 + .../main/resources/META-INF/persistence.xml | 1 + .../src/main/resources/sql/sormas_schema.sql | 35 +++ .../sormas/backend/AbstractBeanTest.java | 30 +- .../sormas/backend/ArchitectureTest.java | 8 +- .../sormas/backend/TestDataCreator.java | 13 + .../CaseFacadeEjbPseudonymizationTest.java | 41 ++- ...ceReportFacadeEjbPseudonymizationTest.java | 127 +++++++++ .../ContactFacadeEjbPseudonymizationTest.java | 36 ++- ...ticipantFacadeEjbPseudonymizationTest.java | 35 +++ .../ExternalEmailFacadeEjbTest.java | 2 +- ...nizationFacadeEjbPseudonymizationTest.java | 86 ++++++ .../ManualMessageLogFacadeEjbTest.java | 257 ++++++++++-------- .../PersonFacadeEjbPseudonymizationTest.java | 44 +++ ...ogenTestFacadeEjbPseudonymizationTest.java | 26 +- .../SampleFacadeEjbPseudonymizationTest.java | 14 + .../SpecialCaseAccessFacadeEjbTest.java | 82 ++++++ .../TaskFacadeEjbPseudonymizationTest.java | 15 + ...velEntryFacadeEjbPseudonymizationTest.java | 138 ++++++++-- ...cinationFacadeEjbPseudonymizationTest.java | 168 ++++++++++++ .../VisitFacadeEjbPseudonymizationTest.java | 22 ++ .../test/resources/META-INF/persistence.xml | 2 +- .../src/main/webapp/WEB-INF/glassfish-web.xml | 5 + sormas-rest/src/main/webapp/WEB-INF/web.xml | 4 + .../symeda/sormas/ui/ControllerProvider.java | 7 + .../symeda/sormas/ui/caze/CaseController.java | 2 +- .../symeda/sormas/ui/caze/CaseDataView.java | 10 +- .../de/symeda/sormas/ui/caze/CasesView.java | 11 + .../sormas/ui/contact/SourceContactList.java | 8 +- .../sormas/ui/exposure/ExposuresField.java | 7 +- .../SpecialCaseAccessController.java | 177 ++++++++++++ .../SpecialCaseAccessForm.java | 79 ++++++ .../SpecialCaseAccessSideComponent.java | 147 ++++++++++ .../utils/CommitDiscardWrapperComponent.java | 12 +- .../FieldAccessColumnStyleGenerator.java | 8 +- .../sormas/ui/utils/PastDateValidator.java | 43 +++ .../sidecomponent/SideComponent.java | 2 +- .../src/main/webapp/WEB-INF/glassfish-web.xml | 5 + sormas-ui/src/main/webapp/WEB-INF/web.xml | 4 + .../test/resources/META-INF/persistence.xml | 2 +- 188 files changed, 3977 insertions(+), 1186 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/caze/IsCase.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/contact/IsContact.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/event/IsEventParticipant.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/immunization/IsImmunization.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/person/IsPerson.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/sample/IsSample.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessDto.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessFacade.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/task/IsTask.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/travelentry/IsTravelEntry.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/visit/IsVisit.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SamplePseudonymizer.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/SormasToSormasPseudonymizer.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccess.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjb.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessService.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/util/AssociableDtoPseudonymizer.java create mode 100644 sormas-backend/src/test/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjbPseudonymizationTest.java create mode 100644 sormas-backend/src/test/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjbTest.java create mode 100644 sormas-backend/src/test/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjbPseudonymizationTest.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessController.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessForm.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessSideComponent.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PastDateValidator.java 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 a167261f297..585e8e039e6 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 @@ -97,6 +97,7 @@ import de.symeda.sormas.api.sormastosormas.share.incoming.SormasToSormasShareRequestFacade; import de.symeda.sormas.api.sormastosormas.share.outgoing.ShareRequestInfoFacade; import de.symeda.sormas.api.sormastosormas.share.outgoing.SormasToSormasShareInfoFacade; +import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessFacade; import de.symeda.sormas.api.symptoms.SymptomsFacade; import de.symeda.sormas.api.systemevents.SystemEventFacade; import de.symeda.sormas.api.systemevents.sync.SyncFacade; @@ -524,6 +525,10 @@ public static ManualMessageLogFacade getManualMessageLogFacade() { return get().lookupEjbRemote(ManualMessageLogFacade.class); } + public static SpecialCaseAccessFacade getSpecialCaseAccessFacade() { + return get().lookupEjbRemote(SpecialCaseAccessFacade.class); + } + @SuppressWarnings("unchecked") public

P lookupEjbRemote(Class

clazz) { try { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java index 71876a9bbaa..88f9e155ae6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java @@ -73,6 +73,7 @@ import de.symeda.sormas.api.utils.DependingOnUserRight; import de.symeda.sormas.api.utils.Diseases; import de.symeda.sormas.api.utils.EmbeddedPersonalData; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.FieldConstraints; import de.symeda.sormas.api.utils.HideForCountries; import de.symeda.sormas.api.utils.HideForCountriesExcept; @@ -85,7 +86,7 @@ import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.LongitudePseudonymizer; @DependingOnFeatureType(featureType = FeatureType.CASE_SURVEILANCE) -public class CaseDataDto extends SormasToSormasShareableDto { +public class CaseDataDto extends SormasToSormasShareableDto implements IsCase { private static final long serialVersionUID = 5007131477733638086L; private static final long MILLISECONDS_30_DAYS = 30L * 24L * 60L * 60L * 1000L; @@ -342,6 +343,8 @@ public class CaseDataDto extends SormasToSormasShareableDto { private String healthFacilityDetails; @Valid + @EmbeddedPersonalData + @EmbeddedSensitiveData private HealthConditionsDto healthConditions; private YesNoUnknown pregnant; @@ -408,6 +411,8 @@ public class CaseDataDto extends SormasToSormasShareableDto { @Valid private HospitalizationDto hospitalization; @Valid + @EmbeddedPersonalData + @EmbeddedSensitiveData private SymptomsDto symptoms; @Valid private EpiDataDto epiData; @@ -416,6 +421,8 @@ public class CaseDataDto extends SormasToSormasShareableDto { @Valid private ClinicalCourseDto clinicalCourse; @Valid + @EmbeddedPersonalData + @EmbeddedSensitiveData private MaternalHistoryDto maternalHistory; @Size(max = 32, message = Validations.textTooLong) private String creationVersion; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java index 3de0f6091ad..a07d45eefb0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java @@ -58,6 +58,7 @@ import de.symeda.sormas.api.user.UserRoleReferenceDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DependingOnUserRight; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.HideForCountries; import de.symeda.sormas.api.utils.HideForCountriesExcept; import de.symeda.sormas.api.utils.LocationHelper; @@ -80,7 +81,7 @@ * recommended to remove properties that are removed from this file from existing export configurations. */ @ExportEntity(CaseDataDto.class) -public class CaseExportDto extends AbstractUuidDto { +public class CaseExportDto extends AbstractUuidDto implements IsCase { private static final long serialVersionUID = 8581579464816945555L; @@ -140,6 +141,7 @@ public class CaseExportDto extends AbstractUuidDto { private YesNoUnknown pregnant; private String approximateAge; private String ageGroup; + @EmbeddedSensitiveData private BirthDateDto birthdate; private Date reportDate; private String region; @@ -191,6 +193,7 @@ public class CaseExportDto extends AbstractUuidDto { private String initialDetectionPlace; private PresentCondition presentCondition; private Date deathDate; + @EmbeddedSensitiveData private BurialInfoDto burialInfo; private String addressRegion; private String addressDistrict; @@ -241,6 +244,7 @@ public class CaseExportDto extends AbstractUuidDto { private boolean traveled; private boolean burialAttended; private YesNoUnknown contactWithSourceCaseKnown; + @EmbeddedSensitiveData private SymptomsDto symptoms; // private Date onsetDate; // private String symptoms; @@ -261,8 +265,11 @@ public class CaseExportDto extends AbstractUuidDto { private int numberOfPrescriptions; private int numberOfTreatments; private int numberOfClinicalVisits; + @EmbeddedSensitiveData private EmbeddedSampleExportDto sample1 = new EmbeddedSampleExportDto(null); + @EmbeddedSensitiveData private EmbeddedSampleExportDto sample2 = new EmbeddedSampleExportDto(null); + @EmbeddedSensitiveData private EmbeddedSampleExportDto sample3 = new EmbeddedSampleExportDto(null); private List otherSamples = new ArrayList<>(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFollowUpDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFollowUpDto.java index a1a03d8c5a6..6e9ff683b67 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFollowUpDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFollowUpDto.java @@ -23,7 +23,7 @@ import de.symeda.sormas.api.followup.FollowUpDto; import de.symeda.sormas.api.person.SymptomJournalStatus; -public class CaseFollowUpDto extends FollowUpDto { +public class CaseFollowUpDto extends FollowUpDto implements IsCase { private static final long serialVersionUID = -7782443664670559221L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java index e5dc8d51a45..201efadc2f9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java @@ -32,12 +32,13 @@ import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.person.SymptomJournalStatus; import de.symeda.sormas.api.share.ExternalShareStatus; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; 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 CaseIndexDto extends PseudonymizableIndexDto implements MergeableIndexDto, Serializable, Cloneable, HasUuid { +public class CaseIndexDto extends PseudonymizableIndexDto implements MergeableIndexDto, Serializable, Cloneable, HasUuid, IsCase { private static final long serialVersionUID = -7764607075875188799L; @@ -110,6 +111,7 @@ public class CaseIndexDto extends PseudonymizableIndexDto implements MergeableIn private String surveillanceOfficerUuid; private CaseOutcome outcome; private Sex sex; + @EmbeddedPersonalData private AgeAndBirthDateDto ageAndBirthDate; private Float completeness; private Date quarantineTo; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseListEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseListEntryDto.java index 01eec19f0a1..e5429da3827 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseListEntryDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseListEntryDto.java @@ -6,7 +6,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class CaseListEntryDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class CaseListEntryDto extends PseudonymizableIndexDto implements Serializable, Cloneable, IsCase { private static final long serialVersionUID = -8812926682263746469L; private Date reportDate; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseReferenceDto.java index 49911d0bc5e..67b2850d596 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseReferenceDto.java @@ -25,7 +25,7 @@ import de.symeda.sormas.api.utils.PersonalData; @DependingOnFeatureType(featureType = FeatureType.CASE_SURVEILANCE) -public class CaseReferenceDto extends ReferenceDto { +public class CaseReferenceDto extends ReferenceDto implements IsCase { private static final long serialVersionUID = 5007131477733638086L; @@ -82,4 +82,8 @@ public static String buildCaption(String uuid, String firstName, String lastName return shortUuid; } + + public String getName() { + return PersonDto.buildCaption(firstName, lastName); + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseSelectionDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseSelectionDto.java index 2aec58d423d..c17cb7a89b8 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseSelectionDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseSelectionDto.java @@ -5,12 +5,12 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.person.Sex; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -import org.apache.commons.lang3.StringUtils; -public class CaseSelectionDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class CaseSelectionDto extends PseudonymizableIndexDto implements Serializable, Cloneable, IsCase { public static final String I18N_PREFIX = "CaseData"; @@ -36,6 +36,7 @@ public class CaseSelectionDto extends PseudonymizableIndexDto implements Seriali @PersonalData @SensitiveData private String personLastName; + @EmbeddedPersonalData private AgeAndBirthDateDto ageAndBirthDate; private String responsibleDistrictName; @PersonalData diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/IsCase.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/IsCase.java new file mode 100644 index 00000000000..b4c0cbf6948 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/IsCase.java @@ -0,0 +1,21 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.caze; + +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsCase extends HasUuid { +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java index 7dd82286257..9e72adad3b9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java @@ -19,6 +19,8 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; @@ -26,7 +28,7 @@ import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.LongitudePseudonymizer; import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class MapCaseDto extends AbstractUuidDto { +public class MapCaseDto extends AbstractUuidDto implements IsCase { private static final long serialVersionUID = -3021332968056368431L; @@ -35,6 +37,8 @@ public class MapCaseDto extends AbstractUuidDto { private Date reportDate; private CaseClassification caseClassification; private Disease disease; + @EmbeddedPersonalData + @EmbeddedSensitiveData private PersonReferenceDto person; @PersonalData @SensitiveData diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/surveillancereport/SurveillanceReportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/surveillancereport/SurveillanceReportDto.java index 03072192325..50866405ae7 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/surveillancereport/SurveillanceReportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/surveillancereport/SurveillanceReportDto.java @@ -59,16 +59,6 @@ public class SurveillanceReportDto extends SormasToSormasShareableDto { private String externalId; - public static SurveillanceReportDto build(CaseReferenceDto caze, UserReferenceDto reportingUser) { - SurveillanceReportDto surveillanceReport = new SurveillanceReportDto(); - - surveillanceReport.setUuid(DataHelper.createUuid()); - surveillanceReport.setCaze(caze); - surveillanceReport.setReportingUser(reportingUser); - - return surveillanceReport; - } - @NotNull(message = Validations.validReportDateTime) private Date reportDate; @@ -92,6 +82,16 @@ public static SurveillanceReportDto build(CaseReferenceDto caze, UserReferenceDt private CaseReferenceDto caze; + public static SurveillanceReportDto build(CaseReferenceDto caze, UserReferenceDto reportingUser) { + SurveillanceReportDto surveillanceReport = new SurveillanceReportDto(); + + surveillanceReport.setUuid(DataHelper.createUuid()); + surveillanceReport.setCaze(caze); + surveillanceReport.setReportingUser(reportingUser); + + return surveillanceReport; + } + public ReportingType getReportingType() { return reportingType; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitDto.java index e23dd8c6b3f..7d83ce93e42 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitDto.java @@ -11,6 +11,7 @@ import de.symeda.sormas.api.symptoms.SymptomsDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DependingOnFeatureType; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.FieldConstraints; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto; @@ -33,6 +34,7 @@ public class ClinicalVisitDto extends PseudonymizableDto { private ClinicalCourseReferenceDto clinicalCourse; @Valid + @EmbeddedSensitiveData private SymptomsDto symptoms; private Disease disease; private Date visitDateTime; 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 177fd1c7c26..84db7e542af 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 @@ -3,6 +3,7 @@ import java.io.Serializable; import de.symeda.sormas.api.audit.AuditedClass; +import de.symeda.sormas.api.uuid.HasUuid; @AuditedClass public class ProcessedEntity implements Serializable { @@ -11,6 +12,14 @@ public class ProcessedEntity implements Serializable { ProcessedEntityStatus processedEntityStatus; + public static ProcessedEntity successful(HasUuid entity) { + return new ProcessedEntity(entity.getUuid(), ProcessedEntityStatus.SUCCESS); + } + + public static ProcessedEntity failedInternally(HasUuid entity) { + return new ProcessedEntity(entity.getUuid(), ProcessedEntityStatus.INTERNAL_FAILURE); + } + public ProcessedEntity(String entityUuid, ProcessedEntityStatus processedEntityStatus) { this.entityUuid = entityUuid; this.processedEntityStatus = processedEntityStatus; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java index b64d937c550..815bd1b4d00 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java @@ -61,7 +61,7 @@ import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.LongitudePseudonymizer; @DependingOnFeatureType(featureType = FeatureType.CONTACT_TRACING) -public class ContactDto extends SormasToSormasShareableDto { +public class ContactDto extends SormasToSormasShareableDto implements IsContact { private static final long serialVersionUID = -7764607075875188799L; @@ -149,6 +149,7 @@ public class ContactDto extends SormasToSormasShareableDto { public static final String DELETION_REASON = "deletionReason"; public static final String OTHER_DELETION_REASON = "otherDeletionReason"; + @EmbeddedPersonalData private CaseReferenceDto caze; @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) private String caseIdExternalSystem; @@ -254,6 +255,7 @@ public class ContactDto extends SormasToSormasShareableDto { @SensitiveData private UserReferenceDto contactOfficer; + @EmbeddedPersonalData private CaseReferenceDto resultingCase; // read-only now, but editable long-term @SensitiveData private UserReferenceDto resultingCaseUser; @@ -611,12 +613,7 @@ public void setReportLatLonAccuracy(Float reportLatLonAccuracy) { } public ContactReferenceDto toReference() { - return new ContactReferenceDto( - getUuid(), - getPerson().getFirstName(), - getPerson().getLastName(), - getCaze() != null ? getCaze().getFirstName() : null, - getCaze() != null ? getCaze().getLastName() : null); + return new ContactReferenceDto(getUuid(), getPerson().getFirstName(), getPerson().getLastName(), getCaze()); } public UserReferenceDto getResultingCaseUser() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java index 60967b9db47..ac35843465b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java @@ -25,6 +25,8 @@ import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseExportType; +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; import de.symeda.sormas.api.caze.VaccinationInfoSource; import de.symeda.sormas.api.caze.VaccinationStatus; import de.symeda.sormas.api.caze.Vaccine; @@ -49,6 +51,7 @@ import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.person.SymptomJournalStatus; import de.symeda.sormas.api.user.UserRoleReferenceDto; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.HideForCountriesExcept; import de.symeda.sormas.api.utils.Order; import de.symeda.sormas.api.utils.PersonalData; @@ -60,7 +63,7 @@ import de.symeda.sormas.api.vaccination.VaccinationDto; @ExportEntity(ContactDto.class) -public class ContactExportDto extends AbstractUuidDto { +public class ContactExportDto extends AbstractUuidDto implements IsContact { private static final long serialVersionUID = 2054231712903661096L; @@ -102,6 +105,7 @@ public class ContactExportDto extends AbstractUuidDto { @SensitiveData private String otherSalutation; private Sex sex; + @EmbeddedPersonalData private BirthDateDto birthdate; private String approximateAge; private Date reportDate; @@ -1474,4 +1478,9 @@ public void setPreviousQuarantineTo(Date previousQuarantineTo) { public void setQuarantineChangeComment(String quarantineChangeComment) { this.quarantineChangeComment = quarantineChangeComment; } + + @Override + public IsCase getCaze() { + return new CaseReferenceDto(sourceCaseUuid); + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFollowUpDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFollowUpDto.java index 32fe0e96b57..53926d88d15 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFollowUpDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFollowUpDto.java @@ -3,12 +3,14 @@ import java.util.Date; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; import de.symeda.sormas.api.followup.FollowUpDto; import de.symeda.sormas.api.person.SymptomJournalStatus; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.SensitiveData; -public class ContactFollowUpDto extends FollowUpDto { +public class ContactFollowUpDto extends FollowUpDto implements IsContact { private static final long serialVersionUID = -1257025719012862417L; @@ -17,6 +19,7 @@ public class ContactFollowUpDto extends FollowUpDto { public static final String CONTACT_OFFICER = "contactOfficer"; public static final String LAST_CONTACT_DATE = "lastContactDate"; + private String caseUuid; @SensitiveData private UserReferenceDto contactOfficer; private Date lastContactDate; @@ -25,13 +28,14 @@ public class ContactFollowUpDto extends FollowUpDto { private SymptomJournalStatus symptomJournalStatus; //@formatter:off - public ContactFollowUpDto(String uuid, Date changeDate, String personFirstName, String personLastName, + public ContactFollowUpDto(String uuid, String caseUuid, Date changeDate, String personFirstName, String personLastName, String contactOfficerUuid, String contactOfficerFirstName, String contactOfficerLastName, Date lastContactDate, Date reportDate, Date followUpUntil, SymptomJournalStatus symptomJournalStatus, Disease disease, boolean isInJurisdiction) { //formatter:on super(uuid, personFirstName, personLastName, reportDate, followUpUntil, disease); + this.caseUuid = caseUuid; this.contactOfficer = new UserReferenceDto(contactOfficerUuid, contactOfficerFirstName, contactOfficerLastName); this.lastContactDate = lastContactDate; this.symptomJournalStatus = symptomJournalStatus; @@ -65,4 +69,9 @@ public SymptomJournalStatus getSymptomJournalStatus() { public void setSymptomJournalStatus(SymptomJournalStatus symptomJournalStatus) { this.symptomJournalStatus = symptomJournalStatus; } + + @Override + public IsCase getCaze() { + return new CaseReferenceDto(caseUuid); + } } 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 a12aabe6e52..a33e8987936 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 @@ -30,7 +30,7 @@ import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; import de.symeda.sormas.api.uuid.HasUuid; -public class ContactIndexDto extends PseudonymizableIndexDto implements HasUuid, Serializable, Cloneable { +public class ContactIndexDto extends PseudonymizableIndexDto implements IsContact, HasUuid, Serializable, Cloneable { private static final long serialVersionUID = 7511900591141885152L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactListEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactListEntryDto.java index 345ed54142c..dc43aa3b9e4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactListEntryDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactListEntryDto.java @@ -4,11 +4,14 @@ import java.util.Date; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class ContactListEntryDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class ContactListEntryDto extends PseudonymizableIndexDto implements IsContact, Serializable, Cloneable { private static final long serialVersionUID = -3753167578595277556L; + private String caseUuid; private ContactStatus contactStatus; private Disease disease; private ContactClassification contactClassification; @@ -20,6 +23,7 @@ public class ContactListEntryDto extends PseudonymizableIndexDto implements Seri public ContactListEntryDto( String uuid, + String caseUuid, ContactStatus contactStatus, Disease disease, ContactClassification contactClassification, @@ -28,6 +32,7 @@ public ContactListEntryDto( Date lastContactDate, boolean isInJurisdiction) { super(uuid); + this.caseUuid = caseUuid; this.contactStatus = contactStatus; this.disease = disease; this.contactClassification = contactClassification; @@ -94,4 +99,9 @@ public boolean isInJurisdiction() { public void setInJurisdiction(boolean inJurisdiction) { isInJurisdiction = inJurisdiction; } + + @Override + public IsCase getCaze() { + return new CaseReferenceDto(caseUuid); + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactReferenceDto.java index e16b9fea9db..1063fab0087 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactReferenceDto.java @@ -22,28 +22,26 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DependingOnFeatureType; import de.symeda.sormas.api.utils.EmbeddedPersonalData; -import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.HasCaption; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; @DependingOnFeatureType(featureType = FeatureType.CONTACT_TRACING) -public class ContactReferenceDto extends ReferenceDto { +public class ContactReferenceDto extends ReferenceDto implements IsContact { private static final long serialVersionUID = -7764607075875188799L; @EmbeddedPersonalData - @EmbeddedSensitiveData private PersonName contactName; @EmbeddedPersonalData - @EmbeddedSensitiveData - private PersonName caseName; + private CaseReferenceDto caze; public ContactReferenceDto() { @@ -53,14 +51,11 @@ public ContactReferenceDto(String uuid) { setUuid(uuid); } - public ContactReferenceDto(String uuid, String contactFirstName, String contactLastName, String caseFirstName, String caseLastName) { + public ContactReferenceDto(String uuid, String contactFirstName, String contactLastName, CaseReferenceDto caze) { setUuid(uuid); this.contactName = new PersonName(contactFirstName, contactLastName); - - if (caseFirstName != null && caseLastName != null) { - this.caseName = new PersonName(caseFirstName, caseLastName); - } + this.caze = caze; } @Override @@ -68,8 +63,8 @@ public String getCaption() { return buildCaption( contactName.firstName, contactName.lastName, - caseName != null ? caseName.firstName : null, - caseName != null ? caseName.lastName : null, + caze != null ? caze.getFirstName() : null, + caze != null ? caze.getLastName() : null, getUuid(), true); } @@ -79,8 +74,8 @@ public String getCaptionAlwaysWithUuid() { return buildCaption( contactName.firstName, contactName.lastName, - caseName != null ? caseName.firstName : null, - caseName != null ? caseName.lastName : null, + caze != null ? caze.getFirstName() : null, + caze != null ? caze.getLastName() : null, getUuid(), true); } @@ -89,8 +84,8 @@ public PersonName getContactName() { return contactName; } - public PersonName getCaseName() { - return caseName; + public CaseReferenceDto getCaze() { + return caze; } public static String buildCaption( @@ -163,11 +158,7 @@ public String buildCaption() { } } - public void setContactName(PersonName contactName) { - this.contactName = contactName; - } - - public void setCaseName(PersonName caseName) { - this.caseName = caseName; + public static CaseReferenceDto getCazeNullable(ContactReferenceDto contactReference) { + return contactReference != null ? contactReference.getCaze() : null; } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/IsContact.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/IsContact.java new file mode 100644 index 00000000000..b7d479619f4 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/IsContact.java @@ -0,0 +1,24 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.contact; + +import de.symeda.sormas.api.caze.IsCase; +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsContact extends HasUuid { + + IsCase getCaze(); +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/MergeContactIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/MergeContactIndexDto.java index 928815a8331..f6e717be139 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/MergeContactIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/MergeContactIndexDto.java @@ -24,10 +24,11 @@ import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.person.ApproximateAgeType; import de.symeda.sormas.api.person.Sex; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class MergeContactIndexDto extends PseudonymizableIndexDto implements MergeableIndexDto, Serializable, Cloneable { +public class MergeContactIndexDto extends PseudonymizableIndexDto implements IsContact, MergeableIndexDto, Serializable, Cloneable { private static final long serialVersionUID = 7147772346906228533L; @@ -55,8 +56,10 @@ public class MergeContactIndexDto extends PseudonymizableIndexDto implements Mer private String firstName; @PersonalData private String lastName; + @EmbeddedPersonalData private AgeAndBirthDateDto ageAndBirthDate; private Sex sex; + @EmbeddedPersonalData private CaseReferenceDto caze; private Disease disease; private String diseaseDetails; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/SimilarContactDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/SimilarContactDto.java index 0a1691ba8f5..9fb241f00e0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/SimilarContactDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/SimilarContactDto.java @@ -4,10 +4,11 @@ import java.util.Date; import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class SimilarContactDto extends PseudonymizableIndexDto implements Serializable { +public class SimilarContactDto extends PseudonymizableIndexDto implements IsContact, Serializable { private static final long serialVersionUID = -7290520732250426907L; @@ -28,6 +29,7 @@ public class SimilarContactDto extends PseudonymizableIndexDto implements Serial private String firstName; @PersonalData private String lastName; + @EmbeddedPersonalData private CaseReferenceDto caze; private String caseIdExternalSystem; private Date lastContactDate; @@ -140,6 +142,6 @@ public Boolean getCaseInJurisdiction() { } public ContactReferenceDto toReference() { - return new ContactReferenceDto(getUuid(), getFirstName(), getLastName(), null, null); + return new ContactReferenceDto(getUuid(), getFirstName(), getLastName(), getCaze()); } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantDto.java index 4d87fc23473..4fce9e173a9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantDto.java @@ -38,7 +38,7 @@ import de.symeda.sormas.api.utils.SensitiveData; @DependingOnFeatureType(featureType = FeatureType.EVENT_SURVEILLANCE) -public class EventParticipantDto extends SormasToSormasShareableDto { +public class EventParticipantDto extends SormasToSormasShareableDto implements IsEventParticipant { private static final long serialVersionUID = -8725734604520880084L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantExportDto.java index 16a2bea8deb..f000adb090b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantExportDto.java @@ -47,6 +47,8 @@ import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.person.Salutation; import de.symeda.sormas.api.person.Sex; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.HideForCountries; import de.symeda.sormas.api.utils.HideForCountriesExcept; import de.symeda.sormas.api.utils.Order; @@ -54,10 +56,11 @@ import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.PostalCodePseudonymizer; +import de.symeda.sormas.api.uuid.AbstractUuidDto; import de.symeda.sormas.api.vaccination.VaccinationDto; @ExportEntity(EventParticipantDto.class) -public class EventParticipantExportDto implements Serializable { +public class EventParticipantExportDto extends AbstractUuidDto implements IsEventParticipant, Serializable { public static final String I18N_PREFIX = "EventParticipantExport"; @@ -117,11 +120,14 @@ public class EventParticipantExportDto implements Serializable { private Sex sex; private String approximateAge; private String ageGroup; + @EmbeddedPersonalData private BirthDateDto birthdate; + @SensitiveData private String nationalHealthId; private PresentCondition presentCondition; private Date deathDate; + @EmbeddedSensitiveData private BurialInfoDto burialInfo; private String addressRegion; private String addressDistrict; @@ -178,8 +184,7 @@ public class EventParticipantExportDto implements Serializable { private long contactCount; //@formatter:off - public EventParticipantExportDto(long id, long personId, String personUuid, String eventParticipantUuid, String nationalHealthId, long personAddressId, boolean isInJurisdiction, String eventUuid, Date eventReportDateTime, - + public EventParticipantExportDto(long id, String uuid, long personId, String personUuid, String eventParticipantUuid, String nationalHealthId, long personAddressId, boolean isInJurisdiction, String eventUuid, Date eventReportDateTime, EventStatus eventStatus, EventInvestigationStatus eventInvestigationStatus, Disease eventDisease, TypeOfPlace typeOfPlace, Date eventStartDate, Date eventEndDate, String eventTitle, String eventDesc, String eventRegion, String eventDistrict, String eventCommunity, String eventCity, String eventStreet, String eventHouseNumber, String firstName, String lastName, Salutation salutation, String otherSalutation, Sex sex, String involvmentDescription, Integer approximateAge, ApproximateAgeType approximateAgeType, @@ -190,7 +195,7 @@ public EventParticipantExportDto(long id, long personId, String personUuid, Stri VaccinationStatus vaccinationStatus ) { //@formatter:on - + super(uuid); this.id = id; this.personId = personId; this.personUuid = personUuid; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantIndexDto.java index 387af8c24ca..dadf01c4c91 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantIndexDto.java @@ -11,7 +11,7 @@ import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class EventParticipantIndexDto extends PseudonymizableIndexDto implements Serializable { +public class EventParticipantIndexDto extends PseudonymizableIndexDto implements IsEventParticipant, Serializable { private static final long serialVersionUID = 1136399297437006739L; @@ -35,6 +35,7 @@ public class EventParticipantIndexDto extends PseudonymizableIndexDto implements @PersonalData @SensitiveData private String firstName; + @PersonalData @SensitiveData private String lastName; private Sex sex; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantListEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantListEntryDto.java index ecfd8c0ba62..ac8cbc47c9e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantListEntryDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventParticipantListEntryDto.java @@ -6,7 +6,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class EventParticipantListEntryDto extends PseudonymizableIndexDto implements Serializable { +public class EventParticipantListEntryDto extends PseudonymizableIndexDto implements IsEventParticipant, Serializable { private static final long serialVersionUID = 725252055850399647L; private String eventUuid; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/IsEventParticipant.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/IsEventParticipant.java new file mode 100644 index 00000000000..ce8dbae1b4a --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/IsEventParticipant.java @@ -0,0 +1,21 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.event; + +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsEventParticipant extends HasUuid { +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/SimilarEventParticipantDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/SimilarEventParticipantDto.java index cd15c75a22d..d3af92b8f45 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/SimilarEventParticipantDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/SimilarEventParticipantDto.java @@ -7,7 +7,7 @@ import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class SimilarEventParticipantDto extends PseudonymizableIndexDto implements Serializable { +public class SimilarEventParticipantDto extends PseudonymizableIndexDto implements IsEventParticipant, Serializable { public static final String I18N_PREFIX = "EventParticipant"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java index c20fe705858..d548d0a0d27 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java @@ -34,6 +34,8 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DependingOnFeatureType; import de.symeda.sormas.api.utils.Diseases; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.FieldConstraints; import de.symeda.sormas.api.utils.HideForCountriesExcept; import de.symeda.sormas.api.utils.PersonalData; @@ -119,6 +121,8 @@ public class ExposureDto extends PseudonymizableDto { @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) private String exposureTypeDetails; @Valid + @EmbeddedPersonalData + @EmbeddedSensitiveData private LocationDto location; private ExposureRole exposureRole; 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 e0e4b43b790..d58e4606dad 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 @@ -208,6 +208,9 @@ public interface Captions { String areaAllAreas = "areaAllAreas"; String areaArchivedAreas = "areaArchivedAreas"; String assign = "assign"; + String assignedBy = "assignedBy"; + String assignedTo = "assignedTo"; + String assignmentDate = "assignmentDate"; String assignToMe = "assignToMe"; String BAGExport = "BAGExport"; String bulkActionCreatDocuments = "bulkActionCreatDocuments"; @@ -235,6 +238,7 @@ public interface Captions { String bulkLostToFollowUp = "bulkLostToFollowUp"; String bulkRestore = "bulkRestore"; String bulkSkipped = "bulkSkipped"; + String bulkSpecialCaseAccess = "bulkSpecialCaseAccess"; String bulkSuccessful = "bulkSuccessful"; String bulkSurveillanceOfficer = "bulkSurveillanceOfficer"; String bulkTaskAssignee = "bulkTaskAssignee"; @@ -588,6 +592,7 @@ public interface Captions { String caseSelect = "caseSelect"; String caseTransferCase = "caseTransferCase"; String caseTransferCases = "caseTransferCases"; + String caze = "caze"; String changeDate = "changeDate"; String changeUserEmail = "changeUserEmail"; String city = "city"; @@ -1066,6 +1071,7 @@ public interface Captions { String DocumentTemplate_uploadWorkflowTemplate = "DocumentTemplate.uploadWorkflowTemplate"; String documentUploadDocument = "documentUploadDocument"; String edit = "edit"; + String endDateTime = "endDateTime"; String endOfProcessingDate = "endOfProcessingDate"; String Environment = "Environment"; String Environment_description = "Environment.description"; @@ -2216,6 +2222,9 @@ public interface Captions { String SormasToSormasShareRequestIndex_organizationName = "SormasToSormasShareRequestIndex.organizationName"; String SormasToSormasShareRequestIndex_uuid = "SormasToSormasShareRequestIndex.uuid"; String sormasToSormasSync = "sormasToSormasSync"; + String specailCaseAccessNoAccessGranted = "specailCaseAccessNoAccessGranted"; + String SpecialCaseAccess = "SpecialCaseAccess"; + String specialCaseAccessNew = "specialCaseAccessNew"; String statisticsAddFilter = "statisticsAddFilter"; String statisticsAttribute = "statisticsAttribute"; String statisticsAttributeSelect = "statisticsAttributeSelect"; 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 7d121d6cc22..c62edd53e23 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 @@ -89,6 +89,7 @@ public interface Strings { String confirmationArchiveTask = "confirmationArchiveTask"; String confirmationArchiveTasks = "confirmationArchiveTasks"; String confirmationArchiveTravelEntry = "confirmationArchiveTravelEntry"; + String confirmationBulkGrantSpecialAccess = "confirmationBulkGrantSpecialAccess"; String confirmationCancelBulkAction = "confirmationCancelBulkAction"; String confirmationCancelExternalFollowUpPopup = "confirmationCancelExternalFollowUpPopup"; String confirmationCancelFollowUp = "confirmationCancelFollowUp"; @@ -417,6 +418,8 @@ public interface Strings { String headingArchiveTravelEntry = "headingArchiveTravelEntry"; String headingAutomaticDeletionStarted = "headingAutomaticDeletionStarted"; String headingBulkOperationProgress = "headingBulkOperationProgress"; + String headingBulkSpecialCaseAccessNoneProcessed = "headingBulkSpecialCaseAccessNoneProcessed"; + String headingBulkSpecialCaseAccessSomeNotProcessed = "headingBulkSpecialCaseAccessSomeNotProcessed"; String headingBurialDetails = "headingBurialDetails"; String headingCampaignBasics = "headingCampaignBasics"; String headingCampaignDashboard = "headingCampaignDashboard"; @@ -451,6 +454,7 @@ public interface Strings { String headingCompleteness = "headingCompleteness"; String headingComplications = "headingComplications"; String headingConfirmArchiving = "headingConfirmArchiving"; + String headingConfirmBulkGrantSpecialAccess = "headingConfirmBulkGrantSpecialAccess"; String headingConfirmChoice = "headingConfirmChoice"; String headingConfirmDearchiving = "headingConfirmDearchiving"; String headingConfirmDeletion = "headingConfirmDeletion"; @@ -512,6 +516,7 @@ public interface Strings { String headingCreateNewUserRole = "headingCreateNewUserRole"; String headingCreateNewVisit = "headingCreateNewVisit"; String headingCreatePathogenTestResult = "headingCreatePathogenTestResult"; + String headingCreateSpecailCaseAccess = "headingCreateSpecailCaseAccess"; String headingCreateSurveillanceReport = "headingCreateSurveillanceReport"; String headingCurrentHospitalization = "headingCurrentHospitalization"; String headingCustomizableEnumConfigurationInfo = "headingCustomizableEnumConfigurationInfo"; @@ -556,6 +561,7 @@ public interface Strings { String headingEditPathogenTestResult = "headingEditPathogenTestResult"; String headingEditPrescription = "headingEditPrescription"; String headingEditSample = "headingEditSample"; + String headingEditSpecailCaseAccess = "headingEditSpecailCaseAccess"; String headingEditSubcontinent = "headingEditSubcontinent"; String headingEditSurveillanceReport = "headingEditSurveillanceReport"; String headingEditTask = "headingEditTask"; @@ -792,6 +798,7 @@ public interface Strings { String headingSormasToSormasCantShareContactWithoutCase = "headingSormasToSormasCantShareContactWithoutCase"; String headingSormasToSormasDuplicateDetection = "headingSormasToSormasDuplicateDetection"; String headingSormasToSormasShareRequestNotFound = "headingSormasToSormasShareRequestNotFound"; + String headingSpecailCaseAccess = "headingSpecailCaseAccess"; String headingStoppedFollowUp = "headingStoppedFollowUp"; String headingSurveillanceReports = "headingSurveillanceReports"; String headingSymptomJournalAccountCreation = "headingSymptomJournalAccountCreation"; @@ -1091,6 +1098,7 @@ public interface Strings { String messageBulkContactsWithDifferentDiseasesSelected = "messageBulkContactsWithDifferentDiseasesSelected"; String messageBulkDontShareWithReportingToolWarning = "messageBulkDontShareWithReportingToolWarning"; String messageBulkLinkEventHint = "messageBulkLinkEventHint"; + String messageBulkSpecialCaseAccessAllProcessed = "messageBulkSpecialCaseAccessAllProcessed"; String messageCampaignArchived = "messageCampaignArchived"; String messageCampaignCreated = "messageCampaignCreated"; String messageCampaignDearchived = "messageCampaignDearchived"; @@ -1160,6 +1168,7 @@ public interface Strings { String messageConvertEventParticipantToCaseDifferentDiseases = "messageConvertEventParticipantToCaseDifferentDiseases"; String messageConvertEventParticipantToCaseNoDisease = "messageConvertEventParticipantToCaseNoDisease"; String messageCopyPassword = "messageCopyPassword"; + String messageCountAccessesNotGrantedDueToError = "messageCountAccessesNotGrantedDueToError"; String messageCountCasesAlreadyInEvent = "messageCountCasesAlreadyInEvent"; String messageCountCasesNotArchivedExternalReason = "messageCountCasesNotArchivedExternalReason"; String messageCountCasesNotDearchivedExternalReason = "messageCountCasesNotDearchivedExternalReason"; 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 29d9dfc8231..8478da71353 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 @@ -184,6 +184,7 @@ public interface Validations { String onlyGeoCoordinatesAllowed = "onlyGeoCoordinatesAllowed"; String onlyIntegerNumbersAllowed = "onlyIntegerNumbersAllowed"; String onlyNumbersAllowed = "onlyNumbersAllowed"; + String pastDate = "pastDate"; String patchNoSuchFieldException = "patchNoSuchFieldException"; String patchUnsupportedCollectionFieldType = "patchUnsupportedCollectionFieldType"; String patchWrongUuid = "patchWrongUuid"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationDto.java index ee453454efa..132c1a2bbc9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationDto.java @@ -50,7 +50,7 @@ import de.symeda.sormas.api.vaccination.VaccinationDto; @DependingOnFeatureType(featureType = FeatureType.IMMUNIZATION_MANAGEMENT) -public class ImmunizationDto extends SormasToSormasShareableDto { +public class ImmunizationDto extends SormasToSormasShareableDto implements IsImmunization { private static final long serialVersionUID = -6538566879882613529L; @@ -109,12 +109,11 @@ public class ImmunizationDto extends SormasToSormasShareableDto { @NotNull(message = Validations.requiredField) private MeansOfImmunization meansOfImmunization; @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) - @SensitiveData(mandatoryField = true) + @SensitiveData private String meansOfImmunizationDetails; private ImmunizationManagementStatus immunizationManagementStatus; @S2SIgnoreProperty(configProperty = SormasToSormasConfig.SORMAS2SORMAS_IGNORE_EXTERNAL_ID) @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong) - @SensitiveData(mandatoryField = true) private String externalId; @NotNull(message = Validations.validResponsibleRegion) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationIndexDto.java index c4cd33c703a..251d47a5cb4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationIndexDto.java @@ -22,11 +22,12 @@ import de.symeda.sormas.api.caze.AgeAndBirthDateDto; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.person.Sex; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class ImmunizationIndexDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class ImmunizationIndexDto extends PseudonymizableIndexDto implements IsImmunization, Serializable, Cloneable { public static final String I18N_PREFIX = "Immunization"; @@ -55,6 +56,7 @@ public class ImmunizationIndexDto extends PseudonymizableIndexDto implements Ser @SensitiveData private String personLastName; private Disease disease; + @EmbeddedPersonalData private AgeAndBirthDateDto ageAndBirthDate; private Sex sex; private String district; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationListEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationListEntryDto.java index 71936b6f36b..a599e48b831 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationListEntryDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationListEntryDto.java @@ -6,7 +6,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class ImmunizationListEntryDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class ImmunizationListEntryDto extends PseudonymizableIndexDto implements IsImmunization, Serializable, Cloneable { public static final String I18N_PREFIX = "Immunization"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationReferenceDto.java index 9e47ea1325c..e238deac234 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/ImmunizationReferenceDto.java @@ -20,7 +20,7 @@ import de.symeda.sormas.api.utils.DependingOnFeatureType; @DependingOnFeatureType(featureType = FeatureType.IMMUNIZATION_MANAGEMENT) -public class ImmunizationReferenceDto extends ReferenceDto { +public class ImmunizationReferenceDto extends ReferenceDto implements IsImmunization { private String externalId; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/immunization/IsImmunization.java b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/IsImmunization.java new file mode 100644 index 00000000000..eac200654d8 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/immunization/IsImmunization.java @@ -0,0 +1,24 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.immunization; + +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsImmunization extends HasUuid { +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java index 6faf5ebd93d..b36c723e07a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java @@ -39,6 +39,7 @@ public enum DatabaseTable { PORT_HEALTH_INFO(DatabaseTableType.SORMAS, CASES, "port_health_info"), MATERNAL_HISTORIES(DatabaseTableType.SORMAS, CASES, "maternal_histories"), SURVEILLANCE_REPORTS(DatabaseTableType.SORMAS, CASES, "surveillance_reports", dependingOnFeature(FeatureType.SURVEILLANCE_REPORTS)), + SPECIAL_CASE_ACCESSES(DatabaseTableType.SORMAS, CASES, "special_case_accesses"), EPIDATA(DatabaseTableType.SORMAS, "epidemiological_data", dependingOnFeature(FeatureType.CASE_SURVEILANCE, FeatureType.CONTACT_TRACING)), EXPOSURES(DatabaseTableType.SORMAS, EPIDATA, "exposures"), diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/IsPerson.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/IsPerson.java new file mode 100644 index 00000000000..10ace3fa818 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/IsPerson.java @@ -0,0 +1,21 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.person; + +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsPerson extends HasUuid { +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java index 062ab1b1ae4..27363cfeeed 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java @@ -62,7 +62,7 @@ FeatureType.CASE_SURVEILANCE, FeatureType.CONTACT_TRACING, FeatureType.EVENT_SURVEILLANCE }) -public class PersonDto extends PseudonymizableDto { +public class PersonDto extends PseudonymizableDto implements IsPerson { public static final long APPROXIMATE_JSON_SIZE_IN_BYTES = 42953; @@ -352,7 +352,6 @@ public class PersonDto extends PseudonymizableDto { private boolean covidCodeDelivered; private SymptomJournalStatus symptomJournalStatus; - @SensitiveData @HideForCountriesExcept(countries = CountryHelper.COUNTRY_CODE_GERMANY) @S2SIgnoreProperty(configProperty = SormasToSormasConfig.SORMAS2SORMAS_IGNORE_EXTERNAL_ID) @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java index 92860594d84..7fd3b5506c3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java @@ -25,6 +25,7 @@ import de.symeda.sormas.api.importexport.ExportGroupType; import de.symeda.sormas.api.importexport.ExportProperty; import de.symeda.sormas.api.location.LocationDto; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.HideForCountries; import de.symeda.sormas.api.utils.HideForCountriesExcept; import de.symeda.sormas.api.utils.Order; @@ -35,7 +36,7 @@ import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.PostalCodePseudonymizer; import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class PersonExportDto extends AbstractUuidDto { +public class PersonExportDto extends AbstractUuidDto implements IsPerson { private static final long serialVersionUID = -6902138630884671263L; @@ -56,6 +57,7 @@ public class PersonExportDto extends AbstractUuidDto { @SensitiveData private String otherSalutation; private Sex sex; + @EmbeddedPersonalData private BirthDateDto birthdate; private String approximateAge; private String ageGroup; @@ -141,7 +143,6 @@ public class PersonExportDto extends AbstractUuidDto { private boolean covidCodeDelivered; private SymptomJournalStatus symptomJournalStatus; - @SensitiveData private String externalId; private String externalToken; private String internalToken; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonIndexDto.java index 2adea1dff04..3e7d73e9c6d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonIndexDto.java @@ -4,15 +4,14 @@ import java.util.Date; import de.symeda.sormas.api.caze.AgeAndBirthDateDto; -import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; 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.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.PostalCodePseudonymizer; -import org.apache.commons.lang3.StringUtils; -public class PersonIndexDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class PersonIndexDto extends PseudonymizableIndexDto implements IsPerson, Serializable, Cloneable { public static final String I18N_PREFIX = "Person"; @@ -35,6 +34,7 @@ public class PersonIndexDto extends PseudonymizableIndexDto implements Serializa @PersonalData @SensitiveData private String lastName; + @EmbeddedPersonalData private AgeAndBirthDateDto ageAndBirthDate; private Sex sex; private String district; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/IsSample.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/IsSample.java new file mode 100644 index 00000000000..f6fd5454f26 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/IsSample.java @@ -0,0 +1,24 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.sample; + +import de.symeda.sormas.api.caze.IsCase; +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsSample extends HasUuid { + + IsCase getAssociatedCase(); +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleDto.java index 7e7af1539e3..cd7b5c8ae78 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleDto.java @@ -38,7 +38,7 @@ import de.symeda.sormas.api.utils.SensitiveData; @DependingOnFeatureType(featureType = FeatureType.SAMPLES_LAB) -public class SampleDto extends SormasToSormasShareableDto { +public class SampleDto extends SormasToSormasShareableDto implements IsSample { private static final long serialVersionUID = -6975445672442728938L; @@ -525,7 +525,12 @@ public void setReportLatLonAccuracy(Float reportLatLonAccuracy) { } public SampleReferenceDto toReference() { - return new SampleReferenceDto(getUuid()); + return new SampleReferenceDto( + getUuid(), + sampleMaterial, + associatedCase != null ? associatedCase.getUuid() : null, + associatedContact != null ? associatedContact.getUuid() : null, + associatedEventParticipant != null ? associatedEventParticipant.getUuid() : null); } @Override diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java index b6ce974e43f..3cb63e9bc5d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java @@ -29,6 +29,7 @@ import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; import de.symeda.sormas.api.contact.ContactClassification; import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.contact.ContactStatus; @@ -48,7 +49,7 @@ import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.EmptyValuePseudonymizer; import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class SampleExportDto extends AbstractUuidDto { +public class SampleExportDto extends AbstractUuidDto implements IsSample { private static final long serialVersionUID = -3027326087594387560L; @@ -178,7 +179,7 @@ public SampleExportDto(long id, String uuid, String labSampleId, Date sampleRepo caseFacilityDetails); } if (contactUuid != null) { - this.associatedContact = new ContactReferenceDto(contactUuid, contactPersonFirstName, contactPersonLastName, null, null); + this.associatedContact = new ContactReferenceDto(contactUuid, contactPersonFirstName, contactPersonLastName, null); this.contactRegion = contactRegion; this.contactDistrict = contactDistrict; this.contactCommunity = contactCommunity; @@ -876,6 +877,11 @@ public SampleJurisdictionFlagsDto getSampleJurisdictionFlagsDto() { return sampleJurisdictionFlagsDto; } + @Override + public IsCase getAssociatedCase() { + return new CaseReferenceDto(caseUuid); + } + public static class SampleExportMaterial implements Serializable { private SampleMaterial sampleMaterial; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleIndexDto.java index 17eb345be88..7a62a319ea0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleIndexDto.java @@ -34,7 +34,7 @@ import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.EmptyValuePseudonymizer; -public class SampleIndexDto extends PseudonymizableIndexDto implements Serializable { +public class SampleIndexDto extends PseudonymizableIndexDto implements IsSample, Serializable { private static final long serialVersionUID = -6298614717044087479L; @@ -120,8 +120,7 @@ public SampleIndexDto(String uuid, String epidNumber, String labSampleId, Date s this.associatedCase = new CaseReferenceDto(associatedCaseUuid, associatedCaseFirstName, associatedCaseLastName); } if (associatedContactUuid != null) { - this.associatedContact = - new ContactReferenceDto(associatedContactUuid, associatedContactFirstName, associatedContactLastName, null, null); + this.associatedContact = new ContactReferenceDto(associatedContactUuid, associatedContactFirstName, associatedContactLastName, null); } if (associatedEventParticipantUuid != null) { this.associatedEventParticipant = new EventParticipantReferenceDto( diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleReferenceDto.java index f6076aa5365..175700c28e5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleReferenceDto.java @@ -14,20 +14,22 @@ */ package de.symeda.sormas.api.sample; -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; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DependingOnFeatureType; @DependingOnFeatureType(featureType = FeatureType.SAMPLES_LAB) public class SampleReferenceDto extends ReferenceDto { private static final long serialVersionUID = -6975445672442728938L; + private String associatedCaseUuid; + public SampleReferenceDto() { } @@ -36,14 +38,14 @@ public SampleReferenceDto(String uuid) { setUuid(uuid); } - public SampleReferenceDto(String uuid, String caption) { - setUuid(uuid); - setCaption(caption); - } - public SampleReferenceDto(String uuid, SampleMaterial sampleMaterial, String caseUuid, String contactUuid, String eventParticipantUuid) { setUuid(uuid); setCaption(buildCaption(sampleMaterial, caseUuid, contactUuid, eventParticipantUuid)); + this.associatedCaseUuid = caseUuid; + } + + public String getAssociatedCaseUuid() { + return associatedCaseUuid; } public static String buildCaption(SampleMaterial sampleMaterial, String caseUuid, String contactUuid, String eventParticipantUuid) { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessDto.java new file mode 100644 index 00000000000..0da9c9cad3b --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessDto.java @@ -0,0 +1,106 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import java.util.Date; + +import javax.validation.constraints.NotNull; + +import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.user.UserReferenceDto; + +public class SpecialCaseAccessDto extends EntityDto { + + private static final long serialVersionUID = 6294697729114738908L; + + public static final String I18N_PREFIX = "SpecialCaseAccess"; + public static final String CAZE = "caze"; + public static final String ASSIGNED_TO = "assignedTo"; + public static final String ASSIGNED_BY = "assignedBy"; + public static final String END_DATE_TIME = "endDateTime"; + public static final String ASSIGNMENT_DATE = "assignmentDate"; + + @NotNull + private CaseReferenceDto caze; + @NotNull + private UserReferenceDto assignedTo; + @NotNull + private UserReferenceDto assignedBy; + @NotNull + private Date endDateTime; + @NotNull + private Date assignmentDate; + + public static SpecialCaseAccessDto build(CaseReferenceDto caze, UserReferenceDto assignedBy) { + SpecialCaseAccessDto dto = new SpecialCaseAccessDto(); + + dto.setCaze(caze); + dto.setAssignmentDate(new Date()); + dto.setAssignedBy(assignedBy); + + return dto; + } + + public CaseReferenceDto getCaze() { + return caze; + } + + public void setCaze(CaseReferenceDto caze) { + this.caze = caze; + } + + public UserReferenceDto getAssignedTo() { + return assignedTo; + } + + public void setAssignedTo(UserReferenceDto assignedTo) { + this.assignedTo = assignedTo; + } + + public UserReferenceDto getAssignedBy() { + return assignedBy; + } + + public void setAssignedBy(UserReferenceDto assignedBy) { + this.assignedBy = assignedBy; + } + + public Date getEndDateTime() { + return endDateTime; + } + + public void setEndDateTime(Date endDateTime) { + this.endDateTime = endDateTime; + } + + public Date getAssignmentDate() { + return assignmentDate; + } + + public void setAssignmentDate(Date assignmentDate) { + this.assignmentDate = assignmentDate; + } + + public SpecialCaseAccessDto withCase(CaseReferenceDto caze) { + SpecialCaseAccessDto withCase = build(caze, assignedBy); + withCase.setAssignedTo(assignedTo); + withCase.setEndDateTime(endDateTime); + withCase.setAssignmentDate(assignmentDate); + + return withCase; + } +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessFacade.java new file mode 100644 index 00000000000..1fd40840558 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/specialcaseaccess/SpecialCaseAccessFacade.java @@ -0,0 +1,43 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import java.util.List; + +import javax.ejb.Remote; +import javax.validation.Valid; + +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.user.UserReferenceDto; + +@Remote +public interface SpecialCaseAccessFacade { + + SpecialCaseAccessDto save(@Valid SpecialCaseAccessDto specialCaseAccess); + + List getAllActiveByCase(CaseReferenceDto caze); + + void delete(String uuid); + + void saveAll(@Valid List specialAccesses); + + boolean isAnyAssignedToUser(List cases, UserReferenceDto user); + + void deleteExpiredSpecialCaseAccesses(); +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/task/IsTask.java b/sormas-api/src/main/java/de/symeda/sormas/api/task/IsTask.java new file mode 100644 index 00000000000..eda757decef --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/task/IsTask.java @@ -0,0 +1,27 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.task; + +import de.symeda.sormas.api.caze.IsCase; +import de.symeda.sormas.api.contact.IsContact; +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsTask extends HasUuid { + + IsCase getCaze(); + + IsContact getContact(); +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskDto.java index e07c8fab39e..155973f28ee 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskDto.java @@ -42,7 +42,7 @@ import de.symeda.sormas.api.utils.FieldConstraints; @DependingOnFeatureType(featureType = FeatureType.TASK_MANAGEMENT) -public class TaskDto extends EntityDto { +public class TaskDto extends EntityDto implements IsTask { private static final long serialVersionUID = 2439546041916003653L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskExportDto.java index 31634be9802..e85d7a7f6c6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskExportDto.java @@ -19,11 +19,16 @@ import java.util.Date; import de.symeda.sormas.api.caze.BirthDateDto; +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; +import de.symeda.sormas.api.contact.ContactReferenceDto; +import de.symeda.sormas.api.contact.IsContact; import de.symeda.sormas.api.importexport.ExportGroup; import de.symeda.sormas.api.importexport.ExportGroupType; import de.symeda.sormas.api.importexport.ExportProperty; import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.Order; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; @@ -31,7 +36,7 @@ import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.PostalCodePseudonymizer; -public class TaskExportDto extends PseudonymizableIndexDto implements Serializable { +public class TaskExportDto extends PseudonymizableIndexDto implements IsTask, Serializable { private static final long serialVersionUID = 4762759594879661318L; @@ -93,6 +98,7 @@ public class TaskExportDto extends PseudonymizableIndexDto implements Serializab private final Sex personSex; + @EmbeddedPersonalData private final BirthDateDto personBirthDate; private final String personAddressRegion; @@ -427,4 +433,14 @@ public String getPersonOtherContactDetails() { public boolean isInJurisdiction() { return inJurisdiction; } + + @Override + public IsCase getCaze() { + return new CaseReferenceDto(cazeUuid); + } + + @Override + public IsContact getContact() { + return new ContactReferenceDto(contactUuid); + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java index ba47e0c88b2..50f636051fc 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java @@ -42,7 +42,7 @@ import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.EmptyValuePseudonymizer; -public class TaskIndexDto extends PseudonymizableIndexDto { +public class TaskIndexDto extends PseudonymizableIndexDto implements IsTask { private static final long serialVersionUID = 2439546041916003653L; @@ -117,7 +117,7 @@ public class TaskIndexDto extends PseudonymizableIndexDto { //@formatter:off public TaskIndexDto(String uuid, TaskContext taskContext, String caseUuid, String caseFirstName, String caseLastName, String eventUuid, String eventTitle, Disease eventDisease, String eventDiseaseDetails, EventStatus eventStatus, EventInvestigationStatus eventInvestigationStatus, Date eventDate, - String contactUuid, String contactFirstName, String contactLastName, String contactCaseFirstName, String contactCaseLastName, + String contactUuid, String contactFirstName, String contactLastName, String contactCaseUuid, String contactCaseFirstName, String contactCaseLastName, String travelEntryUuid, String travelEntryExternalId, String travelEntryFirstName, String travelEntryLastName, String environmentUuid, String environmentName, TaskType taskType, TaskPriority priority, Date dueDate, Date suggestedStart, TaskStatus taskStatus, Disease disease, String creatorUserUuid, String creatorUserFirstName, String creatorUserLastName, String creatorComment, @@ -126,7 +126,7 @@ public TaskIndexDto(String uuid, TaskContext taskContext, String caseUuid, Strin String regionUuid, String regionName, String districtUuid, String districtName, String communityUuid, String communityName, String facilityUuid, String facilityName, String pointOfEntryUuid, String pointOfEntryName, boolean isInJurisdiction, boolean isCaseInJurisdiction, boolean isContactInJurisdiction, boolean isContactCaseInJurisdiction, - boolean isEventInJurisdiction, boolean isTravelEntryInJurisdiction, boolean isEnvironmentInJurisdiction) { + boolean isEventInJurisdiction, boolean isTravelEntryInJurisdiction, boolean isEnvironmentInJurisdiction) { //@formatter:on super(uuid); @@ -145,7 +145,7 @@ public TaskIndexDto(String uuid, TaskContext taskContext, String caseUuid, Strin } if (contactUuid != null) { - this.contact = new ContactReferenceDto(contactUuid, contactFirstName, contactLastName, contactCaseFirstName, contactCaseLastName); + this.contact = new ContactReferenceDto(contactUuid, contactFirstName, contactLastName, new CaseReferenceDto(contactCaseUuid, contactCaseFirstName, contactCaseLastName)); } if (travelEntryUuid != null) { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java index 0de62f6adae..4f2fa03dd85 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java @@ -18,6 +18,7 @@ import java.io.Serializable; import java.util.Date; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.uuid.AbstractUuidDto; @@ -35,11 +36,13 @@ public class PrescriptionIndexDto extends AbstractUuidDto { public static final String PRESCRIPTION_ROUTE = "prescriptionRoute"; public static final String PRESCRIBING_CLINICIAN = "prescribingClinician"; + @EmbeddedSensitiveData private PrescriptionIndexType prescriptionIndexType; private Date prescriptionDate; private PeriodDto prescriptionPeriod; private String frequency; private String dose; + @EmbeddedSensitiveData private PrescriptionIndexRoute prescriptionIndexRoute; @SensitiveData private String prescribingClinician; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java index ecbacb3e0da..2a51af045f1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java @@ -18,6 +18,7 @@ import java.io.Serializable; import java.util.Date; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.uuid.AbstractUuidDto; @@ -32,9 +33,11 @@ public class TreatmentIndexDto extends AbstractUuidDto { public static final String DOSE = "dose"; public static final String TREATMENT_ROUTE = "treatmentRoute"; public static final String EXECUTING_CLINICIAN = "executingClinician"; + @EmbeddedSensitiveData private TreatmentIndexType treatmentIndexType; private Date treatmentDateTime; private String dose; + @EmbeddedSensitiveData private TreatmentIndexRoute treatmentIndexRoute; @SensitiveData private String executingClinician; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/IsTravelEntry.java b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/IsTravelEntry.java new file mode 100644 index 00000000000..cab45e46915 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/IsTravelEntry.java @@ -0,0 +1,24 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.travelentry; + +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsTravelEntry extends HasUuid { +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryDto.java index 6cf5a781910..4a409a1b581 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryDto.java @@ -29,7 +29,7 @@ import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto; @DependingOnFeatureType(featureType = FeatureType.TRAVEL_ENTRIES) -public class TravelEntryDto extends PseudonymizableDto { +public class TravelEntryDto extends PseudonymizableDto implements IsTravelEntry { private static final long serialVersionUID = 4503438472222204446L; @@ -98,9 +98,11 @@ public class TravelEntryDto extends PseudonymizableDto { private String diseaseVariantDetails; private RegionReferenceDto responsibleRegion; private DistrictReferenceDto responsibleDistrict; + @SensitiveData private CommunityReferenceDto responsibleCommunity; private RegionReferenceDto pointOfEntryRegion; private DistrictReferenceDto pointOfEntryDistrict; + @SensitiveData private PointOfEntryReferenceDto pointOfEntry; @SensitiveData @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryIndexDto.java index 83140729059..848a9fd6c12 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryIndexDto.java @@ -8,7 +8,7 @@ import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class TravelEntryIndexDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class TravelEntryIndexDto extends PseudonymizableIndexDto implements IsTravelEntry, Serializable, Cloneable { public static final String I18N_PREFIX = "TravelEntry"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryListEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryListEntryDto.java index 167374c06f9..7ad7fae2cbb 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryListEntryDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/travelentry/TravelEntryListEntryDto.java @@ -6,7 +6,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class TravelEntryListEntryDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class TravelEntryListEntryDto extends PseudonymizableIndexDto implements IsTravelEntry, Serializable, Cloneable { public static final String I18N_PREFIX = "TravelEntry"; public static final String POINT_OF_ENTRY_I18N_PREFIX = "PointOfEntry"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java index d08ff3355f5..aa715ba56f7 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java @@ -296,6 +296,7 @@ public Set getDefaultUserRights() { CASE_SHARE, CASE_ARCHIVE, CASE_MERGE, + GRANT_SPECIAL_CASE_ACCESS, IMMUNIZATION_VIEW, IMMUNIZATION_CREATE, IMMUNIZATION_EDIT, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java index cbab9a2e49a..25a3d0e856d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java @@ -53,6 +53,7 @@ public enum UserRight { CASE_MERGE(UserRightGroup.CASE, UserRight._CASE_EDIT), CASE_SHARE(UserRightGroup.CASE, UserRight._CASE_VIEW), CASE_RESPONSIBLE(UserRightGroup.CASE, UserRight._CASE_EDIT), + GRANT_SPECIAL_CASE_ACCESS(UserRightGroup.CASE, UserRight._CASE_VIEW), IMMUNIZATION_VIEW(UserRightGroup.IMMUNIZATION, UserRight._PERSON_VIEW), IMMUNIZATION_CREATE(UserRightGroup.IMMUNIZATION, UserRight._IMMUNIZATION_VIEW), @@ -299,6 +300,7 @@ public enum UserRight { public static final String _CASE_SHARE = "CASE_SHARE"; public static final String _CASE_ARCHIVE = "CASE_ARCHIVE"; public static final String _CASE_MERGE = "CASE_MERGE"; + public static final String _GRANT_SPECIAL_CASE_ACCESS = "GRANT_SPECIAL_CASE_ACCESS"; public static final String _IMMUNIZATION_VIEW = "IMMUNIZATION_VIEW"; public static final String _IMMUNIZATION_CREATE = "IMMUNIZATION_CREATE"; public static final String _IMMUNIZATION_EDIT = "IMMUNIZATION_EDIT"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessChecker.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessChecker.java index 6be6b692d5b..c0d32c2d373 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessChecker.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessChecker.java @@ -20,11 +20,11 @@ import java.lang.reflect.Field; -public interface FieldAccessChecker { +public interface FieldAccessChecker { boolean isConfiguredForCheck(Field field, boolean withMandatory); boolean isEmbedded(Field field); - boolean hasRight(); + boolean hasRight(T object); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessCheckers.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessCheckers.java index 481d63e5129..d0ad2d2ed0c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessCheckers.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/FieldAccessCheckers.java @@ -18,30 +18,28 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -public class FieldAccessCheckers { +public class FieldAccessCheckers { - private List checkers = new ArrayList<>(); + private final List> checkers = new ArrayList<>(); - public FieldAccessCheckers() { - } - - public boolean isAccessible(Class parentType, String fieldName, boolean withMandatoryFields) { + public boolean isAccessible(Class parentType, T dto, String fieldName, boolean withMandatoryFields) { Field declaredField = getDeclaredField(parentType, fieldName); if (declaredField == null) { return true; } - return isAccessible(declaredField, withMandatoryFields); + return isAccessible(declaredField, dto, withMandatoryFields); } - public boolean isAccessible(Field field, boolean withMandatoryFields) { + public boolean isAccessible(Field field, T object, boolean withMandatoryFields) { - for (FieldAccessChecker checker : checkers) { - if (checker.isConfiguredForCheck(field, withMandatoryFields) && !checker.hasRight()) { + for (FieldAccessChecker checker : checkers) { + if (checker.isConfiguredForCheck(field, withMandatoryFields) && !checker.hasRight(object)) { return false; } } @@ -50,12 +48,16 @@ public boolean isAccessible(Field field, boolean withMandatoryFields) { } @SafeVarargs - public final boolean isAccessibleBy(Field field, boolean withMandatoryFields, Class... checkerTypes) { + public final boolean isAccessibleBy( + Field field, + T object, + boolean withMandatoryFields, + @SuppressWarnings("rawtypes") Class... checkerTypes) { - List filteredCheckers = + List> filteredCheckers = checkers.stream().filter(c -> Arrays.stream(checkerTypes).anyMatch(t -> c.getClass().isAssignableFrom(t))).collect(Collectors.toList()); - for (FieldAccessChecker checker : filteredCheckers) { - if (checker.isConfiguredForCheck(field, withMandatoryFields) && !checker.hasRight()) { + for (FieldAccessChecker checker : filteredCheckers) { + if (checker.isConfiguredForCheck(field, withMandatoryFields) && !checker.hasRight(object)) { return false; } } @@ -65,7 +67,7 @@ public final boolean isAccessibleBy(Field field, boolean withMandatoryFields, Cl public boolean isConfiguredForCheck(Field field, boolean withMandatory) { - for (FieldAccessChecker checker : checkers) { + for (FieldAccessChecker checker : checkers) { if (checker.isConfiguredForCheck(field, withMandatory)) { return true; } @@ -86,7 +88,7 @@ public boolean isEmbedded(Class parentType, String fieldName) { public boolean isEmbedded(Field field) { - for (FieldAccessChecker checker : checkers) { + for (FieldAccessChecker checker : checkers) { if (checker.isEmbedded(field)) { return true; } @@ -95,10 +97,10 @@ public boolean isEmbedded(Field field) { return false; } - public boolean hasRights() { + public boolean hasRights(T object) { - for (FieldAccessChecker checker : checkers) { - if (!checker.hasRight()) { + for (FieldAccessChecker checker : checkers) { + if (!checker.hasRight(object)) { return false; } } @@ -106,17 +108,15 @@ public boolean hasRights() { return true; } - public FieldAccessCheckers add(FieldAccessChecker checker) { + public FieldAccessCheckers add(FieldAccessChecker checker) { checkers.add(checker); return this; } - private Field getDeclaredField(Class parentType, String propertyId) { + private static Field getDeclaredField(Class parentType, String propertyId) { try { - Field declaredField = parentType.getDeclaredField(propertyId); - - return declaredField; + return parentType.getDeclaredField(propertyId); } catch (NoSuchFieldException e) { if (parentType.getSuperclass() != null) { return getDeclaredField(parentType.getSuperclass(), propertyId); @@ -126,20 +126,21 @@ private Field getDeclaredField(Class parentType, String propertyId) { } } - public static FieldAccessCheckers withCheckers(FieldAccessChecker... checkers) { + public static FieldAccessCheckers withCheckers(Collection> checkers) { - FieldAccessCheckers ret = new FieldAccessCheckers(); - for (FieldAccessChecker checker : checkers) { + FieldAccessCheckers ret = new FieldAccessCheckers<>(); + for (FieldAccessChecker checker : checkers) { ret.add(checker); } return ret; } - public T getCheckerByType(Class checkerType) { - for (FieldAccessChecker checker : checkers) { + public > F getCheckerByType(Class checkerType) { + for (FieldAccessChecker checker : checkers) { if (checkerType.isAssignableFrom(checker.getClass())) { - return (T) checker; + //noinspection unchecked + return (F) checker; } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/UiFieldAccessCheckers.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/UiFieldAccessCheckers.java index 746e3ed8d2c..26c1b2e5c9f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/UiFieldAccessCheckers.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/UiFieldAccessCheckers.java @@ -18,16 +18,16 @@ import de.symeda.sormas.api.user.PseudonymizableDataAccessLevel; import de.symeda.sormas.api.utils.fieldaccess.checkers.PseudonymizedFieldAccessChecker; -public class UiFieldAccessCheckers { +public final class UiFieldAccessCheckers { - private final FieldAccessCheckers fieldAccessCheckers; + private final FieldAccessCheckers fieldAccessCheckers; private UiFieldAccessCheckers() { - fieldAccessCheckers = new FieldAccessCheckers(); + fieldAccessCheckers = new FieldAccessCheckers<>(); } - public boolean isAccessible(Class parentType, String fieldName) { - return fieldAccessCheckers.isAccessible(parentType, fieldName, true); + public boolean isAccessible(Class parentType, String fieldName) { + return fieldAccessCheckers.isAccessible(parentType, null, fieldName, true); } public boolean isEmbedded(Class parentType, String fieldName) { @@ -35,45 +35,45 @@ public boolean isEmbedded(Class parentType, String fieldName) { } public boolean hasRight() { - return fieldAccessCheckers.hasRights(); + return fieldAccessCheckers.hasRights(null); } - public UiFieldAccessCheckers add(FieldAccessChecker accessChecker) { + private UiFieldAccessCheckers add(PseudonymizedFieldAccessChecker accessChecker) { fieldAccessCheckers.add(accessChecker); return this; } - public static UiFieldAccessCheckers getNoop() { - return new UiFieldAccessCheckers(); + public static UiFieldAccessCheckers getNoop() { + return new UiFieldAccessCheckers<>(); } - public static UiFieldAccessCheckers getDefault(boolean isPseudonymized) { - UiFieldAccessCheckers fieldAccessCheckers = new UiFieldAccessCheckers(); + public static UiFieldAccessCheckers getDefault(boolean isPseudonymized) { + UiFieldAccessCheckers fieldAccessCheckers = new UiFieldAccessCheckers<>(); - fieldAccessCheckers.add(PseudonymizedFieldAccessChecker.forPersonalData(isPseudonymized)); - fieldAccessCheckers.add(PseudonymizedFieldAccessChecker.forSensitiveData(isPseudonymized)); + fieldAccessCheckers.add(PseudonymizedFieldAccessChecker.forPersonalData(isPseudonymized)) + .add(PseudonymizedFieldAccessChecker.forSensitiveData(isPseudonymized)); return fieldAccessCheckers; } - public static UiFieldAccessCheckers forPersonalData(boolean isPseudonymized) { - UiFieldAccessCheckers fieldAccessCheckers = new UiFieldAccessCheckers(); + public static UiFieldAccessCheckers forPersonalData(boolean isPseudonymized) { + UiFieldAccessCheckers fieldAccessCheckers = new UiFieldAccessCheckers<>(); fieldAccessCheckers.add(PseudonymizedFieldAccessChecker.forPersonalData(isPseudonymized)); return fieldAccessCheckers; } - public static UiFieldAccessCheckers forSensitiveData(boolean isPseudonymized) { - UiFieldAccessCheckers fieldAccessCheckers = new UiFieldAccessCheckers(); + public static UiFieldAccessCheckers forSensitiveData(boolean isPseudonymized) { + UiFieldAccessCheckers fieldAccessCheckers = new UiFieldAccessCheckers<>(); fieldAccessCheckers.add(PseudonymizedFieldAccessChecker.forSensitiveData(isPseudonymized)); return fieldAccessCheckers; } - public static UiFieldAccessCheckers forDataAccessLevel(PseudonymizableDataAccessLevel accessLevel, boolean isPseudonymized) { + public static UiFieldAccessCheckers forDataAccessLevel(PseudonymizableDataAccessLevel accessLevel, boolean isPseudonymized) { switch (accessLevel) { case ALL: diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/AnnotationBasedFieldAccessChecker.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/AnnotationBasedFieldAccessChecker.java index 480483a40d5..402ac5219da 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/AnnotationBasedFieldAccessChecker.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/AnnotationBasedFieldAccessChecker.java @@ -20,19 +20,22 @@ import de.symeda.sormas.api.utils.fieldaccess.FieldAccessChecker; -public abstract class AnnotationBasedFieldAccessChecker implements FieldAccessChecker { +public abstract class AnnotationBasedFieldAccessChecker implements FieldAccessChecker { - private Class fieldAnnotation; - private Class embeddedAnnotation; + private final Class fieldAnnotation; + private final Class embeddedAnnotation; private final boolean hasRight; + private final SpecialAccessCheck specialAccessCheck; protected AnnotationBasedFieldAccessChecker( Class fieldAnnotation, Class embeddedAnnotation, - boolean hasRight) { + final boolean hasRight, + SpecialAccessCheck specialAccessCheck) { this.fieldAnnotation = fieldAnnotation; this.embeddedAnnotation = embeddedAnnotation; this.hasRight = hasRight; + this.specialAccessCheck = specialAccessCheck; } @Override @@ -54,12 +57,12 @@ public boolean isEmbedded(Field field) { } @Override - public boolean hasRight() { - return hasRight; + public boolean hasRight(T object) { + return hasRight || specialAccessCheck.hasSpecialAccess(object); } - public interface RightCheck { + public interface SpecialAccessCheck { - boolean check(boolean inJurisdiction); + boolean hasSpecialAccess(T object); } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PersonalDataFieldAccessChecker.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PersonalDataFieldAccessChecker.java index 3abb47c3328..be838b8a0eb 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PersonalDataFieldAccessChecker.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PersonalDataFieldAccessChecker.java @@ -23,22 +23,22 @@ import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.PersonalData; -public class PersonalDataFieldAccessChecker extends AnnotationBasedFieldAccessChecker { +public final class PersonalDataFieldAccessChecker extends AnnotationBasedFieldAccessChecker { - private PersonalDataFieldAccessChecker(final boolean hasRight) { - super(PersonalData.class, EmbeddedPersonalData.class, hasRight); + private PersonalDataFieldAccessChecker(final boolean hasRight, SpecialAccessCheck specialAccessCheck) { + super(PersonalData.class, EmbeddedPersonalData.class, hasRight, specialAccessCheck); } - public static PersonalDataFieldAccessChecker inJurisdiction(RightCheck rightCheck) { - return new PersonalDataFieldAccessChecker(rightCheck.check(UserRight.SEE_PERSONAL_DATA_IN_JURISDICTION)); + public static PersonalDataFieldAccessChecker inJurisdiction(RightCheck rightCheck, SpecialAccessCheck specialAccessCheck) { + return new PersonalDataFieldAccessChecker<>(rightCheck.check(UserRight.SEE_PERSONAL_DATA_IN_JURISDICTION), specialAccessCheck); } - public static PersonalDataFieldAccessChecker outsideJurisdiction(RightCheck rightCheck) { - return new PersonalDataFieldAccessChecker(rightCheck.check(UserRight.SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION)); + public static PersonalDataFieldAccessChecker outsideJurisdiction(RightCheck rightCheck, SpecialAccessCheck specialAccessCheck) { + return new PersonalDataFieldAccessChecker<>(rightCheck.check(UserRight.SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION), specialAccessCheck); } - public static PersonalDataFieldAccessChecker forcedNoAccess() { - return new PersonalDataFieldAccessChecker(false); + public static PersonalDataFieldAccessChecker forcedNoAccess() { + return new PersonalDataFieldAccessChecker<>(false, t -> false); } @Override diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PseudonymizedFieldAccessChecker.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PseudonymizedFieldAccessChecker.java index 41af818dbea..28605b139fa 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PseudonymizedFieldAccessChecker.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/PseudonymizedFieldAccessChecker.java @@ -22,26 +22,58 @@ import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.utils.fieldaccess.FieldAccessChecker; -public class PseudonymizedFieldAccessChecker extends AnnotationBasedFieldAccessChecker { +public final class PseudonymizedFieldAccessChecker implements FieldAccessChecker { - private PseudonymizedFieldAccessChecker( + private final WrappedFieldAccessChecker wrapped; + + public PseudonymizedFieldAccessChecker( Class annotation, Class embeddedAnnotation, boolean isPseudonymized) { - super(annotation, embeddedAnnotation, !isPseudonymized); + this.wrapped = new WrappedFieldAccessChecker(annotation, embeddedAnnotation, isPseudonymized); + } + + @Override + public boolean isConfiguredForCheck(Field field, boolean withMandatory) { + return wrapped.isConfiguredForCheck(field, withMandatory); } @Override - protected boolean isAnnotatedFieldMandatory(Field annotatedField) { - return false; + public boolean isEmbedded(Field field) { + return wrapped.isEmbedded(field); + } + + public boolean hasRight() { + return wrapped.hasRight(null); + } + + @Override + public boolean hasRight(T object) { + return hasRight(); + } + + private final class WrappedFieldAccessChecker extends AnnotationBasedFieldAccessChecker { + + private WrappedFieldAccessChecker( + Class annotation, + Class embeddedAnnotation, + boolean isPseudonymized) { + super(annotation, embeddedAnnotation, !isPseudonymized, t -> false); + } + + @Override + protected boolean isAnnotatedFieldMandatory(Field annotatedField) { + return false; + } } - public static PseudonymizedFieldAccessChecker forPersonalData(boolean isPseudonymized) { - return new PseudonymizedFieldAccessChecker(PersonalData.class, EmbeddedPersonalData.class, isPseudonymized); + public static PseudonymizedFieldAccessChecker forPersonalData(boolean isPseudonymized) { + return new PseudonymizedFieldAccessChecker<>(PersonalData.class, EmbeddedPersonalData.class, isPseudonymized); } - public static PseudonymizedFieldAccessChecker forSensitiveData(boolean isPseudonymized) { - return new PseudonymizedFieldAccessChecker(SensitiveData.class, EmbeddedSensitiveData.class, isPseudonymized); + public static PseudonymizedFieldAccessChecker forSensitiveData(boolean isPseudonymized) { + return new PseudonymizedFieldAccessChecker<>(SensitiveData.class, EmbeddedSensitiveData.class, isPseudonymized); } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/SensitiveDataFieldAccessChecker.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/SensitiveDataFieldAccessChecker.java index 7364bb19634..fb0c1f68005 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/SensitiveDataFieldAccessChecker.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/SensitiveDataFieldAccessChecker.java @@ -21,22 +21,22 @@ import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.SensitiveData; -public class SensitiveDataFieldAccessChecker extends AnnotationBasedFieldAccessChecker { +public final class SensitiveDataFieldAccessChecker extends AnnotationBasedFieldAccessChecker { - private SensitiveDataFieldAccessChecker(final boolean hasRight) { - super(SensitiveData.class, EmbeddedSensitiveData.class, hasRight); + private SensitiveDataFieldAccessChecker(final boolean hasRight, SpecialAccessCheck specialAccessCheck) { + super(SensitiveData.class, EmbeddedSensitiveData.class, hasRight, specialAccessCheck); } - public static SensitiveDataFieldAccessChecker inJurisdiction(RightCheck rightCheck) { - return new SensitiveDataFieldAccessChecker(rightCheck.check(UserRight.SEE_SENSITIVE_DATA_IN_JURISDICTION)); + public static SensitiveDataFieldAccessChecker inJurisdiction(RightCheck rightCheck, SpecialAccessCheck specialAccessCheck) { + return new SensitiveDataFieldAccessChecker<>(rightCheck.check(UserRight.SEE_SENSITIVE_DATA_IN_JURISDICTION), specialAccessCheck); } - public static SensitiveDataFieldAccessChecker outsideJurisdiction(RightCheck rightCheck) { - return new SensitiveDataFieldAccessChecker(rightCheck.check(UserRight.SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION)); + public static SensitiveDataFieldAccessChecker outsideJurisdiction(RightCheck rightCheck, SpecialAccessCheck specialAccessCheck) { + return new SensitiveDataFieldAccessChecker<>(rightCheck.check(UserRight.SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION), specialAccessCheck); } - public static SensitiveDataFieldAccessChecker forcedNoAccess() { - return new SensitiveDataFieldAccessChecker(false); + public static SensitiveDataFieldAccessChecker forcedNoAccess() { + return new SensitiveDataFieldAccessChecker<>(false, t -> false); } @Override diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/UserRightFieldAccessChecker.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/UserRightFieldAccessChecker.java index 7870fbc028f..28661f3f7d1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/UserRightFieldAccessChecker.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/fieldaccess/checkers/UserRightFieldAccessChecker.java @@ -21,7 +21,7 @@ import de.symeda.sormas.api.utils.DependingOnUserRight; import de.symeda.sormas.api.utils.fieldaccess.FieldAccessChecker; -public class UserRightFieldAccessChecker implements FieldAccessChecker { +public class UserRightFieldAccessChecker implements FieldAccessChecker { private final UserRight userRight; private final boolean hasRight; @@ -42,7 +42,7 @@ public boolean isEmbedded(Field field) { } @Override - public boolean hasRight() { + public boolean hasRight(T object) { return hasRight; } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java index 7b83d45a217..94ae3657f50 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java @@ -16,6 +16,7 @@ package de.symeda.sormas.api.utils.pseudonymization; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -31,18 +32,18 @@ import de.symeda.sormas.api.utils.fieldaccess.checkers.SensitiveDataFieldAccessChecker; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.DefaultValuePseudonymizer; -public class DtoPseudonymizer { +public class DtoPseudonymizer { - protected FieldAccessCheckers inJurisdictionCheckers; - protected FieldAccessCheckers outsideJurisdictionCheckers; + protected FieldAccessCheckers inJurisdictionCheckers; + protected FieldAccessCheckers outsideJurisdictionCheckers; private final String stringValuePlaceholder; protected final boolean pseudonymizeMandatoryFields; protected DtoPseudonymizer( - FieldAccessCheckers inJurisdictionCheckers, - FieldAccessCheckers outsideJurisdictionCheckers, + FieldAccessCheckers inJurisdictionCheckers, + FieldAccessCheckers outsideJurisdictionCheckers, String stringValuePlaceholder, boolean pseudonymizeMandatoryFields) { this.inJurisdictionCheckers = inJurisdictionCheckers; @@ -52,25 +53,25 @@ protected DtoPseudonymizer( this.pseudonymizeMandatoryFields = pseudonymizeMandatoryFields; } - public void addFieldAccessChecker(FieldAccessChecker inJurisdictionChecker, FieldAccessChecker outsideJurisdictionChecker) { + public void addFieldAccessChecker(FieldAccessChecker inJurisdictionChecker, FieldAccessChecker outsideJurisdictionChecker) { this.inJurisdictionCheckers.add(inJurisdictionChecker); this.outsideJurisdictionCheckers.add(outsideJurisdictionChecker); } - public void pseudonymizeDtoCollection( - Class type, - Collection dtos, - JurisdictionValidator jurisdictionValidator, - final CustomCollectionItemPseudonymization customPseudonymization) { + public void pseudonymizeDtoCollection( + Class type, + Collection dtos, + JurisdictionValidator jurisdictionValidator, + final CustomCollectionItemPseudonymization customPseudonymization) { pseudonymizeDtoCollection(type, dtos, jurisdictionValidator, customPseudonymization, false); } - public void pseudonymizeDtoCollection( - Class type, - Collection dtos, - JurisdictionValidator jurisdictionValidator, - final CustomCollectionItemPseudonymization customPseudonymization, + public void pseudonymizeDtoCollection( + Class type, + Collection dtos, + JurisdictionValidator jurisdictionValidator, + final CustomCollectionItemPseudonymization customPseudonymization, boolean skipEmbeddedFields) { List pseudonymizableFieldsInJurisdiction = getPseudonymizableFields(type, true); @@ -78,37 +79,90 @@ public void pseudonymizeDtoCollection( List embeddedFieldsInJurisdiction = getEmbeddedFields(type, true); List embeddedFieldsOutsideJurisdiction = getEmbeddedFields(type, false); - for (final DTO dto : dtos) { + for (final T dto : dtos) { final boolean isInJurisdiction = jurisdictionValidator.validate(dto); pseudonymizeDto( dto, isInJurisdiction ? pseudonymizableFieldsInJurisdiction : pseudonymizableFieldsOutsideJurisdiction, isInJurisdiction ? embeddedFieldsInJurisdiction : embeddedFieldsOutsideJurisdiction, isInJurisdiction, - null, - customPseudonymization == null ? null : (CustomPseudonymization) d -> customPseudonymization.pseudonymize(dto, isInJurisdiction), + customPseudonymization == null ? null : d -> customPseudonymization.pseudonymize(dto, isInJurisdiction), skipEmbeddedFields); } } - public void pseudonymizeDto(Class type, DTO dto, boolean isInJurisdiction, CustomPseudonymization customPseudonymization) { + public void pseudonymizeEmbeddedDtoCollection(Class type, Collection dtos, boolean inJurisdiction, T rootDto) { + + List pseudonymizableFieldsInJurisdiction = getPseudonymizableFields(type, true); + List pseudonymizableFieldsOutsideJurisdiction = getPseudonymizableFields(type, false); + List embeddedFieldsInJurisdiction = getEmbeddedFields(type, true); + List embeddedFieldsOutsideJurisdiction = getEmbeddedFields(type, false); + + for (final X dto : dtos) { + doPseudonymizeDto( + dto, + inJurisdiction ? pseudonymizableFieldsInJurisdiction : pseudonymizableFieldsOutsideJurisdiction, + inJurisdiction ? embeddedFieldsInJurisdiction : embeddedFieldsOutsideJurisdiction, + inJurisdiction, + null, + null, + false, + rootDto); + } + } + + public void pseudonymizeEmbeddedDtoCollection( + Class type, + Collection dtos, + boolean inJurisdiction, + final CustomCollectionItemPseudonymization customPseudonymization, + boolean skipEmbeddedFields, + T rootDto) { + + List pseudonymizableFieldsInJurisdiction = getPseudonymizableFields(type, true); + List pseudonymizableFieldsOutsideJurisdiction = getPseudonymizableFields(type, false); + List embeddedFieldsInJurisdiction = getEmbeddedFields(type, true); + List embeddedFieldsOutsideJurisdiction = getEmbeddedFields(type, false); + + for (final X dto : dtos) { + doPseudonymizeDto( + dto, + inJurisdiction ? pseudonymizableFieldsInJurisdiction : pseudonymizableFieldsOutsideJurisdiction, + inJurisdiction ? embeddedFieldsInJurisdiction : embeddedFieldsOutsideJurisdiction, + inJurisdiction, + null, + customPseudonymization == null ? null : d -> customPseudonymization.pseudonymize(dto, inJurisdiction), + skipEmbeddedFields, + rootDto); + } + } + + public void pseudonymizeDto(Class type, T dto, boolean isInJurisdiction, CustomPseudonymization customPseudonymization) { List declaredFields = getPseudonymizableFields(type, isInJurisdiction); List embeddedFields = getEmbeddedFields(type, isInJurisdiction); - pseudonymizeDto(dto, declaredFields, embeddedFields, isInJurisdiction, null, customPseudonymization, false); + pseudonymizeDto(dto, declaredFields, embeddedFields, isInJurisdiction, customPseudonymization, false); } - public boolean isAccessible(Class type, String fieldName, boolean isInJurisdiction) { + public boolean isAccessible(Class type, String fieldName, T dto, boolean isInJurisdiction) { List pseudonymizableFields = getPseudonymizableFields(type, isInJurisdiction); for (Field field : pseudonymizableFields) { if (fieldName.equals(field.getName())) { - return getFieldAccessCheckers(isInJurisdiction).isAccessible(field, pseudonymizeMandatoryFields); + return getFieldAccessCheckers(isInJurisdiction).isAccessible(field, dto, pseudonymizeMandatoryFields); } } - throw new RuntimeException("Could not find field: " + fieldName); + throw new IllegalArgumentException("Could not find field: " + fieldName); + } + + public void restorePseudonymizedValues(Class type, T dto, T originalDto, boolean isInJurisdiction) { + doRestorePseudonymizedValues(type, dto, originalDto, dto, isInJurisdiction); + } + + public void restoreEmbeddedPseudonymizedValues(Class type, X dto, X originalDto, T rootDto, boolean isInJurisdiction) { + doRestorePseudonymizedValues(type, dto, originalDto, rootDto, isInJurisdiction); } - public void restorePseudonymizedValues(Class type, DTO dto, DTO originalDto, boolean isInJurisdiction) { + private void doRestorePseudonymizedValues(Class type, X dto, X originalDto, T rootDto, boolean isInJurisdiction) { if (dto == null || originalDto == null) { return; } @@ -118,11 +172,11 @@ public void restorePseudonymizedValues(Class for (Field pseudonymizedField : pseudonymizableFields) { try { - if (!getFieldAccessCheckers(isInJurisdiction).isAccessible(pseudonymizedField, pseudonymizeMandatoryFields) - || dto.isPseudonymized() && isFieldValuePseudonymized(pseudonymizedField, dto)) { + if (!getFieldAccessCheckers(isInJurisdiction).isAccessible(pseudonymizedField, rootDto, pseudonymizeMandatoryFields) + || isPseudonymized(dto) && isFieldValuePseudonymized(pseudonymizedField, dto)) { restoreOriginalValue(dto, pseudonymizedField, originalDto); } - } catch (IllegalAccessException | InstantiationException e) { + } catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) { throw new RuntimeException(e); } } @@ -134,10 +188,11 @@ public void restorePseudonymizedValues(Class try { embeddedField.setAccessible(true); - restorePseudonymizedValues( + doRestorePseudonymizedValues( (Class) fieldType, (Pseudonymizable) embeddedField.get(dto), (Pseudonymizable) embeddedField.get(originalDto), + rootDto, isInJurisdiction); } catch (IllegalAccessException e) { throw new RuntimeException("Couldn't restore embedded field " + dto.getClass().getName() + "." + embeddedField.getName(), e); @@ -148,8 +203,12 @@ public void restorePseudonymizedValues(Class } } - private boolean isFieldValuePseudonymized(Field pseudonymizedField, DTO dto) - throws IllegalAccessException, InstantiationException { + protected boolean isPseudonymized(Object dto) { + return Pseudonymizable.class.isAssignableFrom(dto.getClass()) && ((Pseudonymizable) dto).isPseudonymized(); + } + + private boolean isFieldValuePseudonymized(Field pseudonymizedField, X dto) + throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { ValuePseudonymizer pseudonymizer = (ValuePseudonymizer) getPseudonymizer(pseudonymizedField, null); @@ -163,34 +222,25 @@ private boolean isFieldValuePseudonymized(Field ps return pseudonymizer.isValuePseudonymized(fieldValue); } - private boolean pseudonymizeDto( - Class type, - DTO dto, - boolean isInJurisdiction, - Class defaultPseudonymizerClass, - CustomPseudonymization customPseudonymization, + private void pseudonymizeDto( + T dto, + List pseudonymizableFields, + List embeddedFields, + boolean inJurisdiction, + CustomPseudonymization customPseudonymization, boolean skipEmbeddedFields) { - List declaredFields = getPseudonymizableFields(type, isInJurisdiction); - List embeddedFields = getEmbeddedFields(type, isInJurisdiction); - - return pseudonymizeDto( - dto, - declaredFields, - embeddedFields, - isInJurisdiction, - defaultPseudonymizerClass, - customPseudonymization, - skipEmbeddedFields); + doPseudonymizeDto(dto, pseudonymizableFields, embeddedFields, inJurisdiction, null, customPseudonymization, skipEmbeddedFields, dto); } - private boolean pseudonymizeDto( - DTO dto, + private boolean doPseudonymizeDto( + X dto, List pseudonymizableFields, List embeddedFields, boolean inJurisdiction, - Class defaultPseudonymizerClass, - CustomPseudonymization customPseudonymization, - boolean skipEmbeddedFields) { + Class> defaultPseudonymizerClass, + CustomPseudonymization customPseudonymization, + boolean skipEmbeddedFields, + T rootDto) { if (dto == null) { return false; } @@ -198,14 +248,15 @@ private boolean pseudonymizeDto( boolean didPersonalOrSensitiveDataPseudonymization = false; for (Field field : pseudonymizableFields) { - FieldAccessCheckers fieldAccessCheckers = getFieldAccessCheckers(inJurisdiction); - if (!fieldAccessCheckers.isAccessible(field, pseudonymizeMandatoryFields)) { + FieldAccessCheckers fieldAccessCheckers = getFieldAccessCheckers(inJurisdiction); + if (!fieldAccessCheckers.isAccessible(field, rootDto, pseudonymizeMandatoryFields)) { pseudonymizeField(dto, field, defaultPseudonymizerClass); // only personal and sensitive data pseudonymization needs special handling on the client side // other not accessible data is hidden on the client side, so just cleanup and don't mark the DTO as pseudonymized if (!didPersonalOrSensitiveDataPseudonymization) { didPersonalOrSensitiveDataPseudonymization = !fieldAccessCheckers.isAccessibleBy( field, + rootDto, pseudonymizeMandatoryFields, PersonalDataFieldAccessChecker.class, SensitiveDataFieldAccessChecker.class); @@ -220,16 +271,17 @@ private boolean pseudonymizeDto( embeddedField.setAccessible(true); Pseudonymizer pseudonymizerAnnotation = embeddedField.getAnnotation(Pseudonymizer.class); - Class psudonomyzerClass = - pseudonymizerAnnotation != null ? pseudonymizerAnnotation.value() : defaultPseudonymizerClass; + Class> psudonomyzerClass = pseudonymizerAnnotation != null + ? (Class>) pseudonymizerAnnotation.value() + : defaultPseudonymizerClass; - if (pseudonymizeDto( + if (pseudonymizeEmbeddedDto( (Class) embeddedField.getType(), embeddedField.get(dto), inJurisdiction, psudonomyzerClass, - null, - skipEmbeddedFields)) { + skipEmbeddedFields, + rootDto)) { didPersonalOrSensitiveDataPseudonymization = true; } } catch (IllegalAccessException e) { @@ -254,7 +306,31 @@ private boolean pseudonymizeDto( return didPersonalOrSensitiveDataPseudonymization; } - private void pseudonymizeField(DTO dto, Field field, Class pseudonymizerClass) { + public void pseudonymizeEmbeddedDto(Class type, X dto, boolean isInJurisdiction, T rootDto) { + pseudonymizeEmbeddedDto(type, dto, isInJurisdiction, rootDto, null); + } + + public void pseudonymizeEmbeddedDto(Class type, X dto, boolean isInJurisdiction, T rootDto, CustomPseudonymization customPseudonymization) { + List declaredFields = getPseudonymizableFields(type, isInJurisdiction); + List embeddedFields = getEmbeddedFields(type, isInJurisdiction); + + doPseudonymizeDto(dto, declaredFields, embeddedFields, isInJurisdiction, null, customPseudonymization, false, rootDto); + } + + private boolean pseudonymizeEmbeddedDto( + Class type, + X dto, + boolean isInJurisdiction, + Class> defaultPseudonymizerClass, + boolean skipEmbeddedFields, + T rootDto) { + List declaredFields = getPseudonymizableFields(type, isInJurisdiction); + List embeddedFields = getEmbeddedFields(type, isInJurisdiction); + + return doPseudonymizeDto(dto, declaredFields, embeddedFields, isInJurisdiction, defaultPseudonymizerClass, null, skipEmbeddedFields, rootDto); + } + + private void pseudonymizeField(X dto, Field field, Class> pseudonymizerClass) { try { field.setAccessible(true); @@ -267,29 +343,29 @@ private void pseudonymizeField(DTO dto, Field field, Class getPseudonymizer(Field field, Class defaultPseudonymizerClass) - throws IllegalAccessException, InstantiationException { + private ValuePseudonymizer getPseudonymizer(Field field, Class> defaultPseudonymizerClass) + throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Pseudonymizer pseudonymizerAnnotation = field.getAnnotation(Pseudonymizer.class); if (pseudonymizerAnnotation == null) { if (defaultPseudonymizerClass != null) { - return defaultPseudonymizerClass.newInstance(); + return defaultPseudonymizerClass.getDeclaredConstructor().newInstance(); } return new DefaultValuePseudonymizer<>(stringValuePlaceholder); } - return pseudonymizerAnnotation.value().newInstance(); + return pseudonymizerAnnotation.value().getDeclaredConstructor().newInstance(); } - private void restoreOriginalValue(DTO dto, Field field, DTO originalDto) { + private void restoreOriginalValue(X dto, Field field, X originalDto) { try { field.setAccessible(true); @@ -303,30 +379,18 @@ private void restoreOriginalValue(DTO dto, Field f } private List getPseudonymizableFields(Class type, boolean inJurisdiction) { - final FieldAccessCheckers fieldAccessCheckers = getFieldAccessCheckers(inJurisdiction); - - return filterFields(type, new FieldFilter() { + final FieldAccessCheckers fieldAccessCheckers = getFieldAccessCheckers(inJurisdiction); - @Override - public boolean apply(Field field) { - return fieldAccessCheckers.isConfiguredForCheck(field, pseudonymizeMandatoryFields); - } - }); + return filterFields(type, field -> fieldAccessCheckers.isConfiguredForCheck(field, pseudonymizeMandatoryFields)); } private List getEmbeddedFields(Class type, boolean inJurisdiction) { - final FieldAccessCheckers fieldAccessCheckers = getFieldAccessCheckers(inJurisdiction); - - return filterFields(type, new FieldFilter() { + final FieldAccessCheckers fieldAccessCheckers = getFieldAccessCheckers(inJurisdiction); - @Override - public boolean apply(Field field) { - return fieldAccessCheckers.isEmbedded(field); - } - }); + return filterFields(type, fieldAccessCheckers::isEmbedded); } - private List filterFields(Class type, FieldFilter filter) { + private static List filterFields(Class type, FieldFilter filter) { List declaredFields = new ArrayList<>(); for (Field field : type.getDeclaredFields()) { @@ -342,7 +406,7 @@ private List filterFields(Class type, FieldFilter filter) { return declaredFields; } - protected FieldAccessCheckers getFieldAccessCheckers(boolean inJurisdiction) { + protected FieldAccessCheckers getFieldAccessCheckers(boolean inJurisdiction) { return inJurisdiction ? inJurisdictionCheckers : outsideJurisdictionCheckers; } @@ -351,19 +415,19 @@ public interface RightCheck { boolean hasRight(UserRight userRight); } - public interface JurisdictionValidator { + public interface JurisdictionValidator { - boolean validate(DTO dto); + boolean validate(X dto); } - public interface CustomCollectionItemPseudonymization { + public interface CustomCollectionItemPseudonymization { - void pseudonymize(DTO dto, boolean isInJurisdiction); + void pseudonymize(X dto, boolean isInJurisdiction); } - public interface CustomPseudonymization { + public interface CustomPseudonymization { - void pseudonymize(DTO dto); + void pseudonymize(X dto); } private interface FieldFilter { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/IsVisit.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/IsVisit.java new file mode 100644 index 00000000000..f2968a97ba1 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/IsVisit.java @@ -0,0 +1,24 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.visit; + +import de.symeda.sormas.api.uuid.HasUuid; + +public interface IsVisit extends HasUuid { +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitDto.java index bb2572e7973..b033582d127 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitDto.java @@ -22,6 +22,7 @@ import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.VisitOrigin; @@ -32,14 +33,15 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DependingOnFeatureType; -import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.utils.EmbeddedPersonalData; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto; @DependingOnFeatureType(featureType = { FeatureType.CONTACT_TRACING, FeatureType.CASE_FOLLOWUP }) -public class VisitDto extends PseudonymizableDto { +public class VisitDto extends PseudonymizableDto implements IsVisit { private static final long serialVersionUID = -441664767075414789L; @@ -59,6 +61,8 @@ public class VisitDto extends PseudonymizableDto { public static final String ORIGIN = "origin"; @NotNull(message = Validations.validPerson) + @EmbeddedPersonalData + @EmbeddedSensitiveData private PersonReferenceDto person; private Disease disease; @NotNull(message = Validations.visitDate) @@ -71,6 +75,7 @@ public class VisitDto extends PseudonymizableDto { @SensitiveData private String visitRemarks; @Valid + @EmbeddedSensitiveData private SymptomsDto symptoms; @SensitiveData @Min(value = -90, message = Validations.numberTooSmall) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java index 9bcef693a89..1e26eb82866 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java @@ -30,12 +30,13 @@ import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.symptoms.SymptomsDto; import de.symeda.sormas.api.user.UserRoleReferenceDto; +import de.symeda.sormas.api.utils.EmbeddedSensitiveData; import de.symeda.sormas.api.utils.Order; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class VisitExportDto extends AbstractUuidDto { +public class VisitExportDto extends AbstractUuidDto implements IsVisit { private static final long serialVersionUID = 6432390815000039126L; @@ -55,6 +56,7 @@ public class VisitExportDto extends AbstractUuidDto { private VisitStatus visitStatus; @SensitiveData private String visitRemarks; + @EmbeddedSensitiveData private SymptomsDto symptoms; @SensitiveData diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitIndexDto.java index d146c1c6872..13841627efa 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitIndexDto.java @@ -10,7 +10,7 @@ import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class VisitIndexDto extends PseudonymizableIndexDto implements Serializable { +public class VisitIndexDto extends PseudonymizableIndexDto implements IsVisit, Serializable { private static final long serialVersionUID = -2707325548819626469L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java index 942f5295a2a..3c4348362d1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java @@ -15,21 +15,23 @@ package de.symeda.sormas.api.visit; -import de.symeda.sormas.api.uuid.AbstractUuidDto; - import java.util.ArrayList; import java.util.Date; import java.util.List; -public class VisitSummaryExportDto extends AbstractUuidDto +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; +import de.symeda.sormas.api.contact.IsContact; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -{ +public class VisitSummaryExportDto extends AbstractUuidDto implements IsContact { private static final long serialVersionUID = 7066530434713936967L; public static final String I18N_PREFIX = "ContactVisitExport"; private Long contactId; + private String caseUuid; private Integer maximumFollowUpVisits; private String firstName; @@ -38,9 +40,17 @@ public class VisitSummaryExportDto extends AbstractUuidDto private Date followUpUntil; private List visitDetails = new ArrayList<>(); - public VisitSummaryExportDto(String uuid, Long contactId, String firstName, String lastName, Date lastContactDate, Date followUpUntil) { + public VisitSummaryExportDto( + String uuid, + Long contactId, + String caseUuid, + String firstName, + String lastName, + Date lastContactDate, + Date followUpUntil) { super(uuid); this.contactId = contactId; + this.caseUuid = caseUuid; this.firstName = firstName; this.lastName = lastName; this.lastContactDate = lastContactDate; @@ -90,4 +100,9 @@ public List getVisitDetails() { public void setVisitDetails(List visitDetails) { this.visitDetails = visitDetails; } + + @Override + public IsCase getCaze() { + return new CaseReferenceDto(caseUuid); + } } diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 6ef2b32cd8f..2a7f5347e1b 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -2931,3 +2932,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 8efb5414ea3..2acb36f2bc9 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -1591,6 +1591,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1792,6 +1793,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fj-FJ.properties b/sormas-api/src/main/resources/enum_fj-FJ.properties index a470fa223b8..515db8547a5 100644 --- a/sormas-api/src/main/resources/enum_fj-FJ.properties +++ b/sormas-api/src/main/resources/enum_fj-FJ.properties @@ -371,6 +371,7 @@ DatabaseTable.EXPORT_CONFIGURATIONS = Export configurations DatabaseTable.FEATURE_CONFIGURATIONS = Feature configurations DatabaseTable.DISEASE_CONFIGURATIONS = Disease configurations DatabaseTable.DELETION_CONFIGURATIONS = Deletion configurations +DatabaseTable.SPECIAL_CASE_ACCESSES= Special case accesses # DateFilterOption DateFilterOption.DATE = By Date diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 4f14d80851b..7004f358492 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1766,3 +1766,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address. infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations.properties b/sormas-api/src/main/resources/validations.properties index 2f55e0e2a24..43e82191e67 100644 --- a/sormas-api/src/main/resources/validations.properties +++ b/sormas-api/src/main/resources/validations.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events 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 cfb60baf0a4..b63e42246c9 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 @@ -380,12 +380,12 @@ public List restore(List uuids) { } @Override - protected void pseudonymizeDto(Campaign source, CampaignDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected void pseudonymizeDto(Campaign source, CampaignDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { // No pseudonymization for Campaign entities } @Override - protected void restorePseudonymizedDto(CampaignDto dto, CampaignDto existingDto, Campaign entity, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto(CampaignDto dto, CampaignDto existingDto, Campaign entity, Pseudonymizer pseudonymizer) { // No pseudonymization for Campaign entities } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java index b99b6dfc732..4ce8ed36f47 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java @@ -57,6 +57,7 @@ import de.symeda.sormas.api.caze.HospitalWardType; import de.symeda.sormas.api.caze.InfectionSetting; import de.symeda.sormas.api.caze.InvestigationStatus; +import de.symeda.sormas.api.caze.IsCase; import de.symeda.sormas.api.caze.PlagueType; import de.symeda.sormas.api.caze.QuarantineReason; import de.symeda.sormas.api.caze.RabiesType; @@ -94,6 +95,7 @@ import de.symeda.sormas.backend.sormastosormas.entities.SormasToSormasShareable; import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccess; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.task.Task; import de.symeda.sormas.backend.therapy.Therapy; @@ -102,7 +104,7 @@ import de.symeda.sormas.backend.visit.Visit; @Entity(name = "cases") -public class Case extends CoreAdo implements SormasToSormasShareable, HasExternalData { +public class Case extends CoreAdo implements IsCase, SormasToSormasShareable, HasExternalData { private static final long serialVersionUID = -2697795184663562129L; @@ -240,6 +242,7 @@ public class Case extends CoreAdo implements SormasToSormasShareable, HasExterna public static final String QUARANTINE_CHANGE_COMMENT = "quarantineChangeComment"; public static final String DUPLICATE_OF = "duplicateOf"; public static final String CREATION_VERSION = "creationVersion"; + public static final String SPECIAL_CASE_ACCESSES = "specialCaseAccesses"; private Person person; private String description; @@ -418,6 +421,8 @@ public class Case extends CoreAdo implements SormasToSormasShareable, HasExterna private Map externalData; + private List specialCaseAccesses = new ArrayList<>(0); + public static Case build() { Case caze = new Case(); caze.setSystemCaseClassification(CaseClassification.NOT_CLASSIFIED); @@ -1739,4 +1744,13 @@ public Map getExternalData() { public void setExternalData(Map externalData) { this.externalData = externalData; } + + @OneToMany(mappedBy = SpecialCaseAccess.CAZE, fetch = FetchType.LAZY) + public List getSpecialCaseAccesses() { + return specialCaseAccesses; + } + + public void setSpecialCaseAccesses(List specialCaseAccesses) { + this.specialCaseAccesses = specialCaseAccesses; + } } 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 876f0906da5..5529e0bd3de 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 @@ -88,9 +88,6 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.Language; import de.symeda.sormas.api.VisitOrigin; -import de.symeda.sormas.api.caze.AgeAndBirthDateDto; -import de.symeda.sormas.api.caze.BirthDateDto; -import de.symeda.sormas.api.caze.BurialInfoDto; import de.symeda.sormas.api.caze.CaseBulkEditData; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseCriteria; @@ -115,6 +112,7 @@ import de.symeda.sormas.api.caze.CoreAndPersonDto; import de.symeda.sormas.api.caze.EmbeddedSampleExportDto; import de.symeda.sormas.api.caze.InvestigationStatus; +import de.symeda.sormas.api.caze.IsCase; import de.symeda.sormas.api.caze.MapCaseDto; import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.caze.PlagueType; @@ -169,7 +167,6 @@ import de.symeda.sormas.api.infrastructure.facility.FacilityHelper; 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.location.LocationReferenceDto; import de.symeda.sormas.api.manualmessagelog.ManualMessageLogDto; import de.symeda.sormas.api.messaging.MessageType; @@ -214,6 +211,7 @@ import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.utils.YesNoUnknown; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker; import de.symeda.sormas.api.utils.fieldaccess.checkers.UserRightFieldAccessChecker; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; import de.symeda.sormas.api.vaccination.VaccinationDto; @@ -325,6 +323,7 @@ import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareInfoHelper; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb.SymptomsFacadeEjbLocal; @@ -502,6 +501,8 @@ public class CaseFacadeEjb extends AbstractCoreFacadeEjb createPseudonymizer(List cases) { + return createPseudonymizerForDtoWithClinician("", cases); } public Page getIndexPage(CaseCriteria caseCriteria, Integer offset, Integer size, List sortProperties) { @@ -609,7 +600,7 @@ public List getIndexList(CaseCriteria caseCriteria, Integer first, .collect(Collectors.toMap(ExternalShareInfoCountAndLatestDate::getAssociatedObjectUuid, Function.identity())); } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(cases); for (CaseIndexDto caze : cases) { if (survToolShareCountAndDates != null) { ExternalShareInfoCountAndLatestDate survToolShareCountAndDate = survToolShareCountAndDates.get(caze.getUuid()); @@ -622,11 +613,7 @@ public List getIndexList(CaseCriteria caseCriteria, Integer first, } Boolean isInJurisdiction = caze.getInJurisdiction(); - pseudonymizer.pseudonymizeDto( - CaseIndexDto.class, - caze, - isInJurisdiction, - c -> pseudonymizer.pseudonymizeDto(AgeAndBirthDateDto.class, caze.getAgeAndBirthDate(), isInJurisdiction, null)); + pseudonymizer.pseudonymizeDto(CaseIndexDto.class, caze, isInJurisdiction, null); if (diseaseConfigurationFacade.hasFollowUp(caze.getDisease())) { int numberOfMissedVisits = @@ -668,7 +655,7 @@ public List getIndexDetailedList(CaseCriteria caseCriteria .collect(Collectors.toMap(ExternalShareInfoCountAndLatestDate::getAssociatedObjectUuid, Function.identity())); } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(cases); for (CaseIndexDetailedDto caze : cases) { if (survToolShareCountAndDates != null) { ExternalShareInfoCountAndLatestDate survToolShareCountAndDate = survToolShareCountAndDates.get(caze.getUuid()); @@ -693,9 +680,11 @@ public List getIndexDetailedList(CaseCriteria caseCriteria Boolean isInJurisdiction = caze.getInJurisdiction(); pseudonymizer.pseudonymizeDto(CaseIndexDetailedDto.class, caze, isInJurisdiction, c -> { - pseudonymizer.pseudonymizeDto(AgeAndBirthDateDto.class, caze.getAgeAndBirthDate(), isInJurisdiction, null); - pseudonymizer - .pseudonymizeUser(userService.getByUuid(caze.getReportingUser().getUuid()), userService.getCurrentUser(), caze::setReportingUser); + pseudonymizer.pseudonymizeUser( + userService.getByUuid(caze.getReportingUser().getUuid()), + userService.getCurrentUser(), + caze::setReportingUser, + caze); }); if (diseaseConfigurationFacade.hasFollowUp(caze.getDisease())) { @@ -715,7 +704,7 @@ public List getIndexDetailedList(CaseCriteria caseCriteria public List getCaseSelectionList(CaseCriteria caseCriteria) { List entries = service.getCaseSelectionList(caseCriteria); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(entries); pseudonymizer.pseudonymizeDtoCollection(CaseSelectionDto.class, entries, CaseSelectionDto::isInJurisdiction, null); return entries; @@ -727,7 +716,7 @@ public List getEntriesList(String personUuid, Integer first, I Long personId = personFacade.getPersonIdByUuid(personUuid); List entries = service.getEntriesList(personId, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(entries); pseudonymizer.pseudonymizeDtoCollection(CaseListEntryDto.class, entries, CaseListEntryDto::isInJurisdiction, null); return entries; @@ -1071,7 +1060,8 @@ public List getExportList( Map caseUsers = getCaseUsersForExport(resultList, exportConfiguration); - Pseudonymizer pseudonymizer = getPseudonymizerForDtoWithClinician(I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = + createPseudonymizerForDtoWithClinician(I18nProperties.getCaption(Captions.inaccessibleValue), resultList); for (CaseExportDto exportDto : resultList) { final boolean inJurisdiction = exportDto.getInJurisdiction(); @@ -1217,7 +1207,7 @@ public List getExportList( exportDto.setLastCooperativeVisitDate(lastCooperativeVisit.getVisitDateTime()); SymptomsDto visitSymptoms = SymptomsFacadeEjb.toSymptomsDto(lastCooperativeVisit.getSymptoms()); - pseudonymizer.pseudonymizeDto(SymptomsDto.class, visitSymptoms, inJurisdiction, null); + pseudonymizer.pseudonymizeEmbeddedDto(SymptomsDto.class, visitSymptoms, inJurisdiction, exportDto); exportDto.setLastCooperativeVisitSymptoms(SymptomsHelper.buildSymptomsHumanString(visitSymptoms, true, userLanguage)); exportDto.setLastCooperativeVisitSymptomatic( @@ -1257,13 +1247,7 @@ public List getExportList( } pseudonymizer.pseudonymizeDto(CaseExportDto.class, exportDto, inJurisdiction, c -> { - pseudonymizer.pseudonymizeDto(BirthDateDto.class, c.getBirthdate(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(EmbeddedSampleExportDto.class, c.getSample1(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(EmbeddedSampleExportDto.class, c.getSample2(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(EmbeddedSampleExportDto.class, c.getSample3(), inJurisdiction, null); - pseudonymizer.pseudonymizeDtoCollection(EmbeddedSampleExportDto.class, c.getOtherSamples(), s -> inJurisdiction, null); - pseudonymizer.pseudonymizeDto(BurialInfoDto.class, c.getBurialInfo(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(SymptomsDto.class, c.getSymptoms(), inJurisdiction, null); + pseudonymizer.pseudonymizeEmbeddedDtoCollection(EmbeddedSampleExportDto.class, c.getOtherSamples(), inJurisdiction, exportDto); }); } } @@ -1365,13 +1349,9 @@ public List getCasesForMap( District district = districtService.getByReferenceDto(districtRef); List cases = service.getCasesForMap(region, district, disease, from, to, dateType); - // todo shouldn't this also use the overridden createPseudonymizer method? - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); - pseudonymizer.pseudonymizeDtoCollection( - MapCaseDto.class, - cases, - MapCaseDto::getInJurisdiction, - (c, isInJurisdiction) -> pseudonymizer.pseudonymizeDto(PersonReferenceDto.class, c.getPerson(), isInJurisdiction, null)); + + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(cases); + pseudonymizer.pseudonymizeDtoCollection(MapCaseDto.class, cases, MapCaseDto::getInJurisdiction, null); return cases; } @@ -1414,7 +1394,7 @@ public List getSimilarCases(CaseSimilarityCriteria criteria) { List entries = service.getSimilarCases(criteria); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(entries); pseudonymizer.pseudonymizeDtoCollection(CaseSelectionDto.class, entries, CaseSelectionDto::isInJurisdiction, null); return entries; @@ -1461,26 +1441,16 @@ public List getCasesForDuplicateMerging( List cases = service.getCasesForDuplicateMerging(criteria, limit, showDuplicatesWithDifferentRegion, configFacade.getNameSimilarityThreshold()); - for (CaseMergeIndexDto[] caze : cases) { - pseudonymizeCasePairs(caze); + // pseudonymize cases + List flatCaseList = cases.stream().flatMap(Stream::of).collect(Collectors.toList()); + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(flatCaseList); + for (CaseMergeIndexDto caze : flatCaseList) { + pseudonymizer.pseudonymizeDto(CaseMergeIndexDto.class, caze, caze.getInJurisdiction(), null); } return cases; } - public void pseudonymizeCasePairs(CaseMergeIndexDto[] cazePair) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - - Arrays.stream(cazePair).forEach(caze -> { - Boolean isInJurisdiction = caze.getInJurisdiction(); - pseudonymizer.pseudonymizeDto( - CaseMergeIndexDto.class, - caze, - isInJurisdiction, - c -> pseudonymizer.pseudonymizeDto(AgeAndBirthDateDto.class, caze.getAgeAndBirthDate(), isInJurisdiction, null)); - }); - } - @RightsAllowed(UserRight._CASE_EDIT) public void updateCompleteness(String caseUuid) { service.updateCompleteness(caseUuid); @@ -1488,8 +1458,7 @@ public void updateCompleteness(String caseUuid) { @Override public CaseDataDto getCaseDataByUuid(String uuid) { - // todo this plainly duplicates getByUuid from AbstractCoreFacade - return toPseudonymizedDto(service.getByUuid(uuid, true)); + return getByUuid(uuid); } private CaseDataDto getCaseDataWithoutPseudonyimization(String uuid) { @@ -1740,7 +1709,7 @@ private CaseDataDto caseSave( throws ValidationRuntimeException { SymptomsHelper.updateIsSymptomatic(dto.getSymptoms()); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingCaze); restorePseudonymizedDto(dto, existingCaseDto, existingCaze, pseudonymizer); @@ -2917,34 +2886,26 @@ public static CaseReferenceDto toReferenceDto(Case entity) { } @Override - public void pseudonymizeDto(Case source, CaseDataDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + public void pseudonymizeDto(Case source, CaseDataDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (dto != null) { pseudonymizer.pseudonymizeDto(CaseDataDto.class, dto, inJurisdiction, c -> { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); - pseudonymizer.pseudonymizeUser(source.getClassificationUser(), currentUser, dto::setClassificationUser); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser, dto); + pseudonymizer.pseudonymizeUser(source.getClassificationUser(), currentUser, dto::setClassificationUser, dto); - pseudonymizer.pseudonymizeDto( + pseudonymizer.pseudonymizeEmbeddedDto( EpiDataDto.class, dto.getEpiData(), inJurisdiction, - e -> pseudonymizer.pseudonymizeDtoCollection( - ExposureDto.class, - e.getExposures(), - exp -> inJurisdiction, - (exp, expInJurisdiction) -> pseudonymizer.pseudonymizeDto(LocationDto.class, exp.getLocation(), expInJurisdiction, null))); + dto, + e -> pseudonymizer.pseudonymizeEmbeddedDtoCollection(ExposureDto.class, e.getExposures(), inJurisdiction, null, false, dto)); - pseudonymizer.pseudonymizeDto(HealthConditionsDto.class, c.getHealthConditions(), inJurisdiction, null); - - pseudonymizer.pseudonymizeDtoCollection( + pseudonymizer.pseudonymizeEmbeddedDtoCollection( PreviousHospitalizationDto.class, c.getHospitalization().getPreviousHospitalizations(), - h -> inJurisdiction, - null); - - pseudonymizer.pseudonymizeDto(SymptomsDto.class, dto.getSymptoms(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(MaternalHistoryDto.class, dto.getMaternalHistory(), inJurisdiction, null); + inJurisdiction, + dto); }); } } @@ -2953,7 +2914,7 @@ public void pseudonymizeDto(Case source, CaseDataDto dto, Pseudonymizer pseudony @RightsAllowed({ UserRight._CASE_EDIT, UserRight._CASE_EDIT }) - public void restorePseudonymizedDto(CaseDataDto dto, CaseDataDto existingCaseDto, Case caze, Pseudonymizer pseudonymizer) { + public void restorePseudonymizedDto(CaseDataDto dto, CaseDataDto existingCaseDto, Case caze, Pseudonymizer pseudonymizer) { if (existingCaseDto != null) { boolean inJurisdiction = service.inJurisdictionOrOwned(caze); @@ -2967,25 +2928,17 @@ public void restorePseudonymizedDto(CaseDataDto dto, CaseDataDto existingCaseDto EpiDataDto epiData = dto.getEpiData(); EpiDataDto existingEpiData = existingCaseDto.getEpiData(); - pseudonymizer.restorePseudonymizedValues(EpiDataDto.class, epiData, existingEpiData, inJurisdiction); + pseudonymizer.restoreEmbeddedPseudonymizedValues(EpiDataDto.class, epiData, existingEpiData, dto, inJurisdiction); epiData.getExposures().forEach(exposure -> { ExposureDto existingExposure = existingEpiData.getExposures().stream().filter(exp -> DataHelper.isSame(exposure, exp)).findFirst().orElse(null); if (existingExposure != null) { - pseudonymizer.restorePseudonymizedValues(ExposureDto.class, exposure, existingExposure, inJurisdiction); - pseudonymizer - .restorePseudonymizedValues(LocationDto.class, exposure.getLocation(), existingExposure.getLocation(), inJurisdiction); + pseudonymizer.restoreEmbeddedPseudonymizedValues(ExposureDto.class, exposure, existingExposure, dto, inJurisdiction); } }); - pseudonymizer.restorePseudonymizedValues( - HealthConditionsDto.class, - dto.getHealthConditions(), - existingCaseDto.getHealthConditions(), - inJurisdiction); - dto.getHospitalization() .getPreviousHospitalizations() .forEach( @@ -2995,15 +2948,12 @@ public void restorePseudonymizedDto(CaseDataDto dto, CaseDataDto existingCaseDto .filter(eh -> DataHelper.isSame(previousHospitalization, eh)) .findFirst() .ifPresent( - existingPreviousHospitalization -> pseudonymizer.restorePseudonymizedValues( + existingPreviousHospitalization -> pseudonymizer.restoreEmbeddedPseudonymizedValues( PreviousHospitalizationDto.class, previousHospitalization, existingPreviousHospitalization, + dto, inJurisdiction))); - - pseudonymizer.restorePseudonymizedValues(SymptomsDto.class, dto.getSymptoms(), existingCaseDto.getSymptoms(), inJurisdiction); - pseudonymizer - .restorePseudonymizedValues(MaternalHistoryDto.class, dto.getMaternalHistory(), existingCaseDto.getMaternalHistory(), inJurisdiction); } } @@ -3013,7 +2963,7 @@ public CaseReferenceDto convertToReferenceDto(Case source) { if (dto != null) { boolean inJurisdiction = service.inJurisdictionOrOwned(source); - Pseudonymizer.getDefault(userService::hasRight).pseudonymizeDto(CaseReferenceDto.class, dto, inJurisdiction, null); + createSimplePlaceholderPseudonymizer(Collections.singleton(dto)).pseudonymizeDto(CaseReferenceDto.class, dto, inJurisdiction, null); } return dto; @@ -4156,7 +4106,7 @@ public List getCaseFollowUpList( List visits = em.createQuery(visitsCq).getResultList(); Map resultMap = resultList.stream().collect(Collectors.toMap(CaseFollowUpDto::getUuid, Function.identity())); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createSimplePlaceholderPseudonymizer(resultList); for (CaseFollowUpDto caseFollowUpDto : resultMap.values()) { caseFollowUpDto.initVisitSize(interval + 1); @@ -4173,6 +4123,35 @@ public List getCaseFollowUpList( return resultList; } + private Pseudonymizer createPseudonymizerForDtoWithClinician( + @Nullable String pseudonymizedValue, + Collection cases) { + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService, createSpecialAccessChecker(cases), pseudonymizedValue); + + UserRightFieldAccessChecker clinicianViewRightChecker = + new UserRightFieldAccessChecker<>(UserRight.CASE_CLINICIAN_VIEW, userService.hasRight(UserRight.CASE_CLINICIAN_VIEW)); + pseudonymizer.addFieldAccessChecker(clinicianViewRightChecker, clinicianViewRightChecker); + + return pseudonymizer; + } + + @PermitAll + public Pseudonymizer createSimplePseudonymizer(Collection cases) { + return Pseudonymizer.getDefault(userService, createSpecialAccessChecker(cases)); + } + + @PermitAll + public Pseudonymizer createSimplePlaceholderPseudonymizer(Collection cases) { + return Pseudonymizer.getDefaultWithPlaceHolder(userService, createSpecialAccessChecker(cases)); + } + + private AnnotationBasedFieldAccessChecker.SpecialAccessCheck createSpecialAccessChecker( + Collection cases) { + List withSpecialAccess = specialCaseAccessService.getCaseUuidsWithSpecialAccess(cases); + + return caze -> withSpecialAccess.contains(caze.getUuid()); + } + @Override @RightsAllowed(UserRight._CASE_EDIT) public FollowUpPeriodDto calculateFollowUpUntilDate(CaseDataDto caseDto, boolean ignoreOverwrite) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseJoins.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseJoins.java index 18ca771d049..efb749c6000 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseJoins.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseJoins.java @@ -43,6 +43,7 @@ import de.symeda.sormas.backend.sample.SampleJoins; import de.symeda.sormas.backend.share.ExternalShareInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccess; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.visit.Visit; @@ -78,6 +79,7 @@ public class CaseJoins extends QueryJoins { private PersonJoins personJoins; private SampleJoins sampleJoins; private EventParticipantJoins eventParticipantJoins; + private Join specialCaseAccesses; public CaseJoins(From caze) { super(caze); @@ -334,4 +336,12 @@ public Join getSurveillanceReportJoin() { private void setSurveillanceReportJoin(Join surveillanceReportJoin) { this.surveillanceReportJoin = surveillanceReportJoin; } + + public Join getSpecialCaseAccesses() { + return getOrCreate(specialCaseAccesses, Case.SPECIAL_CASE_ACCESSES, JoinType.LEFT, this::setSpecialCaseAccesses); + } + + private void setSpecialCaseAccesses(Join specialCaseAccesses) { + this.specialCaseAccesses = specialCaseAccesses; + } } 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 2a0a6c73246..abb9344bde5 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 @@ -166,6 +166,7 @@ import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoFacadeEjb.SormasToSormasShareInfoFacadeEjbLocal; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.task.TaskService; import de.symeda.sormas.backend.therapy.Prescription; @@ -246,6 +247,8 @@ public class CaseService extends AbstractCoreAdoService { private RegionService regionService; @EJB private DistrictService districtService; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public CaseService() { super(Case.class, DeletableEntityType.CASE); @@ -1389,6 +1392,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil final CriteriaQuery cq = caseQueryContext.getQuery(); final CriteriaBuilder cb = caseQueryContext.getCriteriaBuilder(); final From casePath = caseQueryContext.getRoot(); + CaseJoins joins = caseQueryContext.getJoins(); Predicate filterResponsible = null; Predicate filter = null; @@ -1460,14 +1464,16 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case LABORATORY: final Subquery sampleSubQuery = cq.subquery(Long.class); final Root sampleRoot = sampleSubQuery.from(Sample.class); - final SampleJoins joins = new SampleJoins(sampleRoot); - final Join cazeJoin = joins.getCaze(); - sampleSubQuery.where(cb.and(cb.equal(cazeJoin, casePath), sampleService.createUserFilterWithoutAssociations(cb, joins))); + final SampleJoins sampleJoins = new SampleJoins(sampleRoot); + final Join cazeJoin = sampleJoins.getCaze(); + sampleSubQuery.where(cb.and(cb.equal(cazeJoin, casePath), sampleService.createUserFilterWithoutAssociations(cb, sampleJoins))); sampleSubQuery.select(sampleRoot.get(Sample.ID)); filter = CriteriaBuilderHelper.or(cb, filter, cb.exists(sampleSubQuery)); break; default: } + + filter = CriteriaBuilderHelper.or(cb, filter, specialCaseAccessService.createSpecialCaseAccessFilter(cb, joins.getSpecialCaseAccesses())); } // get all cases based on the user's contact association @@ -1475,7 +1481,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil || (!userFilterCriteria.isExcludeCasesFromContacts() && Boolean.TRUE.equals(userFilterCriteria.getIncludeCasesFromOtherJurisdictions()))) { ContactQueryContext contactQueryContext = - new ContactQueryContext(cb, cq, new ContactJoins(caseQueryContext.getJoins().getContacts())); + new ContactQueryContext(cb, cq, new ContactJoins(joins.getContacts())); filter = CriteriaBuilderHelper.or(cb, filter, contactService.createUserFilterWithoutCase(contactQueryContext)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/porthealthinfo/PortHealthInfoFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/porthealthinfo/PortHealthInfoFacadeEjb.java index 0b6da582538..941f1d44268 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/porthealthinfo/PortHealthInfoFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/porthealthinfo/PortHealthInfoFacadeEjb.java @@ -7,8 +7,6 @@ import de.symeda.sormas.api.caze.porthealthinfo.PortHealthInfoDto; import de.symeda.sormas.api.caze.porthealthinfo.PortHealthInfoFacade; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.Pseudonymizer; @@ -91,16 +89,12 @@ public PortHealthInfoDto getByCaseUuid(String caseUuid) { } private PortHealthInfoDto toPseudonymizedDto(PortHealthInfo portHealthInfo) { - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); PortHealthInfoDto portHealthInfoDto = toDto(portHealthInfo); pseudonymizer.pseudonymizeDto(PortHealthInfoDto.class, portHealthInfoDto, portHealthInfoService.inJurisdictionOrOwned(portHealthInfo), null); return portHealthInfoDto; } - private Pseudonymizer createPseudonymizer() { - return Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - } - @LocalBean @Stateless public static class PortHealthInfoFacadeEjbLocal extends PortHealthInfoFacadeEjb { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java index c48c6c94e19..53d7addf02e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java @@ -63,6 +63,7 @@ import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoFacadeEjb; import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareInfoHelper; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.ModelConstants; @@ -99,6 +100,8 @@ public class SurveillanceReportFacadeEjb private ManagedScheduledExecutorService executorService; @EJB private SormasToSormasCaseFacadeEjbLocal sormasToSormasCaseFacade; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public SurveillanceReportFacadeEjb() { super(); @@ -193,14 +196,24 @@ protected SurveillanceReportReferenceDto toRefDto(SurveillanceReport surveillanc } @Override - protected void pseudonymizeDto(SurveillanceReport source, SurveillanceReportDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected Pseudonymizer createPseudonymizer(List surveillanceReports) { + List withSpecialAccess = specialCaseAccessService.getSurveillanceReportUuidsWithSpecialAccess(surveillanceReports); + return Pseudonymizer.getDefault(userService, r -> withSpecialAccess.contains(r.getUuid())); + } + + @Override + protected void pseudonymizeDto( + SurveillanceReport source, + SurveillanceReportDto dto, + Pseudonymizer pseudonymizer, + boolean inJurisdiction) { User currentUser = userService.getCurrentUser(); pseudonymizer.pseudonymizeDto( SurveillanceReportDto.class, dto, inJurisdiction, - (reportDto) -> pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, reportDto::setReportingUser)); + reportDto -> pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, reportDto::setReportingUser, reportDto)); } @Override @@ -208,7 +221,7 @@ protected void restorePseudonymizedDto( SurveillanceReportDto dto, SurveillanceReportDto existingDto, SurveillanceReport existingReport, - Pseudonymizer pseudonymizer) { + Pseudonymizer pseudonymizer) { if (existingDto != null) { boolean inJurisdiction = service.inJurisdictionOrOwned(existingReport); User currentUser = userService.getCurrentUser(); @@ -271,7 +284,7 @@ public SurveillanceReportDto saveSurveillanceReport(SurveillanceReportDto dto, b throw new AccessDeniedException(I18nProperties.getString(Strings.errorSurveillanceReportNotEditable)); } - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingReport); restorePseudonymizedDto(dto, existingReportDto, existingReport, pseudonymizer); validate(dto); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/clinicalcourse/ClinicalVisitFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/clinicalcourse/ClinicalVisitFacadeEjb.java index 4d67362ad44..4133237fad0 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/clinicalcourse/ClinicalVisitFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/clinicalcourse/ClinicalVisitFacadeEjb.java @@ -8,7 +8,6 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.ejb.EJB; import javax.ejb.LocalBean; @@ -21,7 +20,6 @@ import javax.persistence.criteria.Order; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import javax.persistence.criteria.Selection; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -35,8 +33,6 @@ import de.symeda.sormas.api.clinicalcourse.ClinicalVisitFacade; import de.symeda.sormas.api.clinicalcourse.ClinicalVisitIndexDto; import de.symeda.sormas.api.common.Page; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.symptoms.SymptomsDto; import de.symeda.sormas.api.symptoms.SymptomsHelper; import de.symeda.sormas.api.user.UserRight; @@ -47,11 +43,6 @@ import de.symeda.sormas.backend.caze.CaseQueryContext; import de.symeda.sormas.backend.caze.CaseService; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; -import de.symeda.sormas.backend.infrastructure.community.Community; -import de.symeda.sormas.backend.infrastructure.district.District; -import de.symeda.sormas.backend.infrastructure.facility.Facility; -import de.symeda.sormas.backend.infrastructure.pointofentry.PointOfEntry; -import de.symeda.sormas.backend.infrastructure.region.Region; import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb; @@ -168,8 +159,8 @@ public List getIndexList(ClinicalVisitCriteria criteria, List results = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(ClinicalVisitIndexDto.class, results, v -> v.getInJurisdiction(), null); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); + pseudonymizer.pseudonymizeDtoCollection(ClinicalVisitIndexDto.class, results, ClinicalVisitIndexDto::getInJurisdiction, null); // Build the query to count positive symptoms // TODO: Re-activate when issue #964 (replace EclipseLink with Hibernate) has been done @@ -218,7 +209,7 @@ public List getIndexList(ClinicalVisitCriteria criteria, @Override public ClinicalVisitDto getClinicalVisitByUuid(String uuid) { - return convertToDto(service.getByUuid(uuid), Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(service.getByUuid(uuid), Pseudonymizer.getDefault(userService)); } @Override @@ -253,7 +244,7 @@ private ClinicalVisitDto saveClinicalVisit(ClinicalVisitDto clinicalVisit, Strin caseFacade.save(caze); } - return convertToDto(entity, Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(entity, Pseudonymizer.getDefault(userService)); } /** @@ -295,7 +286,7 @@ public List getAllActiveClinicalVisitsAfter(Date date, Integer private List toPseudonymizedDtos(List entities) { List inJurisdictionIds = service.getInJurisdictionIds(entities); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); List dtos = entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); return dtos; @@ -303,7 +294,7 @@ private List toPseudonymizedDtos(List entities) @Override public List getByUuids(List uuids) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); return service.getByUuids(uuids).stream().map(t -> convertToDto(t, pseudonymizer)).collect(Collectors.toList()); } @@ -349,33 +340,22 @@ public List getExportList(CaseCriteria criteria, Collect List resultList = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); for (ClinicalVisitExportDto exportDto : resultList) { exportDto.setSymptoms(SymptomsFacadeEjb.toSymptomsDto(symptomsService.getById(exportDto.getSymptomsId()))); Boolean inJurisdiction = exportDto.getInJurisdiction(); - pseudonymizer.pseudonymizeDto(ClinicalVisitExportDto.class, exportDto, inJurisdiction, (v) -> { - pseudonymizer.pseudonymizeDto(SymptomsDto.class, v.getSymptoms(), inJurisdiction, null); - }); + pseudonymizer.pseudonymizeDto( + ClinicalVisitExportDto.class, + exportDto, + inJurisdiction, + v -> pseudonymizer.pseudonymizeEmbeddedDto(SymptomsDto.class, v.getSymptoms(), inJurisdiction, v)); } return resultList; } - private Stream> getJurisdictionSelections(ClinicalVisitJoins joins) { - return Stream.of( - joins.getCaseReportingUser().get(User.UUID), - joins.getCaseResponsibleRegion().get(Region.UUID), - joins.getCaseResponsibleDistrict().get(District.UUID), - joins.getCaseResponsibleCommunity().get(Community.UUID), - joins.getCaseRegion().get(Region.UUID), - joins.getCaseDistrict().get(District.UUID), - joins.getCaseCommunity().get(Community.UUID), - joins.getCaseHealthFacility().get(Facility.UUID), - joins.getCasePointOfEntry().get(PointOfEntry.UUID)); - } - - public ClinicalVisitDto convertToDto(ClinicalVisit source, Pseudonymizer pseudonymizer) { + public ClinicalVisitDto convertToDto(ClinicalVisit source, Pseudonymizer pseudonymizer) { if (source == null) { return null; @@ -385,30 +365,27 @@ public ClinicalVisitDto convertToDto(ClinicalVisit source, Pseudonymizer pseudon return convertToDto(source, pseudonymizer, inJurisdiction); } - private ClinicalVisitDto convertToDto(ClinicalVisit source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private ClinicalVisitDto convertToDto(ClinicalVisit source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { ClinicalVisitDto dto = toDto(source); pseudonymizeDto(source, dto, pseudonymizer, inJurisdiction); return dto; } - private void pseudonymizeDto(ClinicalVisit source, ClinicalVisitDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private void pseudonymizeDto(ClinicalVisit source, ClinicalVisitDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (source != null && dto != null) { - pseudonymizer.pseudonymizeDto(ClinicalVisitDto.class, dto, inJurisdiction, v -> { - pseudonymizer.pseudonymizeDto(SymptomsDto.class, dto.getSymptoms(), inJurisdiction, null); - }); + pseudonymizer.pseudonymizeDto(ClinicalVisitDto.class, dto, inJurisdiction, null); } } private void restorePseudonymizedDto(ClinicalVisitDto clinicalVisit, ClinicalVisit existingClinicalVisit) { if (existingClinicalVisit != null) { - Boolean inJurisdiction = caseService.inJurisdictionOrOwned(existingClinicalVisit.getClinicalCourse().getCaze()); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + boolean inJurisdiction = caseService.inJurisdictionOrOwned(existingClinicalVisit.getClinicalCourse().getCaze()); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); ClinicalVisitDto existingDto = toDto(existingClinicalVisit); pseudonymizer.restorePseudonymizedValues(ClinicalVisitDto.class, clinicalVisit, existingDto, inJurisdiction); - pseudonymizer.restorePseudonymizedValues(SymptomsDto.class, clinicalVisit.getSymptoms(), existingDto.getSymptoms(), inJurisdiction); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractBaseEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractBaseEjb.java index e8eae43564b..07b968e4974 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractBaseEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractBaseEjb.java @@ -16,7 +16,10 @@ import de.symeda.sormas.api.BaseFacade; import de.symeda.sormas.api.EntityDto; import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.criteria.BaseCriteria; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.Pseudonymizer; @@ -92,10 +95,10 @@ public List getAllAfter(Date date, Integer batchSize, String lastSynchroniz } public DTO toPseudonymizedDto(ADO source) { - return toPseudonymizedDto(source, createPseudonymizer()); + return toPseudonymizedDto(source, createPseudonymizer(source)); } - public DTO toPseudonymizedDto(ADO source, Pseudonymizer pseudonymizer) { + public DTO toPseudonymizedDto(ADO source, Pseudonymizer pseudonymizer) { if (source == null) { return null; @@ -105,7 +108,7 @@ public DTO toPseudonymizedDto(ADO source, Pseudonymizer pseudonymizer) { return toPseudonymizedDto(source, pseudonymizer, inJurisdiction); } - public DTO toPseudonymizedDto(ADO source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + public DTO toPseudonymizedDto(ADO source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (source == null) { return null; @@ -121,7 +124,7 @@ protected List toPseudonymizedDtos(List adoList) { return Collections.emptyList(); } - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(adoList); List jurisdictionIds = service.getInJurisdictionIds(adoList); return adoList.stream() @@ -130,11 +133,31 @@ protected List toPseudonymizedDtos(List adoList) { } protected void restorePseudonymizedDto(DTO dto, DTO existingDto, ADO entity) { - restorePseudonymizedDto(dto, existingDto, entity, createPseudonymizer()); + restorePseudonymizedDto(dto, existingDto, entity, createPseudonymizer(entity)); } - protected Pseudonymizer createPseudonymizer() { - return Pseudonymizer.getDefault(userService::hasRight); + protected Pseudonymizer createPseudonymizer(ADO ado) { + return createPseudonymizer(ado != null ? Collections.singletonList(ado) : Collections.emptyList()); + } + + protected Pseudonymizer createPseudonymizer(List adoList) { + return Pseudonymizer.getDefault(userService); + } + + protected Pseudonymizer createGenericPseudonymizer() { + return Pseudonymizer.getDefault(userService); + } + + protected Pseudonymizer createGenericPseudonymizer(SpecialAccessCheck specialAccessCheck) { + return Pseudonymizer.getDefault(userService, specialAccessCheck); + } + + protected Pseudonymizer createGenericPlaceholderPseudonymizer() { + return Pseudonymizer.getDefault(userService, I18nProperties.getCaption(Captions.inaccessibleValue)); + } + + protected Pseudonymizer createGenericPlaceholderPseudonymizer(SpecialAccessCheck specialAccessCheck) { + return Pseudonymizer.getDefault(userService, specialAccessCheck, I18nProperties.getCaption(Captions.inaccessibleValue)); } protected abstract ADO fillOrBuildEntity(@NotNull DTO source, ADO target, boolean checkChangeDate); @@ -151,9 +174,9 @@ protected List toRefDtos(Stream adoStream) { return adoStream.map(this::toRefDto).collect(Collectors.toList()); } - protected abstract void pseudonymizeDto(ADO source, DTO dto, Pseudonymizer pseudonymizer, boolean inJurisdiction); + protected abstract void pseudonymizeDto(ADO source, DTO dto, Pseudonymizer pseudonymizer, boolean inJurisdiction); - protected abstract void restorePseudonymizedDto(DTO dto, DTO existingDto, ADO entity, Pseudonymizer pseudonymizer); + protected abstract void restorePseudonymizedDto(DTO dto, DTO existingDto, ADO entity, Pseudonymizer pseudonymizer); protected boolean isAdoInJurisdiction(ADO ado) { return service.inJurisdictionOrOwned(ado); 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 b710495d202..dc0110e82b3 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 @@ -72,7 +72,7 @@ public DTO doSave(@Valid @NotNull DTO dto) { DTO existingDto = toDto(existingAdo); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingAdo); restorePseudonymizedDto(dto, existingDto, existingAdo, pseudonymizer); validate(dto); 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 51be7fe682a..8219f7860aa 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 @@ -48,6 +48,7 @@ import de.symeda.sormas.backend.immunization.ImmunizationFacadeEjb; import de.symeda.sormas.backend.infrastructure.central.CentralInfraSyncFacade; import de.symeda.sormas.backend.report.WeeklyReportFacadeEjb.WeeklyReportFacadeEjbLocal; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessFacadeEjb.SpecialCaseAccessFacadeEjbLocal; import de.symeda.sormas.backend.systemevent.SystemEventFacadeEjb.SystemEventFacadeEjbLocal; import de.symeda.sormas.backend.task.TaskFacadeEjb.TaskFacadeEjbLocal; import de.symeda.sormas.backend.travelentry.TravelEntryFacadeEjb; @@ -90,6 +91,8 @@ public class CronService { private CentralInfraSyncFacade centralInfraSyncFacade; @EJB private CoreEntityDeletionService coreEntityDeletionService; + @EJB + private SpecialCaseAccessFacadeEjbLocal specialCaseAccessFacade; @Schedule(hour = "*", minute = "*/" + TASK_UPDATE_INTERVAL, second = "0", persistent = false) public void sendNewAndDueTaskMessages() { @@ -270,7 +273,7 @@ public void archiveImmunizations() { if (daysAfterImmunizationsGetsArchived >= 1) { immunizationFacade.archiveAllArchivableImmunizations(daysAfterImmunizationsGetsArchived); } - } +} @Schedule(hour = "2", minute = "30", persistent = false) public void archiveTravelEntry() { @@ -282,4 +285,8 @@ public void archiveTravelEntry() { } } + @Schedule(hour = "2", minute = "30", persistent = false) + public void deleteExpiredSpecialCaseAccesses() { + specialCaseAccessFacade.deleteExpiredSpecialCaseAccesses(); + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/Contact.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/Contact.java index f800d0500a1..e6842a8f983 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/Contact.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/Contact.java @@ -52,6 +52,7 @@ import de.symeda.sormas.api.contact.ContactStatus; import de.symeda.sormas.api.contact.EndOfQuarantineReason; import de.symeda.sormas.api.contact.FollowUpStatus; +import de.symeda.sormas.api.contact.IsContact; import de.symeda.sormas.api.contact.QuarantineType; import de.symeda.sormas.api.contact.TracingApp; import de.symeda.sormas.api.externaldata.HasExternalData; @@ -75,7 +76,7 @@ import de.symeda.sormas.backend.visit.Visit; @Entity(name = "contact") -public class Contact extends CoreAdo implements SormasToSormasShareable, HasExternalData { +public class Contact extends CoreAdo implements IsContact, SormasToSormasShareable, HasExternalData { private static final long serialVersionUID = -7764607075875188799L; @@ -515,8 +516,7 @@ public ContactReferenceDto toReference() { getUuid(), contactPerson.getFirstName(), contactPerson.getLastName(), - getCaze() != null ? getCaze().getPerson().getFirstName() : null, - getCaze() != null ? getCaze().getPerson().getLastName() : null); + getCaze() != null ? getCaze().toReference() : null); } @OneToMany(cascade = {}, mappedBy = Task.CONTACT) 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 b307d7260c8..71240358e5e 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 @@ -75,7 +75,6 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.Language; import de.symeda.sormas.api.VisitOrigin; -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.DeletableEntityType; @@ -100,6 +99,7 @@ import de.symeda.sormas.api.contact.ContactSimilarityCriteria; import de.symeda.sormas.api.contact.ContactStatus; import de.symeda.sormas.api.contact.FollowUpStatus; +import de.symeda.sormas.api.contact.IsContact; import de.symeda.sormas.api.contact.MapContactDto; import de.symeda.sormas.api.contact.MergeContactIndexDto; import de.symeda.sormas.api.contact.SimilarContactDto; @@ -117,7 +117,6 @@ import de.symeda.sormas.api.followup.FollowUpDto; import de.symeda.sormas.api.followup.FollowUpLogic; import de.symeda.sormas.api.followup.FollowUpPeriodDto; -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; @@ -125,7 +124,6 @@ import de.symeda.sormas.api.importexport.ExportConfigurationDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.sample.SampleCriteria; @@ -148,6 +146,8 @@ import de.symeda.sormas.api.utils.UtilDate; import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.utils.YesNoUnknown; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; +import de.symeda.sormas.api.uuid.AbstractUuidDto; import de.symeda.sormas.api.visit.VisitDto; import de.symeda.sormas.api.visit.VisitResultDto; import de.symeda.sormas.api.visit.VisitStatus; @@ -200,6 +200,7 @@ import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoFacadeEjb; import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareInfoHelper; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb; import de.symeda.sormas.backend.task.Task; @@ -285,6 +286,8 @@ public class ContactFacadeEjb private ContactService contactService; @EJB private UserRoleFacadeEjb.UserRoleFacadeEjbLocal userRoleFacadeEjb; + @EJB + private SpecialCaseAccessService specialCaseAccessService; @Resource private ManagedScheduledExecutorService executorService; @@ -868,7 +871,7 @@ public List getExportList( // Adding a second query here is not perfect, but selecting the last cooperative visit with a criteria query // doesn't seem to be possible and using a native query is not an option because of user filters - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(exportContacts)); for (ContactExportDto exportContact : exportContacts) { boolean inJurisdiction = exportContact.getInJurisdiction(); @@ -885,7 +888,7 @@ public List getExportList( if (lastCooperativeVisit != null) { SymptomsDto symptoms = SymptomsFacadeEjb.toSymptomsDto(lastCooperativeVisit.getSymptoms()); - pseudonymizer.pseudonymizeDto(SymptomsDto.class, symptoms, inJurisdiction, null); + pseudonymizer.pseudonymizeEmbeddedDto(SymptomsDto.class, symptoms, inJurisdiction, exportContact); exportContact.setLastCooperativeVisitDate(lastCooperativeVisit.getVisitDateTime()); exportContact.setLastCooperativeVisitSymptoms(SymptomsHelper.buildSymptomsHumanString(symptoms, true, userLanguage)); @@ -1028,6 +1031,7 @@ public List getVisitSummaryExportList( cq.multiselect( contactRoot.get(Contact.UUID), contactRoot.get(Contact.ID), + contactJoins.getCaze().get(Case.UUID), contactPerson.get(Person.FIRST_NAME), contactPerson.get(Person.LAST_NAME), cb. selectCase() @@ -1044,7 +1048,7 @@ cb. selectCase() List visitSummaries = QueryHelper.getResultList(em, cq, first, max); if (!visitSummaries.isEmpty()) { - List visitSummaryUuids = visitSummaries.stream().map(e -> e.getUuid()).collect(Collectors.toList()); + List visitSummaryUuids = visitSummaries.stream().map(AbstractUuidDto::getUuid).collect(Collectors.toList()); CriteriaQuery visitsCq = cb.createQuery(VisitSummaryExportDetails.class); Root visitsCqRoot = visitsCq.from(Contact.class); @@ -1066,10 +1070,10 @@ cb. selectCase() Map visitSummaryMap = visitSummaries.stream().collect(Collectors.toMap(VisitSummaryExportDto::getContactId, Function.identity())); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(visitSummaries)); visitSummaryDetails.forEach(v -> { SymptomsDto symptoms = SymptomsFacadeEjb.toSymptomsDto(v.getSymptoms()); - pseudonymizer.pseudonymizeDto(SymptomsDto.class, symptoms, v.getInJurisdiction(), null); + pseudonymizer.pseudonymizeEmbeddedDto(SymptomsDto.class, symptoms, v.getInJurisdiction(), null); visitSummaryMap.get(v.getContactId()) .getVisitDetails() @@ -1162,6 +1166,7 @@ public List getContactFollowUpList( .concat( Stream.of( contact.get(Contact.UUID), + joins.getCasePerson().get(Case.UUID), contact.get(Contact.CHANGE_DATE), joins.getPerson().get(Person.FIRST_NAME), joins.getPerson().get(Person.LAST_NAME), @@ -1217,7 +1222,7 @@ public List getContactFollowUpList( Map resultMap = resultList.stream().collect(Collectors.toMap(ContactFollowUpDto::getUuid, Function.identity())); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(resultMap.values())); for (ContactFollowUpDto contactFollowUpDto : resultMap.values()) { contactFollowUpDto.initVisitSize(interval + 1); @@ -1309,10 +1314,10 @@ public List getIndexList(ContactCriteria contactCriteria, Integ dtos.addAll(QueryHelper.getResultList(em, cq, new ContactIndexDtoResultTransformer(), null, null)); }); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(dtos)); pseudonymizer.pseudonymizeDtoCollection(ContactIndexDto.class, dtos, ContactIndexDto::getInJurisdiction, (c, isInJurisdiction) -> { if (c.getCaze() != null) { - pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, c.getCaze(), c.getCaseInJurisdiction(), null); + pseudonymizer.pseudonymizeEmbeddedDto(CaseReferenceDto.class, c.getCaze(), c.getCaseInJurisdiction(), c); } }); dtos.forEach(contact -> { @@ -1335,7 +1340,7 @@ public List getEntriesList(String personUuid, Integer first Long personId = personFacade.getPersonIdByUuid(personUuid); List entries = service.getEntriesList(personId, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(entries)); pseudonymizer.pseudonymizeDtoCollection(ContactListEntryDto.class, entries, ContactListEntryDto::isInJurisdiction, null); return entries; @@ -1376,12 +1381,12 @@ public List getIndexDetailedList( } } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(dtos)); User currentUser = userService.getCurrentUser(); pseudonymizer.pseudonymizeDtoCollection(ContactIndexDetailedDto.class, dtos, c -> c.getInJurisdiction(), (c, isInJurisdiction) -> { - pseudonymizer.pseudonymizeUser(userService.getByUuid(c.getReportingUser().getUuid()), currentUser, c::setReportingUser); + pseudonymizer.pseudonymizeUser(userService.getByUuid(c.getReportingUser().getUuid()), currentUser, c::setReportingUser, c); if (c.getCaze() != null) { - pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, c.getCaze(), c.getCaseInJurisdiction(), null); + pseudonymizer.pseudonymizeEmbeddedDto(CaseReferenceDto.class, c.getCaze(), c.getCaseInJurisdiction(), c); } }); @@ -1688,14 +1693,28 @@ public int getFollowUpUntilCount(ContactCriteria contactCriteria) { @Override protected List toPseudonymizedDtos(List adoList) { + if (adoList == null) { + return Collections.emptyList(); + } Map jurisdictionsFlags = service.getJurisdictionsFlags(adoList); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(adoList); return adoList.stream().map(p -> toPseudonymizedDto(p, pseudonymizer, jurisdictionsFlags.get(p.getId()))).collect(Collectors.toList()); } @Override - public ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymizer) { + protected Pseudonymizer createPseudonymizer(List contacts) { + return Pseudonymizer.getDefault(userService, createSpecialAccessChecker(contacts)); + } + + private SpecialAccessCheck createSpecialAccessChecker(Collection contacts) { + List withSpecialAccess = specialCaseAccessService.getContactUuidsWithSpecialAccess(contacts); + + return c -> withSpecialAccess.contains(c.getUuid()); + } + + @Override + public ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymizer) { if (source == null) { return null; @@ -1707,12 +1726,12 @@ public ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymizer @Deprecated @Override - public ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + public ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { throw new UnsupportedOperationException("Use variant with jurisdictionFlags parameter"); } - protected ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymizer, ContactJurisdictionFlagsDto jurisdictionFlags) { + private ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymizer, ContactJurisdictionFlagsDto jurisdictionFlags) { ContactDto dto = toDto(source); pseudonymizeDto(source, dto, pseudonymizer, jurisdictionFlags); @@ -1721,45 +1740,51 @@ protected ContactDto toPseudonymizedDto(Contact source, Pseudonymizer pseudonymi @Deprecated @Override - protected void pseudonymizeDto(Contact source, ContactDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected void pseudonymizeDto(Contact source, ContactDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { throw new UnsupportedOperationException("Use variant with jurisdictionFlags parameter"); } - protected void pseudonymizeDto(Contact source, ContactDto dto, Pseudonymizer pseudonymizer, ContactJurisdictionFlagsDto jurisdictionFlags) { + private void pseudonymizeDto( + Contact source, + ContactDto dto, + Pseudonymizer pseudonymizer, + ContactJurisdictionFlagsDto jurisdictionFlags) { boolean inJurisdiction = jurisdictionFlags.getInJurisdiction(); if (dto != null) { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeDto(ContactDto.class, dto, inJurisdiction, (c) -> { - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer.pseudonymizeDto(ContactDto.class, dto, inJurisdiction, c -> { + pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser, c); if (c.getCaze() != null) { - pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, c.getCaze(), jurisdictionFlags.getCaseInJurisdiction(), null); + pseudonymizer.pseudonymizeEmbeddedDto(CaseReferenceDto.class, c.getCaze(), jurisdictionFlags.getCaseInJurisdiction(), c); } - pseudonymizer.pseudonymizeDto( + pseudonymizer.pseudonymizeEmbeddedDto( EpiDataDto.class, dto.getEpiData(), inJurisdiction, - e -> pseudonymizer - .pseudonymizeDtoCollection(ExposureDto.class, e.getExposures(), exp -> inJurisdiction, (exp, expInJurisdiction) -> { - pseudonymizer.pseudonymizeDto(LocationDto.class, exp.getLocation(), expInJurisdiction, null); - })); + c, + e -> pseudonymizer.pseudonymizeEmbeddedDtoCollection(ExposureDto.class, e.getExposures(), inJurisdiction, c)); }); } } @Override - protected void restorePseudonymizedDto(ContactDto dto, ContactDto existingContactDto, Contact existingContact, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto( + ContactDto dto, + ContactDto existingContactDto, + Contact existingContact, + Pseudonymizer pseudonymizer) { if (existingContactDto != null) { boolean isInJurisdiction = service.inJurisdictionOrOwned(existingContact); User currentUser = userService.getCurrentUser(); String followUpComment = null; - if (dto.isPseudonymized() || !pseudonymizer.isAccessible(ContactDto.class, ContactDto.FOLLOW_UP_COMMENT, isInJurisdiction)) { + if (dto.isPseudonymized() || !pseudonymizer.isAccessible(ContactDto.class, ContactDto.FOLLOW_UP_COMMENT, dto, isInJurisdiction)) { /** * Usually, pseudonymized values are not edited, so the pseudonymizer can just overwrite them in the dto when restoring. * One exception is the followUpComment, which can be pseudonymized, but still be edited by automatic system messages, @@ -1771,7 +1796,8 @@ protected void restorePseudonymizedDto(ContactDto dto, ContactDto existingContac pseudonymizer.restoreUser(existingContact.getReportingUser(), currentUser, dto, dto::setReportingUser); pseudonymizer.restorePseudonymizedValues(ContactDto.class, dto, existingContactDto, isInJurisdiction); - pseudonymizer.restorePseudonymizedValues(EpiDataDto.class, dto.getEpiData(), existingContactDto.getEpiData(), isInJurisdiction); + pseudonymizer + .restoreEmbeddedPseudonymizedValues(EpiDataDto.class, dto.getEpiData(), existingContactDto.getEpiData(), dto, isInJurisdiction); if (followUpComment != null) { dto.addToFollowUpComment(followUpComment); @@ -1785,19 +1811,10 @@ private ContactReferenceDto convertToReferenceDto(Contact source) { if (source != null && dto != null) { final ContactJurisdictionFlagsDto contactJurisdictionFlagsDto = service.getJurisdictionFlags(source); boolean inJurisdiction = contactJurisdictionFlagsDto.getInJurisdiction(); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); - - pseudonymizer.pseudonymizeDto(ContactReferenceDto.class, dto, inJurisdiction, (c) -> { - if (source.getCaze() != null) { - pseudonymizer.pseudonymizeDto( - ContactReferenceDto.PersonName.class, - c.getCaseName(), - contactJurisdictionFlagsDto.getCaseInJurisdiction(), - null); - } + Pseudonymizer pseudonymizer = + createGenericPseudonymizer(createSpecialAccessChecker(Collections.singletonList(source))); - pseudonymizer.pseudonymizeDto(ContactReferenceDto.PersonName.class, c.getContactName(), inJurisdiction, null); - }); + pseudonymizer.pseudonymizeDto(ContactReferenceDto.class, dto, inJurisdiction, null); } return dto; @@ -2074,13 +2091,8 @@ public List getMatchingContacts(ContactSimilarityCriteria cri List contacts = em.createQuery(cq).getResultList(); - Pseudonymizer pseudonymizer = createPseudonymizer(); - pseudonymizer.pseudonymizeDtoCollection(SimilarContactDto.class, contacts, SimilarContactDto::getInJurisdiction, (c, isInJurisdiction) -> { - CaseReferenceDto contactCase = c.getCaze(); - if (contactCase != null) { - pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, contactCase, c.getCaseInJurisdiction(), null); - } - }); + Pseudonymizer pseudonymizer = createGenericPseudonymizer(createSpecialAccessChecker(contacts)); + pseudonymizer.pseudonymizeDtoCollection(SimilarContactDto.class, contacts, SimilarContactDto::getInJurisdiction, null, false); if (Boolean.TRUE.equals(criteria.getExcludePseudonymized())) { contacts = contacts.stream().filter(c -> !c.isPseudonymized()).collect(Collectors.toList()); @@ -2089,10 +2101,6 @@ public List getMatchingContacts(ContactSimilarityCriteria cri return contacts; } - public boolean hasSimilarContacts(ContactSimilarityCriteria criteria) { - return service.exists((cb, root, cq) -> getSimilarityFilters(criteria, cb, root, new ContactQueryContext(cb, cq, root))); - } - private Predicate getSimilarityFilters( ContactSimilarityCriteria criteria, CriteriaBuilder cb, @@ -2253,27 +2261,17 @@ public void deleteAsDuplicate(String uuid, String duplicateOfUuid) { public List getContactsForDuplicateMerging(ContactCriteria criteria, @Min(1) Integer limit, boolean ignoreRegion) { List contacts = service.getContactsForDuplicateMerging(criteria, limit, ignoreRegion); - for (MergeContactIndexDto[] contact : contacts) { - pseudonymizeContactPairs(contact); + List flatContactList = contacts.stream().flatMap(Stream::of).collect(Collectors.toList()); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(flatContactList)); + + for (MergeContactIndexDto contact : flatContactList) { + Boolean isInJurisdiction = contact.getInJurisdiction(); + pseudonymizer.pseudonymizeDto(MergeContactIndexDto.class, contact, isInJurisdiction, null); } return contacts; } - public void pseudonymizeContactPairs(MergeContactIndexDto[] contactPair) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - - Arrays.stream(contactPair).forEach(contact -> { - Boolean isInJurisdiction = contact.getInJurisdiction(); - pseudonymizer.pseudonymizeDto(MergeContactIndexDto.class, contact, isInJurisdiction, c -> { - pseudonymizer.pseudonymizeDto(AgeAndBirthDateDto.class, contact.getAgeAndBirthDate(), isInJurisdiction, null); - if (contact.getCaze() != null) { - pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, contact.getCaze(), contact.getCaseInJurisdiction(), null); - } - }); - }); - } - @Override @RightsAllowed(UserRight._CONTACT_EDIT) public void updateCompleteness(String uuid) { @@ -2374,11 +2372,6 @@ private float calculateCompleteness(Contact contact) { return completeness; } - private User getRandomDistrictContactResponsible(District district) { - - return userService.getRandomDistrictUser(district, UserRight.CONTACT_RESPONSIBLE); - } - private String getNumberOfDosesFromVaccinations(Vaccination vaccination) { return vaccination != null ? vaccination.getVaccineDose() : ""; } @@ -2400,5 +2393,4 @@ public ContactFacadeEjbLocal(ContactService service) { super(service); } } - } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFollowUpDtoResultTransformer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFollowUpDtoResultTransformer.java index 960f8363620..410c115b8eb 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFollowUpDtoResultTransformer.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFollowUpDtoResultTransformer.java @@ -34,7 +34,7 @@ public ContactFollowUpDto transformTuple(Object[] tuple, String[] aliases) { //@formatter:off return new ContactFollowUpDto( - (String) tuple[++index], (Date) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], + (String) tuple[++index], (String) tuple[++index], (Date) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (Date) tuple[++index], (Date) tuple[++index], (Date) tuple[++index], (SymptomJournalStatus) tuple[++index], (Disease) tuple[++index], (Boolean) tuple[++index] 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 b2aa0d1df70..b868f64f239 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 @@ -1953,6 +1953,7 @@ public List getEntriesList(Long personId, Integer first, In cq.multiselect( contact.get(Contact.UUID), + contactQueryContext.getJoins().getCaze().get(Case.UUID), contact.get(Contact.CONTACT_STATUS), contact.get(Contact.DISEASE), contact.get(Contact.CONTACT_CLASSIFICATION), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/transformers/ContactListEntryDtoResultTransformer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/transformers/ContactListEntryDtoResultTransformer.java index b9c980a2637..4ffe15a49a1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/transformers/ContactListEntryDtoResultTransformer.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/transformers/ContactListEntryDtoResultTransformer.java @@ -19,13 +19,14 @@ public class ContactListEntryDtoResultTransformer implements ResultTransformer { public Object transformTuple(Object[] objects, String[] strings) { return new ContactListEntryDto( (String) objects[0], - (ContactStatus) objects[1], - (Disease) objects[2], - (ContactClassification) objects[3], - (ContactCategory) objects[4], - (Date) objects[5], + (String) objects[1], + (ContactStatus) objects[2], + (Disease) objects[3], + (ContactClassification) objects[4], + (ContactCategory) objects[5], (Date) objects[6], - (boolean) objects[7]); + (Date) objects[7], + (boolean) objects[8]); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java index b921e7024fa..d6b5892daa1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java @@ -493,7 +493,11 @@ protected CustomizableEnumValueReferenceDto toRefDto(CustomizableEnumValue custo } @Override - protected void pseudonymizeDto(CustomizableEnumValue source, CustomizableEnumValueDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected void pseudonymizeDto( + CustomizableEnumValue source, + CustomizableEnumValueDto dto, + Pseudonymizer pseudonymizer, + boolean inJurisdiction) { // Customizable enum values don't need to be pseudonymized } @@ -502,7 +506,7 @@ protected void restorePseudonymizedDto( CustomizableEnumValueDto dto, CustomizableEnumValueDto existingDto, CustomizableEnumValue entity, - Pseudonymizer pseudonymizer) { + Pseudonymizer pseudonymizer) { // Customizable enum values don't need to be pseudonymized } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java index 30dc136c6bc..6f727a58d5e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java @@ -98,7 +98,7 @@ public class DocumentFacadeEjb implements DocumentFacade { @Override public DocumentDto getDocumentByUuid(String uuid) { - return convertToDto(documentService.getByUuid(uuid), Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(documentService.getByUuid(uuid), Pseudonymizer.getDefault(userService)); } @Override @@ -121,7 +121,7 @@ public DocumentDto saveDocument(@Valid DocumentDto dto, byte[] content) throws I documentService.persist(document); documentService.doFlush(); - return convertToDto(document, Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(document, Pseudonymizer.getDefault(userService)); } catch (Throwable t) { try { documentStorageService.delete(storageReference); @@ -181,18 +181,18 @@ public void deleteDocument(String uuid) { @Override public List getDocumentsRelatedToEntity(DocumentRelatedEntityType type, String uuid) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); return documentService.getRelatedToEntity(type, uuid).stream().map(d -> convertToDto(d, pseudonymizer)).collect(Collectors.toList()); } - @Override - public List getReferencesRelatedToEntity(DocumentRelatedEntityType type, String uuid, Set fileExtensions) { - return documentService.getReferencesRelatedToEntity(type, uuid, fileExtensions); - } + @Override + public List getReferencesRelatedToEntity(DocumentRelatedEntityType type, String uuid, Set fileExtensions) { + return documentService.getReferencesRelatedToEntity(type, uuid, fileExtensions); + } @Override public Map> getDocumentsRelatedToEntities(DocumentCriteria criteria, List sortProperties) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); List allDocuments = documentService.getRelatedToEntities(criteria.getDocumentRelatedEntityType(), criteria.getEntityUuids(), sortProperties); return allDocuments.stream().map(d -> convertToDto(d, pseudonymizer)).collect(Collectors.groupingBy(DocumentDto::getRelatedEntityUuid)); @@ -236,7 +236,7 @@ public Document fillOrBuildEntity(DocumentDto source, Document target, boolean c return target; } - public DocumentDto convertToDto(Document source, Pseudonymizer pseudonymizer) { + public DocumentDto convertToDto(Document source, Pseudonymizer pseudonymizer) { DocumentDto documentDto = toDto(source); pseudonymizeDto(source, documentDto, pseudonymizer); @@ -244,14 +244,14 @@ public DocumentDto convertToDto(Document source, Pseudonymizer pseudonymizer) { return documentDto; } - private void pseudonymizeDto(Document document, DocumentDto dto, Pseudonymizer pseudonymizer) { + private void pseudonymizeDto(Document document, DocumentDto dto, Pseudonymizer pseudonymizer) { if (dto != null) { boolean inJurisdiction = isInJurisdiction(dto); pseudonymizer.pseudonymizeDto( DocumentDto.class, dto, inJurisdiction, - (e) -> pseudonymizer.pseudonymizeUser(document.getUploadingUser(), userService.getCurrentUser(), dto::setUploadingUser)); + e -> pseudonymizer.pseudonymizeUser(document.getUploadingUser(), userService.getCurrentUser(), dto::setUploadingUser, dto)); } } 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 a6d7c1a2c1f..49f0ed47447 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 @@ -37,7 +37,6 @@ 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; @@ -164,7 +163,7 @@ public List getIndexList(EnvironmentCriteria criteria, Inte environments.addAll(QueryHelper.getResultList(em, cq, null, null)); }); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(); pseudonymizer.pseudonymizeDtoCollection(EnvironmentIndexDto.class, environments, EnvironmentIndexDto::isInJurisdiction, null); return environments; @@ -394,16 +393,20 @@ public void restore(String uuid) { } @Override - protected void pseudonymizeDto(Environment source, EnvironmentDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected void pseudonymizeDto(Environment source, EnvironmentDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (dto != null) { pseudonymizer.pseudonymizeDto(EnvironmentDto.class, dto, inJurisdiction, e -> { - pseudonymizer.pseudonymizeUser(source.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser, dto); }); } } @Override - protected void restorePseudonymizedDto(EnvironmentDto dto, EnvironmentDto existingDto, Environment entity, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto( + EnvironmentDto dto, + EnvironmentDto existingDto, + Environment entity, + Pseudonymizer pseudonymizer) { if (existingDto != null) { boolean inJurisdiction = service.inJurisdictionOrOwned(entity); pseudonymizer.restorePseudonymizedValues(EnvironmentDto.class, dto, existingDto, inJurisdiction); 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 7245450f90a..7c7fa3216fd 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 @@ -57,7 +57,6 @@ import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleIndexDto; import de.symeda.sormas.api.environment.environmentsample.EnvironmentSampleReferenceDto; import de.symeda.sormas.api.environment.environmentsample.Pathogen; -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; @@ -128,7 +127,7 @@ public EnvironmentSampleDto save(@Valid @NotNull EnvironmentSampleDto dto) { validateUserRights(dto, existingSample); EnvironmentSampleDto existingDto = toDto(existingSample); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingSample); restorePseudonymizedDto(dto, existingDto, existingSample, pseudonymizer); validate(dto); @@ -224,7 +223,7 @@ public List getIndexList( indexList.addAll(samples); }); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(); pseudonymizer.pseudonymizeDtoCollection(EnvironmentSampleIndexDto.class, indexList, EnvironmentSampleIndexDto::isInJurisdiction, null); return indexList; @@ -633,11 +632,15 @@ protected EnvironmentSampleReferenceDto toRefDto(EnvironmentSample environmentSa } @Override - protected void pseudonymizeDto(EnvironmentSample source, EnvironmentSampleDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected void pseudonymizeDto( + EnvironmentSample source, + EnvironmentSampleDto dto, + Pseudonymizer pseudonymizer, + boolean inJurisdiction) { if (dto != null) { pseudonymizer.pseudonymizeDto(EnvironmentSampleDto.class, dto, inJurisdiction, e -> { - pseudonymizer.pseudonymizeDto(EnvironmentReferenceDto.class, e.getEnvironment(), inJurisdiction, null); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser); + pseudonymizer.pseudonymizeEmbeddedDto(EnvironmentReferenceDto.class, e.getEnvironment(), inJurisdiction, null); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser, dto); }); } } @@ -647,7 +650,7 @@ protected void restorePseudonymizedDto( EnvironmentSampleDto dto, EnvironmentSampleDto existingDto, EnvironmentSample entity, - Pseudonymizer pseudonymizer) { + Pseudonymizer pseudonymizer) { if (existingDto != null) { boolean inJurisdiction = service.inJurisdictionOrOwned(entity); pseudonymizer.restorePseudonymizedValues(EnvironmentSampleDto.class, dto, existingDto, inJurisdiction); 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 187e54add85..2f6377ec9d5 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 @@ -85,7 +85,6 @@ import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException; import de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolRuntimeException; 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; import de.symeda.sormas.api.i18n.Validations; @@ -257,9 +256,10 @@ public Map getEventCountByDisease(EventCriteria eventCriteria) { @Override public EventDto getEventByUuid(String uuid, boolean detailedReferences) { + Event event = service.getByUuid(uuid); return (detailedReferences) - ? convertToDetailedReferenceDto(service.getByUuid(uuid), createPseudonymizer()) - : toPseudonymizedDto(service.getByUuid(uuid)); + ? convertToDetailedReferenceDto(event, createPseudonymizer(event)) + : toPseudonymizedDto(event); } @Override @@ -294,7 +294,7 @@ public EventDto save(@NotNull EventDto dto, boolean checkChangeDate, boolean int EventDto existingDto = toDto(existingEvent); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingEvent); restorePseudonymizedDto(dto, existingDto, existingEvent, pseudonymizer); validate(dto); @@ -673,7 +673,7 @@ public List getIndexList(EventCriteria eventCriteria, Integer fir } } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(); pseudonymizer.pseudonymizeDtoCollection(EventIndexDto.class, indexList, EventIndexDto::getInJurisdictionOrOwned, (c, isInJurisdiction) -> { }); @@ -1271,7 +1271,7 @@ protected EventReferenceDto toRefDto(Event event) { return toReferenceDto(event); } - public EventDto convertToDetailedReferenceDto(Event source, Pseudonymizer pseudonymizer) { + public EventDto convertToDetailedReferenceDto(Event source, Pseudonymizer pseudonymizer) { EventDto eventDto = toDto(source); eventDto.setSuperordinateEvent(EventFacadeEjb.toDetailedReferenceDto(source.getSuperordinateEvent())); @@ -1281,16 +1281,18 @@ public EventDto convertToDetailedReferenceDto(Event source, Pseudonymizer pseudo } @Override - protected void pseudonymizeDto(Event event, EventDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected void pseudonymizeDto(Event event, EventDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (dto != null) { - pseudonymizer.pseudonymizeDto(EventDto.class, dto, inJurisdiction, e -> { - pseudonymizer.pseudonymizeUser(event.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser); - }); + pseudonymizer.pseudonymizeDto( + EventDto.class, + dto, + inJurisdiction, + e -> pseudonymizer.pseudonymizeUser(event.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser, dto)); } } - protected void restorePseudonymizedDto(EventDto dto, EventDto existingDto, Event event, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto(EventDto dto, EventDto existingDto, Event event, Pseudonymizer pseudonymizer) { if (existingDto != null) { boolean inJurisdiction = service.inJurisdictionOrOwned(event); pseudonymizer.restorePseudonymizedValues(EventDto.class, dto, existingDto, inJurisdiction); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipant.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipant.java index 162c3b54060..0b8e5c0d87b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipant.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipant.java @@ -32,6 +32,7 @@ import javax.persistence.OneToMany; import de.symeda.sormas.api.caze.VaccinationStatus; +import de.symeda.sormas.api.event.IsEventParticipant; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.common.CoreAdo; import de.symeda.sormas.backend.infrastructure.district.District; @@ -44,7 +45,7 @@ import de.symeda.sormas.backend.user.User; @Entity -public class EventParticipant extends CoreAdo implements SormasToSormasShareable { +public class EventParticipant extends CoreAdo implements IsEventParticipant, SormasToSormasShareable { private static final long serialVersionUID = -9006001699517297107L; @@ -151,10 +152,10 @@ public void setDistrict(District district) { @Override @ManyToOne(cascade = { - CascadeType.PERSIST, - CascadeType.MERGE, - CascadeType.DETACH, - CascadeType.REFRESH }) + CascadeType.PERSIST, + CascadeType.MERGE, + CascadeType.DETACH, + CascadeType.REFRESH }) public SormasToSormasOriginInfo getSormasToSormasOriginInfo() { return sormasToSormasOriginInfo; } 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 701d942faec..f82acfdde06 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 @@ -62,8 +62,6 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.Language; -import de.symeda.sormas.api.caze.BirthDateDto; -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.DeletableEntityType; @@ -81,9 +79,9 @@ import de.symeda.sormas.api.event.EventParticipantReferenceDto; import de.symeda.sormas.api.event.EventParticipantSelectionDto; import de.symeda.sormas.api.event.EventReferenceDto; +import de.symeda.sormas.api.event.IsEventParticipant; import de.symeda.sormas.api.event.SimilarEventParticipantDto; 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; @@ -99,6 +97,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.backend.FacadeHelper; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseFacadeEjb; @@ -133,6 +132,7 @@ import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoFacadeEjb; import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareInfoHelper; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.IterableHelper; @@ -178,6 +178,8 @@ public class EventParticipantFacadeEjb private VaccinationFacadeEjb.VaccinationFacadeEjbLocal vaccinationFacade; @EJB private VaccinationService vaccinationService; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public EventParticipantFacadeEjb() { } @@ -314,12 +316,10 @@ public EventParticipantDto saveEventParticipant(@Valid EventParticipantDto dto, EventParticipantDto existingDto = toDto(existingParticipant); - User user = userService.getCurrentUser(); - EventReferenceDto eventReferenceDto = dto.getEvent(); Event event = eventService.getByUuid(eventReferenceDto.getUuid()); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingParticipant); restorePseudonymizedDto(dto, existingDto, existingParticipant, pseudonymizer); validate(dto); @@ -668,8 +668,8 @@ public List getIndexList( } } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(EventParticipantIndexDto.class, indexList, p -> p.getInJurisdictionOrOwned(), null); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(indexList)); + pseudonymizer.pseudonymizeDtoCollection(EventParticipantIndexDto.class, indexList, EventParticipantIndexDto::getInJurisdictionOrOwned, null); return indexList; } @@ -792,8 +792,8 @@ public List getListEntries(EventParticipantCriteri List result = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(EventParticipantListEntryDto.class, result, p -> p.getInJurisdiction(), null); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(result)); + pseudonymizer.pseudonymizeDtoCollection(EventParticipantListEntryDto.class, result, EventParticipantListEntryDto::getInJurisdiction, null); return result; } @@ -828,6 +828,7 @@ public List getExportList( cq.multiselect( eventParticipant.get(EventParticipant.ID), + eventParticipant.get(EventParticipant.UUID), person.get(Person.ID), person.get(Person.UUID), eventParticipant.get(EventParticipant.UUID), @@ -949,7 +950,8 @@ public List getExportList( immunizations = immunizationList.stream().collect(Collectors.groupingBy(i -> i.getPerson().getId())); } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = + createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(eventParticipantResultList)); for (EventParticipantExportDto exportDto : eventParticipantResultList) { final boolean inJurisdiction = exportDto.getInJurisdiction(); @@ -1015,9 +1017,7 @@ public List getExportList( Optional.ofNullable(eventParticipantContactCount.get(exportDto.getEventParticipantUuid())).ifPresent(exportDto::setContactCount); pseudonymizer.pseudonymizeDto(EventParticipantExportDto.class, exportDto, inJurisdiction, (c) -> { - pseudonymizer.pseudonymizeDto(BirthDateDto.class, c.getBirthdate(), inJurisdiction, null); - pseudonymizer.pseudonymizeDtoCollection(EmbeddedSampleExportDto.class, c.getEventParticipantSamples(), s -> inJurisdiction, null); - pseudonymizer.pseudonymizeDto(BurialInfoDto.class, c.getBurialInfo(), inJurisdiction, null); + pseudonymizer.pseudonymizeEmbeddedDtoCollection(EmbeddedSampleExportDto.class, c.getEventParticipantSamples(), inJurisdiction, c); }); } } @@ -1112,9 +1112,7 @@ public EventParticipantDto getFirst(EventParticipantCriteria criteria) { return null; } - return service.getFirst(criteria) - .map(e -> toPseudonymizedDto(e, Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)))) - .orElse(null); + return service.getFirst(criteria).map(e -> toPseudonymizedDto(e, createGenericPlaceholderPseudonymizer())).orElse(null); } public EventParticipant fillOrBuildEntity(@NotNull EventParticipantDto source, EventParticipant target, boolean checkChangeDate) { @@ -1143,15 +1141,31 @@ public EventParticipant fillOrBuildEntity(@NotNull EventParticipantDto source, E } @Override - protected void pseudonymizeDto(EventParticipant source, EventParticipantDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected Pseudonymizer createPseudonymizer(List eventParticipants) { + return Pseudonymizer.getDefault(userService, createSpecialAccessChecker(eventParticipants)); + } + + private SpecialAccessCheck createSpecialAccessChecker( + Collection eventParticipants) { + List withSpecialAccess = specialCaseAccessService.getEventParticipantUuidsWithSpecialAccess(eventParticipants); + + return ep -> withSpecialAccess.contains(ep.getUuid()); + } + + @Override + protected void pseudonymizeDto( + EventParticipant source, + EventParticipantDto dto, + Pseudonymizer pseudonymizer, + boolean inJurisdiction) { if (source != null) { validate(dto); pseudonymizer.pseudonymizeDto(EventParticipantDto.class, dto, inJurisdiction, (ep) -> { - pseudonymizer.pseudonymizeUser(source.getReportingUser(), userService.getCurrentUser(), ep::setReportingUser); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), userService.getCurrentUser(), ep::setReportingUser, ep); }); - dto.getPerson().getAddresses().forEach(l -> pseudonymizer.pseudonymizeDto(LocationDto.class, l, inJurisdiction, null)); + dto.getPerson().getAddresses().forEach(l -> pseudonymizer.pseudonymizeEmbeddedDto(LocationDto.class, l, inJurisdiction, dto)); } } @@ -1159,7 +1173,7 @@ protected void restorePseudonymizedDto( EventParticipantDto dto, EventParticipantDto originalDto, EventParticipant originalEventParticipant, - Pseudonymizer pseudonymizer) { + Pseudonymizer pseudonymizer) { if (originalDto != null) { pseudonymizer @@ -1267,7 +1281,7 @@ public List getMatchingEventParticipants(EventPartic List participants = em.createQuery(cq).getResultList(); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createGenericPseudonymizer(createSpecialAccessChecker(participants)); pseudonymizer.pseudonymizeDtoCollection(SimilarEventParticipantDto.class, participants, SimilarEventParticipantDto::getInJurisdiction, null); if (Boolean.TRUE.equals(criteria.getExcludePseudonymized())) { 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 bf7f19d79ab..393e20958fa 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 @@ -55,6 +55,7 @@ import de.symeda.sormas.backend.person.PersonJurisdictionPredicateValidator; import de.symeda.sormas.backend.person.PersonQueryContext; import de.symeda.sormas.backend.person.PersonService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.IterableHelper; @@ -75,6 +76,8 @@ public class DirectoryImmunizationService extends AbstractDeletableAdoService root = qc.getRoot(); + DirectoryImmunizationJoins joins = qc.getJoins(); + + if (filter != null) { + filter = CriteriaBuilderHelper.or( + cb, + filter, + specialCaseAccessService.createSpecialCaseAccessFilter(cb, joins.getPersonJoins().getCaseJoins().getSpecialCaseAccesses())); + } + + filter = + CriteriaBuilderHelper.and(cb, filter, CriteriaBuilderHelper.limitedDiseasePredicate(cb, currentUser, root.get(Immunization.DISEASE))); return filter; } 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 15e731de0a7..b46bd326950 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 @@ -54,7 +54,6 @@ 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.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.i18n.Validations; @@ -68,9 +67,9 @@ import de.symeda.sormas.api.immunization.ImmunizationReferenceDto; import de.symeda.sormas.api.immunization.ImmunizationSimilarityCriteria; import de.symeda.sormas.api.immunization.ImmunizationStatus; +import de.symeda.sormas.api.immunization.IsImmunization; import de.symeda.sormas.api.immunization.MeansOfImmunization; import de.symeda.sormas.api.person.PersonDto; -import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.sample.PathogenTestDto; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sormastosormas.ShareTreeCriteria; @@ -81,6 +80,7 @@ import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.api.vaccination.VaccinationDto; import de.symeda.sormas.backend.FacadeHelper; import de.symeda.sormas.backend.caze.CaseFacadeEjb; @@ -111,6 +111,7 @@ import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareInfoHelper; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.util.DtoHelper; @@ -167,6 +168,8 @@ public class ImmunizationFacadeEjb private SormasToSormasEventFacadeEjb.SormasToSormasEventFacadeEjbLocal sormasToSormasEventFacadeEjbLocal; @EJB private VaccinationService vaccinationService; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public ImmunizationFacadeEjb() { } @@ -396,7 +399,7 @@ public ImmunizationDto save(@Valid @NotNull ImmunizationDto dto, boolean checkCh ImmunizationDto existingDto = toDto(existingImmunization); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingImmunization); restorePseudonymizedDto(dto, existingDto, existingImmunization, pseudonymizer); validate(dto); @@ -427,18 +430,31 @@ public ImmunizationDto save(@Valid @NotNull ImmunizationDto dto, boolean checkCh } @Override - protected void pseudonymizeDto(Immunization source, ImmunizationDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected Pseudonymizer createPseudonymizer(List immunizations) { + return Pseudonymizer.getDefault(userService, getSpecialAccessChecker(immunizations)); + } + + private SpecialAccessCheck getSpecialAccessChecker(Collection immunizations) { + List specialAccessUuids = specialCaseAccessService.getImmunizationUuidsWithSpecialAccess(immunizations); + + return i -> specialAccessUuids.contains(i.getUuid()); + } + + @Override + protected void pseudonymizeDto(Immunization source, ImmunizationDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (dto != null) { pseudonymizer.pseudonymizeDto(ImmunizationDto.class, dto, inJurisdiction, c -> { - User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); - pseudonymizer.pseudonymizeDto(PersonReferenceDto.class, c.getPerson(), inJurisdiction, null); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser, dto); }); } } - protected void restorePseudonymizedDto(ImmunizationDto dto, ImmunizationDto existingDto, Immunization entity, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto( + ImmunizationDto dto, + ImmunizationDto existingDto, + Immunization entity, + Pseudonymizer pseudonymizer) { if (existingDto != null) { final boolean inJurisdiction = service.inJurisdictionOrOwned(entity); final User currentUser = userService.getCurrentUser(); @@ -483,7 +499,7 @@ public long count(ImmunizationCriteria criteria) { @Override public List getIndexList(ImmunizationCriteria criteria, Integer first, Integer max, List sortProperties) { List resultsList = directoryImmunizationService.getIndexList(criteria, first, max, sortProperties); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(getSpecialAccessChecker(resultsList)); pseudonymizer.pseudonymizeDtoCollection(ImmunizationIndexDto.class, resultsList, ImmunizationIndexDto::isInJurisdiction, null); return resultsList; } 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 1ef94f30efa..237cdad9507 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 @@ -77,6 +77,7 @@ import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoFacadeEjb.SormasToSormasShareInfoFacadeEjbLocal; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.travelentry.TravelEntry; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserService; @@ -100,6 +101,8 @@ public class ImmunizationService extends AbstractCoreAdoService immunization = qc.getRoot(); + ImmunizationJoins joins = qc.getJoins(); + + if (filter != null) { + filter = CriteriaBuilderHelper.or( + cb, + filter, + specialCaseAccessService.createSpecialCaseAccessFilter(cb, joins.getPersonJoins().getCaseJoins().getSpecialCaseAccesses())); + } + filter = CriteriaBuilderHelper - .and(cb, filter, CriteriaBuilderHelper.limitedDiseasePredicate(cb, currentUser, qc.getRoot().get(Immunization.DISEASE))); + .and(cb, filter, CriteriaBuilderHelper.limitedDiseasePredicate(cb, currentUser, immunization.get(Immunization.DISEASE))); return filter; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/entity/Immunization.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/entity/Immunization.java index 620654ac41e..1961adab94e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/entity/Immunization.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/entity/Immunization.java @@ -20,10 +20,11 @@ import de.symeda.sormas.api.immunization.ImmunizationManagementStatus; import de.symeda.sormas.api.immunization.ImmunizationStatus; +import de.symeda.sormas.api.immunization.IsImmunization; @Entity(name = "immunization") @Table(name = "immunization") -public class Immunization extends BaseImmunization { +public class Immunization extends BaseImmunization implements IsImmunization { public static final String TABLE_NAME = "immunization"; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java index 371456a00d8..f7f6c3aeee1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java @@ -99,6 +99,7 @@ import de.symeda.sormas.backend.sormastosormas.share.incoming.SormasToSormasShareRequest; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccess; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.task.Task; import de.symeda.sormas.backend.therapy.Prescription; @@ -139,6 +140,7 @@ public class DatabaseExportService { EXPORT_CONFIGS.put(DatabaseTable.CLINICAL_VISITS, ClinicalVisit.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.PORT_HEALTH_INFO, PortHealthInfo.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.MATERNAL_HISTORIES, MaternalHistory.TABLE_NAME); + EXPORT_CONFIGS.put(DatabaseTable.SPECIAL_CASE_ACCESSES, SpecialCaseAccess.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CONTACTS, Contact.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.VISITS, Visit.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CONTACTS_VISITS, Visit.CONTACTS_VISITS_TABLE_NAME); 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 bfeb40c78ed..c7e2161906f 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 @@ -340,12 +340,12 @@ public void validate(@Valid DTO dto) throws ValidationRuntimeException { } @Override - protected void pseudonymizeDto(ADO source, DTO dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected void pseudonymizeDto(ADO source, DTO dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { // we do not pseudonymize infra data } @Override - protected void restorePseudonymizedDto(DTO dto, DTO existingDto, ADO entity, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto(DTO dto, DTO existingDto, ADO entity, Pseudonymizer pseudonymizer) { // we do not pseudonymize infra data } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjb.java index 87dedf60574..68546300739 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjb.java @@ -15,6 +15,7 @@ package de.symeda.sormas.backend.manualmessagelog; +import java.util.Collection; import java.util.List; import javax.ejb.EJB; @@ -27,12 +28,14 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; +import org.jetbrains.annotations.NotNull; + import de.symeda.sormas.api.manualmessagelog.ManualMessageLogCriteria; import de.symeda.sormas.api.manualmessagelog.ManualMessageLogFacade; import de.symeda.sormas.api.manualmessagelog.ManualMessageLogIndexDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.JurisdictionHelper; @@ -50,10 +53,12 @@ public class ManualMessageLogFacadeEjb implements ManualMessageLogFacade { private ManualMessageLogService manualMessageLogService; @EJB private UserService userService; + @EJB + private SpecialCaseAccessService specialCaseAccessService; @RightsAllowed({ - UserRight._SEND_MANUAL_EXTERNAL_MESSAGES, - UserRight._EXTERNAL_EMAIL_SEND}) + UserRight._SEND_MANUAL_EXTERNAL_MESSAGES, + UserRight._EXTERNAL_EMAIL_SEND }) public List getIndexList(ManualMessageLogCriteria criteria) { final CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -63,17 +68,17 @@ public List getIndexList(ManualMessageLogCriteria crit ManualMessageLogJoins joins = new ManualMessageLogJoins(root); cq.multiselect( - root.get(ManualMessageLog.UUID), - root.get(ManualMessageLog.MESSAGE_TYPE), - root.get(ManualMessageLog.SENT_DATE), - joins.getSendingUser().get(User.UUID), - joins.getSendingUser().get(User.FIRST_NAME), - joins.getSendingUser().get(User.LAST_NAME), - root.get(ManualMessageLog.EMAIL_ADDRESS), - root.get(ManualMessageLog.USED_TEMPLATE), - root.get(ManualMessageLog.ATTACHED_DOCUMENTS), - JurisdictionHelper.booleanSelector(cb, manualMessageLogService.inJurisdictionOrOwned(cq, cb, root)), - JurisdictionHelper.booleanSelector(cb, userService.inJurisdictionOrOwned(cb, joins.getSendungUserJoins()))); + root.get(ManualMessageLog.UUID), + root.get(ManualMessageLog.MESSAGE_TYPE), + root.get(ManualMessageLog.SENT_DATE), + joins.getSendingUser().get(User.UUID), + joins.getSendingUser().get(User.FIRST_NAME), + joins.getSendingUser().get(User.LAST_NAME), + root.get(ManualMessageLog.EMAIL_ADDRESS), + root.get(ManualMessageLog.USED_TEMPLATE), + root.get(ManualMessageLog.ATTACHED_DOCUMENTS), + JurisdictionHelper.booleanSelector(cb, manualMessageLogService.inJurisdictionOrOwned(cq, cb, root)), + JurisdictionHelper.booleanSelector(cb, userService.inJurisdictionOrOwned(cb, joins.getSendungUserJoins()))); Predicate filter = manualMessageLogService.buildCriteriaFilter(criteria, root, cb); if (filter != null) { @@ -87,18 +92,28 @@ public List getIndexList(ManualMessageLogCriteria crit List resultList = em.createQuery(cq).getResultList(); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createPseudonymizerWithPlaceholder(resultList); pseudonymizer.pseudonymizeDtoCollection( - ManualMessageLogIndexDto.class, - resultList, - ManualMessageLogIndexDto::isInJurisdiction, - (m, inJurisdiction) -> { - pseudonymizer.pseudonymizeUser(m.isSenderInJurisdiction(), m::setSendingUser); - }); + ManualMessageLogIndexDto.class, + resultList, + ManualMessageLogIndexDto::isInJurisdiction, + (m, inJurisdiction) -> pseudonymizer.pseudonymizeUser(m.isSenderInJurisdiction(), m::setSendingUser, m)); return resultList; } + @NotNull + private Pseudonymizer createPseudonymizerWithPlaceholder(Collection manualMessageLogs) { + return Pseudonymizer.getDefaultWithPlaceHolder(userService, getSpecialAccessChecker(manualMessageLogs)); + } + + private SpecialAccessCheck getSpecialAccessChecker(Collection manualMessageLogs) { + List specialAccessUuids = specialCaseAccessService.getManualMessageLogUuidsWithSpecialAccess(manualMessageLogs); + + return i -> specialAccessUuids.contains(i.getUuid()); + } + + @LocalBean @Stateless public static class ManualMessageLogFacadeEjbLocal extends ManualMessageLogFacadeEjb { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/Person.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/Person.java index 237038e5600..eee616d80fc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/Person.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/Person.java @@ -51,6 +51,7 @@ import de.symeda.sormas.api.person.CauseOfDeath; import de.symeda.sormas.api.person.DeathPlaceType; import de.symeda.sormas.api.person.EducationType; +import de.symeda.sormas.api.person.IsPerson; import de.symeda.sormas.api.person.OccupationType; import de.symeda.sormas.api.person.PersonContactDetailType; import de.symeda.sormas.api.person.PersonReferenceDto; @@ -73,7 +74,7 @@ import de.symeda.sormas.backend.travelentry.TravelEntry; @Entity -public class Person extends AbstractDomainObject implements HasExternalData { +public class Person extends AbstractDomainObject implements IsPerson, HasExternalData { private static final long serialVersionUID = -1735038738114840087L; 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 8fe0f29b768..f58094993da 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 @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -70,8 +71,6 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.RequestContextHolder; -import de.symeda.sormas.api.caze.AgeAndBirthDateDto; -import de.symeda.sormas.api.caze.BirthDateDto; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.caze.CaseDataDto; @@ -85,7 +84,6 @@ import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; 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; import de.symeda.sormas.api.i18n.Validations; @@ -96,6 +94,7 @@ import de.symeda.sormas.api.person.ApproximateAgeType; import de.symeda.sormas.api.person.ApproximateAgeType.ApproximateAgeHelper; import de.symeda.sormas.api.person.CauseOfDeath; +import de.symeda.sormas.api.person.IsPerson; import de.symeda.sormas.api.person.JournalPersonDto; import de.symeda.sormas.api.person.PersonAddressType; import de.symeda.sormas.api.person.PersonAssociation; @@ -124,6 +123,7 @@ import de.symeda.sormas.api.utils.LocationHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.api.vaccination.VaccinationDto; import de.symeda.sormas.backend.FacadeHelper; import de.symeda.sormas.backend.caze.Case; @@ -177,6 +177,7 @@ import de.symeda.sormas.backend.location.LocationService; import de.symeda.sormas.backend.sample.SampleService; import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.travelentry.TravelEntry; import de.symeda.sormas.backend.travelentry.services.TravelEntryService; import de.symeda.sormas.backend.user.User; @@ -255,6 +256,8 @@ public class PersonFacadeEjb extends AbstractBaseEjb getIndexList(PersonCriteria criteria, Integer first, persons.addAll(QueryHelper.getResultList(em, cq, new PersonIndexDtoResultTransformer(), null, null)); }); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection( - PersonIndexDto.class, - persons, - PersonIndexDto::getInJurisdiction, - (p, isInJurisdiction) -> pseudonymizer.pseudonymizeDto(AgeAndBirthDateDto.class, p.getAgeAndBirthDate(), isInJurisdiction, null)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(persons)); + pseudonymizer.pseudonymizeDtoCollection(PersonIndexDto.class, persons, PersonIndexDto::getInJurisdiction, null); logger.debug( "getIndexList() finished. association={}, count={}, {}ms", @@ -1581,12 +1580,8 @@ public List getExportList(PersonCriteria criteria, int first, i List persons = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection( - PersonExportDto.class, - persons, - PersonExportDto::getInJurisdiction, - (p, isInJurisdiction) -> pseudonymizer.pseudonymizeDto(BirthDateDto.class, p.getBirthdate(), isInJurisdiction, null)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(createSpecialAccessChecker(persons)); + pseudonymizer.pseudonymizeDtoCollection(PersonExportDto.class, persons, PersonExportDto::getInJurisdiction, null); logger.debug( "getExportList() finished. association={}, count={}, {}ms", @@ -1617,35 +1612,46 @@ public Page getIndexPage(PersonCriteria personCriteria, Integer } @Override - protected void pseudonymizeDto(Person source, PersonDto dto, Pseudonymizer pseudonymizer, boolean isInJurisdiction) { + protected Pseudonymizer createPseudonymizer(List persons) { + return Pseudonymizer.getDefault(userService, createSpecialAccessChecker(persons)); + } + + private SpecialAccessCheck createSpecialAccessChecker(Collection persons) { + List withSpecialAccess = specialCaseAccessService.getPersonUuidsWithSpecialAccess(persons); + + return p -> withSpecialAccess.contains(p.getUuid()); + } + + @Override + protected void pseudonymizeDto(Person source, PersonDto dto, Pseudonymizer pseudonymizer, boolean isInJurisdiction) { if (dto != null) { pseudonymizer.pseudonymizeDto(PersonDto.class, dto, isInJurisdiction, p -> { - pseudonymizer.pseudonymizeDto(LocationDto.class, p.getAddress(), isInJurisdiction, null); - p.getAddresses().forEach(l -> pseudonymizer.pseudonymizeDto(LocationDto.class, l, isInJurisdiction, null)); - p.getPersonContactDetails().forEach(pcd -> pseudonymizer.pseudonymizeDto(PersonContactDetailDto.class, pcd, isInJurisdiction, null)); + pseudonymizer.pseudonymizeEmbeddedDtoCollection(LocationDto.class, p.getAddresses(), isInJurisdiction, p); + pseudonymizer.pseudonymizeEmbeddedDtoCollection(PersonContactDetailDto.class, p.getPersonContactDetails(), isInJurisdiction, p); }); } } @Override - protected void restorePseudonymizedDto(PersonDto source, PersonDto existingPerson, Person person, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto(PersonDto source, PersonDto existingPerson, Person person, Pseudonymizer pseudonymizer) { if (person != null && existingPerson != null) { boolean isInJurisdiction = isAdoInJurisdiction(person); pseudonymizer.restorePseudonymizedValues(PersonDto.class, source, existingPerson, isInJurisdiction); - pseudonymizer.restorePseudonymizedValues(LocationDto.class, source.getAddress(), existingPerson.getAddress(), isInJurisdiction); source.getAddresses() .forEach( - l -> pseudonymizer.restorePseudonymizedValues( + l -> pseudonymizer.restoreEmbeddedPseudonymizedValues( LocationDto.class, l, existingPerson.getAddresses().stream().filter(a -> a.getUuid().equals(l.getUuid())).findFirst().orElse(null), + existingPerson, isInJurisdiction)); source.getPersonContactDetails() .forEach( - pcd -> pseudonymizer.restorePseudonymizedValues( + pcd -> pseudonymizer.restoreEmbeddedPseudonymizedValues( PersonContactDetailDto.class, pcd, existingPerson.getPersonContactDetails().stream().filter(a -> a.getUuid().equals(pcd.getUuid())).findFirst().orElse(null), + existingPerson, isInJurisdiction)); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java index 08b2035bb17..6e553c5bd93 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java @@ -118,10 +118,9 @@ public List getAllActiveAdditionalTestsAfter(Date date, Integ private List toPseudonymizedDtos(List entities) { List inJurisdictionIds = service.getInJurisdictionIds(entities); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); - List dtos = - entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); - return dtos; + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); + + return entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); } @Override @@ -140,7 +139,7 @@ public List getAllActiveUuids() { return service.getAllActiveUuids(user); } - public AdditionalTestDto convertToDto(AdditionalTest source, Pseudonymizer pseudonymizer) { + public AdditionalTestDto convertToDto(AdditionalTest source, Pseudonymizer pseudonymizer) { if (source == null) { return null; @@ -149,7 +148,7 @@ public AdditionalTestDto convertToDto(AdditionalTest source, Pseudonymizer pseud return convertToDto(source, pseudonymizer, service.inJurisdictionOrOwned(source)); } - private AdditionalTestDto convertToDto(AdditionalTest source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private static AdditionalTestDto convertToDto(AdditionalTest source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { AdditionalTestDto dto = toDto(source); pseudonymizer.pseudonymizeDto(AdditionalTestDto.class, dto, inJurisdiction, null); 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 d6e5745ec5b..f6c16f2d3a3 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 @@ -56,6 +56,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.backend.FacadeHelper; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; @@ -76,6 +77,7 @@ import de.symeda.sormas.backend.infrastructure.facility.FacilityFacadeEjb; import de.symeda.sormas.backend.infrastructure.facility.FacilityService; import de.symeda.sormas.backend.infrastructure.region.Region; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.user.UserService; @@ -116,6 +118,8 @@ public class PathogenTestFacadeEjb implements PathogenTestFacade { private NotificationService notificationService; @EJB private CountryService countryService; + @EJB + private SpecialCaseAccessService specialCaseAccessService; @Override public List getAllActiveUuids() { @@ -146,10 +150,9 @@ public List getAllActivePathogenTestsAfter(Date date, Integer b private List toPseudonymizedDtos(List entities) { List inJurisdictionIds = pathogenTestService.getInJurisdictionIds(entities); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); - List dtos = - entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); - return dtos; + Pseudonymizer pseudonymizer = createPseudonymizer(entities); + + return entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); } public List getIndexList( @@ -199,8 +202,7 @@ public PathogenTestDto getLatestPathogenTest(String sampleUuid) { cq.where(filter); cq.orderBy(cb.desc(pathogenTestRoot.get(PathogenTest.CREATION_DATE))); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); - return QueryHelper.getFirstResult(em, cq, t -> convertToDto(t, pseudonymizer)); + return QueryHelper.getFirstResult(em, cq, this::convertToDto); } @Override @@ -242,7 +244,7 @@ public List getDeletedUuidsSince(Date since) { @Override public PathogenTestDto getByUuid(String uuid) { - return convertToDto(pathogenTestService.getByUuid(uuid), Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(pathogenTestService.getByUuid(uuid)); } @Override @@ -375,7 +377,7 @@ public PathogenTestDto savePathogenTest(@Valid PathogenTestDto dto, boolean chec onPathogenTestChanged(existingSampleTestDto, pathogenTest); handleAssociatedEntityChanges(pathogenTest, syncShares); - return convertToDto(pathogenTest, Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(pathogenTest); } @Override @@ -450,7 +452,11 @@ public void validate(PathogenTestDto pathogenTest) throws ValidationRuntimeExcep } } - public PathogenTestDto convertToDto(PathogenTest source, Pseudonymizer pseudonymizer) { + private PathogenTestDto convertToDto(PathogenTest source) { + return convertToDto(source, createPseudonymizer(Collections.singletonList(source))); + } + + public PathogenTestDto convertToDto(PathogenTest source, Pseudonymizer pseudonymizer) { if (source == null) { return null; @@ -460,25 +466,39 @@ public PathogenTestDto convertToDto(PathogenTest source, Pseudonymizer pseudonym return convertToDto(source, pseudonymizer, inJurisdiction); } - private PathogenTestDto convertToDto(PathogenTest source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private PathogenTestDto convertToDto(PathogenTest source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { PathogenTestDto target = toDto(source); pseudonymizeDto(source, target, pseudonymizer, inJurisdiction); return target; } - private void pseudonymizeDto(PathogenTest source, PathogenTestDto target, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private static void pseudonymizeDto( + PathogenTest source, + PathogenTestDto target, + Pseudonymizer pseudonymizer, + boolean inJurisdiction) { if (source != null && target != null) { pseudonymizer.pseudonymizeDto(PathogenTestDto.class, target, inJurisdiction, null); } } + private Pseudonymizer createPseudonymizer(Collection tests) { + return Pseudonymizer.getDefault(userService, createSpecialAccessChecker(tests)); + } + + private SpecialAccessCheck createSpecialAccessChecker(Collection tests) { + List withSpecialAccess = specialCaseAccessService.getPathogenTestUuidsWithSpecialAccess(tests); + + return test -> withSpecialAccess.contains(test.getUuid()); + } + private void restorePseudonymizedDto(PathogenTestDto dto, PathogenTest existingSampleTest, PathogenTestDto existingSampleTestDto) { if (existingSampleTestDto != null) { boolean isInJurisdiction = pathogenTestService.inJurisdictionOrOwned(existingSampleTest); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + Pseudonymizer pseudonymizer = createPseudonymizer(Collections.singletonList(existingSampleTest)); pseudonymizer.restorePseudonymizedValues(PathogenTestDto.class, dto, existingSampleTestDto, isInJurisdiction); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/Sample.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/Sample.java index 35ab74d7175..7940b4b5eb8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/Sample.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/Sample.java @@ -45,6 +45,7 @@ import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.sample.AdditionalTestType; +import de.symeda.sormas.api.sample.IsSample; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.api.sample.SampleMaterial; @@ -65,7 +66,7 @@ import de.symeda.sormas.backend.user.User; @Entity(name = "samples") -public class Sample extends DeletableAdo implements SormasToSormasShareable { +public class Sample extends DeletableAdo implements IsSample, SormasToSormasShareable { private static final long serialVersionUID = -7196712070188634978L; 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 8494e1ac1cb..0271147823b 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 @@ -51,13 +51,13 @@ import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.event.EventParticipantReferenceDto; -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.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityHelper; import de.symeda.sormas.api.sample.AdditionalTestDto; +import de.symeda.sormas.api.sample.IsSample; import de.symeda.sormas.api.sample.PathogenTestDto; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sample.SampleCriteria; @@ -121,7 +121,6 @@ import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.IterableHelper; 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; @@ -361,7 +360,8 @@ public List getObsoleteUuidsSince(Date since) { @Override public SampleDto getSampleByUuid(String uuid) { - return convertToDto(sampleService.getByUuid(uuid), createPseudonymizer()); + Sample sample = sampleService.getByUuid(uuid); + return convertToDto(sample, createPseudonymizer(sample)); } @Override @@ -656,6 +656,8 @@ private List getExportList( List resultList = QueryHelper.getResultList(em, cq, first, max); + SamplePseudonymizer pseudonymizer = createPseudonymizer(true, resultList); + for (SampleExportDto exportDto : resultList) { Sample sampleFromExportDto = sampleService.getById(exportDto.getId()); List pathogenTests = sampleFromExportDto.getPathogenTests(); @@ -690,7 +692,7 @@ private List getExportList( } } - if (exportDto.getAdditionalTestingRequested()) { + if (Boolean.TRUE.equals(exportDto.getAdditionalTestingRequested())) { List additionalTests = additionalTestService.getAllBySample(sampleFromExportDto); if (!additionalTests.isEmpty()) { exportDto.setAdditionalTest(AdditionalTestFacadeEjb.toDto(additionalTests.get(0))); @@ -704,17 +706,16 @@ private List getExportList( exportDto.setOtherAdditionalTestsDetails(I18nProperties.getString(Strings.no)); } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); boolean isInJurisdiction = exportDto.getSampleJurisdictionFlagsDto().getInJurisdiction(); pseudonymizer.pseudonymizeDto( SampleExportDto.class, exportDto, isInJurisdiction, - s -> pseudonymizer.pseudonymizeDtoCollection( + s -> pseudonymizer.pseudonymizeEmbeddedDtoCollection( SampleExportDto.SampleExportPathogenTest.class, exportDto.getOtherPathogenTests(), - t -> isInJurisdiction, - null)); + isInJurisdiction, + exportDto)); } return resultList; @@ -876,19 +877,19 @@ public Sample fillOrBuildEntity(@NotNull SampleDto source, Sample target, boolea return target; } - public SampleDto convertToDto(Sample source, Pseudonymizer pseudonymizer) { + public SampleDto convertToDto(Sample source, SamplePseudonymizer pseudonymizers) { if (source == null) { return null; } - return convertToDto(source, pseudonymizer, sampleService.getJurisdictionFlags(source)); + return convertToDto(source, pseudonymizers, sampleService.getJurisdictionFlags(source)); } - private SampleDto convertToDto(Sample source, Pseudonymizer pseudonymizer, SampleJurisdictionFlagsDto jurisdictionFlags) { + private SampleDto convertToDto(Sample source, SamplePseudonymizer pseudonymizers, SampleJurisdictionFlagsDto jurisdictionFlags) { SampleDto dto = toDto(source); - pseudonymizeDto(source, dto, pseudonymizer, jurisdictionFlags); + pseudonymizeDto(source, dto, pseudonymizers, jurisdictionFlags); return dto; } @@ -896,23 +897,30 @@ private SampleDto convertToDto(Sample source, Pseudonymizer pseudonymizer, Sampl private List toPseudonymizedDtos(List entities) { Map jurisdictionFlags = sampleService.getJurisdictionsFlags(entities); - Pseudonymizer pseudonymizer = createPseudonymizer(); - List dtos = - entities.stream().map(p -> convertToDto(p, pseudonymizer, jurisdictionFlags.get(p.getId()))).collect(Collectors.toList()); - return dtos; + SamplePseudonymizer pseudonymizer = createPseudonymizer(false, entities); + + return entities.stream().map(p -> convertToDto(p, pseudonymizer, jurisdictionFlags.get(p.getId()))).collect(Collectors.toList()); + } + + private SamplePseudonymizer createPseudonymizer(IsSample sample) { + return createPseudonymizer(false, sample != null ? Collections.singleton(sample) : Collections.emptyList()); } - private Pseudonymizer createPseudonymizer() { - return Pseudonymizer.getDefault(userService::hasRight); + private SamplePseudonymizer createPseudonymizer(boolean withPlaceHolder, Collection samples) { + return sampleService.createPseudonymizer(withPlaceHolder, samples); } - private void pseudonymizeDto(Sample source, SampleDto dto, Pseudonymizer pseudonymizer, SampleJurisdictionFlagsDto jurisdictionFlags) { + private void pseudonymizeDto( + Sample source, + SampleDto dto, + SamplePseudonymizer pseudonymizer, + SampleJurisdictionFlagsDto jurisdictionFlags) { if (dto != null) { User currentUser = userService.getCurrentUser(); pseudonymizer.pseudonymizeDto(SampleDto.class, dto, jurisdictionFlags.getInJurisdiction(), s -> { - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, s::setReportingUser); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, s::setReportingUser, s); pseudonymizeAssociatedObjects( s.getAssociatedCase(), s.getAssociatedContact(), @@ -929,7 +937,7 @@ private void restorePseudonymizedDto(SampleDto dto, Sample existingSample, Sampl boolean inJurisdiction = sampleService.getJurisdictionFlags(existingSample).getInJurisdiction(); User currentUser = userService.getCurrentUser(); - Pseudonymizer pseudonymizer = createPseudonymizer(); + SamplePseudonymizer pseudonymizer = createPseudonymizer(existingSample); pseudonymizer.restoreUser(existingSample.getReportingUser(), currentUser, dto, dto::setReportingUser); pseudonymizer.restorePseudonymizedValues(SampleDto.class, dto, existingSampleDto, inJurisdiction); } @@ -939,35 +947,29 @@ private void pseudonymizeAssociatedObjects( CaseReferenceDto sampleCase, ContactReferenceDto sampleContact, EventParticipantReferenceDto sampleEventParticipant, - Pseudonymizer pseudonymizer, + SamplePseudonymizer pseudonymizer, SampleJurisdictionFlagsDto jurisdictionFlagsDto) { if (sampleCase != null) { - pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, sampleCase, jurisdictionFlagsDto.getCaseInJurisdiction(), null); + pseudonymizer.pseudonymizeCaseReference(sampleCase, jurisdictionFlagsDto.getCaseInJurisdiction()); } if (sampleContact != null) { - pseudonymizer.pseudonymizeDto( + pseudonymizer.pseudonymizeAssociatedDto( ContactReferenceDto.PersonName.class, sampleContact.getContactName(), - jurisdictionFlagsDto.getContactInJurisdiction(), - null); - - if (sampleContact.getCaseName() != null) { - pseudonymizer.pseudonymizeDto( - ContactReferenceDto.PersonName.class, - sampleContact.getCaseName(), - jurisdictionFlagsDto.getContactCaseInJurisdiction(), - null); + jurisdictionFlagsDto.getContactInJurisdiction()); + + if (sampleContact.getCaze() != null) { + pseudonymizer.pseudonymizeCaseReference(sampleContact.getCaze(), jurisdictionFlagsDto.getContactCaseInJurisdiction()); } } if (sampleEventParticipant != null) { - pseudonymizer.pseudonymizeDto( + pseudonymizer.pseudonymizeAssociatedDto( EventParticipantReferenceDto.class, sampleEventParticipant, - jurisdictionFlagsDto.getEvenParticipantInJurisdiction(), - null); + jurisdictionFlagsDto.getEvenParticipantInJurisdiction()); } } @@ -1035,11 +1037,10 @@ public static SampleReferenceDto toReferenceDto(Sample entity) { return new SampleReferenceDto( entity.getUuid(), - SampleReferenceDto.buildCaption( - entity.getSampleMaterial(), - entity.getAssociatedCase() != null ? entity.getAssociatedCase().getUuid() : null, - entity.getAssociatedContact() != null ? entity.getAssociatedContact().getUuid() : null, - entity.getAssociatedEventParticipant() != null ? entity.getAssociatedEventParticipant().getUuid() : null)); + entity.getSampleMaterial(), + entity.getAssociatedCase() != null ? entity.getAssociatedCase().getUuid() : null, + entity.getAssociatedContact() != null ? entity.getAssociatedContact().getUuid() : null, + entity.getAssociatedEventParticipant() != null ? entity.getAssociatedEventParticipant().getUuid() : null); } private void onSampleChanged(SampleDto existingSample, Sample newSample, boolean syncShares) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SamplePseudonymizer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SamplePseudonymizer.java new file mode 100644 index 00000000000..ba9e2e78ebc --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SamplePseudonymizer.java @@ -0,0 +1,30 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.sample; + +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.backend.util.AssociableDtoPseudonymizer; +import de.symeda.sormas.backend.util.Pseudonymizer; + +public class SamplePseudonymizer extends AssociableDtoPseudonymizer { + + public SamplePseudonymizer( + Pseudonymizer rootPseudonymizer, + Pseudonymizer casePseudonymizer, + Pseudonymizer deafultAssociatedObjectPseudonymizer) { + super(rootPseudonymizer, casePseudonymizer, deafultAssociatedObjectPseudonymizer); + } +} 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 db56f74dd51..3e002d90053 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 @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -57,7 +58,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.RequestContextHolder; -import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; import de.symeda.sormas.api.common.DeletableEntityType; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.progress.ProcessedEntity; @@ -66,8 +67,7 @@ import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.event.EventParticipantReferenceDto; 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.sample.IsSample; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.api.sample.SampleAssociationType; @@ -80,6 +80,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.SortProperty; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseFacadeEjb; import de.symeda.sormas.backend.caze.CaseQueryContext; @@ -106,6 +107,7 @@ import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoFacadeEjb.SormasToSormasShareInfoFacadeEjbLocal; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.IterableHelper; @@ -141,6 +143,8 @@ public class SampleService extends AbstractDeletableAdoService private ExternalMessageService externalMessageService; @EJB protected FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public SampleService() { super(Sample.class, DeletableEntityType.SAMPLE); @@ -283,45 +287,58 @@ public List getIndexList(SampleCriteria sampleCriteria, Integer } } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - Pseudonymizer emptyValuePseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + SamplePseudonymizer pseudonymizer = createPseudonymizer(true, samples); + pseudonymizer .pseudonymizeDtoCollection(SampleIndexDto.class, samples, s -> s.getSampleJurisdictionFlagsDto().getInJurisdiction(), (s, ignored) -> { final SampleJurisdictionFlagsDto sampleJurisdictionFlagsDto = s.getSampleJurisdictionFlagsDto(); if (s.getAssociatedCase() != null) { - emptyValuePseudonymizer - .pseudonymizeDto(CaseReferenceDto.class, s.getAssociatedCase(), sampleJurisdictionFlagsDto.getCaseInJurisdiction(), null); + pseudonymizer.pseudonymizeCaseReference(s.getAssociatedCase(), sampleJurisdictionFlagsDto.getCaseInJurisdiction()); } ContactReferenceDto associatedContact = s.getAssociatedContact(); if (associatedContact != null) { - emptyValuePseudonymizer.pseudonymizeDto( - ContactReferenceDto.PersonName.class, - associatedContact.getContactName(), - sampleJurisdictionFlagsDto.getContactInJurisdiction(), - null); - - if (associatedContact.getCaseName() != null) { - pseudonymizer.pseudonymizeDto( - ContactReferenceDto.PersonName.class, - associatedContact.getCaseName(), - sampleJurisdictionFlagsDto.getContactCaseInJurisdiction(), - null); + pseudonymizer.pseudonymizeAssociatedDto( + ContactReferenceDto.class, + associatedContact, + sampleJurisdictionFlagsDto.getContactInJurisdiction()); + + if (associatedContact.getCaze() != null) { + pseudonymizer + .pseudonymizeCaseReference(associatedContact.getCaze(), sampleJurisdictionFlagsDto.getContactCaseInJurisdiction()); } } if (s.getAssociatedEventParticipant() != null) { - emptyValuePseudonymizer.pseudonymizeDto( + pseudonymizer.pseudonymizeAssociatedDto( EventParticipantReferenceDto.class, s.getAssociatedEventParticipant(), - sampleJurisdictionFlagsDto.getEvenParticipantInJurisdiction(), - null); + sampleJurisdictionFlagsDto.getEvenParticipantInJurisdiction()); } }, true); return samples; } + public SamplePseudonymizer createPseudonymizer(boolean withPlaceHolder, Collection samples) { + + AnnotationBasedFieldAccessChecker.SpecialAccessCheck specialAccessChecker = createSpecialAccessChecker(samples); + Pseudonymizer rootPseudonymizer = withPlaceHolder + ? Pseudonymizer.getDefaultWithPlaceHolder(userService, specialAccessChecker) + : Pseudonymizer.getDefault(userService, specialAccessChecker); + + Collection cases = samples.stream().map(IsSample::getAssociatedCase).filter(Objects::nonNull).collect(Collectors.toList()); + + return new SamplePseudonymizer<>(rootPseudonymizer, caseFacade.createSimplePseudonymizer(cases), Pseudonymizer.getDefault(userService)); + } + + private AnnotationBasedFieldAccessChecker.SpecialAccessCheck createSpecialAccessChecker( + Collection samples) { + List withSpecialAccess = specialCaseAccessService.getSampleUuidsWithSpecialAccess(samples); + + return sample -> withSpecialAccess.contains(sample.getUuid()); + } + public List getIndexListIds(SampleCriteria sampleCriteria, Integer first, Integer max, List sortProperties) { final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaQuery cq = cb.createTupleQuery(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java index cd48472b6e4..099709e5e4f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java @@ -31,8 +31,6 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.share.ExternalShareInfoCriteria; import de.symeda.sormas.api.share.ExternalShareInfoDto; import de.symeda.sormas.api.share.ExternalShareInfoFacade; @@ -80,7 +78,7 @@ public List getIndexList(ExternalShareInfoCriteria criteri List shareInfoList = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); return shareInfoList.stream().map(i -> convertToDto(i, pseudonymizer)).collect(Collectors.toList()); } @@ -124,11 +122,10 @@ public boolean isSharedEvent(String eventUuid) { return ExternalShareStatus.SHARED.equals(externalShareStatus); } - private ExternalShareInfoDto convertToDto(ExternalShareInfo source, Pseudonymizer pseudonymizer) { + private ExternalShareInfoDto convertToDto(ExternalShareInfo source, Pseudonymizer pseudonymizer) { ExternalShareInfoDto dto = toDto(source); - boolean pseudonymized = pseudonymizer - .pseudonymizeUser(source.getSender(), userService.getCurrentUser(), dto::setSender); + boolean pseudonymized = pseudonymizer.pseudonymizeUser(source.getSender(), userService.getCurrentUser(), dto::setSender, dto); if (pseudonymized) { dto.setPseudonymized(true); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/CaseShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/CaseShareDataBuilder.java index 4afac05ddcd..49eae50ae07 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/CaseShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/CaseShareDataBuilder.java @@ -34,8 +34,8 @@ import de.symeda.sormas.backend.person.PersonFacadeEjb; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; -import de.symeda.sormas.backend.util.Pseudonymizer; @Stateless @LocalBean @@ -60,7 +60,7 @@ public CaseShareDataBuilder() { @Override protected SormasToSormasCaseDto doBuildShareData(Case caze, ShareRequestInfo requestInfo, boolean ownerShipHandedOver) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); PersonDto personDto = dataBuilderHelper.getPersonDto(caze.getPerson(), pseudonymizer, requestInfo); CaseDataDto cazeDto = getDto(caze, pseudonymizer); @@ -77,15 +77,15 @@ public void doBusinessValidation(SormasToSormasCaseDto dto) { @Override protected SormasToSormasCasePreview doBuildShareDataPreview(Case caze, ShareRequestInfo requestInfo) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); return getCasePreview(caze, pseudonymizer); } @Override - protected CaseDataDto getDto(Case caze, Pseudonymizer pseudonymizer) { + protected CaseDataDto getDto(Case caze, SormasToSormasPseudonymizer pseudonymizer) { - CaseDataDto cazeDto = caseFacade.toPseudonymizedDto(caze, pseudonymizer); + CaseDataDto cazeDto = caseFacade.toPseudonymizedDto(caze, pseudonymizer.getPseudonymizer()); // reporting user is not set to null here as it would not pass the validation // the receiver appears to set it to SORMAS2SORMAS Client anyway cazeDto.setClassificationUser(null); @@ -97,7 +97,7 @@ protected CaseDataDto getDto(Case caze, Pseudonymizer pseudonymizer) { return cazeDto; } - public SormasToSormasCasePreview getCasePreview(Case caze, Pseudonymizer pseudonymizer) { + public SormasToSormasCasePreview getCasePreview(Case caze, SormasToSormasPseudonymizer pseudonymizer) { SormasToSormasCasePreview casePreview = new SormasToSormasCasePreview(); casePreview.setUuid(caze.getUuid()); @@ -120,7 +120,7 @@ public SormasToSormasCasePreview getCasePreview(Case caze, Pseudonymizer pseudon casePreview.setPerson(dataBuilderHelper.getPersonPreview(caze.getPerson())); - pseudonymizer.pseudonymizeDto(SormasToSormasCasePreview.class, casePreview, false, null); + pseudonymizer. getPseudonymizer().pseudonymizeDto(SormasToSormasCasePreview.class, casePreview, false, null); return casePreview; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/ContactShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/ContactShareDataBuilder.java index caefb971762..4389d806658 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/ContactShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/ContactShareDataBuilder.java @@ -34,8 +34,8 @@ import de.symeda.sormas.backend.person.PersonFacadeEjb; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; -import de.symeda.sormas.backend.util.Pseudonymizer; @Stateless @LocalBean @@ -61,7 +61,7 @@ public ContactShareDataBuilder() { @Override protected SormasToSormasContactDto doBuildShareData(Contact contact, ShareRequestInfo requestInfo, boolean ownerShipHandedOver) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); PersonDto personDto = dataBuilderHelper.getPersonDto(contact.getPerson(), pseudonymizer, requestInfo); ContactDto contactDto = getDto(contact, pseudonymizer); @@ -70,9 +70,9 @@ protected SormasToSormasContactDto doBuildShareData(Contact contact, ShareReques } @Override - protected ContactDto getDto(Contact contact, Pseudonymizer pseudonymizer) { + protected ContactDto getDto(Contact contact, SormasToSormasPseudonymizer pseudonymizer) { - ContactDto contactDto = contactFacade.toPseudonymizedDto(contact, pseudonymizer); + ContactDto contactDto = contactFacade.toPseudonymizedDto(contact, pseudonymizer.getPseudonymizer()); // reporting user is not set to null here as it would not pass the validation // the receiver appears to set it to SORMAS2SORMAS Client anyway contactDto.setContactOfficer(null); @@ -91,13 +91,13 @@ public void doBusinessValidation(SormasToSormasContactDto dto) throws Validation @Override public SormasToSormasContactPreview doBuildShareDataPreview(Contact contact, ShareRequestInfo requestInfo) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); return getContactPreview(contact, pseudonymizer); } - public SormasToSormasContactPreview getContactPreview(Contact contact, Pseudonymizer pseudonymizer) { + public SormasToSormasContactPreview getContactPreview(Contact contact, SormasToSormasPseudonymizer pseudonymizer) { SormasToSormasContactPreview contactPreview = new SormasToSormasContactPreview(); contactPreview.setUuid(contact.getUuid()); @@ -117,7 +117,7 @@ public SormasToSormasContactPreview getContactPreview(Contact contact, Pseudonym contactPreview.setCaze(CaseFacadeEjb.toReferenceDto(contact.getCaze())); - pseudonymizer.pseudonymizeDto(SormasToSormasContactPreview.class, contactPreview, false, null); + pseudonymizer.getPseudonymizer().pseudonymizeDto(SormasToSormasContactPreview.class, contactPreview, false, null); return contactPreview; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/EventShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/EventShareDataBuilder.java index aaf9f72715e..180e4643086 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/EventShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/EventShareDataBuilder.java @@ -29,8 +29,8 @@ import de.symeda.sormas.backend.location.LocationFacadeEjb; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; -import de.symeda.sormas.backend.util.Pseudonymizer; @Stateless @LocalBean @@ -52,7 +52,7 @@ public EventShareDataBuilder() { @Override protected SormasToSormasEventDto doBuildShareData(Event data, ShareRequestInfo requestInfo, boolean ownerShipHandedOver) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); EventDto eventDto = getDto(data, pseudonymizer); return new SormasToSormasEventDto(eventDto); } @@ -64,14 +64,14 @@ public void doBusinessValidation(SormasToSormasEventDto sormasToSormasEventDto) @Override public SormasToSormasEventPreview doBuildShareDataPreview(Event event, ShareRequestInfo requestInfo) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); return getEventPreview(event, pseudonymizer); } @Override - protected EventDto getDto(Event event, Pseudonymizer pseudonymizer) { + protected EventDto getDto(Event event, SormasToSormasPseudonymizer pseudonymizer) { - EventDto eventDto = eventFacade.toPseudonymizedDto(event, pseudonymizer); + EventDto eventDto = eventFacade.toPseudonymizedDto(event, pseudonymizer.getPseudonymizer()); // reporting user is not set to null here as it would not pass the validation // the receiver appears to set it to SORMAS2SORMAS Client anyway eventDto.setSormasToSormasOriginInfo(null); @@ -79,7 +79,7 @@ protected EventDto getDto(Event event, Pseudonymizer pseudonymizer) { return eventDto; } - public SormasToSormasEventPreview getEventPreview(Event event, Pseudonymizer pseudonymizer) { + public SormasToSormasEventPreview getEventPreview(Event event, SormasToSormasPseudonymizer pseudonymizer) { SormasToSormasEventPreview preview = new SormasToSormasEventPreview(); preview.setUuid(event.getUuid()); @@ -90,7 +90,7 @@ public SormasToSormasEventPreview getEventPreview(Event event, Pseudonymizer pse preview.setDiseaseDetails(event.getDiseaseDetails()); preview.setEventLocation(LocationFacadeEjb.toDto(event.getEventLocation())); - pseudonymizer.pseudonymizeDto(SormasToSormasEventPreview.class, preview, false, null); + pseudonymizer. getPseudonymizer().pseudonymizeDto(SormasToSormasEventPreview.class, preview, false, null); return preview; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/eventparticipant/EventParticipantShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/eventparticipant/EventParticipantShareDataBuilder.java index 44c44232462..12e2e1d579c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/eventparticipant/EventParticipantShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/eventparticipant/EventParticipantShareDataBuilder.java @@ -29,8 +29,8 @@ import de.symeda.sormas.backend.event.EventParticipantFacadeEjb; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; -import de.symeda.sormas.backend.util.Pseudonymizer; @Stateless @LocalBean @@ -56,7 +56,7 @@ public SormasToSormasEventParticipantDto doBuildShareData( EventParticipant eventParticipant, ShareRequestInfo requestInfo, boolean ownerShipHandedOver) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); EventParticipantDto eventParticipantDto = getDto(eventParticipant, pseudonymizer); dataBuilderHelper.pseudonymizePerson(eventParticipantDto.getPerson(), requestInfo); @@ -65,9 +65,9 @@ public SormasToSormasEventParticipantDto doBuildShareData( } @Override - protected EventParticipantDto getDto(EventParticipant eventParticipant, Pseudonymizer pseudonymizer) { + protected EventParticipantDto getDto(EventParticipant eventParticipant, SormasToSormasPseudonymizer pseudonymizer) { - EventParticipantDto eventParticipantDto = eventParticipantFacade.toPseudonymizedDto(eventParticipant, pseudonymizer); + EventParticipantDto eventParticipantDto = eventParticipantFacade.toPseudonymizedDto(eventParticipant, pseudonymizer.getPseudonymizer()); // reporting user is not set to null here as it would not pass the validation // the receiver appears to set it to SORMAS2SORMAS Client anyway eventParticipantDto.setSormasToSormasOriginInfo(null); @@ -83,19 +83,22 @@ public void doBusinessValidation(SormasToSormasEventParticipantDto sormasToSorma @Override public SormasToSormasEventParticipantPreview doBuildShareDataPreview(EventParticipant eventParticipant, ShareRequestInfo requestInfo) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); return getEventParticipantPreview(eventParticipant, pseudonymizer); } - public SormasToSormasEventParticipantPreview getEventParticipantPreview(EventParticipant eventParticipant, Pseudonymizer pseudonymizer) { + public SormasToSormasEventParticipantPreview getEventParticipantPreview( + EventParticipant eventParticipant, + SormasToSormasPseudonymizer pseudonymizer) { SormasToSormasEventParticipantPreview preview = new SormasToSormasEventParticipantPreview(); preview.setUuid(eventParticipant.getUuid()); preview.setPerson(dataBuilderHelper.getPersonPreview(eventParticipant.getPerson())); preview.setEvent(EventFacadeEjb.toReferenceDto(eventParticipant.getEvent())); - pseudonymizer.pseudonymizeDto(SormasToSormasEventParticipantPreview.class, preview, false, null); + pseudonymizer. getPseudonymizer() + .pseudonymizeDto(SormasToSormasEventParticipantPreview.class, preview, false, null); return preview; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/immunization/ImmunizationShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/immunization/ImmunizationShareDataBuilder.java index 7e5ba52af63..571fba3f0cf 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/immunization/ImmunizationShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/immunization/ImmunizationShareDataBuilder.java @@ -28,8 +28,8 @@ import de.symeda.sormas.backend.immunization.entity.Immunization; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; -import de.symeda.sormas.backend.util.Pseudonymizer; @Stateless @LocalBean @@ -52,15 +52,15 @@ public ImmunizationShareDataBuilder() { @Override protected SormasToSormasImmunizationDto doBuildShareData(Immunization immunization, ShareRequestInfo requestInfo, boolean ownerShipHandedOver) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); ImmunizationDto immunizationDto = getDto(immunization, pseudonymizer); return new SormasToSormasImmunizationDto(immunizationDto); } @Override - protected ImmunizationDto getDto(Immunization immunization, Pseudonymizer pseudonymizer) { + protected ImmunizationDto getDto(Immunization immunization, SormasToSormasPseudonymizer pseudonymizer) { - ImmunizationDto immunizationDto = immunizationFacade.toPseudonymizedDto(immunization, pseudonymizer); + ImmunizationDto immunizationDto = immunizationFacade.toPseudonymizedDto(immunization, pseudonymizer.getPseudonymizer()); // reporting user is not set to null here as it would not pass the validation // the receiver appears to set it to SORMAS2SORMAS Client anyway immunizationDto.setSormasToSormasOriginInfo(null); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/sample/SampleShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/sample/SampleShareDataBuilder.java index 4429dc0ed4b..e6e5896b72e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/sample/SampleShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/sample/SampleShareDataBuilder.java @@ -35,10 +35,11 @@ import de.symeda.sormas.backend.sample.PathogenTestFacadeEjb; import de.symeda.sormas.backend.sample.Sample; import de.symeda.sormas.backend.sample.SampleFacadeEjb; +import de.symeda.sormas.backend.sample.SamplePseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; -import de.symeda.sormas.backend.util.Pseudonymizer; @Stateless @LocalBean @@ -64,35 +65,38 @@ public SampleShareDataBuilder() { @Override protected SormasToSormasSampleDto doBuildShareData(Sample sample, ShareRequestInfo requestInfo, boolean ownerShipHandedOver) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); SampleDto sampleDto = getDto(sample, pseudonymizer); List pathogenTests = sample.getPathogenTests().stream().map(t -> { - PathogenTestDto pathogenTestDto = pathogenTestFacade.convertToDto(t, pseudonymizer); + PathogenTestDto pathogenTestDto = pathogenTestFacade.convertToDto(t, pseudonymizer.getPseudonymizer()); dataBuilderHelper.clearIgnoredProperties(pathogenTestDto); return pathogenTestDto; }).collect(Collectors.toList()); - List additionalTests = - sample.getAdditionalTests().stream().map(t -> additionalTestFacade.convertToDto(t, pseudonymizer)).collect(Collectors.toList()); + List additionalTests = sample.getAdditionalTests() + .stream() + .map(t -> additionalTestFacade.convertToDto(t, pseudonymizer.getPseudonymizer())) + .collect(Collectors.toList()); List externalMessages = Collections.emptyList(); if (ownerShipHandedOver) { - externalMessages = - sample.getSampleReports() - .stream() - .map(s -> dataBuilderHelper.getExternalMessageDto(s.getLabMessage(), requestInfo)) - .collect(Collectors.toList()); + externalMessages = sample.getSampleReports() + .stream() + .map(s -> dataBuilderHelper.getExternalMessageDto(s.getLabMessage(), requestInfo)) + .collect(Collectors.toList()); } return new SormasToSormasSampleDto(sampleDto, pathogenTests, additionalTests, externalMessages); } @Override - protected SampleDto getDto(Sample sample, Pseudonymizer pseudonymizer) { + protected SampleDto getDto(Sample sample, SormasToSormasPseudonymizer pseudonymizer) { - SampleDto sampleDto = sampleFacade.convertToDto(sample, pseudonymizer); + SampleDto sampleDto = sampleFacade.convertToDto( + sample, + new SamplePseudonymizer<>(pseudonymizer.getPseudonymizer(), pseudonymizer.getPseudonymizer(), pseudonymizer.getPseudonymizer())); // reporting user is not set to null here as it would not pass the validation // the receiver appears to set it to SORMAS2SORMAS Client anyway sampleDto.setSormasToSormasOriginInfo(null); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/surveillancereport/SurveillanceReportShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/surveillancereport/SurveillanceReportShareDataBuilder.java index a89c93a6878..49bee0c5f5f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/surveillancereport/SurveillanceReportShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/surveillancereport/SurveillanceReportShareDataBuilder.java @@ -29,8 +29,8 @@ import de.symeda.sormas.backend.caze.surveillancereport.SurveillanceReportFacadeEjb.SurveillanceReportFacadeEjbLocal; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; -import de.symeda.sormas.backend.util.Pseudonymizer; @Stateless @LocalBean @@ -56,7 +56,7 @@ protected SormasToSormasSurveillanceReportDto doBuildShareData( SurveillanceReport report, ShareRequestInfo requestInfo, boolean ownerShipHandedOver) { - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); SurveillanceReportDto reportDto = getDto(report, pseudonymizer); SormasToSormasExternalMessageDto externalMessage = null; @@ -68,8 +68,8 @@ protected SormasToSormasSurveillanceReportDto doBuildShareData( } @Override - protected SurveillanceReportDto getDto(SurveillanceReport surveillanceReport, Pseudonymizer pseudonymizer) { - SurveillanceReportDto report = surveillanceReportFacade.toPseudonymizedDto(surveillanceReport, pseudonymizer); + protected SurveillanceReportDto getDto(SurveillanceReport surveillanceReport, SormasToSormasPseudonymizer pseudonymizer) { + SurveillanceReportDto report = surveillanceReportFacade.toPseudonymizedDto(surveillanceReport, pseudonymizer.getPseudonymizer()); // reporting user is not set to null here as it would not pass the validation // the receiver appears to set it to SORMAS2SORMAS Client anyway report.setSormasToSormasOriginInfo(null); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilder.java index 945db7f8acc..25368d656f3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilder.java @@ -18,12 +18,11 @@ import java.util.ArrayList; import java.util.List; -import de.symeda.sormas.backend.util.Pseudonymizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.symeda.sormas.api.sormastosormas.entities.SormasToSormasEntityDto; import de.symeda.sormas.api.sormastosormas.SormasToSormasShareableDto; +import de.symeda.sormas.api.sormastosormas.entities.SormasToSormasEntityDto; import de.symeda.sormas.api.sormastosormas.validation.SormasToSormasValidationException; import de.symeda.sormas.api.sormastosormas.validation.ValidationErrors; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -66,7 +65,7 @@ public SHARED buildShareData(ADO data, ShareRequestInfo requestInfo, boolean own } return shared; } - protected abstract DTO getDto(ADO ado, Pseudonymizer pseudonymizer); + protected abstract DTO getDto(ADO ado, SormasToSormasPseudonymizer pseudonymizer); protected abstract void doBusinessValidation(SHARED shared) throws ValidationRuntimeException; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java index 96ed61a0b7e..c63d8af7c04 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java @@ -65,8 +65,8 @@ public class ShareDataBuilderHelper { @EJB private ExternalMessageFacadeEjb.ExternalMessageFacadeEjbLocal externalMessageFacade; - public Pseudonymizer createPseudonymizer(ShareRequestInfo requestInfo) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultNoCheckers(false); + public SormasToSormasPseudonymizer createPseudonymizer(ShareRequestInfo requestInfo) { + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultNoCheckers(false); if (requestInfo.isPseudonymizedPersonalData()) { pseudonymizer.addFieldAccessChecker(PersonalDataFieldAccessChecker.forcedNoAccess(), PersonalDataFieldAccessChecker.forcedNoAccess()); @@ -75,11 +75,11 @@ public Pseudonymizer createPseudonymizer(ShareRequestInfo requestInfo) { pseudonymizer.addFieldAccessChecker(SensitiveDataFieldAccessChecker.forcedNoAccess(), SensitiveDataFieldAccessChecker.forcedNoAccess()); } - return pseudonymizer; + return new SormasToSormasPseudonymizer(pseudonymizer); } - public PersonDto getPersonDto(Person person, Pseudonymizer pseudonymizer, ShareRequestInfo requestInfo) { - PersonDto personDto = personFacade.toPseudonymizedDto(person, pseudonymizer, true); + public PersonDto getPersonDto(Person person, SormasToSormasPseudonymizer pseudonymizer, ShareRequestInfo requestInfo) { + PersonDto personDto = personFacade.toPseudonymizedDto(person, pseudonymizer.getPseudonymizer(), true); pseudonymizePerson(personDto, requestInfo); clearIgnoredProperties(personDto); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/SormasToSormasPseudonymizer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/SormasToSormasPseudonymizer.java new file mode 100644 index 00000000000..806dc958d87 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/SormasToSormasPseudonymizer.java @@ -0,0 +1,31 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.sormastosormas.share; + +import de.symeda.sormas.backend.util.Pseudonymizer; + +public class SormasToSormasPseudonymizer { + + private final Pseudonymizer pseudonymizer; + + public SormasToSormasPseudonymizer(Pseudonymizer pseudonymizer) { + this.pseudonymizer = pseudonymizer; + } + + public Pseudonymizer getPseudonymizer() { + return (Pseudonymizer) pseudonymizer; + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareRequestInfoFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareRequestInfoFacadeEjb.java index 061fd530aac..6b45cfaa4ef 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareRequestInfoFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareRequestInfoFacadeEjb.java @@ -53,11 +53,11 @@ import de.symeda.sormas.backend.sormastosormas.entities.event.EventShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.entities.eventparticipant.EventParticipantShareDataBuilder; import de.symeda.sormas.backend.sormastosormas.share.ShareDataBuilderHelper; +import de.symeda.sormas.backend.sormastosormas.share.SormasToSormasPseudonymizer; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.DtoHelper; 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; @@ -197,7 +197,7 @@ public ShareRequestDetailsDto getShareRequestDetails(String requestUuid) { details.setDataType(requestInfo.getDataType()); details.setStatus(requestInfo.getRequestStatus()); - Pseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); + SormasToSormasPseudonymizer pseudonymizer = dataBuilderHelper.createPseudonymizer(requestInfo); details.setCases( requestInfo.getShares() .stream() diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccess.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccess.java new file mode 100644 index 00000000000..292c6c62934 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccess.java @@ -0,0 +1,88 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.ManyToOne; + +import de.symeda.sormas.backend.caze.Case; +import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.user.User; + +@Entity(name = SpecialCaseAccess.TABLE_NAME) +public class SpecialCaseAccess extends AbstractDomainObject { + + public static final String TABLE_NAME = "specialcaseaccesses"; + private static final long serialVersionUID = -4418393030246909960L; + + public static final String CAZE = "caze"; + public static final String ASSIGNED_TO = "assignedTo"; + public static final String END_DATE_TIME = "endDateTime"; + + private Case caze; + private User assignedTo; + private User assignedBy; + private Date endDateTime; + private Date assignmentDate; + + @ManyToOne + public Case getCaze() { + return caze; + } + + public void setCaze(Case caze) { + this.caze = caze; + } + + @ManyToOne + public User getAssignedTo() { + return assignedTo; + } + + public void setAssignedTo(User assignedTo) { + this.assignedTo = assignedTo; + } + + @ManyToOne + public User getAssignedBy() { + return assignedBy; + } + + public void setAssignedBy(User assignedBy) { + this.assignedBy = assignedBy; + } + + @Column + public Date getEndDateTime() { + return endDateTime; + } + + public void setEndDateTime(Date endDateTime) { + this.endDateTime = endDateTime; + } + + @Column + public Date getAssignmentDate() { + return assignmentDate; + } + + public void setAssignmentDate(Date assignmentDate) { + this.assignmentDate = assignmentDate; + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjb.java new file mode 100644 index 00000000000..666e50cb75d --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjb.java @@ -0,0 +1,127 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.validation.Valid; + +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessDto; +import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessFacade; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.backend.caze.CaseFacadeEjb; +import de.symeda.sormas.backend.caze.CaseService; +import de.symeda.sormas.backend.user.UserFacadeEjb; +import de.symeda.sormas.backend.user.UserService; +import de.symeda.sormas.backend.util.DtoHelper; +import de.symeda.sormas.backend.util.RightsAllowed; + +@Stateless(name = "SpecialCaseAccessFacade") +@RightsAllowed(UserRight._GRANT_SPECIAL_CASE_ACCESS) +public class SpecialCaseAccessFacadeEjb implements SpecialCaseAccessFacade { + + @EJB + private SpecialCaseAccessService specialCaseAccessService; + @EJB + private CaseService caseService; + @EJB + private UserService userService; + + @Override + public SpecialCaseAccessDto save(@Valid SpecialCaseAccessDto dto) { + SpecialCaseAccess existingAdo = specialCaseAccessService.getByUuid(dto.getUuid()); + SpecialCaseAccess ado = fillOrBuildEntity(dto, existingAdo); + + specialCaseAccessService.ensurePersisted(ado); + + return toDto(ado); + } + + @Override + public List getAllActiveByCase(CaseReferenceDto caze) { + return specialCaseAccessService.getAllActiveByCase(caze).stream().map(SpecialCaseAccessFacadeEjb::toDto).collect(Collectors.toList()); + } + + @Override + public void delete(String uuid) { + specialCaseAccessService.deletePermanent(specialCaseAccessService.getByUuid(uuid)); + } + + @Override + public boolean isAnyAssignedToUser(List cases, UserReferenceDto user) { + return specialCaseAccessService.isAnyAssignedToUser(cases, user); + } + + @Override + public void saveAll(@Valid List specialAccesses) { + specialAccesses.forEach(access -> { + specialCaseAccessService.deleteByCaseAndAssignee(access.getCaze(), access.getAssignedTo()); + save(access); + }); + } + + @RightsAllowed(UserRight._SYSTEM) + public void deleteExpiredSpecialCaseAccesses() { + specialCaseAccessService + .getByPredicate((cb, from, cq) -> cb.lessThanOrEqualTo(from.get(SpecialCaseAccess.END_DATE_TIME), new java.util.Date())) + .forEach(specialCaseAccessService::deletePermanent); + } + + private SpecialCaseAccess fillOrBuildEntity(SpecialCaseAccessDto source, SpecialCaseAccess target) { + if (source == null) { + return null; + } + + target = DtoHelper.fillOrBuildEntity(source, target, SpecialCaseAccess::new, true); + + target.setCaze(caseService.getByReferenceDto(source.getCaze())); + target.setAssignedTo(userService.getByReferenceDto(source.getAssignedTo())); + target.setAssignedBy(userService.getByReferenceDto(source.getAssignedBy())); + target.setAssignmentDate(source.getAssignmentDate()); + target.setEndDateTime(source.getEndDateTime()); + + return target; + } + + private static SpecialCaseAccessDto toDto(SpecialCaseAccess source) { + if (source == null) { + return null; + } + + SpecialCaseAccessDto target = new SpecialCaseAccessDto(); + DtoHelper.fillDto(target, source); + + target.setCaze(CaseFacadeEjb.toReferenceDto(source.getCaze())); + target.setAssignedTo(UserFacadeEjb.toReferenceDto(source.getAssignedTo())); + target.setAssignedBy(UserFacadeEjb.toReferenceDto(source.getAssignedBy())); + target.setAssignmentDate(source.getAssignmentDate()); + target.setEndDateTime(source.getEndDateTime()); + + return target; + } + + @LocalBean + @Stateless + public static class SpecialCaseAccessFacadeEjbLocal extends SpecialCaseAccessFacadeEjb { + + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessService.java new file mode 100644 index 00000000000..dfe480e9deb --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessService.java @@ -0,0 +1,215 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.From; +import javax.persistence.criteria.JoinType; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; +import de.symeda.sormas.api.contact.IsContact; +import de.symeda.sormas.api.event.IsEventParticipant; +import de.symeda.sormas.api.immunization.IsImmunization; +import de.symeda.sormas.api.manualmessagelog.ManualMessageLogIndexDto; +import de.symeda.sormas.api.person.IsPerson; +import de.symeda.sormas.api.sample.IsSample; +import de.symeda.sormas.api.task.IsTask; +import de.symeda.sormas.api.travelentry.IsTravelEntry; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.uuid.HasUuid; +import de.symeda.sormas.api.visit.IsVisit; +import de.symeda.sormas.backend.caze.Case; +import de.symeda.sormas.backend.caze.surveillancereport.SurveillanceReport; +import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.BaseAdoService; +import de.symeda.sormas.backend.common.CriteriaBuilderHelper; +import de.symeda.sormas.backend.contact.Contact; +import de.symeda.sormas.backend.event.EventParticipant; +import de.symeda.sormas.backend.immunization.entity.Immunization; +import de.symeda.sormas.backend.manualmessagelog.ManualMessageLog; +import de.symeda.sormas.backend.person.Person; +import de.symeda.sormas.backend.sample.PathogenTest; +import de.symeda.sormas.backend.sample.Sample; +import de.symeda.sormas.backend.task.Task; +import de.symeda.sormas.backend.travelentry.TravelEntry; +import de.symeda.sormas.backend.user.User; +import de.symeda.sormas.backend.util.IterableHelper; +import de.symeda.sormas.backend.util.ModelConstants; +import de.symeda.sormas.backend.vaccination.Vaccination; +import de.symeda.sormas.backend.visit.Visit; + +@Stateless +@LocalBean +public class SpecialCaseAccessService extends BaseAdoService { + + public SpecialCaseAccessService() { + super(SpecialCaseAccess.class); + } + + public Collection getAllActiveByCase(CaseReferenceDto caze) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(getElementClass()); + Root from = cq.from(getElementClass()); + + cq.where( + cb.equal(from.join(SpecialCaseAccess.CAZE, JoinType.LEFT).get(Case.UUID), caze.getUuid()), + cb.greaterThanOrEqualTo(from.get(SpecialCaseAccess.END_DATE_TIME), new Date())); + cq.orderBy(cb.desc(from.get(SpecialCaseAccess.END_DATE_TIME))); + + return em.createQuery(cq).getResultList(); + } + + public boolean isAnyAssignedToUser(List cases, UserReferenceDto user) { + return IterableHelper.anyBatch( + cases, + ModelConstants.PARAMETER_LIMIT, + batchedCases -> exists( + (cb, from, cq) -> cb.and( + from.join(SpecialCaseAccess.CAZE, JoinType.LEFT) + .get(Case.UUID) + .in(batchedCases.stream().map(CaseReferenceDto::getUuid).collect(Collectors.toList())), + cb.equal(from.join(SpecialCaseAccess.ASSIGNED_TO, JoinType.LEFT).get(User.UUID), user.getUuid()), + cb.greaterThanOrEqualTo(from.get(SpecialCaseAccess.END_DATE_TIME), new Date())))); + } + + public void deleteByCaseAndAssignee(CaseReferenceDto caze, UserReferenceDto assignedTo) { + getByPredicate( + (cb, from, cq) -> cb.and( + cb.equal(from.join(SpecialCaseAccess.CAZE, JoinType.LEFT).get(Case.UUID), caze.getUuid()), + cb.equal(from.join(SpecialCaseAccess.ASSIGNED_TO, JoinType.LEFT).get(User.UUID), assignedTo.getUuid()))) + .forEach(this::deletePermanent); + } + + public List getCaseUuidsWithSpecialAccess(Collection cases) { + return getUuidsWithSpecialAccess(Case.class, cases, r -> r); + } + + public List getSurveillanceReportUuidsWithSpecialAccess(Collection cases) { + return getUuidsWithSpecialAccess(SurveillanceReport.class, cases, r -> r.join(SurveillanceReport.CAZE)); + } + + public List getImmunizationUuidsWithSpecialAccess(Collection immunizations) { + return getUuidsWithSpecialAccess(Immunization.class, immunizations, r -> r.join(Immunization.PERSON).join(Person.CASES)); + } + + public List getSampleUuidsWithSpecialAccess(Collection samples) { + return getUuidsWithSpecialAccess(Sample.class, samples, r -> r.join(Sample.ASSOCIATED_CASE)); + } + + public List getPathogenTestUuidsWithSpecialAccess(Collection tests) { + return getUuidsWithSpecialAccess(PathogenTest.class, tests, r -> r.join(PathogenTest.SAMPLE).join(Sample.ASSOCIATED_CASE)); + } + + public List getTaskUuidsWithSpecialAccess(Collection tasks) { + return getUuidsWithSpecialAccess(Task.class, tasks, r -> r.join(Task.CAZE)); + } + + public List getTravelEntryUuidsWithSpecialAccess(Collection entries) { + return getUuidsWithSpecialAccess(TravelEntry.class, entries, r -> r.join(TravelEntry.PERSON).join(Person.CASES)); + } + + public List getVaccinationUuidsWithSpecialAccess(List vaccinations) { + return getUuidsWithSpecialAccess( + Vaccination.class, + vaccinations, + r -> r.join(Vaccination.IMMUNIZATION).join(Immunization.PERSON).join(Person.CASES)); + } + + public List getVisitUuidsWithSpecialAccess(Collection visits) { + return getUuidsWithSpecialAccess(Visit.class, visits, r -> r.join(Visit.CAZE)); + } + + public List getPersonUuidsWithSpecialAccess(Collection persons) { + return getUuidsWithSpecialAccess( + Person.class, + persons, + r -> r.join(Person.CASES, JoinType.LEFT), + r -> r.join(Person.CONTACTS, JoinType.LEFT).join(Contact.CAZE, JoinType.LEFT)); + } + + public List getEventParticipantUuidsWithSpecialAccess(Collection eventParticipants) { + return getUuidsWithSpecialAccess(EventParticipant.class, eventParticipants, r -> r.join(EventParticipant.PERSON).join(Person.CASES)); + } + + public List getContactUuidsWithSpecialAccess(Collection contacts) { + return getUuidsWithSpecialAccess(Contact.class, contacts, r -> r.join(Contact.CAZE)); + } + + public List getManualMessageLogUuidsWithSpecialAccess(Collection manualMessageLogs) { + return getUuidsWithSpecialAccess( + ManualMessageLog.class, + manualMessageLogs, + r -> r.join(ManualMessageLog.RECIPIENT_PERSON).join(Person.CASES)); + } + + @SafeVarargs + private List getUuidsWithSpecialAccess( + Class entityType, + Collection entities, + Function, From>... caseJoins) { + + if (entities.isEmpty()) { + return Collections.emptyList(); + } + + List result = new ArrayList<>(entities.size()); + + IterableHelper.executeBatched(entities, ModelConstants.PARAMETER_LIMIT, batch -> { + final CriteriaBuilder cb = em.getCriteriaBuilder(); + final CriteriaQuery cq = cb.createQuery(String.class); + final Root from = cq.from(entityType); + + Predicate specialAccessPredicate = null; + for (Function, From> caseJoin : caseJoins) { + specialAccessPredicate = CriteriaBuilderHelper.or( + cb, + specialAccessPredicate, + createSpecialCaseAccessFilter(cb, caseJoin.apply(from).join(Case.SPECIAL_CASE_ACCESSES, JoinType.LEFT))); + } + + cq.select(from.get(AbstractDomainObject.UUID)); + cq.where( + cb.and( + from.get(AbstractDomainObject.UUID).in(batch.stream().map(HasUuid::getUuid).collect(Collectors.toList())), + specialAccessPredicate)); + + result.addAll(em.createQuery(cq).getResultList()); + }); + + return result; + } + + public Predicate createSpecialCaseAccessFilter(CriteriaBuilder cb, From from) { + return cb.and( + cb.equal(from.get(SpecialCaseAccess.ASSIGNED_TO), getCurrentUser()), + cb.greaterThanOrEqualTo(from.get(SpecialCaseAccess.END_DATE_TIME), new Date())); + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java index 483141bb7bc..7930440849c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java @@ -34,6 +34,7 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; +import de.symeda.sormas.api.task.IsTask; import de.symeda.sormas.api.task.TaskContext; import de.symeda.sormas.api.task.TaskPriority; import de.symeda.sormas.api.task.TaskStatus; @@ -48,7 +49,7 @@ import de.symeda.sormas.backend.user.User; @Entity -public class Task extends AbstractDomainObject { +public class Task extends AbstractDomainObject implements IsTask { private static final long serialVersionUID = -4754578341242164661L; 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 ac8f1ad371b..a5f1e37d73b 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 @@ -26,6 +26,7 @@ import java.util.Objects; import java.util.function.Supplier; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.ejb.EJB; import javax.ejb.LocalBean; @@ -51,17 +52,17 @@ import org.slf4j.LoggerFactory; import de.symeda.sormas.api.EditPermissionType; -import de.symeda.sormas.api.caze.BirthDateDto; import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.caze.IsCase; 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.environment.EnvironmentReferenceDto; import de.symeda.sormas.api.event.EventReferenceDto; -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.task.IsTask; import de.symeda.sormas.api.task.TaskContext; import de.symeda.sormas.api.task.TaskCriteria; import de.symeda.sormas.api.task.TaskDto; @@ -79,6 +80,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.backend.FacadeHelper; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseFacadeEjb; @@ -112,12 +114,14 @@ import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.location.LocationJoins; import de.symeda.sormas.backend.person.Person; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.travelentry.TravelEntry; import de.symeda.sormas.backend.travelentry.TravelEntryFacadeEjb; import de.symeda.sormas.backend.travelentry.services.TravelEntryService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.user.UserService; +import de.symeda.sormas.backend.util.AssociableDtoPseudonymizer; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.IterableHelper; import de.symeda.sormas.backend.util.JurisdictionHelper; @@ -160,6 +164,8 @@ public class TaskFacadeEjb implements TaskFacade { private EnvironmentService environmentService; @EJB private NotificationService notificationService; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public Task fillOrBuildEntity(TaskDto source, Task target, boolean checkChangeDate) { if (source == null) { @@ -251,7 +257,7 @@ public Task fillOrBuildEntity(TaskDto source, Task target, boolean checkChangeDa return target; } - public TaskDto toDto(Task source, Pseudonymizer pseudonymizer) { + public TaskDto toDto(Task source, TaskPseudonymizer pseudonymizer) { if (source == null) { return null; @@ -260,7 +266,7 @@ public TaskDto toDto(Task source, Pseudonymizer pseudonymizer) { return toDto(source, pseudonymizer, taskService.getJurisdictionFlags(source)); } - private TaskDto toDto(Task source, Pseudonymizer pseudonymizer, TaskJurisdictionFlagsDto jurisdictionFlags) { + private TaskDto toDto(Task source, TaskPseudonymizer pseudonymizer, TaskJurisdictionFlagsDto jurisdictionFlags) { TaskDto target = new TaskDto(); @@ -298,7 +304,7 @@ private TaskDto toDto(Task source, Pseudonymizer pseudonymizer, TaskJurisdiction pseudonymizer.pseudonymizeDto(TaskDto.class, target, jurisdictionFlags.getInJurisdiction(), t -> { if (source.getCaze() != null) { - pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, target.getCaze(), jurisdictionFlags.getCaseInJurisdiction(), null); + pseudonymizer.pseudonymizeCaseReference(target.getCaze(), jurisdictionFlags.getCaseInJurisdiction()); } if (source.getContact() != null) { @@ -310,12 +316,14 @@ private TaskDto toDto(Task source, Pseudonymizer pseudonymizer, TaskJurisdiction } if (source.getEvent() != null) { - pseudonymizer.pseudonymizeDto(EventReferenceDto.class, target.getEvent(), jurisdictionFlags.getEventInJurisdiction(), null); + pseudonymizer.pseudonymizeAssociatedDto(EventReferenceDto.class, target.getEvent(), jurisdictionFlags.getEventInJurisdiction()); } if (source.getTravelEntry() != null) { - pseudonymizer - .pseudonymizeDto(TravelEntryReferenceDto.class, target.getTravelEntry(), jurisdictionFlags.getTravelEntryInJurisdiction(), null); + pseudonymizer.pseudonymizeAssociatedDto( + TravelEntryReferenceDto.class, + target.getTravelEntry(), + jurisdictionFlags.getTravelEntryInJurisdiction()); } }); @@ -325,13 +333,34 @@ private TaskDto toDto(Task source, Pseudonymizer pseudonymizer, TaskJurisdiction private List toPseudonymizedDtos(List entities) { Map jurisdictionFlags = taskService.getJurisdictionsFlags(entities); - Pseudonymizer pseudonymizer = createPseudonymizer(); - List dtos = entities.stream().map(p -> toDto(p, pseudonymizer, jurisdictionFlags.get(p.getId()))).collect(Collectors.toList()); - return dtos; + TaskPseudonymizer pseudonymizer = createPseudonymizer(entities); + + return entities.stream().map(p -> toDto(p, pseudonymizer, jurisdictionFlags.get(p.getId()))).collect(Collectors.toList()); + } + + private TaskPseudonymizer createPseudonymizer(IsTask task) { + return createPseudonymizer(false, task != null ? Collections.singletonList(task) : Collections.emptyList()); } - private Pseudonymizer createPseudonymizer() { - return Pseudonymizer.getDefault(userService::hasRight); + private TaskPseudonymizer createPseudonymizer(Collection tasks) { + return createPseudonymizer(false, tasks); + } + + private TaskPseudonymizer createPseudonymizer(boolean withPlaceHolder, Collection tasks) { + List uuidsWithSpecialAccess = specialCaseAccessService.getTaskUuidsWithSpecialAccess(tasks); + SpecialAccessCheck specialAccessCheck = t -> uuidsWithSpecialAccess.contains(t.getUuid()); + + List associatedCases = tasks.stream() + .flatMap(t -> Stream.of(t.getCaze(), t.getContact() != null ? t.getContact().getCaze() : null)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + return new TaskPseudonymizer<>( + withPlaceHolder + ? Pseudonymizer.getDefaultWithPlaceHolder(userService, specialAccessCheck) + : Pseudonymizer.getDefault(userService, specialAccessCheck), + caseFacade.createSimplePseudonymizer(associatedCases), + Pseudonymizer.getDefault(userService)); } @Override @@ -378,7 +407,7 @@ public TaskDto saveTask(@Valid TaskDto dto) { } } - return toDto(ado, createPseudonymizer()); + return toDto(ado, createPseudonymizer(existingTask)); } @Override @@ -393,12 +422,12 @@ public List saveBulkTasks( List processedTasks = new ArrayList<>(); UserReferenceDto currentUser = userService.getCurrentUser().toReference(); - for (String taskUuid : taskUuidList) { + List tasks = getByUuids(taskUuidList); - try { - Task task = taskService.getByUuid(taskUuid); - TaskDto taskDto = toDto(task, createPseudonymizer()); + for (TaskDto taskDto : tasks) { + String taskUuid = taskDto.getUuid(); + try { if (priorityChange) { taskDto.setPriority(updatedTempTask.getPriority()); } @@ -561,6 +590,7 @@ public List getIndexList(TaskCriteria taskCriteria, Integer first, joins.getContact().get(Contact.UUID), joins.getContactPerson().get(Person.FIRST_NAME), joins.getContactPerson().get(Person.LAST_NAME), + joins.getContactCasePerson().get(Person.UUID), joins.getContactCasePerson().get(Person.FIRST_NAME), joins.getContactCasePerson().get(Person.LAST_NAME), joins.getTravelEntry().get(TravelEntry.UUID), @@ -627,43 +657,40 @@ public List getIndexList(TaskCriteria taskCriteria, Integer first, assigneeUser.setCaption(assigneeUser.getCaption() + " (" + (taskCount != null ? taskCount.toString() : "") + ")"); } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - Pseudonymizer emptyValuePseudonymizer = createPseudonymizer(); + TaskPseudonymizer pseudonymizer = createPseudonymizer(true, tasks); + pseudonymizer .pseudonymizeDtoCollection(TaskIndexDto.class, tasks, t -> t.getTaskJurisdictionFlagsDto().getInJurisdiction(), (t, ignored) -> { final TaskJurisdictionFlagsDto taskJurisdictionFlagsDto = t.getTaskJurisdictionFlagsDto(); if (t.getCaze() != null) { - emptyValuePseudonymizer - .pseudonymizeDto(CaseReferenceDto.class, t.getCaze(), taskJurisdictionFlagsDto.getCaseInJurisdiction(), null); + pseudonymizer.pseudonymizeCaseReference(t.getCaze(), taskJurisdictionFlagsDto.getCaseInJurisdiction()); } if (t.getContact() != null) { pseudonymizeContactReference( - emptyValuePseudonymizer, + pseudonymizer, t.getContact(), taskJurisdictionFlagsDto.getContactInJurisdiction(), taskJurisdictionFlagsDto.getContactCaseInJurisdiction()); } if (t.getEvent() != null) { - emptyValuePseudonymizer - .pseudonymizeDto(EventReferenceDto.class, t.getEvent(), taskJurisdictionFlagsDto.getEventInJurisdiction(), null); + pseudonymizer + .pseudonymizeAssociatedDto(EventReferenceDto.class, t.getEvent(), taskJurisdictionFlagsDto.getEventInJurisdiction()); } if (t.getTravelEntry() != null) { - emptyValuePseudonymizer.pseudonymizeDto( + pseudonymizer.pseudonymizeAssociatedDto( TravelEntryReferenceDto.class, t.getTravelEntry(), - taskJurisdictionFlagsDto.getTravelEntryInJurisdiction(), - null); + taskJurisdictionFlagsDto.getTravelEntryInJurisdiction()); } if (t.getEnvironment() != null) { - emptyValuePseudonymizer.pseudonymizeDto( + pseudonymizer.pseudonymizeAssociatedDto( EnvironmentReferenceDto.class, t.getEnvironment(), - taskJurisdictionFlagsDto.getEnvironmentInJurisdiction(), - null); + taskJurisdictionFlagsDto.getEnvironmentInJurisdiction()); } }, true); } @@ -829,12 +856,8 @@ public List getExportList(TaskCriteria criteria, Collection tasks = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection( - TaskExportDto.class, - tasks, - TaskExportDto::isInJurisdiction, - (t, inJurisdiction) -> pseudonymizer.pseudonymizeDto(BirthDateDto.class, t.getPersonBirthDate(), inJurisdiction, null)); + TaskPseudonymizer pseudonymizer = createPseudonymizer(true, tasks); + pseudonymizer.pseudonymizeDtoCollection(TaskExportDto.class, tasks, TaskExportDto::isInJurisdiction, null, false); return tasks; } @@ -847,15 +870,15 @@ private Expression getPersonAddressFieldPath(CriteriaBuilder cb, TaskJoi return CriteriaBuilderHelper.coalesce(cb, joins.getCasePersonAddress().get(fieldName), joins.getContactPersonAddress().get(fieldName)); } - private void pseudonymizeContactReference( - Pseudonymizer pseudonymizer, + private void pseudonymizeContactReference( + TaskPseudonymizer pseudonymizer, ContactReferenceDto contactReference, boolean isContactInJurisdiction, boolean isContactCaseInJurisdiction) { - pseudonymizer.pseudonymizeDto(ContactReferenceDto.PersonName.class, contactReference.getContactName(), isContactInJurisdiction, null); + pseudonymizer.pseudonymizeAssociatedDto(ContactReferenceDto.PersonName.class, contactReference.getContactName(), isContactInJurisdiction); - if (contactReference.getCaseName() != null) { - pseudonymizer.pseudonymizeDto(ContactReferenceDto.PersonName.class, contactReference.getCaseName(), isContactCaseInJurisdiction, null); + if (contactReference.getCaze() != null) { + pseudonymizer.pseudonymizeCaseReference(contactReference.getCaze(), isContactCaseInJurisdiction); } } @@ -948,7 +971,9 @@ public Map getPendingTaskCountPerUser(List userUuids) { @Override public TaskDto getByUuid(String uuid) { - return toDto(taskService.getByUuid(uuid), createPseudonymizer()); + Task task = taskService.getByUuid(uuid); + + return toDto(task, createPseudonymizer(task)); } @Override @@ -1175,4 +1200,14 @@ public EditPermissionType getEditPermissionType(String uuid) { public static class TaskFacadeEjbLocal extends TaskFacadeEjb { } + + public static final class TaskPseudonymizer extends AssociableDtoPseudonymizer { + + public TaskPseudonymizer( + Pseudonymizer rootPseudonymizer, + Pseudonymizer casePseudonymizer, + Pseudonymizer deafultAssociatedObjectPseudonymizer) { + super(rootPseudonymizer, casePseudonymizer, deafultAssociatedObjectPseudonymizer); + } + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskIndexDtoResultTransformer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskIndexDtoResultTransformer.java index d26c460eaca..9afa732098c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskIndexDtoResultTransformer.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskIndexDtoResultTransformer.java @@ -43,7 +43,7 @@ public TaskIndexDto transformTuple(Object[] tuple, String[] aliases) { (String) tuple[++index], (String) tuple[++index], (Disease) tuple[++index], (String) tuple[++index], (EventStatus) tuple[++index], (EventInvestigationStatus) tuple[++index], (Date) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], - (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], + (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (TaskType) tuple[++index], (TaskPriority) tuple[++index], (Date) tuple[++index], (Date) tuple[++index], (TaskStatus) tuple[++index], (Disease) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], (String) tuple[++index], diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java index 1143293b79c..f10a766ad9f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java @@ -19,8 +19,6 @@ import javax.validation.constraints.NotNull; import de.symeda.sormas.api.caze.CaseCriteria; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.therapy.PrescriptionCriteria; import de.symeda.sormas.api.therapy.PrescriptionDto; import de.symeda.sormas.api.therapy.PrescriptionExportDto; @@ -89,18 +87,15 @@ public List getIndexList(PrescriptionCriteria criteria) { List indexList = em.createQuery(cq).getResultList(); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(PrescriptionIndexDto.class, indexList, p -> p.getInJurisdiction(), (p, inJurisdiction) -> { - pseudonymizer.pseudonymizeDto(PrescriptionIndexDto.PrescriptionIndexType.class, p.getPrescriptionIndexType(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(PrescriptionIndexDto.PrescriptionIndexRoute.class, p.getPrescriptionIndexRoute(), inJurisdiction, null); - }); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); + pseudonymizer.pseudonymizeDtoCollection(PrescriptionIndexDto.class, indexList, PrescriptionIndexDto::getInJurisdiction, null); return indexList; } @Override public PrescriptionDto getPrescriptionByUuid(String uuid) { - return convertToDto(service.getByUuid(uuid), Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(service.getByUuid(uuid), Pseudonymizer.getDefault(userService)); } @Override @@ -119,7 +114,7 @@ public PrescriptionDto savePrescription(@Valid PrescriptionDto prescription) { service.ensurePersisted(entity); - return convertToDto(entity, Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(entity, Pseudonymizer.getDefault(userService)); } @Override @@ -148,12 +143,11 @@ public List getAllActivePrescriptionsAfter(Date date, Integer b private List toPseudonymizedDtos(List entities) { List inJurisdictionIds = service.getInJurisdictionIds(entities); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); - List dtos = - entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); - return dtos; + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); + + return entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); } - + @Override public List getByUuids(List uuids) { @@ -208,13 +202,13 @@ public List getExportList(CaseCriteria criteria, Collecti List exportList = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(PrescriptionExportDto.class, exportList, p -> p.getInJurisdiction(), null); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); + pseudonymizer.pseudonymizeDtoCollection(PrescriptionExportDto.class, exportList, PrescriptionExportDto::getInJurisdiction, null); return exportList; } - private PrescriptionDto convertToDto(Prescription source, Pseudonymizer pseudonymizer) { + private PrescriptionDto convertToDto(Prescription source, Pseudonymizer pseudonymizer) { if (source == null) { return null; @@ -224,14 +218,14 @@ private PrescriptionDto convertToDto(Prescription source, Pseudonymizer pseudony return convertToDto(source, pseudonymizer, inJurisdiction); } - private PrescriptionDto convertToDto(Prescription source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private PrescriptionDto convertToDto(Prescription source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { PrescriptionDto dto = toDto(source); pseudonymizeDto(source, dto, pseudonymizer, inJurisdiction); return dto; } - private void pseudonymizeDto(Prescription source, PrescriptionDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private void pseudonymizeDto(Prescription source, PrescriptionDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (source != null && dto != null) { pseudonymizer.pseudonymizeDto(PrescriptionDto.class, dto, inJurisdiction, null); } @@ -239,7 +233,7 @@ private void pseudonymizeDto(Prescription source, PrescriptionDto dto, Pseudonym private void restorePseudonymizedDto(PrescriptionDto prescription, Prescription existingPrescription, PrescriptionDto existingPrescriptionDto) { if (existingPrescription != null) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); pseudonymizer.restorePseudonymizedValues( PrescriptionDto.class, prescription, diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/TreatmentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/TreatmentFacadeEjb.java index 854a550c3ee..e71060be315 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/TreatmentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/TreatmentFacadeEjb.java @@ -19,8 +19,6 @@ import javax.validation.constraints.NotNull; import de.symeda.sormas.api.caze.CaseCriteria; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.therapy.TreatmentCriteria; import de.symeda.sormas.api.therapy.TreatmentDto; import de.symeda.sormas.api.therapy.TreatmentExportDto; @@ -88,11 +86,8 @@ public List getIndexList(TreatmentCriteria criteria) { List indexList = em.createQuery(cq).getResultList(); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(TreatmentIndexDto.class, indexList, t -> t.getInJurisdiction(), (t, inJurisdiction) -> { - pseudonymizer.pseudonymizeDto(TreatmentIndexDto.TreatmentIndexType.class, t.getTreatmentIndexType(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(TreatmentIndexDto.TreatmentIndexRoute.class, t.getTreatmentIndexRoute(), inJurisdiction, null); - }); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); + pseudonymizer.pseudonymizeDtoCollection(TreatmentIndexDto.class, indexList, TreatmentIndexDto::getInJurisdiction, null); return indexList; } @@ -127,18 +122,15 @@ public List getTreatmentForPrescription(List prescrip List treatmentIndexDtos = em.createQuery(cq).getResultList(); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(TreatmentIndexDto.class, treatmentIndexDtos, t -> t.getInJurisdiction(), (t, inJurisdiction) -> { - pseudonymizer.pseudonymizeDto(TreatmentIndexDto.TreatmentIndexType.class, t.getTreatmentIndexType(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(TreatmentIndexDto.TreatmentIndexRoute.class, t.getTreatmentIndexRoute(), inJurisdiction, null); - }); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); + pseudonymizer.pseudonymizeDtoCollection(TreatmentIndexDto.class, treatmentIndexDtos, TreatmentIndexDto::getInJurisdiction, null); return treatmentIndexDtos; } @Override public TreatmentDto getTreatmentByUuid(String uuid) { - return convertToDto(service.getByUuid(uuid), Pseudonymizer.getDefault(userService::hasRight)); + return convertToDto(service.getByUuid(uuid), Pseudonymizer.getDefault(userService)); } @Override @@ -203,10 +195,9 @@ public List getByUuids(List uuids) { private List toPseudonymizedDtos(List entities) { List inJurisdictionIds = service.getInJurisdictionIds(entities); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); - List dtos = - entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); - return dtos; + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); + + return entities.stream().map(p -> convertToDto(p, pseudonymizer, inJurisdictionIds.contains(p.getId()))).collect(Collectors.toList()); } @Override @@ -254,13 +245,13 @@ public List getExportList(CaseCriteria criteria, Collection< List exportList = QueryHelper.getResultList(em, cq, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(TreatmentExportDto.class, exportList, t -> t.getInJurisdiction(), null); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefaultWithPlaceHolder(userService); + pseudonymizer.pseudonymizeDtoCollection(TreatmentExportDto.class, exportList, TreatmentExportDto::getInJurisdiction, null); return exportList; } - private TreatmentDto convertToDto(Treatment source, Pseudonymizer pseudonymizer) { + private TreatmentDto convertToDto(Treatment source, Pseudonymizer pseudonymizer) { if (source == null) { return null; @@ -270,14 +261,14 @@ private TreatmentDto convertToDto(Treatment source, Pseudonymizer pseudonymizer) return convertToDto(source, pseudonymizer, inJurisdiction); } - private TreatmentDto convertToDto(Treatment source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private TreatmentDto convertToDto(Treatment source, Pseudonymizer pseudonymizer, boolean inJurisdiction) { TreatmentDto dto = toDto(source); pseudonymizeDto(source, dto, pseudonymizer, inJurisdiction); return dto; } - private void pseudonymizeDto(Treatment source, TreatmentDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + private void pseudonymizeDto(Treatment source, TreatmentDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (source != null && dto != null) { pseudonymizer.pseudonymizeDto(TreatmentDto.class, dto, inJurisdiction, null); } @@ -285,7 +276,7 @@ private void pseudonymizeDto(Treatment source, TreatmentDto dto, Pseudonymizer p private void restorePseudonymizedDto(TreatmentDto source, Treatment existingTreatment, TreatmentDto existingDto) { if (existingTreatment != null) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService); pseudonymizer.restorePseudonymizedValues(TreatmentDto.class, source, existingDto, service.inJurisdictionOrOwned(existingTreatment)); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntry.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntry.java index e4faaa6533a..193dcdba31e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntry.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntry.java @@ -20,6 +20,7 @@ import de.symeda.sormas.api.contact.QuarantineType; import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.travelentry.DeaContentEntry; +import de.symeda.sormas.api.travelentry.IsTravelEntry; import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.common.CoreAdo; @@ -33,7 +34,7 @@ import de.symeda.sormas.backend.util.ModelConstants; @Entity(name = "travelentry") -public class TravelEntry extends CoreAdo { +public class TravelEntry extends CoreAdo implements IsTravelEntry { private static final long serialVersionUID = 8415313365918535184L; 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 32e9149e7b9..62d398e19ca 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 @@ -3,6 +3,7 @@ import java.sql.Timestamp; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -28,11 +29,11 @@ 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.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.travelentry.DeaContentEntry; +import de.symeda.sormas.api.travelentry.IsTravelEntry; import de.symeda.sormas.api.travelentry.TravelEntryCriteria; import de.symeda.sormas.api.travelentry.TravelEntryDto; import de.symeda.sormas.api.travelentry.TravelEntryFacade; @@ -44,6 +45,7 @@ import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.backend.FacadeHelper; import de.symeda.sormas.backend.caze.CaseFacadeEjb; import de.symeda.sormas.backend.caze.CaseService; @@ -58,6 +60,7 @@ import de.symeda.sormas.backend.infrastructure.region.RegionService; import de.symeda.sormas.backend.person.PersonFacadeEjb; import de.symeda.sormas.backend.person.PersonService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.travelentry.services.TravelEntryListService; import de.symeda.sormas.backend.travelentry.services.TravelEntryService; import de.symeda.sormas.backend.user.User; @@ -91,6 +94,8 @@ public class TravelEntryFacadeEjb private CaseFacadeEjb.CaseFacadeEjbLocal caseFacade; @EJB private TravelEntryService travelEntryService; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public TravelEntryFacadeEjb() { } @@ -208,18 +213,33 @@ public long count(TravelEntryCriteria criteria, boolean ignoreUserFilter) { } @Override - protected void pseudonymizeDto(TravelEntry source, TravelEntryDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected Pseudonymizer createPseudonymizer(List travelEntries) { + return Pseudonymizer.getDefault(userService, getSpecialAccessChecker(travelEntries)); + } + + private SpecialAccessCheck getSpecialAccessChecker(Collection entries) { + List specialAccessUuids = specialCaseAccessService.getTravelEntryUuidsWithSpecialAccess(entries); + + return t -> specialAccessUuids.contains(t.getUuid()); + } + + @Override + protected void pseudonymizeDto(TravelEntry source, TravelEntryDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (dto != null) { pseudonymizer.pseudonymizeDto(TravelEntryDto.class, dto, inJurisdiction, c -> { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser, dto); }); } } @Override - protected void restorePseudonymizedDto(TravelEntryDto dto, TravelEntryDto existingDto, TravelEntry entity, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto( + TravelEntryDto dto, + TravelEntryDto existingDto, + TravelEntry entity, + Pseudonymizer pseudonymizer) { if (existingDto != null) { final boolean inJurisdiction = service.inJurisdictionOrOwned(entity); final User currentUser = userService.getCurrentUser(); @@ -232,7 +252,7 @@ protected void restorePseudonymizedDto(TravelEntryDto dto, TravelEntryDto existi public List getIndexList(TravelEntryCriteria criteria, Integer first, Integer max, List sortProperties) { List resultList = service.getIndexList(criteria, first, max, sortProperties); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(getSpecialAccessChecker(resultList)); pseudonymizer.pseudonymizeDtoCollection(TravelEntryIndexDto.class, resultList, TravelEntryIndexDto::isInJurisdiction, null); return resultList; @@ -288,7 +308,7 @@ public List getEntriesList(TravelEntryListCriteria crit } List entries = travelEntryListService.getEntriesList(personId, caseId, first, max); - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(getSpecialAccessChecker(entries)); pseudonymizer.pseudonymizeDtoCollection(TravelEntryListEntryDto.class, entries, TravelEntryListEntryDto::isInJurisdiction, null); return entries; 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 58c11cc85fb..401a9e5fc2c 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 @@ -15,6 +15,7 @@ import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.person.PersonQueryContext; import de.symeda.sormas.backend.person.PersonService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.travelentry.TravelEntry; import de.symeda.sormas.backend.travelentry.TravelEntryJoins; import de.symeda.sormas.backend.travelentry.TravelEntryJurisdictionPredicateValidator; @@ -28,6 +29,8 @@ public abstract class BaseTravelEntryService extends AbstractCoreAdoService getIndexListIds(TravelEntryCriteria criteria, Integer first, final Root travelEntry = cq.from(TravelEntry.class); TravelEntryQueryContext travelEntryQueryContext = new TravelEntryQueryContext(cb, cq, travelEntry); - TravelEntryJoins joins = travelEntryQueryContext.getJoins(); List> selections = new ArrayList<>(); selections.add(travelEntry.get(Person.ID)); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/AssociableDtoPseudonymizer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/AssociableDtoPseudonymizer.java new file mode 100644 index 00000000000..28261dceabc --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/AssociableDtoPseudonymizer.java @@ -0,0 +1,88 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.util; + +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; + +import de.symeda.sormas.api.caze.CaseReferenceDto; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.utils.pseudonymization.DtoPseudonymizer; +import de.symeda.sormas.backend.user.User; + +public abstract class AssociableDtoPseudonymizer { + + private final Pseudonymizer rootPseudonymizer; + private final Pseudonymizer casePseudonymizer; + private final Pseudonymizer deafultAssociatedObjectPseudonymizer; + + public AssociableDtoPseudonymizer( + Pseudonymizer rootPseudonymizer, + Pseudonymizer casePseudonymizer, + Pseudonymizer deafultAssociatedObjectPseudonymizer) { + this.rootPseudonymizer = rootPseudonymizer; + this.casePseudonymizer = casePseudonymizer; + this.deafultAssociatedObjectPseudonymizer = deafultAssociatedObjectPseudonymizer; + } + + public void pseudonymizeDto(Class type, T task, boolean inJurisdiction, DtoPseudonymizer.CustomPseudonymization customPseudonymization) { + rootPseudonymizer.pseudonymizeDto(type, task, inJurisdiction, customPseudonymization); + } + + public void pseudonymizeDtoCollection( + Class type, + Collection dtos, + DtoPseudonymizer.JurisdictionValidator jurisdictionValidator, + DtoPseudonymizer.CustomCollectionItemPseudonymization customPseudonymization, + boolean skipEmbeddedFields) { + rootPseudonymizer.pseudonymizeDtoCollection(type, dtos, jurisdictionValidator, customPseudonymization, skipEmbeddedFields); + } + + public void pseudonymizeCaseReference(CaseReferenceDto caze, Boolean caseInJurisdiction) { + casePseudonymizer.pseudonymizeDto(CaseReferenceDto.class, caze, caseInJurisdiction, null); + } + + public void pseudonymizeAssociatedDto(Class type, X dto, Boolean inJurisdiction) { + //noinspection unchecked + ((Pseudonymizer) deafultAssociatedObjectPseudonymizer).pseudonymizeDto(type, dto, inJurisdiction, null); + } + + public void pseudonymizeUser(User user, User currentUser, Consumer setPseudonymizedValue, T sample) { + rootPseudonymizer.pseudonymizeUser(user, currentUser, setPseudonymizedValue, sample); + } + + public void pseudonymizeEmbeddedDto( + Class type, + X dto, + boolean inJurisdiction, + T rootDto, + DtoPseudonymizer.CustomPseudonymization customPseudonymization) { + rootPseudonymizer.pseudonymizeEmbeddedDto(type, dto, inJurisdiction, rootDto, customPseudonymization); + } + + public void pseudonymizeEmbeddedDtoCollection(Class type, List dtos, boolean inJurisdiction, T rootDto) { + rootPseudonymizer.pseudonymizeEmbeddedDtoCollection(type, dtos, inJurisdiction, rootDto); + } + + public void restorePseudonymizedValues(Class sampleDtoClass, T dto, T existingSampleDto, boolean inJurisdiction) { + rootPseudonymizer.restorePseudonymizedValues(sampleDtoClass, dto, existingSampleDto, inJurisdiction); + } + + public void restoreUser(User reportingUser, User currentUser, T dto, Consumer setPseudonymizedValue) { + rootPseudonymizer.restoreUser(reportingUser, currentUser, dto, setPseudonymizedValue); + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/IterableHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/IterableHelper.java index dba2bd270e7..6a363c24eed 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/IterableHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/IterableHelper.java @@ -1,6 +1,7 @@ package de.symeda.sormas.backend.util; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; @@ -31,7 +32,7 @@ private IterableHelper() { * @param batchFunction * The function to call for a batch. */ - public static void executeBatched(List entries, int batchSize, Consumer> batchFunction) { + public static void executeBatched(Collection entries, int batchSize, Consumer> batchFunction) { if (CollectionUtils.isNotEmpty(entries)) { for (List batch : ListUtils.partition(new ArrayList<>(entries), batchSize)) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java index d1dabd32791..48cc1772c09 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java @@ -15,7 +15,7 @@ package de.symeda.sormas.backend.util; -import java.lang.reflect.Field; +import java.util.Arrays; import java.util.function.Consumer; import de.symeda.sormas.api.i18n.Captions; @@ -24,58 +24,92 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.fieldaccess.FieldAccessCheckers; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.api.utils.fieldaccess.checkers.PersonalDataFieldAccessChecker; import de.symeda.sormas.api.utils.fieldaccess.checkers.SensitiveDataFieldAccessChecker; import de.symeda.sormas.api.utils.pseudonymization.DtoPseudonymizer; -import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto; import de.symeda.sormas.backend.user.User; +import de.symeda.sormas.backend.user.UserService; -public class Pseudonymizer extends DtoPseudonymizer { +public final class Pseudonymizer extends DtoPseudonymizer { - public static Pseudonymizer getDefault(RightCheck rightCheck) { - return new Pseudonymizer(createDefaultFieldAccessCheckers(true, rightCheck), createDefaultFieldAccessCheckers(false, rightCheck), "", true); + public static Pseudonymizer getDefault(UserService userService) { + return getDefault(userService::hasRight, noopSpecialAccessCheck()); } - public static Pseudonymizer getDefault(RightCheck rightCheck, String stringValuePlaceholder) { - return new Pseudonymizer( - createDefaultFieldAccessCheckers(true, rightCheck), - createDefaultFieldAccessCheckers(false, rightCheck), + public static Pseudonymizer getDefault(UserService userService, SpecialAccessCheck specialAccessCheck) { + return getDefault(userService::hasRight, specialAccessCheck); + } + + public static Pseudonymizer getDefault(UserService userService, SpecialAccessCheck specialAccessCheck, String stringValuePlaceholder) { + return getDefault(userService::hasRight, specialAccessCheck, stringValuePlaceholder); + } + + public static Pseudonymizer getDefault(UserService userService, String stringValuePlaceholder) { + return getDefault(userService::hasRight, noopSpecialAccessCheck(), stringValuePlaceholder); + } + + private static Pseudonymizer getDefault(RightCheck rightCheck, SpecialAccessCheck specialAccessCheck) { + return new Pseudonymizer<>( + createDefaultFieldAccessCheckers(true, rightCheck, specialAccessCheck), + createDefaultFieldAccessCheckers(false, rightCheck, specialAccessCheck), + "", + true); + } + + private static Pseudonymizer getDefault(RightCheck rightCheck, SpecialAccessCheck specialAccessCheck, String stringValuePlaceholder) { + return new Pseudonymizer<>( + createDefaultFieldAccessCheckers(true, rightCheck, specialAccessCheck), + createDefaultFieldAccessCheckers(false, rightCheck, specialAccessCheck), stringValuePlaceholder, true); } - public static Pseudonymizer getDefaultWithInaccessibleValuePlaceHolder(RightCheck rightCheck) { - return getDefault(rightCheck, I18nProperties.getCaption(Captions.inaccessibleValue)); + public static Pseudonymizer getDefaultWithPlaceHolder(UserService userService) { + return getDefaultWithPlaceHolder(userService, noopSpecialAccessCheck()); + } + + public static Pseudonymizer getDefaultWithPlaceHolder(UserService userService, SpecialAccessCheck specialAccessCheck) { + return getDefaultWithPlaceHolder(userService::hasRight, specialAccessCheck); + } + + private static Pseudonymizer getDefaultWithPlaceHolder(RightCheck rightCheck, SpecialAccessCheck specialAccessCheck) { + return getDefault(rightCheck, specialAccessCheck, I18nProperties.getCaption(Captions.inaccessibleValue)); + } + + public static Pseudonymizer getDefaultNoCheckers(boolean pseudonymizeMandatoryFields) { + return new Pseudonymizer<>(new FieldAccessCheckers<>(), new FieldAccessCheckers<>(), "", pseudonymizeMandatoryFields); } - public static Pseudonymizer getDefaultNoCheckers(boolean pseudonymizeMandatoryFields) { - return new Pseudonymizer(new FieldAccessCheckers(), new FieldAccessCheckers(), "", pseudonymizeMandatoryFields); + private static SpecialAccessCheck noopSpecialAccessCheck() { + return t -> false; } - public Pseudonymizer( - FieldAccessCheckers inJurisdictionCheckers, - FieldAccessCheckers outsideJurisdictionCheckers, + private Pseudonymizer( + FieldAccessCheckers inJurisdictionCheckers, + FieldAccessCheckers outsideJurisdictionCheckers, String stringValuePlaceholder, boolean pseudonymizeMandatoryFields) { super(inJurisdictionCheckers, outsideJurisdictionCheckers, stringValuePlaceholder, pseudonymizeMandatoryFields); } - private SensitiveDataFieldAccessChecker getSensitiveDataFieldAccessChecker(boolean inJurisdiction) { + private SensitiveDataFieldAccessChecker getSensitiveDataFieldAccessChecker(boolean inJurisdiction) { + //noinspection unchecked return getFieldAccessCheckers(inJurisdiction).getCheckerByType(SensitiveDataFieldAccessChecker.class); } - public boolean pseudonymizeUser(User dtoUser, User currentUser, Consumer setPseudonymizedValue) { + public boolean pseudonymizeUser(User dtoUser, User currentUser, Consumer setPseudonymizedValue, T dto) { boolean isInJurisdiction = dtoUser == null || isUserInJurisdiction(dtoUser, currentUser); - return pseudonymizeUser(isInJurisdiction, setPseudonymizedValue); - } + return pseudonymizeUser(isInJurisdiction, setPseudonymizedValue, dto); + } - public boolean pseudonymizeUser(boolean isUserInJurisdiction, Consumer setPseudonymizedValue) { + public boolean pseudonymizeUser(boolean isUserInJurisdiction, Consumer setPseudonymizedValue, T dto) { - SensitiveDataFieldAccessChecker sensitiveDataFieldAccessChecker = getSensitiveDataFieldAccessChecker(isUserInJurisdiction); + SensitiveDataFieldAccessChecker sensitiveDataFieldAccessChecker = getSensitiveDataFieldAccessChecker(isUserInJurisdiction); boolean isConfiguredToCheck = sensitiveDataFieldAccessChecker != null && pseudonymizeMandatoryFields; - if (isConfiguredToCheck && !sensitiveDataFieldAccessChecker.hasRight()) { + if (isConfiguredToCheck && !sensitiveDataFieldAccessChecker.hasRight(dto)) { setPseudonymizedValue.accept(null); return true; @@ -84,29 +118,17 @@ public boolean pseudonymizeUser(boolean isUserInJurisdiction, Consumer dtoClass, String dtoFieldName) { - try { - return dtoClass.getDeclaredField(dtoFieldName); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } - } - - public void restoreUser( - User originalDtoUser, - User currentUser, - DTO dto, - Consumer setPseudonymizedValue) { + public void restoreUser(User originalDtoUser, User currentUser, T dto, Consumer setPseudonymizedValue) { boolean isInJurisdiction = originalDtoUser == null || isUserInJurisdiction(originalDtoUser, currentUser); - SensitiveDataFieldAccessChecker sensitiveDataFieldAccessChecker = getSensitiveDataFieldAccessChecker(isInJurisdiction); - if (sensitiveDataFieldAccessChecker != null && !sensitiveDataFieldAccessChecker.hasRight() || dto.isPseudonymized()) { + SensitiveDataFieldAccessChecker sensitiveDataFieldAccessChecker = getSensitiveDataFieldAccessChecker(isInJurisdiction); + if (sensitiveDataFieldAccessChecker != null && !sensitiveDataFieldAccessChecker.hasRight(dto) || isPseudonymized(dto)) { setPseudonymizedValue.accept(originalDtoUser != null ? originalDtoUser.toReference() : null); } } - private boolean isUserInJurisdiction(User user, User currentUser) { + private static boolean isUserInJurisdiction(User user, User currentUser) { JurisdictionLevel jurisdictionLevel = user.getJurisdictionLevel(); if (jurisdictionLevel == JurisdictionLevel.NATION || jurisdictionLevel == JurisdictionLevel.REGION) { @@ -136,14 +158,17 @@ private boolean isUserInJurisdiction(User user, User currentUser) { return true; } - private static FieldAccessCheckers createDefaultFieldAccessCheckers(boolean inJurisdiction, final RightCheck rightCheck) { - PersonalDataFieldAccessChecker personalFieldAccessChecker = inJurisdiction - ? PersonalDataFieldAccessChecker.inJurisdiction(rightCheck::hasRight) - : PersonalDataFieldAccessChecker.outsideJurisdiction(rightCheck::hasRight); - SensitiveDataFieldAccessChecker sensitiveFieldAccessChecker = inJurisdiction - ? SensitiveDataFieldAccessChecker.inJurisdiction(rightCheck::hasRight) - : SensitiveDataFieldAccessChecker.outsideJurisdiction(rightCheck::hasRight); - - return FieldAccessCheckers.withCheckers(personalFieldAccessChecker, sensitiveFieldAccessChecker); + private static FieldAccessCheckers createDefaultFieldAccessCheckers( + boolean inJurisdiction, + final RightCheck rightCheck, + SpecialAccessCheck specialAccessCheck) { + PersonalDataFieldAccessChecker personalFieldAccessChecker = inJurisdiction + ? PersonalDataFieldAccessChecker.inJurisdiction(rightCheck::hasRight, specialAccessCheck) + : PersonalDataFieldAccessChecker.outsideJurisdiction(rightCheck::hasRight, specialAccessCheck); + SensitiveDataFieldAccessChecker sensitiveFieldAccessChecker = inJurisdiction + ? SensitiveDataFieldAccessChecker.inJurisdiction(rightCheck::hasRight, specialAccessCheck) + : SensitiveDataFieldAccessChecker.outsideJurisdiction(rightCheck::hasRight, specialAccessCheck); + + return FieldAccessCheckers.withCheckers(Arrays.asList(personalFieldAccessChecker, sensitiveFieldAccessChecker)); } } 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 aabfda19138..d1dee05a51f 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 @@ -59,6 +59,7 @@ 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.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.api.vaccination.VaccinationCriteria; import de.symeda.sormas.api.vaccination.VaccinationDto; import de.symeda.sormas.api.vaccination.VaccinationFacade; @@ -80,6 +81,7 @@ import de.symeda.sormas.backend.immunization.ImmunizationFacadeEjb.ImmunizationFacadeEjbLocal; import de.symeda.sormas.backend.immunization.ImmunizationService; import de.symeda.sormas.backend.immunization.entity.Immunization; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.util.DtoHelper; @@ -109,6 +111,8 @@ public class VaccinationFacadeEjb private EventParticipantService eventParticipantService; @EJB private HealthConditionsMapper healthConditionsMapper; + @EJB + private SpecialCaseAccessService specialCaseAccessService; public VaccinationFacadeEjb() { } @@ -126,7 +130,7 @@ public VaccinationDto save(VaccinationDto dto) { Vaccination existingVaccination = dto.getUuid() != null ? service.getByUuid(dto.getUuid()) : null; VaccinationDto existingDto = toDto(existingVaccination); - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = createPseudonymizer(existingVaccination); restorePseudonymizedDto(dto, existingDto, existingVaccination, pseudonymizer); validate(dto); @@ -388,19 +392,32 @@ public List getEntriesListWithRelevance( } @Override - protected void pseudonymizeDto(Vaccination source, VaccinationDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected Pseudonymizer createPseudonymizer(List vaccinations) { + List specialAccessUuids = specialCaseAccessService.getVaccinationUuidsWithSpecialAccess(vaccinations); + + SpecialAccessCheck specialAccessCheck = t -> specialAccessUuids.contains(t.getUuid()); + + return Pseudonymizer.getDefault(userService, specialAccessCheck); + } + + @Override + protected void pseudonymizeDto(Vaccination source, VaccinationDto dto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (dto != null) { pseudonymizer.pseudonymizeDto(VaccinationDto.class, dto, inJurisdiction, c -> { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser, dto); }); } } @Override - protected void restorePseudonymizedDto(VaccinationDto dto, VaccinationDto existingDto, Vaccination vaccination, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto( + VaccinationDto dto, + VaccinationDto existingDto, + Vaccination vaccination, + Pseudonymizer pseudonymizer) { if (existingDto != null) { final boolean inJurisdiction = service.inJurisdictionOrOwned(vaccination); @@ -675,10 +692,12 @@ private boolean isDuplicateOf(VaccinationDto vaccination1, VaccinationDto vaccin } public Map getLatestByPersons(List persons, Disease disease) { - Pseudonymizer pseudonymizer = createPseudonymizer(); + List vaccinations = + service.getVaccinationsByCriteria(new VaccinationCriteria.Builder(persons).withDisease(disease).build(), null, null, null); + + Pseudonymizer pseudonymizer = createPseudonymizer(vaccinations); - return service.getVaccinationsByCriteria(new VaccinationCriteria.Builder(persons).withDisease(disease).build(), null, null, null) - .stream() + return vaccinations.stream() .collect(Collectors.toMap(v -> v.getImmunization().getPerson().getUuid(), v -> toPseudonymizedDto(v, pseudonymizer), (v1, v2) -> { Date v1Date = v1.getVaccinationDate() != null ? v1.getVaccinationDate() : v1.getReportDate(); Date v2Date = v2.getVaccinationDate() != null ? v2.getVaccinationDate() : v2.getReportDate(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/Visit.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/Visit.java index a264b6e08d2..033666410e8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/Visit.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/Visit.java @@ -39,6 +39,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.VisitOrigin; +import de.symeda.sormas.api.visit.IsVisit; import de.symeda.sormas.api.visit.VisitStatus; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.common.AbstractDomainObject; @@ -48,7 +49,7 @@ import de.symeda.sormas.backend.user.User; @Entity -public class Visit extends AbstractDomainObject { +public class Visit extends AbstractDomainObject implements IsVisit { private static final long serialVersionUID = -5731538672268784234L; 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 c83e62a7663..4c738a00c84 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 @@ -58,12 +58,10 @@ 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; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.importexport.ExportConfigurationDto; import de.symeda.sormas.api.person.PersonReferenceDto; -import de.symeda.sormas.api.symptoms.SymptomsDto; import de.symeda.sormas.api.symptoms.SymptomsHelper; import de.symeda.sormas.api.user.NotificationType; import de.symeda.sormas.api.user.UserReferenceDto; @@ -73,7 +71,9 @@ import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; +import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.api.visit.ExternalVisitDto; +import de.symeda.sormas.api.visit.IsVisit; import de.symeda.sormas.api.visit.VisitCriteria; import de.symeda.sormas.api.visit.VisitDto; import de.symeda.sormas.api.visit.VisitExportDto; @@ -97,6 +97,7 @@ import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.person.PersonFacadeEjb; import de.symeda.sormas.backend.person.PersonService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb.SymptomsFacadeEjbLocal; @@ -134,6 +135,8 @@ public class VisitFacadeEjb extends AbstractBaseEjb getIndexList(VisitCriteria visitCriteria, Integer fir List indexList = QueryHelper.getResultList(em, cq, new VisitIndexDtoResultTransformer(), first, max); if (!indexList.isEmpty()) { - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - indexList.forEach(visitIndex -> pseudonymizer.pseudonymizeDto(VisitIndexDto.class, visitIndex, visitIndex.getInJurisdiction(), null)); + Pseudonymizer pseudonymizer = createGenericPlaceholderPseudonymizer(getSpecialAccessChecker(indexList)); + pseudonymizer.pseudonymizeDtoCollection(VisitIndexDto.class, indexList, VisitIndexDto::getInJurisdiction, null); } return indexList; @@ -525,7 +528,7 @@ public List getVisitsExportList( if (!resultList.isEmpty()) { - Pseudonymizer pseudonymizer = createPseudonymizer(); + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService, getSpecialAccessChecker(resultList)); Set userIds = resultList.stream().map(VisitExportDto::getVisitUserId).filter(Objects::nonNull).collect(Collectors.toSet()); Map visitUsers = userIds.isEmpty() ? null @@ -540,11 +543,7 @@ public List getVisitsExportList( exportDto.setVisitUserRoles(user.getUserRoles().stream().map(UserRoleFacadeEjb::toReferenceDto).collect(Collectors.toSet())); } - pseudonymizer.pseudonymizeDto(VisitExportDto.class, exportDto, inJurisdiction, v -> { - if (v.getSymptoms() != null) { - pseudonymizer.pseudonymizeDto(SymptomsDto.class, v.getSymptoms(), inJurisdiction, null); - } - }); + pseudonymizer.pseudonymizeDto(VisitExportDto.class, exportDto, inJurisdiction, null); if (symptoms != null) { Optional.ofNullable(symptoms.get(exportDto.getSymptomsId())) @@ -587,24 +586,31 @@ public Visit fillOrBuildEntity(@NotNull VisitDto source, Visit target, boolean c } @Override - protected void pseudonymizeDto(Visit source, VisitDto visitDto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { + protected Pseudonymizer createPseudonymizer(List visits) { + return Pseudonymizer.getDefault(userService, getSpecialAccessChecker(visits)); + } + + private SpecialAccessCheck getSpecialAccessChecker(Collection visits) { + List specialAccessUuids = specialCaseAccessService.getVisitUuidsWithSpecialAccess(visits); + + return t -> specialAccessUuids.contains(t.getUuid()); + } + + @Override + protected void pseudonymizeDto(Visit source, VisitDto visitDto, Pseudonymizer pseudonymizer, boolean inJurisdiction) { if (visitDto != null) { - pseudonymizer.pseudonymizeDto(VisitDto.class, visitDto, inJurisdiction, v -> { - pseudonymizer.pseudonymizeDto(PersonReferenceDto.class, visitDto.getPerson(), inJurisdiction, null); - pseudonymizer.pseudonymizeDto(SymptomsDto.class, visitDto.getSymptoms(), inJurisdiction, null); - }); + pseudonymizer.pseudonymizeDto(VisitDto.class, visitDto, inJurisdiction, null); } } @Override - protected void restorePseudonymizedDto(VisitDto dto, VisitDto existingDto, Visit existingVisit, Pseudonymizer pseudonymizer) { + protected void restorePseudonymizedDto(VisitDto dto, VisitDto existingDto, Visit existingVisit, Pseudonymizer pseudonymizer) { if (existingDto != null) { boolean isInJurisdiction = service.inJurisdictionOrOwned(existingVisit); pseudonymizer.restorePseudonymizedValues(VisitDto.class, dto, existingDto, isInJurisdiction); - pseudonymizer.restorePseudonymizedValues(SymptomsDto.class, dto.getSymptoms(), existingDto.getSymptoms(), isInJurisdiction); } } diff --git a/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml b/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml index 408c4ba47a5..ff44756b2e3 100644 --- a/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml +++ b/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml @@ -82,6 +82,11 @@ CASE_RESPONSIBLE + + GRANT_SPECIAL_CASE_ACCESS + GRANT_SPECIAL_CASE_ACCESS + + IMMUNIZATION_VIEW IMMUNIZATION_VIEW diff --git a/sormas-backend/src/main/resources/META-INF/persistence.xml b/sormas-backend/src/main/resources/META-INF/persistence.xml index 2a8fa42d7fa..26b868d4990 100644 --- a/sormas-backend/src/main/resources/META-INF/persistence.xml +++ b/sormas-backend/src/main/resources/META-INF/persistence.xml @@ -85,6 +85,7 @@ de.symeda.sormas.backend.externalmessage.labmessage.TestReport de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration de.symeda.sormas.backend.externalmessage.labmessage.SampleReport + de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccess true diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index b8314b70261..0e34a7fdcdf 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12880,4 +12880,39 @@ ALTER TABLE customizableenumvalue_history ADD COLUMN active boolean; INSERT INTO schema_version (version_number, comment) VALUES (539, 'Add active column to customizable enum values #12804'); +-- 2024-01-18 Grant users special access to specific cases' personal data for a limited time #12758 + +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'GRANT_SPECIAL_CASE_ACCESS' FROM userroles WHERE userroles.linkeddefaultuserrole = 'ADMIN'; + +CREATE TABLE IF NOT EXISTS specialcaseaccesses +( + id bigint not null, + uuid varchar(36) not null unique, + changedate timestamp not null, + creationdate timestamp not null, + change_user_id bigint, + sys_period tstzrange not null, + caze_id bigint not null, + assignedto_id bigint not null, + assignedby_id bigint not null, + enddatetime timestamp not null, + assignmentdate timestamp not null, + primary key (id) +); + +ALTER TABLE specialcaseaccesses OWNER TO sormas_user; +ALTER TABLE specialcaseaccesses ADD CONSTRAINT fk_caze_id FOREIGN KEY (caze_id) REFERENCES cases (id); +ALTER TABLE specialcaseaccesses ADD CONSTRAINT fk_assignedto_id FOREIGN KEY (assignedto_id) REFERENCES users (id); +ALTER TABLE specialcaseaccesses ADD CONSTRAINT fk_assignedby_id FOREIGN KEY (assignedby_id) REFERENCES users (id); + +CREATE TABLE specialcaseaccesses_history (LIKE specialcaseaccesses); +CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE ON specialcaseaccesses + FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'specialcaseaccesses_history', true); +CREATE TRIGGER delete_history_trigger + AFTER DELETE ON specialcaseaccesses + FOR EACH ROW EXECUTE PROCEDURE delete_history_trigger('specialcaseaccesses_history', 'id'); +ALTER TABLE specialcaseaccesses_history OWNER TO sormas_user; + +INSERT INTO schema_version (version_number, comment) VALUES (540, 'Grant users special access to specific cases'' personal data for a limited time #12758'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** 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 701acbbeb7b..16c0848aa97 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 @@ -33,10 +33,6 @@ import javax.persistence.EntityManager; import javax.persistence.Query; -import de.symeda.sormas.api.manualmessagelog.ManualMessageLogFacade; -import de.symeda.sormas.backend.manualmessagelog.ManualMessageLogFacadeEjb; -import de.symeda.sormas.backend.manualmessagelog.ManualMessageLogFacadeEjb.ManualMessageLogFacadeEjbLocal; -import de.symeda.sormas.backend.manualmessagelog.ManualMessageLogService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -94,6 +90,7 @@ import de.symeda.sormas.api.infrastructure.pointofentry.PointOfEntryFacade; import de.symeda.sormas.api.infrastructure.region.RegionFacade; import de.symeda.sormas.api.infrastructure.subcontinent.SubcontinentFacade; +import de.symeda.sormas.api.manualmessagelog.ManualMessageLogFacade; import de.symeda.sormas.api.outbreak.OutbreakFacade; import de.symeda.sormas.api.report.AggregateReportFacade; import de.symeda.sormas.api.report.WeeklyReportFacade; @@ -107,6 +104,7 @@ import de.symeda.sormas.api.sormastosormas.entities.event.SormasToSormasEventFacade; import de.symeda.sormas.api.sormastosormas.entities.externalmessage.SormasToSormasExternalMessageFacade; import de.symeda.sormas.api.sormastosormas.share.incoming.SormasToSormasShareRequestFacade; +import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessFacade; import de.symeda.sormas.api.systemevents.SystemEventFacade; import de.symeda.sormas.api.task.TaskFacade; import de.symeda.sormas.api.therapy.PrescriptionFacade; @@ -203,6 +201,8 @@ import de.symeda.sormas.backend.infrastructure.region.RegionService; import de.symeda.sormas.backend.infrastructure.subcontinent.SubcontinentFacadeEjb; import de.symeda.sormas.backend.infrastructure.subcontinent.SubcontinentService; +import de.symeda.sormas.backend.manualmessagelog.ManualMessageLogFacadeEjb.ManualMessageLogFacadeEjbLocal; +import de.symeda.sormas.backend.manualmessagelog.ManualMessageLogService; import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; import de.symeda.sormas.backend.person.PersonService; @@ -242,6 +242,8 @@ import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoFacadeEjb.SormasToSormasShareInfoFacadeEjbLocal; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoService; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessFacadeEjb.SpecialCaseAccessFacadeEjbLocal; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.symptoms.SymptomsService; import de.symeda.sormas.backend.systemevent.SystemEventFacadeEjb; import de.symeda.sormas.backend.task.TaskFacadeEjb.TaskFacadeEjbLocal; @@ -1032,11 +1034,19 @@ public ExternalEmailFacade getExternalEmailFacade() { return getBean(ExternalEmailFacadeEjbLocal.class); } - public ManualMessageLogFacade getManualMessageLogFacade() { - return getBean(ManualMessageLogFacadeEjbLocal.class); - } + public ManualMessageLogFacade getManualMessageLogFacade() { + return getBean(ManualMessageLogFacadeEjbLocal.class); + } + + public ManualMessageLogService getManualMessageLogService() { + return getBean(ManualMessageLogService.class); + } - public ManualMessageLogService getManualMessageLogService() { - return getBean(ManualMessageLogService.class); - } + public SpecialCaseAccessFacade getSpecialCaseAccessFacade() { + return getBean(SpecialCaseAccessFacadeEjbLocal.class); + } + + public SpecialCaseAccessService getSpecialCaseAccessService() { + return getBean(SpecialCaseAccessService.class); + } } 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 fe237fa8f5e..c67ea2afc63 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 @@ -84,6 +84,7 @@ import de.symeda.sormas.backend.sormastosormas.share.incoming.SormasToSormasShareRequestFacadeEJB; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfoFacadeEjb; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfoFacadeEjb; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessFacadeEjb; import de.symeda.sormas.backend.task.TaskFacadeEjb; import de.symeda.sormas.backend.therapy.PrescriptionFacadeEjb; import de.symeda.sormas.backend.therapy.TreatmentFacadeEjb; @@ -275,7 +276,7 @@ public void testExternalMessageFacadeEjbAuthorization(JavaClasses classes) { assertFacadeEjbAnnotated( ExternalMessageFacadeEjb.class, AuthMode.CLASS_ONLY, - Arrays.asList("getExternalMessagesAdapterVersion", "fetchAndSaveExternalMessages", "bulkAssignExternalMessages", "delete"), + Arrays.asList("getExternalMessagesAdapterVersion", "fetchAndSaveExternalMessages", "bulkAssignExternalMessages", "delete"), classes); } @@ -464,6 +465,11 @@ public void testManualMessageLogFacadeEjbAuthorization(JavaClasses classes) { assertFacadeEjbAnnotated(ManualMessageLogFacadeEjb.class, AuthMode.METHODS_ONLY, classes); } + @ArchTest + public void testSpecialCaseAccessFacadeEjbAuthorization(JavaClasses classes) { + assertFacadeEjbAnnotated(SpecialCaseAccessFacadeEjb.class, AuthMode.CLASS_ONLY, Collections.singletonList("deleteExpiredSpecialCaseAccesses"), classes); + } + private void assertFacadeEjbAnnotated(Class facadeEjbClass, JavaClasses classes) { assertFacadeEjbAnnotated(facadeEjbClass, AuthMode.CLASS_AND_METHODS, Collections.emptyList(), classes); } 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 77c2e5a05e2..1f052750ecb 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 @@ -124,6 +124,7 @@ import de.symeda.sormas.api.sormastosormas.SormasToSormasOriginInfoDto; import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestDataType; import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestStatus; +import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessDto; import de.symeda.sormas.api.systemevents.SystemEventDto; import de.symeda.sormas.api.systemevents.SystemEventStatus; import de.symeda.sormas.api.systemevents.SystemEventType; @@ -2422,6 +2423,18 @@ public EnvironmentSampleDto createEnvironmentSample( return beanTest.getEnvironmentSampleFacade().save(sample); } + public SpecialCaseAccessDto createSpecialCaseAccess( + CaseReferenceDto caze, + UserReferenceDto assignedBy, + UserReferenceDto assignedTo, + Date endDateTime) { + SpecialCaseAccessDto specialCaseAccess = SpecialCaseAccessDto.build(caze, assignedBy); + specialCaseAccess.setAssignedTo(assignedTo); + specialCaseAccess.setEndDateTime(endDateTime); + + return beanTest.getSpecialCaseAccessFacade().save(specialCaseAccess); + } + /** * @author MartinWahnschaffe * @deprecated Use RDCF instead diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbPseudonymizationTest.java index 7e9a386605c..747d5aa697c 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbPseudonymizationTest.java @@ -67,6 +67,7 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.user.UserRoleReferenceDto; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.feature.FeatureConfiguration; @@ -460,6 +461,20 @@ public void testUpdateGpsCoordinatesWithPseudonymizedData() { assertThat(savedCase.getReportLon(), is(22.234)); } + @Test + public void testSpecialCaseAccessOutsideJurisdiction() { + + CaseDataDto caze = createCase(rdcf1, user1); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + + assertNotPseudonymized(getCaseFacade().getCaseDataByUuid(caze.getUuid()), rdcf1, user1); + assertNotPseudonymized(getCaseFacade().getByUuid(caze.getUuid()), rdcf1, user1); + assertNotPseudonymized(getCaseFacade().getByUuids(Collections.singletonList(caze.getUuid())).get(0), rdcf1, user1); + assertNotPseudonymized(getCaseFacade().getAllAfter(new Date(0)).get(0), rdcf1, user1); + assertThat(getCaseFacade().getIndexList(new CaseCriteria(), null, null, null).get(0).isPseudonymized(), is(false)); + assertThat(getCaseFacade().getExportList(new CaseCriteria(), null, null, 0, Integer.MAX_VALUE, null, Language.EN).get(0).getHealthFacilityDetails(), is("Test Facility details")); + } + private CaseDataDto createCase(TestDataCreator.RDCF rdcf, UserDto reportingUser) { return createCase(rdcf, createPerson().toReference(), reportingUser); } @@ -533,24 +548,28 @@ private PersonDto createPerson() { } private void assertNotPseudonymized(CaseDataDto caze) { + assertNotPseudonymized(caze, rdcf2, user2); + } + + private void assertNotPseudonymized(CaseDataDto caze, TestDataCreator.RDCF rdfc, UserDto user) { assertThat(caze.isPseudonymized(), is(false)); - assertThat(caze.getResponsibleRegion(), is(rdcf2.region)); - assertThat(caze.getResponsibleDistrict(), is(rdcf2.district)); - assertThat(caze.getResponsibleCommunity(), is(rdcf2.community)); - assertThat(caze.getRegion(), is(rdcf2.region)); - assertThat(caze.getDistrict(), is(rdcf2.district)); - assertThat(caze.getCommunity(), is(rdcf2.community)); - assertThat(caze.getHealthFacility(), is(rdcf2.facility)); + assertThat(caze.getResponsibleRegion(), is(rdfc.region)); + assertThat(caze.getResponsibleDistrict(), is(rdfc.district)); + assertThat(caze.getResponsibleCommunity(), is(rdfc.community)); + assertThat(caze.getRegion(), is(rdfc.region)); + assertThat(caze.getDistrict(), is(rdfc.district)); + assertThat(caze.getCommunity(), is(rdfc.community)); + assertThat(caze.getHealthFacility(), is(rdfc.facility)); assertThat(caze.getHealthFacilityDetails(), is("Test Facility details")); - assertThat(caze.getPointOfEntry(), is(rdcf2.pointOfEntry)); + assertThat(caze.getPointOfEntry(), is(rdfc.pointOfEntry)); assertThat(caze.getPointOfEntryDetails(), is("Test point of entry details")); assertThat(caze.getPerson().getFirstName(), is("James")); assertThat(caze.getPerson().getLastName(), is("Smith")); //sensitive data - assertThat(caze.getReportingUser().getUuid(), is(user2.getUuid())); - assertThat(caze.getSurveillanceOfficer().getUuid(), is(user2.getUuid())); - assertThat(caze.getClassificationUser().getUuid(), is(user2.getUuid())); + assertThat(caze.getReportingUser().getUuid(), is(user.getUuid())); + assertThat(caze.getSurveillanceOfficer().getUuid(), is(user.getUuid())); + assertThat(caze.getClassificationUser().getUuid(), is(user.getUuid())); assertThat(caze.getFollowUpComment(), is("Test comment")); // assertThat(caze.getReportLat(), is(46.432)); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjbPseudonymizationTest.java new file mode 100644 index 00000000000..62c11da1769 --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjbPseudonymizationTest.java @@ -0,0 +1,127 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.surveillancereport; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import java.util.Collections; +import java.util.Date; + +import org.junit.jupiter.api.Test; + +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.caze.surveillancereport.ReportingType; +import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportDto; +import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.JurisdictionLevel; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.user.UserRoleReferenceDto; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.backend.AbstractBeanTest; +import de.symeda.sormas.backend.TestDataCreator; + +public class SurveillanceReportFacadeEjbPseudonymizationTest extends AbstractBeanTest { + + private TestDataCreator.RDCF rdcf1; + private TestDataCreator.RDCF rdcf2; + private UserDto user1; + private UserDto user2; + + @Override + public void init() { + + super.init(); + + UserRoleReferenceDto newUserRole = creator.createUserRole( + "NoEventNoCaseView", + JurisdictionLevel.DISTRICT, + UserRight.CASE_CLINICIAN_VIEW, + UserRight.CASE_VIEW, + UserRight.PERSON_VIEW); + + rdcf1 = creator.createRDCF("Region 1", "District 1", "Community 1", "Facility 1", "Point of entry 1"); + user1 = creator.createUser( + rdcf1.region.getUuid(), + rdcf1.district.getUuid(), + rdcf1.facility.getUuid(), + "Surv", + "Off1", + creator.getUserRoleReference(DefaultUserRole.SURVEILLANCE_OFFICER), + newUserRole); + + rdcf2 = creator.createRDCF("Region 2", "District 2", "Community 2", "Facility 2", "Point of entry 2"); + user2 = creator.createUser( + rdcf2.region.getUuid(), + rdcf2.district.getUuid(), + rdcf2.facility.getUuid(), + "Surv", + "Off2", + creator.getUserRoleReference(DefaultUserRole.SURVEILLANCE_OFFICER), + newUserRole); + + loginWith(user2); + } + + @Test + public void testGetReportOfCaseOutsideJurisdiction() { + CaseDataDto caze = creator.createCase(user1.toReference(), creator.createPerson().toReference(), rdcf1); + SurveillanceReportDto report = createSurveillanceReport(caze, user1, rdcf1); + + assertPseudonymized(getSurveillanceReportFacade().getByUuid(report.getUuid())); + assertPseudonymized(getSurveillanceReportFacade().getByUuids(Collections.singletonList(report.getUuid())).get(0)); + } + + @Test + public void testGetReportOfCaseWithSpecialAccess() { + CaseDataDto caze = creator.createCase(user1.toReference(), creator.createPerson().toReference(), rdcf1); + SurveillanceReportDto report = createSurveillanceReport(caze, user1, rdcf1); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + + assertNotPseudonymized(getSurveillanceReportFacade().getByUuid(report.getUuid())); + assertNotPseudonymized(getSurveillanceReportFacade().getByUuids(Collections.singletonList(report.getUuid())).get(0)); + } + + private void assertPseudonymized(SurveillanceReportDto report) { + assertThat(report.isPseudonymized(), is(true)); + assertThat(report.getFacilityDetails(), is("")); + assertThat(report.getNotificationDetails(), is("")); + } + + private void assertNotPseudonymized(SurveillanceReportDto report) { + assertThat(report.isPseudonymized(), is(false)); + assertThat(report.getFacilityDetails(), is("Test facility details")); + assertThat(report.getNotificationDetails(), is("Test notification details")); + } + + private SurveillanceReportDto createSurveillanceReport(CaseDataDto caze, UserDto user, TestDataCreator.RDCF rdcf) { + SurveillanceReportDto newReport = SurveillanceReportDto.build(caze.toReference(), user.toReference()); + newReport.setReportDate(new Date()); + newReport.setDateOfDiagnosis(new Date()); + newReport.setReportingType(ReportingType.LABORATORY); + newReport.setFacilityRegion(rdcf.region); + newReport.setFacilityDistrict(rdcf.district); + newReport.setFacility(rdcf.facility); + newReport.setFacilityDetails("Test facility details"); + newReport.setNotificationDetails("Test notification details"); + + return getSurveillanceReportFacade().save(newReport); + } +} diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbPseudonymizationTest.java index 9c2a06c9e23..61c851c67b7 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbPseudonymizationTest.java @@ -52,6 +52,7 @@ import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; @@ -107,7 +108,7 @@ public void testGetContactInJurisdiction() { CaseDataDto caze = createCase(user2, rdcf2); ContactDto contact = createContact(user2, caze, rdcf2); - assertNotPseudonymized(getContactFacade().getByUuid(contact.getUuid()), true); + assertNotPseudonymized(getContactFacade().getByUuid(contact.getUuid()), user2, true); } @Test @@ -195,7 +196,7 @@ public void testPseudonymizeGetByUuids() { ContactDto contact2 = createContact(user1, caze, rdcf2); List contacts = getContactFacade().getByUuids(Arrays.asList(contact1.getUuid(), contact2.getUuid())); - assertNotPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact1.getUuid())).findFirst().get(), false); + assertNotPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact1.getUuid())).findFirst().get(), user2, false); assertPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact2.getUuid())).findFirst().get()); } @@ -213,9 +214,9 @@ public void testPseudonymizeGetAllAfter() { calendar.set(Calendar.YEAR, 2019); List contacts = getContactFacade().getAllAfter(calendar.getTime()); - assertNotPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact1.getUuid())).findFirst().get(), true); + assertNotPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact1.getUuid())).findFirst().get(), user2, true); assertPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact2.getUuid())).findFirst().get()); - assertNotPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact3.getUuid())).findFirst().get(), false); + assertNotPseudonymized(contacts.stream().filter(c -> c.getUuid().equals(contact3.getUuid())).findFirst().get(), user2, false); } @Test @@ -413,7 +414,28 @@ public void testUpdateContactInJurisdictionWithPseudonymizedDto() { assertThat(updatedContact.getReportLatLonAccuracy(), is(20F)); } - private void assertNotPseudonymized(ContactDto contact, boolean caseInJurisdiction) { + @Test + public void testGetContactOfCaseWithSpecialAccess() { + + CaseDataDto caze = createCase(user1, rdcf1); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + + ContactDto contact = createContact(user1, caze, rdcf1); + + assertNotPseudonymized(getContactFacade().getByUuid(contact.getUuid()), user1, true); + assertNotPseudonymized(getContactFacade().getByUuids(Collections.singletonList(contact.getUuid())).get(0), user1, true); + assertNotPseudonymized(getContactFacade().getAllAfter(new Date(0)).get(0), user1, true); + assertThat(getContactFacade().getIndexList(new ContactCriteria(), null, null, null).get(0).isPseudonymized(), is(false)); + assertThat( + getContactFacade().getExportList(new ContactCriteria(), null, 0, Integer.MAX_VALUE, null, Language.EN).get(0).getFirstName(), + is(contact.getPerson().getFirstName())); + assertThat(getContactFacade().getEntriesList(contact.getPerson().getUuid(), null, null).get(0).isPseudonymized(), is(false)); + assertThat( + getContactFacade().getContactFollowUpList(new ContactCriteria(), new Date(), 100, null, null, null).get(0).isPseudonymized(), + is(false)); + } + + private void assertNotPseudonymized(ContactDto contact, UserDto user, boolean caseInJurisdiction) { assertThat(contact.getPerson().getFirstName(), is("James")); assertThat(contact.getPerson().getLastName(), is("Smith")); @@ -421,8 +443,8 @@ private void assertNotPseudonymized(ContactDto contact, boolean caseInJurisdicti assertThat(contact.getCaze().getLastName(), caseInJurisdiction ? is("Smith") : isEmptyString()); // sensitive data - assertThat(contact.getReportingUser().getUuid(), is(user2.getUuid())); - assertThat(contact.getContactOfficer().getUuid(), is(user2.getUuid())); + assertThat(contact.getReportingUser().getUuid(), is(user.getUuid())); + assertThat(contact.getContactOfficer().getUuid(), is(user.getUuid())); assertThat(contact.getResultingCaseUser(), is(nullValue())); assertThat(contact.getReportLat(), is(46.432)); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbPseudonymizationTest.java index 573b1334772..707110ba071 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbPseudonymizationTest.java @@ -23,13 +23,18 @@ import static org.hamcrest.Matchers.nullValue; import java.util.Arrays; +import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.function.Consumer; import org.junit.jupiter.api.Test; +import de.symeda.sormas.api.Language; +import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventInvestigationStatus; +import de.symeda.sormas.api.event.EventParticipantCriteria; import de.symeda.sormas.api.event.EventParticipantDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.i18n.Captions; @@ -39,6 +44,7 @@ import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.AccessDeniedException; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; @@ -236,6 +242,35 @@ public void testUpdateWithPseudonymizedDto() { assertThat(saved.getPerson().getAddress().getCity(), is("Test City")); } + @Test + public void testEventParticipantCasePersonWithSpecialAccess() { + loginWith(user1); + + EventParticipantDto eventParticipant = createEventParticipant(user1, rdcf1); + CaseDataDto caze = creator.createCase(user1.toReference(), eventParticipant.getPerson().toReference(), rdcf1); + creator.createSpecialCaseAccess(caze.toReference(), nationalAdmin.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + + eventParticipant.setResultingCase(caze.toReference()); + getEventParticipantFacade().save(eventParticipant); + + loginWith(user2); + + assertNotPseudonymized(getEventParticipantFacade().getEventParticipantByUuid(eventParticipant.getUuid())); + assertNotPseudonymized(getEventParticipantFacade().getByUuid(eventParticipant.getUuid())); + assertNotPseudonymized(getEventParticipantFacade().getByUuids(Collections.singletonList(eventParticipant.getUuid())).get(0)); + assertNotPseudonymized(getEventParticipantFacade().getAllAfter(new Date(0)).get(0)); + assertThat( + getEventParticipantFacade().getIndexList(new EventParticipantCriteria().withEvent(eventParticipant.getEvent()), null, null, null) + .get(0) + .isPseudonymized(), + is(false)); + assertThat( + getEventParticipantFacade().getExportList(new EventParticipantCriteria(), null, 0, Integer.MAX_VALUE, Language.EN, null) + .get(0) + .getFirstName(), + is(eventParticipant.getPerson().getFirstName())); + } + private EventParticipantDto createEventParticipant(UserDto user, TestDataCreator.RDCF rdcf) { return createEventParticipant(user, rdcf, null); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalemail/ExternalEmailFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalemail/ExternalEmailFacadeEjbTest.java index bf07b5b8738..0d97356f412 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalemail/ExternalEmailFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalemail/ExternalEmailFacadeEjbTest.java @@ -513,7 +513,7 @@ public void testSendAttachmentNotRelatedToEntity() throws MessagingException, IO p.setNationalHealthId("1234567890"); }); - CaseDataDto caze = creator.createCase(userDto.toReference(), person.toReference(), rdcf); + CaseDataDto caze = creator.createCase(userDto.toReference(), person.toReference(), rdcf); DocumentDto document = createDocument("SomeDocument.txt", DocumentRelatedEntityType.CONTACT, "mock-uuid", "Some content".getBytes(StandardCharsets.UTF_8)); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjbPseudonymizationTest.java index 6b4f61d54b9..23f7ba8c0b5 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjbPseudonymizationTest.java @@ -2,8 +2,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import java.util.Collections; +import java.util.Date; import java.util.HashMap; import javax.persistence.Query; @@ -15,14 +19,17 @@ import de.symeda.sormas.api.feature.FeatureConfigurationIndexDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; +import de.symeda.sormas.api.immunization.ImmunizationCriteria; import de.symeda.sormas.api.immunization.ImmunizationDto; import de.symeda.sormas.api.immunization.ImmunizationManagementStatus; import de.symeda.sormas.api.immunization.ImmunizationStatus; import de.symeda.sormas.api.immunization.MeansOfImmunization; +import de.symeda.sormas.api.infrastructure.facility.FacilityType; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.feature.FeatureConfiguration; @@ -214,4 +221,83 @@ public void testPseudonymizedGetByUuidWithLimitedUser() { assertThat(testImmunization3Fourth.isPseudonymized(), is(true)); assertThat(testImmunization3Fourth.getAdditionalDetails(), is(emptyString())); } + + @Test + public void testGetImmunizationOutsideJurisdiction() { + loginWith(nationalAdmin); + + CaseDataDto caze = creator.createCase(nationalUser.toReference(), creator.createPerson().toReference(), rdcf2); + ImmunizationDto immunization = createImmunization(caze, nationalUser, rdcf2); + + loginWith(districtUser1); + + assertPseudonymized(getImmunizationFacade().getByUuid(immunization.getUuid()), rdcf2); + assertPseudonymized(getImmunizationFacade().getByUuids(Collections.singletonList(immunization.getUuid())).get(0), rdcf2); + assertThat(getImmunizationFacade().getAllAfter(new Date(0)), hasSize(0)); + assertThat(getImmunizationFacade().getIndexList(new ImmunizationCriteria(), null, null, null), hasSize(0)); + } + + @Test + public void testGetImmuniztionOfCaseWithSpecialAccess() { + loginWith(nationalAdmin); + + CaseDataDto caze = creator.createCase(nationalAdmin.toReference(), creator.createPerson().toReference(), rdcf2); + ImmunizationDto immunization = createImmunization(caze, nationalAdmin, rdcf2); + creator + .createSpecialCaseAccess(caze.toReference(), nationalUser.toReference(), districtUser1.toReference(), DateHelper.addDays(new Date(), 1)); + + loginWith(districtUser1); + + assertNotPseudonymized(getImmunizationFacade().getByUuid(immunization.getUuid()), nationalAdmin, rdcf2); + assertNotPseudonymized(getImmunizationFacade().getByUuids(Collections.singletonList(immunization.getUuid())).get(0), nationalAdmin, rdcf2); + assertNotPseudonymized(getImmunizationFacade().getAllAfter(new Date(0)).get(0), nationalAdmin, rdcf2); + assertThat(getImmunizationFacade().getIndexList(new ImmunizationCriteria(), null, null, null).get(0).isPseudonymized(), is(false)); + } + + private void assertPseudonymized(ImmunizationDto immunization, TestDataCreator.RDCF rdcf) { + assertThat(immunization.isPseudonymized(), is(true)); + assertThat(immunization.getReportingUser(), is(nationalUser)); + assertThat(immunization.getDisease(), is(Disease.CORONAVIRUS)); + assertThat(immunization.getMeansOfImmunization(), is(MeansOfImmunization.OTHER)); + assertThat(immunization.getMeansOfImmunizationDetails(), is("")); + assertThat(immunization.getResponsibleRegion(), is(rdcf.region)); + assertThat(immunization.getResponsibleDistrict(), is(rdcf.district)); + assertThat(immunization.getResponsibleCommunity(), is(nullValue())); + assertThat(immunization.getHealthFacility(), is(nullValue())); + assertThat(immunization.getHealthFacilityDetails(), is("")); + assertThat(immunization.getAdditionalDetails(), is("")); + } + + private void assertNotPseudonymized(ImmunizationDto immunization, UserDto user, TestDataCreator.RDCF rdcf) { + assertThat(immunization.isPseudonymized(), is(false)); + assertThat(immunization.getReportingUser(), is(user.toReference())); + assertThat(immunization.getDisease(), is(Disease.CORONAVIRUS)); + assertThat(immunization.getMeansOfImmunization(), is(MeansOfImmunization.OTHER)); + assertThat(immunization.getMeansOfImmunizationDetails(), is("Test means of immunization details")); + assertThat(immunization.getResponsibleRegion(), is(rdcf.region)); + assertThat(immunization.getResponsibleDistrict(), is(rdcf.district)); + assertThat(immunization.getResponsibleCommunity(), is(rdcf.community)); + assertThat(immunization.getHealthFacility(), is(rdcf.facility)); + assertThat(immunization.getHealthFacilityDetails(), is("Test facility details")); + assertThat(immunization.getAdditionalDetails(), is("Test additional details")); + } + + private ImmunizationDto createImmunization(CaseDataDto caze, UserDto user, TestDataCreator.RDCF rdcf) { + ImmunizationDto immunization = ImmunizationDto.build(caze.getPerson()); + immunization.setRelatedCase(caze.toReference()); + immunization.setReportDate(new Date()); + immunization.setReportingUser(user.toReference()); + immunization.setDisease(Disease.CORONAVIRUS); + immunization.setMeansOfImmunization(MeansOfImmunization.OTHER); + immunization.setMeansOfImmunizationDetails("Test means of immunization details"); + immunization.setResponsibleRegion(rdcf.region); + immunization.setResponsibleDistrict(rdcf.district); + immunization.setResponsibleCommunity(rdcf.community); + immunization.setFacilityType(FacilityType.HOSPITAL); + immunization.setHealthFacility(rdcf.facility); + immunization.setHealthFacilityDetails("Test facility details"); + immunization.setAdditionalDetails("Test additional details"); + + return getImmunizationFacade().save(immunization); + } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjbTest.java index 15d347fd475..355b02dd076 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/manualmessagelog/ManualMessageLogFacadeEjbTest.java @@ -26,139 +26,160 @@ import java.util.List; import java.util.function.Consumer; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.backend.util.RightsAllowed; import org.junit.jupiter.api.Test; import de.symeda.sormas.api.caze.CaseDataDto; 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.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.manualmessagelog.ManualMessageLogCriteria; import de.symeda.sormas.api.manualmessagelog.ManualMessageLogIndexDto; import de.symeda.sormas.api.messaging.MessageType; import de.symeda.sormas.api.travelentry.TravelEntryDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; public class ManualMessageLogFacadeEjbTest extends AbstractBeanTest { - private TestDataCreator.RDCF rdcf; - private UserDto user; - - @Override - public void init() { - super.init(); - - rdcf = creator.createRDCF(); - user = creator.createUser(rdcf, DefaultUserRole.SURVEILLANCE_OFFICER); - } - - @Test - public void testGetIndexList() { - CaseDataDto caze = creator.createCase(user.toReference(), creator.createPerson().toReference(), rdcf); - ManualMessageLog caseEmail = createEmailMessageLog(m -> { - m.setRecipientPerson(getPersonService().getByReferenceDto(caze.getPerson())); - m.setCaze(getCaseService().getByReferenceDto(caze.toReference())); - }); - ContactDto contact = creator.createContact(rdcf, user.toReference(), creator.createPerson().toReference()); - ManualMessageLog contactEmail = createEmailMessageLog(m -> { - m.setRecipientPerson(getPersonService().getByReferenceDto(contact.getPerson())); - m.setContact(getContactService().getByReferenceDto(contact.toReference())); - }); - - createManualMessageLog(MessageType.SMS, null, m -> { - m.setRecipientPerson(getPersonService().getByReferenceDto(caze.getPerson())); - m.setCaze(getCaseService().getByReferenceDto(caze.toReference())); - }); - - List caseEmails = getManualMessageLogFacade() - .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).caze(caze.toReference())); - assertThat(caseEmails, hasSize(1)); - assertThat(caseEmails.get(0).getUuid(), is(caseEmail.getUuid())); - assertThat(caseEmails.get(0).getEmailAddress(), is("test@email.com")); - assertThat(caseEmails.get(0).getSendingUser(), is(user.toReference())); - assertThat(caseEmails.get(0).getMessageType(), is(MessageType.EMAIL)); - assertThat(caseEmails.get(0).getUsedTemplate(), is("TestTemplate.txt")); - assertThat(caseEmails.get(0).getAttachedDocuments(), containsInAnyOrder("TestDocument.pdf", "TestDoc2.docx")); - - List contactEmails = getManualMessageLogFacade() - .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).contact(contact.toReference())); - assertThat(contactEmails, hasSize(1)); - assertThat(contactEmails.get(0).getUuid(), is(contactEmail.getUuid())); - } - - @Test - public void testGetIndexListForEventParticipant() { - EventDto event = creator.createEvent(user.toReference()); - EventParticipantDto eventParticipant = creator.createEventParticipant(event.toReference(), creator.createPerson(), user.toReference()); - - ManualMessageLog eventParticipantEmail = createEmailMessageLog(m -> { - m.setRecipientPerson(getPersonService().getByReferenceDto(eventParticipant.getPerson().toReference())); - m.setEventParticipant(getEventParticipantService().getByReferenceDto(eventParticipant.toReference())); - }); - - List epEmails = getManualMessageLogFacade().getIndexList( - new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).eventParticipant(eventParticipant.toReference())); - assertThat(epEmails, hasSize(1)); - assertThat(epEmails.get(0).getUuid(), is(eventParticipantEmail.getUuid())); - } - - @Test - public void testGetIndexListForTravelEntry() { - TravelEntryDto travelEntry = creator.createTravelEntry(creator.createPerson().toReference(), user.toReference(), rdcf, null); - ManualMessageLog travelEntryEmail = createEmailMessageLog(m -> { - m.setRecipientPerson(getPersonService().getByReferenceDto(travelEntry.getPerson())); - m.setTravelEntry(getTravelEntryService().getByReferenceDto(travelEntry.toReference())); - }); - - List epEmails = getManualMessageLogFacade() - .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).travelEntry(travelEntry.toReference())); - assertThat(epEmails, hasSize(1)); - assertThat(epEmails.get(0).getUuid(), is(travelEntryEmail.getUuid())); - } - - @Test - public void testGetIndexListPseudonymization() { - TravelEntryDto travelEntry = creator.createTravelEntry(creator.createPerson().toReference(), user.toReference(), rdcf, null); - ManualMessageLog travelEntryEmail = createEmailMessageLog(m -> { - m.setRecipientPerson(getPersonService().getByReferenceDto(travelEntry.getPerson())); - m.setTravelEntry(getTravelEntryService().getByReferenceDto(travelEntry.toReference())); - }); - - TestDataCreator.RDCF rdcf2 = creator.createRDCF(); - UserDto user2 = creator.createUser(rdcf2, "Officer2", DefaultUserRole.SURVEILLANCE_OFFICER); - - loginWith(user2); - - List epEmails = getManualMessageLogFacade() - .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).travelEntry(travelEntry.toReference())); - assertThat(epEmails, hasSize(1)); - assertThat(epEmails.get(0).getUuid(), is(travelEntryEmail.getUuid())); - assertThat(epEmails.get(0).getEmailAddress(), is(I18nProperties.getCaption(Captions.inaccessibleValue))); - assertThat(epEmails.get(0).getSendingUser(), is(nullValue())); - } - - private ManualMessageLog createEmailMessageLog(Consumer setupRelatedEntity) { - return createManualMessageLog(MessageType.EMAIL, "TestTemplate.txt", setupRelatedEntity); - } - - private ManualMessageLog createManualMessageLog(MessageType messageType, String templateName, Consumer setupRelatedEntity) { - ManualMessageLog log = new ManualMessageLog(); - log.setMessageType(messageType); - log.setSendingUser(getUserService().getByUuid(user.getUuid())); - log.setSentDate(new Date()); - log.setEmailAddress("test@email.com"); - log.setUsedTemplate(templateName); - log.setAttachedDocuments(Arrays.asList("TestDocument.pdf", "TestDoc2.docx")); - - setupRelatedEntity.accept(log); - - getManualMessageLogService().ensurePersisted(log); - - return log; - } + private TestDataCreator.RDCF rdcf; + private UserDto user; + + @Override + public void init() { + super.init(); + + rdcf = creator.createRDCF(); + user = creator.createUser(rdcf, DefaultUserRole.SURVEILLANCE_OFFICER); + } + + @Test + public void testGetIndexList() { + CaseDataDto caze = creator.createCase(user.toReference(), creator.createPerson().toReference(), rdcf); + ManualMessageLog caseEmail = createEmailMessageLog(m -> { + m.setRecipientPerson(getPersonService().getByReferenceDto(caze.getPerson())); + m.setCaze(getCaseService().getByReferenceDto(caze.toReference())); + }); + ContactDto contact = creator.createContact(rdcf, user.toReference(), creator.createPerson().toReference()); + ManualMessageLog contactEmail = createEmailMessageLog(m -> { + m.setRecipientPerson(getPersonService().getByReferenceDto(contact.getPerson())); + m.setContact(getContactService().getByReferenceDto(contact.toReference())); + }); + + createManualMessageLog(MessageType.SMS, null, m -> { + m.setRecipientPerson(getPersonService().getByReferenceDto(caze.getPerson())); + m.setCaze(getCaseService().getByReferenceDto(caze.toReference())); + }); + + List caseEmails = getManualMessageLogFacade() + .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).caze(caze.toReference())); + assertThat(caseEmails, hasSize(1)); + assertThat(caseEmails.get(0).getUuid(), is(caseEmail.getUuid())); + assertThat(caseEmails.get(0).getEmailAddress(), is("test@email.com")); + assertThat(caseEmails.get(0).getSendingUser(), is(user.toReference())); + assertThat(caseEmails.get(0).getMessageType(), is(MessageType.EMAIL)); + assertThat(caseEmails.get(0).getUsedTemplate(), is("TestTemplate.txt")); + assertThat(caseEmails.get(0).getAttachedDocuments(), containsInAnyOrder("TestDocument.pdf", "TestDoc2.docx")); + + List contactEmails = getManualMessageLogFacade() + .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).contact(contact.toReference())); + assertThat(contactEmails, hasSize(1)); + assertThat(contactEmails.get(0).getUuid(), is(contactEmail.getUuid())); + } + + @Test + public void testGetIndexListForEventParticipant() { + EventDto event = creator.createEvent(user.toReference()); + EventParticipantDto eventParticipant = creator.createEventParticipant(event.toReference(), creator.createPerson(), user.toReference()); + + ManualMessageLog eventParticipantEmail = createEmailMessageLog(m -> { + m.setRecipientPerson(getPersonService().getByReferenceDto(eventParticipant.getPerson().toReference())); + m.setEventParticipant(getEventParticipantService().getByReferenceDto(eventParticipant.toReference())); + }); + + List epEmails = getManualMessageLogFacade().getIndexList( + new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).eventParticipant(eventParticipant.toReference())); + assertThat(epEmails, hasSize(1)); + assertThat(epEmails.get(0).getUuid(), is(eventParticipantEmail.getUuid())); + } + + @Test + public void testGetIndexListForTravelEntry() { + TravelEntryDto travelEntry = creator.createTravelEntry(creator.createPerson().toReference(), user.toReference(), rdcf, null); + ManualMessageLog travelEntryEmail = createEmailMessageLog(m -> { + m.setRecipientPerson(getPersonService().getByReferenceDto(travelEntry.getPerson())); + m.setTravelEntry(getTravelEntryService().getByReferenceDto(travelEntry.toReference())); + }); + + List epEmails = getManualMessageLogFacade() + .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).travelEntry(travelEntry.toReference())); + assertThat(epEmails, hasSize(1)); + assertThat(epEmails.get(0).getUuid(), is(travelEntryEmail.getUuid())); + } + + @Test + public void testGetIndexListPseudonymization() { + TravelEntryDto travelEntry = creator.createTravelEntry(creator.createPerson().toReference(), user.toReference(), rdcf, null); + ManualMessageLog travelEntryEmail = createEmailMessageLog(m -> { + m.setRecipientPerson(getPersonService().getByReferenceDto(travelEntry.getPerson())); + m.setTravelEntry(getTravelEntryService().getByReferenceDto(travelEntry.toReference())); + }); + + TestDataCreator.RDCF rdcf2 = creator.createRDCF(); + UserDto user2 = creator.createUser(rdcf2, "Officer2", DefaultUserRole.SURVEILLANCE_OFFICER); + + loginWith(user2); + + List travelEntryEmails = getManualMessageLogFacade() + .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).travelEntry(travelEntry.toReference())); + assertThat(travelEntryEmails, hasSize(1)); + assertThat(travelEntryEmails.get(0).getUuid(), is(travelEntryEmail.getUuid())); + assertThat(travelEntryEmails.get(0).getEmailAddress(), is(I18nProperties.getCaption(Captions.inaccessibleValue))); + assertThat(travelEntryEmails.get(0).getSendingUser(), is(nullValue())); + } + + @Test + public void testGetForCaseWithSpecialAcces() { + CaseDataDto caze = creator.createCase(user.toReference(), creator.createPerson().toReference(), rdcf, null); + createEmailMessageLog(m -> { + m.setRecipientPerson(getPersonService().getByReferenceDto(caze.getPerson())); + m.setCaze(getCaseService().getByReferenceDto(caze.toReference())); + }); + + TestDataCreator.RDCF rdcf2 = creator.createRDCF(); + UserDto user2 = creator.createUser(rdcf2, "Officer2", DefaultUserRole.SURVEILLANCE_OFFICER); + + creator.createSpecialCaseAccess(caze.toReference(), user.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + + loginWith(user2); + + List epEmails = getManualMessageLogFacade() + .getIndexList(new ManualMessageLogCriteria().messageType(MessageType.EMAIL).withTemplate(true).caze(caze.toReference())); + assertThat(epEmails, hasSize(1)); + assertThat(epEmails.get(0).isPseudonymized(), is(false)); + } + + private ManualMessageLog createEmailMessageLog(Consumer setupRelatedEntity) { + return createManualMessageLog(MessageType.EMAIL, "TestTemplate.txt", setupRelatedEntity); + } + + private ManualMessageLog createManualMessageLog(MessageType messageType, String templateName, Consumer setupRelatedEntity) { + ManualMessageLog log = new ManualMessageLog(); + log.setMessageType(messageType); + log.setSendingUser(getUserService().getByUuid(user.getUuid())); + log.setSentDate(new Date()); + log.setEmailAddress("test@email.com"); + log.setUsedTemplate(templateName); + log.setAttachedDocuments(Arrays.asList("TestDocument.pdf", "TestDoc2.docx")); + + setupRelatedEntity.accept(log); + + getManualMessageLogService().ensurePersisted(log); + + return log; + } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/person/PersonFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/person/PersonFacadeEjbPseudonymizationTest.java index cc71bac992d..99857a02b6b 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/person/PersonFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/person/PersonFacadeEjbPseudonymizationTest.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Optional; @@ -39,6 +40,7 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.infrastructure.area.AreaType; import de.symeda.sormas.api.location.LocationDto; +import de.symeda.sormas.api.person.PersonAssociation; import de.symeda.sormas.api.person.PersonCriteria; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.PersonExportDto; @@ -47,6 +49,7 @@ import de.symeda.sormas.api.travelentry.TravelEntryDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; @@ -415,6 +418,47 @@ public void testPseudonymizeExportList() { assertEquals(Optional.empty(), exportList.stream().filter(p -> p.getUuid().equals(person2.getUuid())).findFirst()); } + @Test + public void tesGetPersonOfCaseWithSpecialAccess() { + person = createPerson(); + CaseDataDto caze = creator.createCase(districtUser1.toReference(), person.toReference(), rdcf1); + creator + .createSpecialCaseAccess(caze.toReference(), nationalAdmin.toReference(), districtUser2.toReference(), DateHelper.addDays(new Date(), 1)); + loginWith(districtUser2); + + assertNotPseudonymized(getPersonFacade().getByUuid(person.getUuid())); + assertNotPseudonymized(getPersonFacade().getByUuids(Collections.singletonList(person.getUuid())).get(0)); + assertNotPseudonymized(getPersonFacade().getAllAfter(new Date(0)).get(0)); + assertThat( + getPersonFacade().getIndexList(new PersonCriteria().personAssociation(PersonAssociation.CASE), null, null, null).get(0).isPseudonymized(), + is(false)); + assertThat( + getPersonFacade().getExportList(new PersonCriteria().personAssociation(PersonAssociation.CASE), 0, Integer.MAX_VALUE) + .get(0) + .getFirstName(), + is(person.getFirstName())); + } + + @Test + public void tesGetContactPersonOfCaseWithSpecialAccess() { + CaseDataDto caze = creator.createCase(districtUser1.toReference(), creator.createPerson().toReference(), rdcf1); + creator + .createSpecialCaseAccess(caze.toReference(), nationalAdmin.toReference(), districtUser2.toReference(), DateHelper.addDays(new Date(), 1)); + + person = createPerson(); + creator.createContact(districtUser1.toReference(), person.toReference(), caze, rdcf1); + + loginWith(districtUser2); + + assertNotPseudonymized(getPersonFacade().getByUuid(person.getUuid())); + assertNotPseudonymized(getPersonFacade().getByUuids(Collections.singletonList(person.getUuid())).get(0)); + assertNotPseudonymized( + getPersonFacade().getAllAfter(new Date(0)).stream().filter(p -> p.getUuid().equals(person.getUuid())).findFirst().get()); + assertThat( + getPersonFacade().getIndexList(new PersonCriteria().personAssociation(PersonAssociation.CASE), null, null, null).get(0).isPseudonymized(), + is(false)); + } + private PersonDto createPerson() { LocationDto address = LocationDto.build(); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjbPseudonymizationTest.java index df4eb649a19..fb034c9d599 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjbPseudonymizationTest.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -35,6 +36,8 @@ import de.symeda.sormas.api.sample.SampleDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.infrastructure.facility.Facility; @@ -233,6 +236,21 @@ public void updatePathogenTestInJurisdictionWithPseudonymizedDto() { assertThat(updatedTest.getLabUser().getUuid(), is(user2.getUuid())); } + @Test + public void testPathogenTestOnSampleOfCasWithSpecialAccess() { + Facility lab = getFacilityService().getByUuid(creator.createFacility("Lab", rdcf1.region, rdcf1.district, rdcf1.community).getUuid()); + loginWith(user2); + CaseDataDto caze = creator.createCase(user1.toReference(), creator.createPerson("First", "Last").toReference(), rdcf1); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + SampleDto sample = creator.createSample(caze.toReference(), user1.toReference(), lab); + + PathogenTestDto pathogenTest = createPathogenTest(lab, sample, user1); + + assertNotPseudonymized(getPathogenTestFacade().getByUuid(pathogenTest.getUuid()), user1.toReference()); + assertNotPseudonymized(getPathogenTestFacade().getByUuids(Collections.singletonList(pathogenTest.getUuid())).get(0), user1.toReference()); + assertNotPseudonymized(getPathogenTestFacade().getAllActivePathogenTestsAfter(new Date(0)).get(0), user1.toReference()); + } + private PathogenTestDto createPathogenTest(Facility lab, SampleDto sample, UserDto labUser) { return creator.createPathogenTest( sample.toReference(), @@ -250,13 +268,17 @@ private PathogenTestDto createPathogenTest(Facility lab, SampleDto sample, UserD }); } - private void assertNotPseudonymized(PathogenTestDto pathogenTes) { + private void assertNotPseudonymized(PathogenTestDto pathogenTes, UserReferenceDto labUser) { assertThat(pathogenTes.getLab().getCaption(), is("Lab")); assertThat(pathogenTes.getLabDetails(), is("Test lab details")); - assertThat(pathogenTes.getLabUser().getUuid(), is(user2.getUuid())); + assertThat(pathogenTes.getLabUser().getUuid(), is(labUser.getUuid())); assertThat(pathogenTes.getTestTypeText(), is("Test type text")); } + private void assertNotPseudonymized(PathogenTestDto pathogenTes) { + assertNotPseudonymized(pathogenTes, user2.toReference()); + } + private void assertPseudonymized(PathogenTestDto pathogenTes) { assertThat(pathogenTes.getLab().getCaption(), is("Lab")); assertThat(pathogenTes.getLabDetails(), isEmptyString()); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbPseudonymizationTest.java index 6124e0098a8..068a7beafe1 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbPseudonymizationTest.java @@ -55,6 +55,7 @@ import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.feature.FeatureConfiguration; @@ -379,6 +380,19 @@ public void testPseudonymizeExportList() { assertThat(export4.getLab(), is("Lab")); } + @Test + public void testGetSampleOfCaseWithSpecialAccess() { + CaseDataDto caze = creator.createCase(user1.toReference(), creator.createPerson("John", "Smith").toReference(), rdcf1); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + SampleDto sample = createCaseSample(caze, user1); + + SampleDto sampleByUuid = getSampleFacade().getSampleByUuid(sample.getUuid()); + assertNotPseudonymized(sampleByUuid, user1.getUuid()); + assertNotPseudonymized(getSampleFacade().getByUuids(Collections.singletonList(sample.getUuid())).get(0), user1.getUuid()); + assertThat(getSampleFacade().getIndexList(new SampleCriteria(), null, null, null).get(0).isPseudonymized(), is(false)); + assertThat(getSampleFacade().getExportList(new SampleCriteria(), null, 0, Integer.MAX_VALUE).get(0).getShipmentDetails(), is("Test shipment details")); + } + private void createPathogenTest(SampleDto sample, UserDto user) { Date testDateTime = new Date(1591747200000L);//2020-06-10 creator.createPathogenTest( diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjbTest.java new file mode 100644 index 00000000000..ff958cd4e57 --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/specialcaseaccess/SpecialCaseAccessFacadeEjbTest.java @@ -0,0 +1,82 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; + +import java.util.Date; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessDto; +import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.backend.AbstractBeanTest; +import de.symeda.sormas.backend.TestDataCreator; + +public class SpecialCaseAccessFacadeEjbTest extends AbstractBeanTest { + + @Test + public void testGetByCase() { + TestDataCreator.RDCF rdcf = creator.createRDCF(); + UserReferenceDto user = creator.createUser(rdcf, "officer", DefaultUserRole.SURVEILLANCE_OFFICER).toReference(); + CaseDataDto caze = creator.createCase(user, rdcf, null); + + TestDataCreator.RDCF otherRdcf = creator.createRDCF(); + UserReferenceDto otherUser = creator.createUser(otherRdcf, "otherOfficer", DefaultUserRole.SURVEILLANCE_OFFICER).toReference(); + + creator.createSpecialCaseAccess(caze.toReference(), user, otherUser, DateHelper.addDays(new Date(), 1)); + + // expired ones should not be returned + creator.createSpecialCaseAccess(caze.toReference(), user, otherUser, DateHelper.subtractDays(new Date(), 1)); + // ones linked to other cases should not be returned + CaseDataDto caze2 = creator.createCase(user, rdcf, null); + creator.createSpecialCaseAccess(caze2.toReference(), user, otherUser, DateHelper.addDays(new Date(), 1)); + + List specialAccesses = getSpecialCaseAccessFacade().getAllActiveByCase(caze.toReference()); + assertThat(specialAccesses, hasSize(1)); + assertThat(specialAccesses.get(0).getCaze(), is(caze.toReference())); + assertThat(specialAccesses.get(0).getAssignedBy(), is(user)); + assertThat(specialAccesses.get(0).getAssignedTo(), is(otherUser)); + } + + @Test + public void testDeleteExpiredSpecialAccesses() { + TestDataCreator.RDCF rdcf = creator.createRDCF(); + UserReferenceDto user = creator.createUser(rdcf, "officer", DefaultUserRole.SURVEILLANCE_OFFICER).toReference(); + CaseDataDto caze = creator.createCase(user, rdcf, null); + + TestDataCreator.RDCF otherRdcf = creator.createRDCF(); + UserReferenceDto otherUser = creator.createUser(otherRdcf, "otherOfficer", DefaultUserRole.SURVEILLANCE_OFFICER).toReference(); + + creator.createSpecialCaseAccess(caze.toReference(), user, otherUser, DateHelper.addDays(new Date(), 1)); + // expired ones should be deleted + creator.createSpecialCaseAccess(caze.toReference(), user, otherUser, DateHelper.subtractDays(new Date(), 1)); + + getSpecialCaseAccessFacade().deleteExpiredSpecialCaseAccesses(); + + long specialAccessCount = getSpecialCaseAccessService().count(); + assertThat(specialAccessCount, is(1L)); + } +} diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/task/TaskFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/task/TaskFacadeEjbPseudonymizationTest.java index a2336fdc8ad..7e973763996 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/task/TaskFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/task/TaskFacadeEjbPseudonymizationTest.java @@ -43,6 +43,7 @@ import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; @@ -387,6 +388,20 @@ public void testPseudonymizeGetByContact() { assertThat(active2.getContact().getCaption(), is(DataHelper.getShortUuid(task4.getContact().getUuid()))); } + @Test + public void testGetTaskOfCaseWithSpecialAccess() { + + CaseDataDto caze = creator.createCase(user1.toReference(), creator.createPerson("John", "Smith").toReference(), rdcf1); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + TaskDto task = createCaseTask(caze); + + assertNotPseudonymized(getTaskFacade().getByUuid(task.getUuid())); + assertNotPseudonymized(getTaskFacade().getByUuids(Collections.singletonList(task.getUuid())).get(0)); + assertNotPseudonymized(getTaskFacade().getAllActiveTasksAfter(new Date(0)).get(0)); + assertThat(getTaskFacade().getIndexList(new TaskCriteria(), null, null, null).get(0).isPseudonymized(), is(false)); + assertThat(getTaskFacade().getExportList(new TaskCriteria(), null, 0, Integer.MAX_VALUE).get(0).isPseudonymized(), is(false)); + } + private TaskDto createCaseTask(CaseDataDto caze) { return creator .createTask(TaskContext.CASE, TaskType.CASE_INVESTIGATION, TaskStatus.PENDING, caze.toReference(), null, null, null, new Date(), null); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjbPseudonymizationTest.java index edb7f67d38a..0babe24cdbd 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjbPseudonymizationTest.java @@ -2,8 +2,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import java.util.Collections; +import java.util.Date; import java.util.HashMap; import javax.persistence.Query; @@ -12,14 +16,17 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.contact.QuarantineType; import de.symeda.sormas.api.feature.FeatureConfigurationIndexDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.travelentry.TravelEntryCriteria; import de.symeda.sormas.api.travelentry.TravelEntryDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.feature.FeatureConfiguration; @@ -31,6 +38,8 @@ public class TravelEntryFacadeEjbPseudonymizationTest extends AbstractBeanTest { private UserDto nationalUser; + private UserDto districtUser1; + @Override public void init() { super.init(); @@ -44,6 +53,14 @@ public void init() { "Nat", "User", creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); + + districtUser1 = creator.createUser( + rdcf1.region.getUuid(), + rdcf1.district.getUuid(), + rdcf1.facility.getUuid(), + "Surv", + "Off1", + creator.getUserRoleReference(DefaultUserRole.SURVEILLANCE_OFFICER)); } @Test @@ -67,23 +84,17 @@ public void testPseudonymizedGetByUuidWithLimitedUser() { // travel entry within limited user's jurisdiction PersonDto person1 = creator.createPerson("John", "Doe"); - TravelEntryDto travelEntry1 = creator.createTravelEntry( - person1.toReference(), - nationalUser.toReference(), rdcf1, v ->{ - v.setDisease(Disease.CORONAVIRUS); - v.setQuarantineHomePossibleComment("pacient can stay home"); - } - ); + TravelEntryDto travelEntry1 = creator.createTravelEntry(person1.toReference(), nationalUser.toReference(), rdcf1, v -> { + v.setDisease(Disease.CORONAVIRUS); + v.setQuarantineHomePossibleComment("pacient can stay home"); + }); // travel entry outside limited user's jurisdiction PersonDto person2 = creator.createPerson("John", "Doe"); - TravelEntryDto travelEntry2 = creator.createTravelEntry( - person2.toReference(), - nationalUser.toReference(),rdcf2, v -> { - v.setDisease(Disease.CORONAVIRUS); - v.setQuarantineHomePossibleComment("pacient can stay home second"); - } - ); + TravelEntryDto travelEntry2 = creator.createTravelEntry(person2.toReference(), nationalUser.toReference(), rdcf2, v -> { + v.setDisease(Disease.CORONAVIRUS); + v.setQuarantineHomePossibleComment("pacient can stay home second"); + }); loginWith(nationalAdmin); UserDto surveillanceOfficerWithRestrictedAccessToAssignedEntities = @@ -91,23 +102,17 @@ public void testPseudonymizedGetByUuidWithLimitedUser() { // travel entry created by limited user within limited user's jurisdiction PersonDto person3 = creator.createPerson("John", "Doe"); - TravelEntryDto travelEntry3 = creator.createTravelEntry( - person3.toReference(), - nationalUser.toReference(), rdcf1, v -> { - v.setDisease(Disease.CORONAVIRUS); - v.setQuarantineHomePossibleComment("pacient can stay home"); - } - ); + TravelEntryDto travelEntry3 = creator.createTravelEntry(person3.toReference(), nationalUser.toReference(), rdcf1, v -> { + v.setDisease(Disease.CORONAVIRUS); + v.setQuarantineHomePossibleComment("pacient can stay home"); + }); // travel entry created by limited user outside limited user's jurisdiction PersonDto person4 = creator.createPerson("John", "Doe"); - TravelEntryDto travelEntry4 = creator.createTravelEntry( - person4.toReference(), - nationalUser.toReference(), rdcf2, v-> { - v.setDisease(Disease.CORONAVIRUS); - v.setQuarantineHomePossibleComment("pacient can stay home second"); - } - ); + TravelEntryDto travelEntry4 = creator.createTravelEntry(person4.toReference(), nationalUser.toReference(), rdcf2, v -> { + v.setDisease(Disease.CORONAVIRUS); + v.setQuarantineHomePossibleComment("pacient can stay home second"); + }); loginWith(surveillanceOfficerWithRestrictedAccessToAssignedEntities); TravelEntryDto testTravelEntry = getTravelEntryFacade().getByUuid(travelEntry1.getUuid()); @@ -152,4 +157,81 @@ public void testPseudonymizedGetByUuidWithLimitedUser() { assertThat(testTravelEntry3Fourth.isPseudonymized(), is(true)); assertThat(testTravelEntry3Fourth.getQuarantineHomePossibleComment(), is(emptyString())); } + + @Test + public void testGetTravelEntryOutsideJurisdiction() { + loginWith(nationalAdmin); + + TravelEntryDto travelEntry = createTravelEntry(nationalUser, rdcf2, null); + + loginWith(districtUser1); + + assertPseudonymized(getTravelEntryFacade().getByUuid(travelEntry.getUuid()), rdcf2); + assertPseudonymized(getTravelEntryFacade().getByUuids(Collections.singletonList(travelEntry.getUuid())).get(0), rdcf2); + assertThat(getTravelEntryFacade().getAllAfter(new Date(0)), hasSize(0)); + assertThat(getTravelEntryFacade().getIndexList(new TravelEntryCriteria(), null, null, null), hasSize(0)); + } + + @Test + public void testGetReportOfCaseWithSpecialAccess() { + loginWith(nationalAdmin); + + CaseDataDto caze = creator.createCase(nationalUser.toReference(), creator.createPerson().toReference(), rdcf2); + TravelEntryDto travelEntry = createTravelEntry(nationalUser, rdcf2, caze); + creator + .createSpecialCaseAccess(caze.toReference(), nationalUser.toReference(), districtUser1.toReference(), DateHelper.addDays(new Date(), 1)); + + loginWith(districtUser1); + + assertNotPseudonymized(getTravelEntryFacade().getByUuid(travelEntry.getUuid()), nationalUser, rdcf2); + assertNotPseudonymized(getTravelEntryFacade().getByUuids(Collections.singletonList(travelEntry.getUuid())).get(0), nationalUser, rdcf2); + assertNotPseudonymized(getTravelEntryFacade().getAllAfter(new Date(0)).get(0), nationalUser, rdcf2); + assertThat(getTravelEntryFacade().getIndexList(new TravelEntryCriteria(), null, null, null).get(0).isPseudonymized(), is(false)); + } + + private void assertPseudonymized(TravelEntryDto travelEntry, TestDataCreator.RDCF rdcf) { + assertThat(travelEntry.isPseudonymized(), is(true)); + assertThat(travelEntry.getReportingUser(), is(nationalUser)); + assertThat(travelEntry.getDisease(), is(Disease.CORONAVIRUS)); + assertThat(travelEntry.getResponsibleRegion(), is(rdcf.region)); + assertThat(travelEntry.getResponsibleDistrict(), is(rdcf.district)); + assertThat(travelEntry.getResponsibleCommunity(), is(nullValue())); + assertThat(travelEntry.getPointOfEntry(), is(nullValue())); + assertThat(travelEntry.getPointOfEntryDetails(), is("")); + assertThat(travelEntry.getQuarantine(), is(QuarantineType.OTHER)); + assertThat(travelEntry.getQuarantineTypeDetails(), is("")); + assertThat(travelEntry.getQuarantineHelpNeeded(), is("")); + } + + private void assertNotPseudonymized(TravelEntryDto travelEntry, UserDto user, TestDataCreator.RDCF rdcf) { + assertThat(travelEntry.isPseudonymized(), is(false)); + assertThat(travelEntry.getReportingUser(), is(user.toReference())); + assertThat(travelEntry.getDisease(), is(Disease.CORONAVIRUS)); + assertThat(travelEntry.getResponsibleRegion(), is(rdcf.region)); + assertThat(travelEntry.getResponsibleDistrict(), is(rdcf.district)); + assertThat(travelEntry.getResponsibleCommunity(), is(rdcf.community)); + assertThat(travelEntry.getPointOfEntry(), is(rdcf.pointOfEntry)); + assertThat(travelEntry.getPointOfEntryDetails(), is("Test point of entry details")); + assertThat(travelEntry.getQuarantine(), is(QuarantineType.OTHER)); + assertThat(travelEntry.getQuarantineTypeDetails(), is("Test quarantine type details")); + assertThat(travelEntry.getQuarantineHelpNeeded(), is("Test quarantine help needed")); + } + + private TravelEntryDto createTravelEntry(UserDto user, TestDataCreator.RDCF rdcf, CaseDataDto caze) { + TravelEntryDto travelEntry = TravelEntryDto.build(caze == null ? creator.createPerson().toReference() : caze.getPerson()); + travelEntry.setReportDate(new Date()); + travelEntry.setDateOfArrival(new Date()); + travelEntry.setReportingUser(user.toReference()); + travelEntry.setDisease(Disease.CORONAVIRUS); + travelEntry.setResponsibleRegion(rdcf.region); + travelEntry.setResponsibleDistrict(rdcf.district); + travelEntry.setResponsibleCommunity(rdcf.community); + travelEntry.setPointOfEntry(rdcf.pointOfEntry); + travelEntry.setPointOfEntryDetails("Test point of entry details"); + travelEntry.setQuarantine(QuarantineType.OTHER); + travelEntry.setQuarantineTypeDetails("Test quarantine type details"); + travelEntry.setQuarantineHelpNeeded("Test quarantine help needed"); + + return getTravelEntryFacade().save(travelEntry); + } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjbPseudonymizationTest.java new file mode 100644 index 00000000000..ba9fcd4bbe4 --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjbPseudonymizationTest.java @@ -0,0 +1,168 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.vaccination; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; + +import java.util.Collections; +import java.util.Date; + +import org.junit.jupiter.api.Test; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.caze.Vaccine; +import de.symeda.sormas.api.caze.VaccineManufacturer; +import de.symeda.sormas.api.immunization.ImmunizationDto; +import de.symeda.sormas.api.immunization.ImmunizationReferenceDto; +import de.symeda.sormas.api.person.PersonReferenceDto; +import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.JurisdictionLevel; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.user.UserRoleReferenceDto; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.vaccination.VaccinationCriteria; +import de.symeda.sormas.api.vaccination.VaccinationDto; +import de.symeda.sormas.backend.AbstractBeanTest; +import de.symeda.sormas.backend.TestDataCreator; + +public class VaccinationFacadeEjbPseudonymizationTest extends AbstractBeanTest { + + private TestDataCreator.RDCF rdcf1; + private TestDataCreator.RDCF rdcf2; + private UserDto user1; + private UserDto user2; + + @Override + public void init() { + + super.init(); + + UserRoleReferenceDto newUserRole = creator.createUserRole( + "NoEventNoCaseView", + JurisdictionLevel.DISTRICT, + UserRight.CASE_CLINICIAN_VIEW, + UserRight.CASE_VIEW, + UserRight.PERSON_VIEW); + + rdcf1 = creator.createRDCF("Region 1", "District 1", "Community 1", "Facility 1", "Point of entry 1"); + user1 = creator.createUser( + rdcf1.region.getUuid(), + rdcf1.district.getUuid(), + rdcf1.facility.getUuid(), + "Surv", + "Off1", + creator.getUserRoleReference(DefaultUserRole.SURVEILLANCE_OFFICER), + newUserRole); + + rdcf2 = creator.createRDCF("Region 2", "District 2", "Community 2", "Facility 2", "Point of entry 2"); + user2 = creator.createUser( + rdcf2.region.getUuid(), + rdcf2.district.getUuid(), + rdcf2.facility.getUuid(), + "Surv", + "Off2", + creator.getUserRoleReference(DefaultUserRole.SURVEILLANCE_OFFICER), + newUserRole); + + loginWith(user2); + } + + @Test + public void testGetTravelEntryOutsideJurisdiction() { + PersonReferenceDto personRef = creator.createPerson().toReference(); + ImmunizationDto immunization = creator.createImmunization(Disease.CORONAVIRUS, personRef, user1.toReference(), rdcf1); + VaccinationDto vaccination = createVaccination(user1, immunization.toReference()); + + assertPseudonymized(getVaccinationFacade().getByUuid(vaccination.getUuid())); + assertPseudonymized(getVaccinationFacade().getByUuids(Collections.singletonList(vaccination.getUuid())).get(0)); + assertPseudonymized(getVaccinationFacade().getAllAfter(new Date(0)).get(0)); + // no pseudonymization on index list currently + assertThat( + getVaccinationFacade().getIndexList(new VaccinationCriteria.Builder(personRef).build(), null, null, null).get(0).isPseudonymized(), + is(false)); + } + + @Test + public void testGetReportOfCaseWithSpecialAccess() { + PersonReferenceDto personRef = creator.createPerson().toReference(); + ImmunizationDto immunization = creator.createImmunization(Disease.CORONAVIRUS, personRef, user1.toReference(), rdcf1); + VaccinationDto vaccination = createVaccination(user1, immunization.toReference()); + + CaseDataDto caze = creator.createCase(user2.toReference(), personRef, rdcf2 ); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + + assertNotPseudonymized(getVaccinationFacade().getByUuid(vaccination.getUuid()), user1); + assertNotPseudonymized(getVaccinationFacade().getByUuids(Collections.singletonList(vaccination.getUuid())).get(0), user1); + assertNotPseudonymized(getVaccinationFacade().getAllAfter(new Date(0)).get(0), user1); + assertThat( + getVaccinationFacade().getIndexList(new VaccinationCriteria.Builder(personRef).build(), null, null, null).get(0).isPseudonymized(), + is(false)); + } + + private void assertPseudonymized(VaccinationDto vaccination) { + assertThat(vaccination.isPseudonymized(), is(true)); + assertThat(vaccination.getReportingUser(), is(nullValue())); + assertThat(vaccination.getVaccineName(), is(Vaccine.OTHER)); + assertThat(vaccination.getOtherVaccineName(), is("")); + assertThat(vaccination.getVaccineManufacturer(), is(VaccineManufacturer.OTHER)); + assertThat(vaccination.getOtherVaccineManufacturer(), is("")); + assertThat(vaccination.getVaccineType(), is("")); + assertThat(vaccination.getVaccineDose(), is("")); + assertThat(vaccination.getVaccineInn(), is("")); + assertThat(vaccination.getVaccineBatchNumber(), is("")); + assertThat(vaccination.getVaccineUniiCode(), is("")); + assertThat(vaccination.getVaccineAtcCode(), is("")); + } + + private void assertNotPseudonymized(VaccinationDto vaccination, UserDto user) { + assertThat(vaccination.isPseudonymized(), is(false)); + assertThat(vaccination.getReportingUser(), is(user)); + assertThat(vaccination.getVaccineName(), is(Vaccine.OTHER)); + assertThat(vaccination.getOtherVaccineName(), is("Test vaccine name")); + assertThat(vaccination.getVaccineManufacturer(), is(VaccineManufacturer.OTHER)); + assertThat(vaccination.getOtherVaccineManufacturer(), is("Test vaccine name")); + assertThat(vaccination.getVaccineType(), is("Test vaccine type")); + assertThat(vaccination.getVaccineDose(), is("Test vaccine dose")); + assertThat(vaccination.getVaccineInn(), is("Test vaccine INN")); + assertThat(vaccination.getVaccineBatchNumber(), is("Test vaccine batch number")); + assertThat(vaccination.getVaccineUniiCode(), is("Test vaccine UNII code")); + assertThat(vaccination.getVaccineAtcCode(), is("Test vaccine ATC code")); + } + + private VaccinationDto createVaccination(UserDto user, ImmunizationReferenceDto immunization) { + VaccinationDto vaccination = VaccinationDto.build(user.toReference()); + vaccination.setReportDate(new Date()); + vaccination.setVaccinationDate(DateHelper.subtractDays(new Date(), 20)); + vaccination.setReportingUser(user.toReference()); + vaccination.setImmunization(immunization); + vaccination.setVaccineName(Vaccine.OTHER); + vaccination.setOtherVaccineName("Test vaccine name"); + vaccination.setVaccineManufacturer(VaccineManufacturer.OTHER); + vaccination.setOtherVaccineManufacturer("Test vaccine name"); + vaccination.setVaccineType("Test vaccine type"); + vaccination.setVaccineDose("Test vaccine dose"); + vaccination.setVaccineInn("Test vaccine INN"); + vaccination.setVaccineBatchNumber("Test vaccine batch number"); + vaccination.setVaccineUniiCode("Test vaccine UNII code"); + vaccination.setVaccineAtcCode("Test vaccine ATC code"); + + return getVaccinationFacade().save(vaccination); + } +} diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/visit/VisitFacadeEjbPseudonymizationTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/visit/VisitFacadeEjbPseudonymizationTest.java index 35c40b4dfb6..4eb5cbf4d7c 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/visit/VisitFacadeEjbPseudonymizationTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/visit/VisitFacadeEjbPseudonymizationTest.java @@ -16,6 +16,7 @@ package de.symeda.sormas.backend.visit; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.nullValue; @@ -29,6 +30,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.VisitOrigin; +import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.symptoms.SymptomState; @@ -36,6 +38,7 @@ import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.visit.VisitCriteria; import de.symeda.sormas.api.visit.VisitDto; import de.symeda.sormas.api.visit.VisitExportDto; @@ -187,6 +190,25 @@ public void testUpdateWithPseudonymizedDto() { assertThat(updated.getReportLatLonAccuracy(), is(20f)); } + @Test + public void testGetVisitOnCaseWithSpecialAccess() { + CaseDataDto caze = creator.createCase(user1.toReference(), person.toReference(), rdcf1); + VisitDto visit = creator.createVisit(caze.getDisease(), person.toReference()); + creator.createSpecialCaseAccess(caze.toReference(), user1.toReference(), user2.toReference(), DateHelper.addDays(new Date(), 1)); + + assertThat(getVisitFacade().getByUuid(visit.getUuid()).isPseudonymized(), is(false)); + assertThat(getVisitFacade().getByUuids(Collections.singletonList(visit.getUuid())).get(0).isPseudonymized(), is(false)); + assertThat(getVisitFacade().getIndexList(new VisitCriteria().caze(caze.toReference()), null, null, null).get(0).isPseudonymized(), is(false)); + assertThat( + getVisitFacade().getVisitsExportList(new VisitCriteria().caze(caze.toReference()), null, null, 0, Integer.MAX_VALUE, null) + .get(0) + .getFirstName(), + is(person.getFirstName())); + // user filter for case visits is not implemented + assertThat(getVisitFacade().getAllActiveVisitsAfter(new Date(0)), hasSize(0)); + assertThat(getVisitFacade().getAllAfter(new Date(0)), hasSize(0)); + } + private ContactVisit createVisit(UserDto visitUser, PersonDto person) { ContactDto contact = creator.createContact(visitUser.toReference(), person.toReference(), Disease.CORONAVIRUS, c -> { Calendar calendar = Calendar.getInstance(); diff --git a/sormas-backend/src/test/resources/META-INF/persistence.xml b/sormas-backend/src/test/resources/META-INF/persistence.xml index 8989dfca0bd..0d274281578 100644 --- a/sormas-backend/src/test/resources/META-INF/persistence.xml +++ b/sormas-backend/src/test/resources/META-INF/persistence.xml @@ -86,7 +86,7 @@ de.symeda.sormas.backend.externalmessage.labmessage.TestReport de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration de.symeda.sormas.backend.externalmessage.labmessage.SampleReport - + de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccess true diff --git a/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml b/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml index 652aeb16577..a797fa13e74 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml @@ -980,6 +980,11 @@ CASE_RESPONSIBLE + + GRANT_SPECIAL_CASE_ACCESS + GRANT_SPECIAL_CASE_ACCESS + + CONTACT_RESPONSIBLE CONTACT_RESPONSIBLE diff --git a/sormas-rest/src/main/webapp/WEB-INF/web.xml b/sormas-rest/src/main/webapp/WEB-INF/web.xml index 73b8b4e6511..42c2ce25177 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/web.xml @@ -792,6 +792,10 @@ CASE_RESPONSIBLE + + GRANT_SPECIAL_CASE_ACCESS + + CONTACT_RESPONSIBLE 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 9b7f283cb9c..619e4fbba4f 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 @@ -43,6 +43,7 @@ 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.specialcaseaccess.SpecialCaseAccessController; import de.symeda.sormas.ui.statistics.StatisticsController; import de.symeda.sormas.ui.task.TaskController; import de.symeda.sormas.ui.therapy.TherapyController; @@ -95,6 +96,7 @@ public class ControllerProvider extends BaseControllerProvider { private final EnvironmentSampleController environmentSampleController; private final ExternalEmailController externalEmailController; private final CustomizableEnumController customizableEnumController; + private final SpecialCaseAccessController specialCaseAccessController; public ControllerProvider() { super(); @@ -136,6 +138,7 @@ public ControllerProvider() { environmentSampleController = new EnvironmentSampleController(); externalEmailController = new ExternalEmailController(); customizableEnumController = new CustomizableEnumController(); + specialCaseAccessController = new SpecialCaseAccessController(); } protected static ControllerProvider get() { @@ -289,4 +292,8 @@ public static ExternalEmailController getExternalEmailController() { public static CustomizableEnumController getCustomizableEnumController() { return get().customizableEnumController; } + + public static SpecialCaseAccessController getSpecialCaseAccessController() { + return get().specialCaseAccessController; + } } 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 94d08a2e2af..050f9ef30da 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 @@ -1079,7 +1079,7 @@ BulkOperationHandler. forBulkEdit() editView.addDiscardListener(popupWindow::close); } - private Consumer> bulkOperationCallback(AbstractCaseGrid caseGrid, Window popupWindow) { + public Consumer> bulkOperationCallback(AbstractCaseGrid caseGrid, Window popupWindow) { return remainingCases -> { if (popupWindow != null) { popupWindow.close(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java index 366588ba6c8..b09f43173fb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java @@ -45,6 +45,7 @@ import de.symeda.sormas.ui.samples.sampleLink.SampleListComponent; import de.symeda.sormas.ui.samples.sampleLink.SampleListComponentLayout; import de.symeda.sormas.ui.sormastosormas.SormasToSormasListComponent; +import de.symeda.sormas.ui.specialcaseaccess.SpecialCaseAccessSideComponent; import de.symeda.sormas.ui.task.TaskListComponent; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.CssStyles; @@ -73,6 +74,7 @@ public class CaseDataView extends AbstractCaseView implements HasName { public static final String SURVEILLANCE_REPORTS_LOC = "surveillanceReports"; public static final String DOCUMENTS_LOC = "documents"; public static final String EXTERNAL_EMAILS_LOC = "externalEmails"; + public static final String SPECIAL_ACCESSES_LOC = "specialAccesses"; private static final long serialVersionUID = -1L; private CommitDiscardWrapperComponent editComponent; @@ -108,7 +110,8 @@ protected void initView(String params) { SURVEILLANCE_REPORTS_LOC, DOCUMENTS_LOC, QuarantineOrderDocumentsComponent.QUARANTINE_LOC, - EXTERNAL_EMAILS_LOC); + EXTERNAL_EMAILS_LOC, + SPECIAL_ACCESSES_LOC); container.addComponent(layout); @@ -227,6 +230,11 @@ protected void initView(String params) { layout.addSidePanelComponent(new SideComponentLayout(externalEmailSideComponent), EXTERNAL_EMAILS_LOC); } + if (UiUtil.permitted(UserRight.GRANT_SPECIAL_CASE_ACCESS)) { + SpecialCaseAccessSideComponent specialAccessListComponent = new SpecialCaseAccessSideComponent(getCaseRef()); + layout.addSidePanelComponent(new SideComponentLayout(specialAccessListComponent), SPECIAL_ACCESSES_LOC); + } + final boolean deleted = FacadeProvider.getCaseFacade().isDeleted(uuid); layout.disableIfNecessary(deleted, caseEditAllowed); } 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 04eb4da0136..51b775637da 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 @@ -83,6 +83,7 @@ import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SearchSpecificLayout; 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.caze.importer.CaseImportLayout; @@ -829,6 +830,16 @@ public HorizontalLayout createStatusFilterBar() { }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE))); } + if (UiUtil.permitted(UserRight.GRANT_SPECIAL_CASE_ACCESS)) { + menuBarItems.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkSpecialCaseAccess), + VaadinIcons.RASTER_LOWER_LEFT, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getSpecialCaseAccessController() + .createForSelectedCases(items, (AbstractCaseGrid) grid)))); + } + bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, menuBarItems); bulkOperationsDropdown.setVisible(viewConfiguration.isInEagerMode()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/SourceContactList.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/SourceContactList.java index 5efe0966d12..637a5396d38 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/SourceContactList.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/SourceContactList.java @@ -82,13 +82,7 @@ public int getSize() { public List getSourceContacts() { return getEntries().stream() - .map( - c -> new ContactReferenceDto( - c.getUuid(), - c.getFirstName(), - c.getLastName(), - c.getCaze() != null ? c.getCaze().getFirstName() : null, - c.getCaze() != null ? c.getCaze().getLastName() : null)) + .map(c -> new ContactReferenceDto(c.getUuid(), c.getFirstName(), c.getLastName(), c.getCaze())) .collect(Collectors.toList()); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java index 6df23badf11..dc6903ec691 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java @@ -227,14 +227,13 @@ private void addGeneratedColumns(Table table) { table.addGeneratedColumn(COLUMN_SOURCE_CASE_NAME, (Table.ColumnGenerator) (source, itemId, columnId) -> { ExposureDto exposure = (ExposureDto) itemId; return !isPseudonymized - ? DataHelper - .toStringNullable(isCaseNameExisting(exposure.getContactToCase()) ? exposure.getContactToCase().getCaseName().buildCaption() : "") + ? DataHelper.toStringNullable(getContactCaseName(exposure.getContactToCase())) : I18nProperties.getCaption(Captions.inaccessibleValue); }); } - private boolean isCaseNameExisting(ContactReferenceDto contactToCase) { - return contactToCase != null && contactToCase.getCaseName() != null; + private static String getContactCaseName(ContactReferenceDto contactToCase) { + return contactToCase.getCaze() != null ? contactToCase.getCaze().getName() : null; } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessController.java new file mode 100644 index 00000000000..e56e5426987 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessController.java @@ -0,0 +1,177 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.vaadin.server.Page; +import com.vaadin.server.Sizeable.Unit; +import com.vaadin.ui.Label; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Window; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.caze.CaseIndexDto; +import de.symeda.sormas.api.caze.CaseReferenceDto; +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.specialcaseaccess.SpecialCaseAccessDto; +import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.caze.AbstractCaseGrid; +import de.symeda.sormas.ui.utils.BulkOperationHandler; +import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; +import de.symeda.sormas.ui.utils.VaadinUiUtil; + +public class SpecialCaseAccessController { + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + public SpecialCaseAccessController() { + } + + public void create(CaseReferenceDto caze, Runnable callback) { + SpecialCaseAccessDto specialCaseAccess = SpecialCaseAccessDto.build(caze, UserProvider.getCurrent().getUserReference()); + + openEditWindow( + specialCaseAccess, + Strings.headingCreateSpecailCaseAccess, + true, + false, + FacadeProvider.getSpecialCaseAccessFacade()::save, + callback); + } + + public void createForSelectedCases(Set cases, AbstractCaseGrid caseGrid) { + + if (CollectionUtils.isEmpty(cases)) { + new Notification( + I18nProperties.getString(Strings.headingNoCasesSelected), + I18nProperties.getString(Strings.messageNoCasesSelected), + Notification.Type.WARNING_MESSAGE, + false).show(Page.getCurrent()); + + return; + } + + SpecialCaseAccessDto specialCaseAccess = SpecialCaseAccessDto.build(null, UserProvider.getCurrent().getUserReference()); + openEditWindow(specialCaseAccess, Strings.headingCreateSpecailCaseAccess, true, true, editedAccess -> { + boolean anyAssignedToUser = FacadeProvider.getSpecialCaseAccessFacade() + .isAnyAssignedToUser(cases.stream().map(CaseIndexDto::toReference).collect(Collectors.toList()), editedAccess.getAssignedTo()); + + if (anyAssignedToUser) { + VaadinUiUtil.showConfirmationPopup( + I18nProperties.getString(Strings.headingConfirmBulkGrantSpecialAccess), + new Label(I18nProperties.getString(Strings.confirmationBulkGrantSpecialAccess)), + I18nProperties.getString(Strings.yes), + I18nProperties.getString(Strings.no), + 640, + confirmed -> { + if (Boolean.TRUE.equals(confirmed)) { + saveBulkSpecialAccesses(new ArrayList<>(cases), editedAccess, caseGrid); + } + }); + } else { + saveBulkSpecialAccesses(new ArrayList<>(cases), editedAccess, caseGrid); + } + }, () -> { + }); + } + + public void edit(SpecialCaseAccessDto specialCaseAccess, Runnable callback) { + openEditWindow( + specialCaseAccess, + Strings.headingEditSpecailCaseAccess, + false, + false, + FacadeProvider.getSpecialCaseAccessFacade()::save, + callback); + } + + private static void openEditWindow( + SpecialCaseAccessDto specialCaseAccess, + String titleTag, + boolean isCreate, + boolean isBulkCreate, + Consumer handleSave, + Runnable callback) { + SpecialCaseAccessForm editForm = new SpecialCaseAccessForm(isCreate); + if (isBulkCreate) { + editForm.hideCaseField(); + } + editForm.setValue(specialCaseAccess); + + CommitDiscardWrapperComponent editComponent = new CommitDiscardWrapperComponent<>(editForm, editForm.getFieldGroup()); + + Window window = VaadinUiUtil.showModalPopupWindow(editComponent, I18nProperties.getString(titleTag)); + window.setWidth(600, Unit.PIXELS); + + editComponent.addCommitListener(() -> { + if (!editForm.getFieldGroup().isModified()) { + SpecialCaseAccessDto dto = editForm.getValue(); + + handleSave.accept(dto); + callback.run(); + } + }); + + if (!isCreate) { + editComponent.addDeleteListener(() -> { + FacadeProvider.getSpecialCaseAccessFacade().delete(specialCaseAccess.getUuid()); + + window.close(); + callback.run(); + }, I18nProperties.getCaption(SpecialCaseAccessDto.I18N_PREFIX)); + } + } + + private void saveBulkSpecialAccesses(List cases, SpecialCaseAccessDto accessTemplate, AbstractCaseGrid caseGrid) { + new BulkOperationHandler( + Strings.messageBulkSpecialCaseAccessAllProcessed, + null, + Strings.headingBulkSpecialCaseAccessSomeNotProcessed, + Strings.headingBulkSpecialCaseAccessNoneProcessed, + Strings.messageCountAccessesNotGrantedDueToError, + null, + null, + null, + null, + Strings.infoBulkProcessFinishedWithSkips, + Strings.infoBulkProcessFinishedWithoutSuccess).doBulkOperation(batch -> { + List processedCases = new ArrayList<>(); + + try { + List specialAccesses = + batch.stream().map(c -> accessTemplate.withCase(c.toReference())).collect(Collectors.toList()); + FacadeProvider.getSpecialCaseAccessFacade().saveAll(specialAccesses); + processedCases.addAll(batch.stream().map(ProcessedEntity::successful).collect(Collectors.toList())); + } catch (Exception e) { + processedCases.addAll(batch.stream().map(ProcessedEntity::failedInternally).collect(Collectors.toList())); + logger.error("Failed to save special case accesses", e); + } + return processedCases; + }, new ArrayList<>(cases), ControllerProvider.getCaseController().bulkOperationCallback(caseGrid, null)); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessForm.java new file mode 100644 index 00000000000..1e0ca72a8fa --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessForm.java @@ -0,0 +1,79 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import static de.symeda.sormas.ui.utils.LayoutUtil.fluidRowLocs; + +import com.vaadin.v7.ui.ComboBox; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessDto; +import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.ui.utils.AbstractEditForm; +import de.symeda.sormas.ui.utils.DateTimeField; +import de.symeda.sormas.ui.utils.FieldHelper; +import de.symeda.sormas.ui.utils.PastDateValidator; + +public class SpecialCaseAccessForm extends AbstractEditForm { + + private static final long serialVersionUID = -945936537515438396L; + private static final String HTML_LAYOUT = fluidRowLocs(SpecialCaseAccessDto.CAZE) + + fluidRowLocs(SpecialCaseAccessDto.ASSIGNED_TO) + + fluidRowLocs(SpecialCaseAccessDto.END_DATE_TIME) + + fluidRowLocs(SpecialCaseAccessDto.ASSIGNED_BY, SpecialCaseAccessDto.ASSIGNMENT_DATE); + + private final boolean isCreate; + + protected SpecialCaseAccessForm(boolean isCreate) { + super(SpecialCaseAccessDto.class, SpecialCaseAccessDto.I18N_PREFIX, false); + this.isCreate = isCreate; + + if (isCreate) { + hideValidationUntilNextCommit(); + } + + setWidthUndefined(); + + addFields(); + } + + @Override + protected String createHtmlLayout() { + return HTML_LAYOUT; + } + + @Override + protected void addFields() { + addField(SpecialCaseAccessDto.CAZE).setReadOnly(true); + + ComboBox assignedToField = addField(SpecialCaseAccessDto.ASSIGNED_TO); + FieldHelper.updateItems(assignedToField, FacadeProvider.getUserFacade().getUsersByRegionAndRights(null, null, UserRight.CASE_VIEW)); + assignedToField.setRequired(true); + + DateTimeField endDateTime = addDateField(SpecialCaseAccessDto.END_DATE_TIME, DateTimeField.class, -1); + endDateTime.addValidator(new PastDateValidator(endDateTime.getCaption())); + endDateTime.setRequired(true); + + if (!isCreate) { + addField(SpecialCaseAccessDto.ASSIGNED_BY).setReadOnly(true); + addField(SpecialCaseAccessDto.ASSIGNMENT_DATE).setReadOnly(true); + } + } + + public void hideCaseField() { + getField(SpecialCaseAccessDto.CAZE).setVisible(false); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessSideComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessSideComponent.java new file mode 100644 index 00000000000..8296cbb977f --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/specialcaseaccess/SpecialCaseAccessSideComponent.java @@ -0,0 +1,147 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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.specialcaseaccess; + +import java.util.List; + +import javax.validation.constraints.Null; + +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.Language; +import de.symeda.sormas.api.caze.CaseReferenceDto; +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.specialcaseaccess.SpecialCaseAccessDto; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; +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.PaginationList; +import de.symeda.sormas.ui.utils.components.sidecomponent.SideComponent; +import de.symeda.sormas.ui.utils.components.sidecomponent.SideComponentField; + +public class SpecialCaseAccessSideComponent extends SideComponent { + + public SpecialCaseAccessSideComponent(CaseReferenceDto caze) { + super(I18nProperties.getString(Strings.headingSpecailCaseAccess)); + + setWidth(100, Unit.PERCENTAGE); + setMargin(false); + setSpacing(false); + + SpecialCaseAccessList list = new SpecialCaseAccessList(caze); + addComponent(list); + list.reload(); + + addCreateButton( + I18nProperties + .getCaption(Captions.specialCaseAccessNew), + () -> ControllerProvider.getSpecialCaseAccessController().create(caze, list::reload)); + } + + private static class SpecialCaseAccessList extends PaginationList { + + private final CaseReferenceDto caze; + + public SpecialCaseAccessList(CaseReferenceDto caze) { + super(5); + + this.caze = caze; + } + + @Override + public void reload() { + List specialAccesses = FacadeProvider.getSpecialCaseAccessFacade().getAllActiveByCase(caze); + setEntries(specialAccesses); + if (!specialAccesses.isEmpty()) { + showPage(1); + } else { + listLayout.removeAllComponents(); + updatePaginationLayout(); + listLayout.addComponent(new Label(I18nProperties.getCaption(Captions.specailCaseAccessNoAccessGranted))); + } + } + + @Override + protected void drawDisplayedEntries() { + listLayout.removeAllComponents(); + for (SpecialCaseAccessDto specialCaseAccess : getDisplayedEntries()) { + SpecialCaseAccessEntry entry = new SpecialCaseAccessEntry(specialCaseAccess); + + entry.addActionButton( + specialCaseAccess.getUuid(), + event -> ControllerProvider.getSpecialCaseAccessController().edit(specialCaseAccess, this::reload), + true); + listLayout.addComponent(entry); + } + } + } + + private static class SpecialCaseAccessEntry extends SideComponentField { + + public SpecialCaseAccessEntry(SpecialCaseAccessDto specialCaseAccess) { +// VerticalLayout mainLayout = new VerticalLayout(); +// mainLayout.setWidth(100, Unit.PERCENTAGE); +// mainLayout.setMargin(false); +// mainLayout.setSpacing(false); +// addComponentToField(mainLayout); + Language userLanguage = UserProvider.getCurrent().getUser().getLanguage(); + + addComponentToField(createRow(null, specialCaseAccess.getAssignedTo().getCaption())); + addComponentToField( + createRow( + I18nProperties.getPrefixCaption(SpecialCaseAccessDto.I18N_PREFIX, SpecialCaseAccessDto.END_DATE_TIME), + DateHelper.formatLocalDate(specialCaseAccess.getEndDateTime(), userLanguage))); + addComponentToField( + createRow( + I18nProperties.getPrefixCaption(SpecialCaseAccessDto.I18N_PREFIX, SpecialCaseAccessDto.ASSIGNED_BY), + specialCaseAccess.getAssignedBy().getCaption())); + addComponentToField( + createRow( + I18nProperties.getPrefixCaption(SpecialCaseAccessDto.I18N_PREFIX, SpecialCaseAccessDto.ASSIGNMENT_DATE), + DateHelper.formatLocalDate(specialCaseAccess.getAssignmentDate(), userLanguage))); + } + + private HorizontalLayout createRow(@Null String label, Object value) { + HorizontalLayout row = new HorizontalLayout(); + row.setMargin(false); + row.setSpacing(false); + + if (label != null) { + Label rowLabel = new Label(DataHelper.toStringNullable(label) + ":"); + CssStyles.style(rowLabel, CssStyles.HSPACE_RIGHT_4); + row.addComponent(rowLabel); + } + + Label rowValue = new Label(DataHelper.toStringNullable(value)); + if (label == null) { + rowValue.addStyleName(CssStyles.LABEL_BOLD); + } + row.addComponent(rowValue); + + return row; + } + + } +} 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 2ff616a5e4d..8795116e685 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 @@ -265,7 +265,8 @@ protected void addDirtyHandler(FieldGroup[] fieldGroups) { .anyMatch(Buffered::isModified)) { dirty = true; } - } else if (source instanceof EventDataForm) { + } + else if (source instanceof EventDataForm) { final EventDataForm eventDataForm = (EventDataForm) source; final LocationEditForm locationEditForm = eventDataForm.getField(EventDto.EVENT_LOCATION); if (atLeastOneFieldModified( @@ -286,7 +287,8 @@ protected void addDirtyHandler(FieldGroup[] fieldGroups) { .anyMatch(Buffered::isModified)) { dirty = true; } - } else if (source instanceof LocationEditForm) { + } + else if (source instanceof LocationEditForm) { final LocationEditForm locationEditForm = (LocationEditForm) source; if (atLeastOneFieldModified( locationEditForm.getField(LocationDto.LATITUDE), @@ -300,12 +302,14 @@ protected void addDirtyHandler(FieldGroup[] fieldGroups) { .anyMatch(Buffered::isModified)) { dirty = true; } - } else if (source instanceof AccessibleTextField) { + } + else if (source instanceof AccessibleTextField) { final AccessibleTextField accessibleTextField = (AccessibleTextField) source; if (accessibleTextField.isModified()) { dirty = true; } - } else { + } + else { dirty = true; } }))); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FieldAccessColumnStyleGenerator.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FieldAccessColumnStyleGenerator.java index a4a92fd1bc9..7ab5f9338ac 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FieldAccessColumnStyleGenerator.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FieldAccessColumnStyleGenerator.java @@ -39,9 +39,9 @@ public static FieldAccessColumnStyleGenerator for private static FieldAccessColumnStyleGenerator forFieldAccessCheckers( Class beanType, String columnId, - UiFieldAccessCheckers psuedonymizedDataFieldChecker) { + UiFieldAccessCheckers psuedonymizedDataFieldChecker) { - return new FieldAccessColumnStyleGenerator<>((t) -> { + return new FieldAccessColumnStyleGenerator<>(t -> { if (t.isPseudonymized()) { return psuedonymizedDataFieldChecker.isEmbedded(beanType, columnId) ? psuedonymizedDataFieldChecker.hasRight() @@ -52,7 +52,7 @@ private static FieldAccessColumnStyleGenerator fo }); } - private Function accessCheck; + private final Function accessCheck; public FieldAccessColumnStyleGenerator(Function accessCheck) { this.accessCheck = accessCheck; @@ -60,7 +60,7 @@ public FieldAccessColumnStyleGenerator(Function accessCheck) { @Override public String apply(T dto) { - if (!accessCheck.apply(dto)) { + if (Boolean.FALSE.equals(accessCheck.apply(dto))) { return CssStyles.INACCESSIBLE_COLUMN; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PastDateValidator.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PastDateValidator.java new file mode 100644 index 00000000000..ec12fafa532 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/PastDateValidator.java @@ -0,0 +1,43 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2024 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 java.util.Date; + +import com.vaadin.v7.data.validator.AbstractValidator; + +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Validations; + +public class PastDateValidator extends AbstractValidator { + + public PastDateValidator(String caption) { + super(I18nProperties.getValidationError(Validations.pastDate, caption)); + } + + @Override + protected boolean isValidValue(Date value) { + return value == null || value.after(new Date()); + } + + @Override + public Class getType() { + return Date.class; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/sidecomponent/SideComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/sidecomponent/SideComponent.java index 588e5a05a51..0097e80e3d2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/sidecomponent/SideComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/components/sidecomponent/SideComponent.java @@ -25,7 +25,7 @@ public class SideComponent extends VerticalLayout { protected Button createButton; public SideComponent(String heading) { - this(heading, null); + this(heading, Runnable::run); } public SideComponent(String heading, Consumer actionCallback) { diff --git a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml index 6f71704550d..dc1bd0fc94d 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml @@ -981,6 +981,11 @@ CASE_RESPONSIBLE + + GRANT_SPECIAL_CASE_ACCESS + GRANT_SPECIAL_CASE_ACCESS + + CONTACT_RESPONSIBLE CONTACT_RESPONSIBLE diff --git a/sormas-ui/src/main/webapp/WEB-INF/web.xml b/sormas-ui/src/main/webapp/WEB-INF/web.xml index dcea91747d4..cd9bbf84146 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/web.xml @@ -797,6 +797,10 @@ CASE_RESPONSIBLE + + GRANT_SPECIAL_CASE_ACCESS + + CONTACT_RESPONSIBLE diff --git a/sormas-ui/src/test/resources/META-INF/persistence.xml b/sormas-ui/src/test/resources/META-INF/persistence.xml index c94cd481b90..0eb172e7093 100644 --- a/sormas-ui/src/test/resources/META-INF/persistence.xml +++ b/sormas-ui/src/test/resources/META-INF/persistence.xml @@ -86,7 +86,7 @@ de.symeda.sormas.backend.externalmessage.labmessage.SampleReport de.symeda.sormas.backend.environment.Environment de.symeda.sormas.backend.environment.environmentsample.EnvironmentSample - + de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccess true From 136d39ba4f24ee6b23398fccae377ce7b75bb407 Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Fri, 16 Feb 2024 08:54:52 +0000 Subject: [PATCH 43/65] [GitHub Actions] Update openAPI spec files --- sormas-rest/swagger.json | 16 +++++++++++----- sormas-rest/swagger.yaml | 11 +++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index a74ea4d6023..0433a9cbbf0 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -9889,7 +9889,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] + "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] } } } @@ -9919,7 +9919,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] + "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] } } } @@ -12887,6 +12887,9 @@ "lastName" : { "type" : "string" }, + "name" : { + "type" : "string" + }, "uuid" : { "type" : "string", "pattern" : "^[0-9a-zA-Z-]*$" @@ -14212,8 +14215,8 @@ "caption" : { "type" : "string" }, - "caseName" : { - "$ref" : "#/components/schemas/PersonName" + "caze" : { + "$ref" : "#/components/schemas/CaseReferenceDto" }, "contactName" : { "$ref" : "#/components/schemas/PersonName" @@ -22305,6 +22308,9 @@ "SampleReferenceDto" : { "type" : "object", "properties" : { + "associatedCaseUuid" : { + "type" : "string" + }, "caption" : { "type" : "string" }, @@ -25190,7 +25196,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] + "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] }, "uniqueItems" : true }, diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index 0b0d86ee09d..755f1a4212e 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -7033,6 +7033,7 @@ paths: - CASE_MERGE - CASE_SHARE - CASE_RESPONSIBLE + - GRANT_SPECIAL_CASE_ACCESS - IMMUNIZATION_VIEW - IMMUNIZATION_CREATE - IMMUNIZATION_EDIT @@ -7253,6 +7254,7 @@ paths: - CASE_MERGE - CASE_SHARE - CASE_RESPONSIBLE + - GRANT_SPECIAL_CASE_ACCESS - IMMUNIZATION_VIEW - IMMUNIZATION_CREATE - IMMUNIZATION_EDIT @@ -10823,6 +10825,8 @@ components: type: string lastName: type: string + name: + type: string uuid: type: string pattern: "^[0-9a-zA-Z-]*$" @@ -12392,8 +12396,8 @@ components: properties: caption: type: string - caseName: - $ref: '#/components/schemas/PersonName' + caze: + $ref: '#/components/schemas/CaseReferenceDto' contactName: $ref: '#/components/schemas/PersonName' uuid: @@ -21743,6 +21747,8 @@ components: SampleReferenceDto: type: object properties: + associatedCaseUuid: + type: string caption: type: string uuid: @@ -25323,6 +25329,7 @@ components: - CASE_MERGE - CASE_SHARE - CASE_RESPONSIBLE + - GRANT_SPECIAL_CASE_ACCESS - IMMUNIZATION_VIEW - IMMUNIZATION_CREATE - IMMUNIZATION_EDIT From d64c4ad2e5f95ae3be9ded90d9c51cd2835777cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 16 Feb 2024 12:47:21 +0100 Subject: [PATCH 44/65] #12887 - Fix SQL query --- .../src/main/resources/sql/sormas_schema.sql | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 58e2c43e4da..fc1c68272e2 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12920,29 +12920,38 @@ DO $$ DECLARE user_role_id BIGINT; + user_role_ur_id BIGINT; BEGIN FOR user_role_id IN SELECT DISTINCT(ur.id) FROM userroles ur JOIN userroles_userrights urur ON ur.id = urur.userrole_id WHERE urur.userright = 'ENVIRONMENT_DELETE' - AND urur.userright != 'ENVIRONMENT_SAMPLE_DELETE' LOOP - INSERT INTO userroles_userrights (userrole_id, userright) - VALUES (user_role_id, 'ENVIRONMENT_SAMPLE_DELETE'); - - UPDATE userroles set changedate = now() WHERE id = user_role_id; + SELECT 1 FROM userroles_userrights + WHERE userrole_id = user_role_id AND userright = 'ENVIRONMENT_SAMPLE_DELETE' + INTO user_role_ur_id; + + IF NOT FOUND THEN + INSERT INTO userroles_userrights (userrole_id, userright) + VALUES (user_role_id, 'ENVIRONMENT_SAMPLE_DELETE'); + UPDATE userroles set changedate = now() WHERE id = user_role_id; + END IF; END LOOP; FOR user_role_id IN SELECT DISTINCT(ur.id) FROM userroles ur JOIN userroles_userrights urur ON ur.id = urur.userrole_id WHERE urur.userright = 'ENVIRONMENT_SAMPLE_DELETE' - AND urur.userright != 'ENVIRONMENT_PATHOGEN_TEST_DELETE' LOOP - INSERT INTO userroles_userrights (userrole_id, userright) - VALUES (user_role_id, 'ENVIRONMENT_PATHOGEN_TEST_DELETE'); - - UPDATE userroles set changedate = now() WHERE id = user_role_id; + SELECT DISTINCT(userrole_id) FROM userroles_userrights + WHERE userrole_id = user_role_id AND userright = 'ENVIRONMENT_PATHOGEN_TEST_DELETE' + INTO user_role_ur_id; + + IF NOT FOUND THEN + INSERT INTO userroles_userrights (userrole_id, userright) + VALUES (user_role_id, 'ENVIRONMENT_PATHOGEN_TEST_DELETE'); + UPDATE userroles set changedate = now() WHERE id = user_role_id; + END IF; END LOOP; END; $$ LANGUAGE plpgsql; From 7400380e83df451eb8c452fc87f9c4a8c50069a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 16 Feb 2024 13:19:28 +0100 Subject: [PATCH 45/65] #12779 - Change environment sample redirection (#12969) --- .../ui/environment/EnvironmentDataView.java | 8 ++++- .../EnvironmentSampleController.java | 34 +++++++++++++++---- .../EnvironmentSampleDataView.java | 20 +++++++++-- 3 files changed, 52 insertions(+), 10 deletions(-) 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 bc68d85b5ce..754c93266b6 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 @@ -8,13 +8,14 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.samples.HasName; import de.symeda.sormas.ui.task.TaskListComponent; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.DetailSubComponentWrapper; import de.symeda.sormas.ui.utils.LayoutWithSidePanel; -public class EnvironmentDataView extends AbstractEnvironmentView { +public class EnvironmentDataView extends AbstractEnvironmentView implements HasName { public static final String VIEW_NAME = ROOT_VIEW_NAME + "/data"; @@ -78,4 +79,9 @@ protected void initView(String params) { protected boolean isEditAllowed() { return FacadeProvider.getEnvironmentFacade().isEditAllowed(environment.getUuid()); } + + @Override + public String getName() { + return VIEW_NAME; + } } 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 2f83fcad304..ad91fcc4f57 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 @@ -25,6 +25,7 @@ import com.vaadin.server.Sizeable; import com.vaadin.ui.Component; import com.vaadin.ui.Notification; +import com.vaadin.ui.UI; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.common.DeletionReason; @@ -43,6 +44,7 @@ import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.environment.EnvironmentDataView; import de.symeda.sormas.ui.samples.SamplesView; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.DateFormatHelper; @@ -89,7 +91,7 @@ private Consumer> bulkOperationCallback(Environm }; } - public CommitDiscardWrapperComponent getEditComponent(EnvironmentSampleDto sample) { + public CommitDiscardWrapperComponent getEditComponent(EnvironmentSampleDto sample, String oldViewName) { EnvironmentSampleFacade environmentSampleFacade = FacadeProvider.getEnvironmentSampleFacade(); String sampleUuid = sample.getUuid(); @@ -128,12 +130,13 @@ public CommitDiscardWrapperComponent getEditComponent } if (UserProvider.getCurrent().hasUserRight(UserRight.ENVIRONMENT_SAMPLE_DELETE)) { - editComponent.addDeleteWithReasonOrRestoreListener( - SamplesView.VIEW_NAME, - null, - I18nProperties.getString(Strings.entityEnvironmentSample), - sampleUuid, - FacadeProvider.getEnvironmentSampleFacade()); + editComponent.addDeleteWithReasonOrRestoreListener((deleteDetails) -> { + FacadeProvider.getEnvironmentSampleFacade().delete(sample.getUuid(), deleteDetails); + redirectToOldNavigationState(sample, oldViewName); + }, (deletionDetails) -> { + FacadeProvider.getEnvironmentSampleFacade().restore(sample.getUuid()); + UI.getCurrent().getNavigator().navigateTo(SamplesView.VIEW_NAME); + }, I18nProperties.getString(Strings.entityEnvironmentSample), FacadeProvider.getEnvironmentSampleFacade().isDeleted(sample.getUuid())); } editComponent.restrictEditableComponentsOnEditView( @@ -185,4 +188,21 @@ public void create(EnvironmentDto environment, Runnable callback) { VaadinUiUtil.showModalPopupWindow(editView, I18nProperties.getString(Strings.headingCreateNewEnvironmentSample)); } + + private void redirectToOldNavigationState(EnvironmentSampleDto dto, String oldViewName) { + + if (oldViewName != null) { + String navigationState; + if (oldViewName.equals(EnvironmentDataView.VIEW_NAME)) { + navigationState = oldViewName + "/" + dto.getEnvironment().getUuid(); + } else { + // Environment sample accessed from samples directory + navigationState = oldViewName; + } + UI.getCurrent().getNavigator().navigateTo(navigationState); + } else { + // Environment sample accessed by URL from any other view + UI.getCurrent().getNavigator().navigateTo(SamplesView.VIEW_NAME); + } + } } 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 0232e4cf48c..2820a697b2a 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 @@ -15,6 +15,10 @@ package de.symeda.sormas.ui.samples.environmentsample; +import java.util.Arrays; +import java.util.List; + +import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener; import de.symeda.sormas.api.EditPermissionType; @@ -27,6 +31,7 @@ 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.HasName; import de.symeda.sormas.ui.samples.SamplesView; import de.symeda.sormas.ui.samples.pathogentestlink.PathogenTestListComponent; import de.symeda.sormas.ui.utils.AbstractDetailView; @@ -44,6 +49,7 @@ public class EnvironmentSampleDataView extends AbstractDetailView editComponent; + private String oldViewName = null; public EnvironmentSampleDataView() { super(VIEW_NAME); @@ -51,8 +57,14 @@ public EnvironmentSampleDataView() { @Override public void enter(ViewChangeListener.ViewChangeEvent event) { - super.enter(event); + View oldView = event.getOldView(); + if (oldView != null) { + List> interfaces = Arrays.asList(oldView.getClass().getInterfaces()); + if (interfaces.contains(HasName.class)) { + oldViewName = ((HasName) oldView).getName(); + } + } initOrRedirect(event); } @@ -79,7 +91,7 @@ protected void initView(String params) { String sampleUuid = getReference().getUuid(); EnvironmentSampleDto sample = FacadeProvider.getEnvironmentSampleFacade().getByUuid(sampleUuid); EditPermissionType editPermission = FacadeProvider.getEnvironmentSampleFacade().getEditPermissionType(sampleUuid); - editComponent = ControllerProvider.getEnvironmentSampleController().getEditComponent(sample); + editComponent = ControllerProvider.getEnvironmentSampleController().getEditComponent(sample, getOldViewName()); DetailSubComponentWrapper container = new DetailSubComponentWrapper(() -> editComponent); container.setWidth(100, Unit.PERCENTAGE); @@ -118,4 +130,8 @@ private boolean isEditAllowed() { return FacadeProvider.getEnvironmentSampleFacade().isEditAllowed(getReference().getUuid()); } + private String getOldViewName() { + return oldViewName; + } + } From 238dee6ff9f7fd815e14a942c8020d8138e20fec Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Fri, 16 Feb 2024 13:31:01 +0100 Subject: [PATCH 46/65] qa-auto/HSP-6588 Stabilize "Test custom task export edit" - increased TimerLite time --- .../java/org/sormas/e2etests/helpers/WebDriverHelpers.java | 2 +- .../steps/web/application/tasks/TaskManagementSteps.java | 3 +-- .../src/test/resources/features/sanity/web/Task.feature | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java index 2cb9f5feeca..8cf5ff44dbd 100755 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java @@ -403,7 +403,7 @@ public void doubleClickOnWebElementBySelector(By selector) { } public void clickWhileOtherButtonIsDisplayed(By clickedElement, By waitedSelector) { - TimerLite timer = TimerLite.of(ofSeconds(30)); + TimerLite timer = TimerLite.of(ofSeconds(35)); do { clickOnWebElementWhichMayNotBePresent(clickedElement, 0); if (timer.isTimeUp()) { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java index d69b588ff74..d0bda6c778d 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java @@ -99,8 +99,7 @@ public TaskManagementSteps( When( "^I click on the NEW TASK button$", - () ->{ - webDriverHelpers.waitForSpinnerNotVisible(10); + () -> { webDriverHelpers.clickWhileOtherButtonIsDisplayed(NEW_TASK_BUTTON, TASK_TYPE_COMBOBOX); }); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature index 8b9edd7bc3b..29577dcee42 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature @@ -179,7 +179,6 @@ Feature: Tasks functionalities And I click on the Tasks button from navbar And I click on the NEW TASK button When I create a new task with specific data - # And I click on the Tasks button from navbar And I filter out last created task from Tasks Directory And I click Export button in Task Directory When I click on the Custom Event Export button From 17f685f4290d9d5a86a92c8d561c6091501b6f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 16 Feb 2024 14:30:24 +0100 Subject: [PATCH 47/65] #11919 - Display correct information on hospitalization change (#12968) --- .../de/symeda/sormas/ui/caze/PlaceOfStayEditForm.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/PlaceOfStayEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/PlaceOfStayEditForm.java index 9a4ee9374a1..5ab1b71b0ad 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/PlaceOfStayEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/PlaceOfStayEditForm.java @@ -25,6 +25,7 @@ import java.util.Collections; import com.vaadin.ui.Label; +import com.vaadin.v7.data.util.converter.Converter; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.ComboBox; import com.vaadin.v7.ui.TextField; @@ -192,4 +193,12 @@ private void updateFacility() { facilityCombo.setEnabled(false); } } + + @Override + public void setValue(CaseDataDto newFieldValue) throws ReadOnlyException, Converter.ConversionException { + super.setValue(newFieldValue); + if (newFieldValue.getRegion() != null && newFieldValue.getRegion().getUuid() != newFieldValue.getResponsibleRegion().getUuid()) { + differentPlaceOfStayJurisdiction.setValue(true); + } + } } From df83633d8b6ecff988f254e61c38617e0a30329a Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Fri, 16 Feb 2024 18:40:32 +0200 Subject: [PATCH 48/65] #12974 Remove mask from case contact list and event participant list for users with special case access where contact and event participant are accessible --- .../de/symeda/sormas/api/caze/CaseFacade.java | 2 + .../symeda/sormas/api/event/EventFacade.java | 2 + .../sormas/backend/caze/CaseFacadeEjb.java | 5 + .../sormas/backend/event/EventFacadeEjb.java | 8 + .../SpecialCaseAccessService.java | 39 ++++ .../sormas/ui/caze/CaseContactsView.java | 204 +++++++++--------- .../ui/events/EventParticipantsView.java | 22 +- 7 files changed, 172 insertions(+), 110 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 298587e6997..e2466b8fb60 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 @@ -231,4 +231,6 @@ List saveBulkEditWithFacilities( boolean hasOtherValidVaccination(CaseDataDto caze, String vaccinationUuid); Pair getRegionAndDistrictRefsOf(CaseReferenceDto caze); + + boolean hasCurrentUserSpecialAccess(CaseReferenceDto caze); } 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 7fa14d47f05..9b23b71bc56 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 @@ -86,4 +86,6 @@ List saveBulkEvents( boolean eventManagementStatusChange); boolean isInJurisdictionOrOwned(String uuid); + + boolean hasParticipantWithSpecialAccess(EventReferenceDto eventRef); } 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 5529e0bd3de..93f95d558e6 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 @@ -4440,6 +4440,11 @@ public void updateSymptomsByVisit(Visit visit) { caseSave(cazeDto, true, visit.getCaze(), cazeDto, true, true); } + @Override + public boolean hasCurrentUserSpecialAccess(CaseReferenceDto caze) { + return specialCaseAccessService.hasCurrentUserSpecialAccess(caze); + } + @LocalBean @Stateless public static class CaseFacadeEjbLocal extends CaseFacadeEjb { 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 2f6377ec9d5..72dcf194827 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 @@ -126,6 +126,7 @@ import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareInfoHelper; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; +import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.user.UserService; @@ -180,6 +181,8 @@ public class EventFacadeEjb extends AbstractCoreFacadeEjb cb + .and(cb.equal(from.join(SpecialCaseAccess.CAZE).get(Case.UUID), caze.getUuid()), createSpecialCaseAccessFilter(cb, from))); + } + + public boolean hasEventParticipantWithSpecialAccess(EventReferenceDto eventRef) { + final CriteriaBuilder cb = em.getCriteriaBuilder(); + final CriteriaQuery query = cb.createQuery(Object.class); + final Root from = query.from(EventParticipant.class); + + final Subquery subquery = query.subquery(EventParticipant.class); + final Root subRootEntity = subquery.from(EventParticipant.class); + subquery.select(subRootEntity); + subquery.where( + cb.equal(subRootEntity.get(EventParticipant.EVENT).get(AbstractDomainObject.UUID), eventRef.getUuid()), + createSpecialCaseAccessFilter(cb, subRootEntity.join(EventParticipant.PERSON).join(Person.CASES).join(Case.SPECIAL_CASE_ACCESSES))); + + final Predicate exists = cb.exists(subquery); + final Expression trueExpression = cb.literal(true); + final Expression falseExpression = cb.literal(false); + query.select(cb.selectCase().when(exists, trueExpression).otherwise(falseExpression)); + + final TypedQuery typedQuery = em.createQuery(query); + typedQuery.setMaxResults(1); + + try { + return (Boolean) typedQuery.getSingleResult(); + } catch (NoResultException e) { + // h2 database entity manager throws "NoResultException" if the entity not found + return false; + } + } } 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 392992c7036..ba43cf64eee 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 @@ -211,7 +211,7 @@ public HorizontalLayout createFilterBar() { return topLayout; } - public HorizontalLayout createStatusFilterBar() { + public HorizontalLayout createStatusFilterBar(boolean isEditAllowed) { HorizontalLayout statusFilterLayout = new HorizontalLayout(); statusFilterLayout.setSpacing(true); @@ -243,113 +243,115 @@ public HorizontalLayout createStatusFilterBar() { } statusFilterLayout.setExpandRatio(statusFilterLayout.getComponent(statusFilterLayout.getComponentCount() - 1), 1); - // Bulk operation dropdown - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - statusFilterLayout.setWidth(100, Unit.PERCENTAGE); - - MenuBar bulkOperationsDropdown = MenuBarHelper.createDropDown( - Captions.bulkActions, - 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); - statusFilterLayout.setExpandRatio(bulkOperationsDropdown, 1); - } + if (isEditAllowed) { + // Bulk operation dropdown + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { + statusFilterLayout.setWidth(100, Unit.PERCENTAGE); + + MenuBar bulkOperationsDropdown = MenuBarHelper.createDropDown( + Captions.bulkActions, + 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); + statusFilterLayout.setExpandRatio(bulkOperationsDropdown, 1); + } - if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_IMPORT)) { - Button importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { - Window popupWindow = VaadinUiUtil - .showPopupWindow(new CaseContactsImportLayout(FacadeProvider.getCaseFacade().getCaseDataByUuid(criteria.getCaze().getUuid()))); - popupWindow.setCaption(I18nProperties.getString(Strings.headingImportCaseContacts)); - popupWindow.addCloseListener(c -> { - grid.reload(); - }); - }, ValoTheme.BUTTON_PRIMARY); - - statusFilterLayout.addComponent(importButton); - statusFilterLayout.setComponentAlignment(importButton, Alignment.MIDDLE_RIGHT); - if (!UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - statusFilterLayout.setExpandRatio(importButton, 1); + if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_IMPORT)) { + Button importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { + Window popupWindow = VaadinUiUtil.showPopupWindow( + new CaseContactsImportLayout(FacadeProvider.getCaseFacade().getCaseDataByUuid(criteria.getCaze().getUuid()))); + popupWindow.setCaption(I18nProperties.getString(Strings.headingImportCaseContacts)); + popupWindow.addCloseListener(c -> { + grid.reload(); + }); + }, ValoTheme.BUTTON_PRIMARY); + + statusFilterLayout.addComponent(importButton); + statusFilterLayout.setComponentAlignment(importButton, Alignment.MIDDLE_RIGHT); + if (!UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { + statusFilterLayout.setExpandRatio(importButton, 1); + } } - } - if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_EXPORT)) { - VerticalLayout exportLayout = new VerticalLayout(); - exportLayout.setSpacing(true); - exportLayout.setMargin(true); - exportLayout.addStyleName(CssStyles.LAYOUT_MINIMAL); - exportLayout.setWidth(200, Unit.PIXELS); + if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_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); + PopupButton exportButton = ButtonHelper.createIconPopupButton(Captions.export, VaadinIcons.DOWNLOAD, exportLayout); - statusFilterLayout.addComponent(exportButton); - statusFilterLayout.setComponentAlignment(exportButton, Alignment.MIDDLE_RIGHT); - if (!UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - statusFilterLayout.setExpandRatio(exportButton, 1); + statusFilterLayout.addComponent(exportButton); + statusFilterLayout.setComponentAlignment(exportButton, Alignment.MIDDLE_RIGHT); + if (!UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { + statusFilterLayout.setExpandRatio(exportButton, 1); + } + StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( + grid, + () -> viewConfiguration.isInEagerMode() ? this.grid.asMultiSelect().getSelectedItems() : null, + ExportEntityName.CONTACTS); + addExportButton(streamResource, exportButton, exportLayout, VaadinIcons.TABLE, Captions.exportBasic, Descriptions.descExportButton); + + StreamResource extendedExportStreamResource = + ContactDownloadUtil.createContactExportResource(grid.getCriteria(), this::getSelectedRows, null); + addExportButton( + extendedExportStreamResource, + exportButton, + exportLayout, + VaadinIcons.FILE_TEXT, + Captions.exportDetailed, + Descriptions.descDetailedExportButton); + + Button btnCustomExport = ButtonHelper.createIconButton(Captions.exportCustom, VaadinIcons.FILE_TEXT, e -> { + ControllerProvider.getCustomExportController().openContactExportWindow(grid.getCriteria(), this::getSelectedRows); + }, ValoTheme.BUTTON_PRIMARY); + btnCustomExport.setDescription(I18nProperties.getString(Strings.infoCustomExport)); + btnCustomExport.setWidth(100, Unit.PERCENTAGE); + exportLayout.addComponent(btnCustomExport); + + // Warning if no filters have been selected + Label warningLabel = new Label(I18nProperties.getString(Strings.infoExportNoFilters)); + warningLabel.setWidth(100, Unit.PERCENTAGE); + exportLayout.addComponent(warningLabel); + warningLabel.setVisible(false); + + exportButton.addClickListener(e -> warningLabel.setVisible(!criteria.hasAnyFilterActive())); } - StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( - grid, - () -> viewConfiguration.isInEagerMode() ? this.grid.asMultiSelect().getSelectedItems() : null, - ExportEntityName.CONTACTS); - addExportButton(streamResource, exportButton, exportLayout, VaadinIcons.TABLE, Captions.exportBasic, Descriptions.descExportButton); - - StreamResource extendedExportStreamResource = - ContactDownloadUtil.createContactExportResource(grid.getCriteria(), this::getSelectedRows, null); - addExportButton( - extendedExportStreamResource, - exportButton, - exportLayout, - VaadinIcons.FILE_TEXT, - Captions.exportDetailed, - Descriptions.descDetailedExportButton); - - Button btnCustomExport = ButtonHelper.createIconButton(Captions.exportCustom, VaadinIcons.FILE_TEXT, e -> { - ControllerProvider.getCustomExportController().openContactExportWindow(grid.getCriteria(), this::getSelectedRows); - }, ValoTheme.BUTTON_PRIMARY); - btnCustomExport.setDescription(I18nProperties.getString(Strings.infoCustomExport)); - btnCustomExport.setWidth(100, Unit.PERCENTAGE); - exportLayout.addComponent(btnCustomExport); - - // Warning if no filters have been selected - Label warningLabel = new Label(I18nProperties.getString(Strings.infoExportNoFilters)); - warningLabel.setWidth(100, Unit.PERCENTAGE); - exportLayout.addComponent(warningLabel); - warningLabel.setVisible(false); - - exportButton.addClickListener(e -> warningLabel.setVisible(!criteria.hasAnyFilterActive())); - } - if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_CREATE)) { - final CaseDataDto caseDto = FacadeProvider.getCaseFacade().getCaseDataByUuid(this.getCaseRef().getUuid()); - final ExpandableButton lineListingButton = - new ExpandableButton(Captions.lineListing).expand(e -> ControllerProvider.getContactController().openLineListingWindow(caseDto)); + if (UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_CREATE)) { + final CaseDataDto caseDto = FacadeProvider.getCaseFacade().getCaseDataByUuid(this.getCaseRef().getUuid()); + final ExpandableButton lineListingButton = + new ExpandableButton(Captions.lineListing).expand(e -> ControllerProvider.getContactController().openLineListingWindow(caseDto)); - statusFilterLayout.addComponent(lineListingButton); + statusFilterLayout.addComponent(lineListingButton); - final Button newButton = ButtonHelper.createIconButtonWithCaption( - Captions.contactNewContact, - I18nProperties.getPrefixCaption(ContactDto.I18N_PREFIX, Captions.contactNewContact), - VaadinIcons.PLUS_CIRCLE, - e -> ControllerProvider.getContactController().create(this.getCaseRef()), - ValoTheme.BUTTON_PRIMARY); + final Button newButton = ButtonHelper.createIconButtonWithCaption( + Captions.contactNewContact, + I18nProperties.getPrefixCaption(ContactDto.I18N_PREFIX, Captions.contactNewContact), + VaadinIcons.PLUS_CIRCLE, + e -> ControllerProvider.getContactController().create(this.getCaseRef()), + ValoTheme.BUTTON_PRIMARY); - statusFilterLayout.addComponent(newButton); - statusFilterLayout.setComponentAlignment(newButton, Alignment.MIDDLE_RIGHT); + statusFilterLayout.addComponent(newButton); + statusFilterLayout.setComponentAlignment(newButton, Alignment.MIDDLE_RIGHT); + } } statusFilterLayout.addStyleName("top-bar"); @@ -372,7 +374,7 @@ protected void initView(String params) { grid = new ContactGrid(criteria, getClass(), ViewConfiguration.class); gridLayout = new DetailSubComponentWrapper(() -> null); gridLayout.addComponent(createFilterBar()); - gridLayout.addComponent(createStatusFilterBar()); + gridLayout.addComponent(createStatusFilterBar(isEditAllowed())); gridLayout.addComponent(grid); gridLayout.setMargin(true); gridLayout.setSpacing(false); @@ -395,7 +397,9 @@ protected void initView(String params) { updateFilterComponents(); grid.reload(); - setEditPermission(gridLayout); + if (!FacadeProvider.getCaseFacade().hasCurrentUserSpecialAccess(getCaseRef())) { + setEditPermission(gridLayout); + } } @Override 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 969ef9838f9..2390c10bf59 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 @@ -305,14 +305,14 @@ public HorizontalLayout createTopBar() { final ExpandableButton lineListingButton = new ExpandableButton(Captions.lineListing) .expand(e -> ControllerProvider.getEventParticipantController().openLineListingWindow(getEventRef())); addHeaderComponent(lineListingButton); - lineListingButton.setEnabled(isGridEnabled()); + lineListingButton.setEnabled(allowActions()); } topLayout.addStyleName(CssStyles.VSPACE_3); return topLayout; } - private boolean isGridEnabled() { + private boolean allowActions() { return !isEventDeleted() && isEditAllowed(); } @@ -346,13 +346,13 @@ protected void initView(String params) { gridLayout.setMargin(true); gridLayout.setSpacing(false); gridLayout.addComponent(createTopBar()); - gridLayout.addComponent(createStatusFilterBar()); + gridLayout.addComponent(createStatusFilterBar(isEditAllowed())); gridLayout.addComponent(grid); gridLayout.setExpandRatio(grid, 1); gridLayout.setStyleName("crud-main-layout"); grid.addDataSizeChangeListener(e -> updateStatusButtons()); setSubComponent(gridLayout); - gridLayout.setEnabled(isGridEnabled()); + gridLayout.setEnabled(allowActions() || FacadeProvider.getEventFacade().hasParticipantWithSpecialAccess(eventRef)); } if (params.startsWith("?")) { @@ -362,7 +362,7 @@ protected void initView(String params) { updateFilterComponents(); } - public HorizontalLayout createStatusFilterBar() { + private HorizontalLayout createStatusFilterBar(boolean isEditAllowed) { HorizontalLayout statusFilterLayout = new HorizontalLayout(); statusFilterLayout.setSpacing(true); @@ -420,12 +420,14 @@ public HorizontalLayout createStatusFilterBar() { actionButtonsLayout.addComponent(eventParticipantRelevanceStatusFilter); } - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_CREATE)) { - addButton = ButtonHelper.createIconButton(Captions.eventParticipantAddPerson, VaadinIcons.PLUS_CIRCLE, e -> { - ControllerProvider.getEventParticipantController().createEventParticipant(this.getEventRef(), r -> navigateTo(criteria)); - }, ValoTheme.BUTTON_PRIMARY); + if (isEditAllowed) { + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_CREATE)) { + addButton = ButtonHelper.createIconButton(Captions.eventParticipantAddPerson, VaadinIcons.PLUS_CIRCLE, e -> { + ControllerProvider.getEventParticipantController().createEventParticipant(this.getEventRef(), r -> navigateTo(criteria)); + }, ValoTheme.BUTTON_PRIMARY); - actionButtonsLayout.addComponent(addButton); + actionButtonsLayout.addComponent(addButton); + } } statusFilterLayout.addComponent(actionButtonsLayout); From 6a3a6cf660b5a4937cacf01ec03c21b806345a86 Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 19 Feb 2024 12:41:27 +0100 Subject: [PATCH 49/65] qa-auto/HSP-6608 Check checkboxes filters on Case directory page for DE specific - updated "I click SHOW MORE FILTERS button on Case directory page" step --- .../web/application/cases/CaseDirectorySteps.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 93c8c946070..67ed69bd493 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 @@ -805,9 +805,18 @@ public CaseDirectorySteps( (String diseaseFilterOption) -> webDriverHelpers.selectFromCombobox( CASE_DISEASE_VARIANT_FILTER_COMBOBOX, diseaseFilterOption)); + And( "I click SHOW MORE FILTERS button on Case directory page", - () -> webDriverHelpers.clickOnWebElementBySelector(SHOW_MORE_LESS_FILTERS)); + () -> { + String showMoreLessFilterCaption = + webDriverHelpers.getTextFromWebElement( + By.cssSelector("#showHideMoreFilters > span > .v-button-caption")); + + if (showMoreLessFilterCaption.equalsIgnoreCase("Mehr Filter anzeigen") + || showMoreLessFilterCaption.equalsIgnoreCase("Show More Filters")) + webDriverHelpers.clickOnWebElementBySelector(SHOW_MORE_LESS_FILTERS); + }); Then( "I apply Outcome of case filter {string} on Case directory page", From 86be459190b93b2a21d8a49fb159c3b0ea31597b Mon Sep 17 00:00:00 2001 From: Michal Kozakiewicz Date: Mon, 19 Feb 2024 15:02:50 +0100 Subject: [PATCH 50/65] qa-auto/HSP-6610 Stabilize "[S2S] Delete a shared case" - added one more step that ensure right case uuid, changed readonly field value --- .../application/aCommonComponents/GeneralActionsSteps.java | 2 +- .../steps/web/application/cases/CreateNewCaseSteps.java | 7 +++++++ .../steps/web/application/cases/EditCaseSteps.java | 2 +- .../test/resources/features/sanity/web/SharedCases.feature | 6 ++++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/GeneralActionsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/GeneralActionsSteps.java index eb80b6ee295..25034994ea7 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/GeneralActionsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/GeneralActionsSteps.java @@ -50,7 +50,7 @@ public GeneralActionsSteps( When( "Total number of read only fields should be {int}", (Integer number) -> { - TimeUnit.SECONDS.sleep(3); // waiting for page loaded + TimeUnit.SECONDS.sleep(4); // waiting for page loaded softly.assertEquals( webDriverHelpers.getNumberOfElements(READ_ONLY_FIELDS), number.intValue(), 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 75dbd2be6de..17a5c643609 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 @@ -1217,6 +1217,13 @@ public CreateNewCaseSteps( webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); }); + When( + "I fill case UUID field for the last created case", + () -> { + webDriverHelpers.fillInWebElement( + CASE_DIRECTORY_DETAILED_PAGE_FILTER_INPUT, casesUUID.get(0)); + }); + And( "^I fill only mandatory fields for a new case form$", () -> { 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 c4441909f59..b7bf678dcd5 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 @@ -2202,7 +2202,7 @@ public EditCaseSteps( "I check if editable fields are enabled for the case in view", () -> { webDriverHelpers.waitForPageLoadingSpinnerToDisappear(30); - webDriverHelpers.waitForElementPresent(BACK_TO_CASES_LIST_BUTTON, 3); + webDriverHelpers.waitForElementPresent(BACK_TO_CASES_LIST_BUTTON, 5); softly.assertEquals( webDriverHelpers.isElementEnabled(INVESTIGATION_STATUS_OPTIONS), true, 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 27b04dff294..8ad2b81c505 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 @@ -27,11 +27,12 @@ Feature: Sharing cases between environments tests Then I click on Delete button from case And I set Reason for deletion as "Löschen auf Anforderung der betroffenen Person nach DSGVO" And I click on Yes option in Confirm deletion popup + And I fill case UUID field for the last created case And I apply "Alle" to ownership combobox on Case Directory Page And I apply "Gelöschte Fälle" to combobox on Case Directory Page Then I click on the APPLY FILTERS button And I select first created case for person from Cases list - Then Total number of read only fields should be 13 + Then Total number of read only fields should be 14 And I check if handover card contains shared with "s2s_2" information And I check if handover card contains "Geteilt von: S2S USER" information And I check if handover card contains "shared to be deleted after" information @@ -1188,12 +1189,13 @@ Feature: Sharing cases between environments tests And I click on Delete button from case And I set Reason for deletion as "Löschen auf Anforderung der betroffenen Person nach DSGVO" And I click on Yes option in Confirm deletion popup + And I fill case UUID field for the last created case And I apply "Zum Besitz" to ownership combobox on Case Directory Page And I apply "Gelöschte Fälle" to combobox on Case Directory Page And I click APPLY BUTTON in Case Directory Page And I select first created case for person from Cases list Then I check if editable fields are enabled for the case in view - And Total number of read only fields should be 21 + And Total number of read only fields should be 22 When I back to tab number 2 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 From 48d5af37a1ed4d2704f2cd99d675ed2f80120284 Mon Sep 17 00:00:00 2001 From: Carina Paul <47103965+carina29@users.noreply.github.com> Date: Tue, 20 Feb 2024 11:17:06 +0200 Subject: [PATCH 51/65] #10994 remove entity specific bulk rights (#12967) * #10994 - Remove PERFORM_BULK_OPERATIONS_CASE_SAMPLES * #10994 - TODO * #10994 - Remove PERFORM_BULK_OPERATIONS_EVENT * #10994 - Remove PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT * #10994 - Remove PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES * #10994 - Remove TODO * #10994 - Samplesview refactoring * #10994 - Refactoring * #10994 - Refactoring update to insert * #10994 - Refactoring the script --- .../sormas/api/user/DefaultUserRole.java | 13 ++++-------- .../de/symeda/sormas/api/user/UserRight.java | 8 -------- sormas-api/src/main/resources/enum.properties | 8 -------- .../ExternalMessageFacadeEjb.java | 2 +- .../resources/META-INF/glassfish-ejb-jar.xml | 20 ------------------- .../src/main/resources/sql/sormas_schema.sql | 20 +++++++++++++++++++ .../src/main/webapp/WEB-INF/glassfish-web.xml | 20 ------------------- sormas-rest/src/main/webapp/WEB-INF/web.xml | 16 --------------- .../de/symeda/sormas/ui/caze/CasesView.java | 4 ++-- .../de/symeda/sormas/ui/events/EventGrid.java | 2 +- .../ui/events/EventParticipantsGrid.java | 2 +- .../ui/events/EventParticipantsView.java | 2 +- .../symeda/sormas/ui/events/EventsView.java | 4 ++-- .../externalmessage/ExternalMessagesView.java | 2 +- .../symeda/sormas/ui/samples/SamplesView.java | 3 +-- .../EnvironmentSampleGrid.java | 2 +- .../samples/humansample/HumanSampleGrid.java | 2 +- .../humansample/HumanSampleGridComponent.java | 2 +- .../src/main/webapp/WEB-INF/glassfish-web.xml | 20 ------------------- sormas-ui/src/main/webapp/WEB-INF/web.xml | 16 --------------- 20 files changed, 37 insertions(+), 131 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java index aa715ba56f7..1f69c7123ad 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java @@ -375,11 +375,8 @@ public Set getDefaultUserRights() { STATISTICS_EXPORT, DATABASE_EXPORT_ACCESS, PERFORM_BULK_OPERATIONS, - PERFORM_BULK_OPERATIONS_EVENT, - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT, PERFORM_BULK_OPERATIONS_PSEUDONYM, MANAGE_PUBLIC_EXPORT_CONFIGURATION, - PERFORM_BULK_OPERATIONS_CASE_SAMPLES, INFRASTRUCTURE_CREATE, INFRASTRUCTURE_EDIT, INFRASTRUCTURE_VIEW, @@ -540,7 +537,7 @@ public Set getDefaultUserRights() { STATISTICS_ACCESS, STATISTICS_EXPORT, MANAGE_PUBLIC_EXPORT_CONFIGURATION, - PERFORM_BULK_OPERATIONS_CASE_SAMPLES, + PERFORM_BULK_OPERATIONS, INFRASTRUCTURE_VIEW, INFRASTRUCTURE_EXPORT, DASHBOARD_SURVEILLANCE_VIEW, @@ -912,8 +909,7 @@ public Set getDefaultUserRights() { WEEKLYREPORT_VIEW, STATISTICS_ACCESS, STATISTICS_EXPORT, - PERFORM_BULK_OPERATIONS_EVENT, - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT, + PERFORM_BULK_OPERATIONS, DASHBOARD_CONTACT_VIEW, DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS, DASHBOARD_CAMPAIGNS_VIEW, @@ -1372,7 +1368,7 @@ public Set getDefaultUserRights() { EXTERNAL_MESSAGE_VIEW, EXTERNAL_MESSAGE_PROCESS, EXTERNAL_MESSAGE_DELETE, - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES, + PERFORM_BULK_OPERATIONS, TRAVEL_ENTRY_MANAGEMENT_ACCESS, TRAVEL_ENTRY_VIEW, TRAVEL_ENTRY_CREATE, @@ -1756,8 +1752,7 @@ public Set getDefaultUserRights() { WEEKLYREPORT_VIEW, STATISTICS_ACCESS, STATISTICS_EXPORT, - PERFORM_BULK_OPERATIONS_EVENT, - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT, + PERFORM_BULK_OPERATIONS, INFRASTRUCTURE_VIEW, INFRASTRUCTURE_EXPORT, DASHBOARD_SURVEILLANCE_VIEW, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java index 41c9e5f9715..5af09861014 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java @@ -75,8 +75,6 @@ public enum UserRight { SAMPLE_EXPORT(UserRightGroup.SAMPLE, UserRight._SAMPLE_VIEW), SAMPLE_TRANSFER(UserRightGroup.SAMPLE, UserRight._SAMPLE_EDIT), SAMPLE_EDIT_NOT_OWNED(UserRightGroup.SAMPLE, UserRight._SAMPLE_EDIT), - PERFORM_BULK_OPERATIONS_CASE_SAMPLES(UserRightGroup.SAMPLE, UserRight._SAMPLE_EDIT), - PATHOGEN_TEST_CREATE(UserRightGroup.SAMPLE, UserRight._SAMPLE_VIEW), PATHOGEN_TEST_EDIT(UserRightGroup.SAMPLE, UserRight._SAMPLE_EDIT), PATHOGEN_TEST_DELETE(UserRightGroup.SAMPLE, UserRight._SAMPLE_VIEW), @@ -124,7 +122,6 @@ public enum UserRight { EVENT_DELETE(UserRightGroup.EVENT, UserRight._EVENT_VIEW, UserRight._EVENTPARTICIPANT_DELETE, UserRight._TASK_DELETE, UserRight._ACTION_DELETE, UserRight._DOCUMENT_DELETE), EVENT_IMPORT(UserRightGroup.EVENT, UserRight._EVENT_VIEW), EVENT_EXPORT(UserRightGroup.EVENT, UserRight._EVENT_VIEW), - PERFORM_BULK_OPERATIONS_EVENT(UserRightGroup.EVENT, UserRight._EVENT_EDIT), EVENT_RESPONSIBLE(UserRightGroup.EVENT, UserRight._EVENT_EDIT), EVENTPARTICIPANT_VIEW(UserRightGroup.EVENT, UserRight._EVENT_VIEW, UserRight._PERSON_VIEW), @@ -133,7 +130,6 @@ public enum UserRight { EVENTPARTICIPANT_ARCHIVE(UserRightGroup.EVENT, UserRight._EVENTPARTICIPANT_VIEW), EVENTPARTICIPANT_DELETE(UserRightGroup.EVENT, UserRight._EVENTPARTICIPANT_VIEW, UserRight._SAMPLE_DELETE, UserRight._PERSON_DELETE), EVENTPARTICIPANT_IMPORT(UserRightGroup.EVENT, UserRight._EVENTPARTICIPANT_VIEW), - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT(UserRightGroup.EVENT, UserRight._EVENTPARTICIPANT_EDIT), EVENTGROUP_CREATE(UserRightGroup.EVENT, UserRight._EVENT_VIEW, UserRight._EVENTGROUP_LINK), EVENTGROUP_EDIT(UserRightGroup.EVENT, UserRight._EVENT_VIEW), @@ -265,7 +261,6 @@ public enum UserRight { UserRight._IMMUNIZATION_CREATE, UserRight._IMMUNIZATION_EDIT, UserRight._IMMUNIZATION_DELETE), EXTERNAL_MESSAGE_PUSH(UserRightGroup.EXTERNAL), EXTERNAL_MESSAGE_DELETE(UserRightGroup.EXTERNAL, UserRight._EXTERNAL_MESSAGE_VIEW), - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES(UserRightGroup.EXTERNAL, UserRight._EXTERNAL_MESSAGE_VIEW), OUTBREAK_VIEW(UserRightGroup.CONFIGURATION), OUTBREAK_EDIT(UserRightGroup.CONFIGURATION, UserRight._OUTBREAK_VIEW), @@ -382,10 +377,7 @@ public enum UserRight { public static final String _STATISTICS_EXPORT = "STATISTICS_EXPORT"; public static final String _DATABASE_EXPORT_ACCESS = "DATABASE_EXPORT_ACCESS"; public static final String _PERFORM_BULK_OPERATIONS = "PERFORM_BULK_OPERATIONS"; - public static final String _PERFORM_BULK_OPERATIONS_EVENT = "PERFORM_BULK_OPERATIONS_EVENT"; public static final String _MANAGE_PUBLIC_EXPORT_CONFIGURATION = "MANAGE_PUBLIC_EXPORT_CONFIGURATION"; - public static final String _PERFORM_BULK_OPERATIONS_CASE_SAMPLES = "PERFORM_BULK_OPERATIONS_CASE_SAMPLES"; - public static final String _PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES"; public static final String _PERFORM_BULK_OPERATIONS_PSEUDONYM = "PERFORM_BULK_OPERATIONS_PSEUDONYM"; public static final String _INFRASTRUCTURE_CREATE = "INFRASTRUCTURE_CREATE"; public static final String _INFRASTRUCTURE_EDIT = "INFRASTRUCTURE_EDIT"; diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 2acb36f2bc9..9155b85d362 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1687,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1738,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1751,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries 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 0037dbf2b48..1a1c6eaceed 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 @@ -408,7 +408,7 @@ public List delete(List uuids) { } @Override - @RightsAllowed(UserRight._PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES) + @RightsAllowed(UserRight._PERFORM_BULK_OPERATIONS) public void bulkAssignExternalMessages(List uuids, UserReferenceDto userRef) { List externalMessages = externalMessageService.getByUuids(uuids); User user = userService.getByReferenceDto(userRef); diff --git a/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml b/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml index ff44756b2e3..a5aeb3a99de 100644 --- a/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml +++ b/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml @@ -502,26 +502,11 @@ PERFORM_BULK_OPERATIONS - - PERFORM_BULK_OPERATIONS_EVENT - PERFORM_BULK_OPERATIONS_EVENT - - - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - - MANAGE_PUBLIC_EXPORT_CONFIGURATION MANAGE_PUBLIC_EXPORT_CONFIGURATION - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - - PERFORM_BULK_OPERATIONS_PSEUDONYM PERFORM_BULK_OPERATIONS_PSEUDONYM @@ -802,11 +787,6 @@ EXTERNAL_MESSAGE_DELETE - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - - TRAVEL_ENTRY_MANAGEMENT_ACCESS TRAVEL_ENTRY_MANAGEMENT_ACCESS diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index fc1c68272e2..549bac269e4 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12958,4 +12958,24 @@ $$ LANGUAGE plpgsql; INSERT INTO schema_version (version_number, comment) VALUES (541, 'Update environment sample deletion dependencies #12887'); +-- 2024-02-09 Remove entity specific PERFORM_BULK_OPERATIONS user rights #10994 +DO $$ + DECLARE + rec RECORD; + BEGIN + FOR rec IN SELECT id FROM userroles + LOOP + IF NOT EXISTS (SELECT 1 FROM userroles_userrights WHERE userrole_id = rec.id AND userright = 'PERFORM_BULK_OPERATIONS') THEN + IF ((SELECT exists(SELECT userrole_id FROM userroles_userrights where userrole_id = rec.id and userright in ('PERFORM_BULK_OPERATIONS_CASE_SAMPLES','PERFORM_BULK_OPERATIONS_EVENT','PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT','PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES'))) = true) THEN + INSERT INTO userroles_userrights(userrole_id, userright, sys_period) values (rec.id, 'PERFORM_BULK_OPERATIONS', tstzrange(now(), null)); + END IF; + END IF; + END LOOP; + DELETE from userroles_userrights WHERE userright in ('PERFORM_BULK_OPERATIONS_CASE_SAMPLES', 'PERFORM_BULK_OPERATIONS_EVENT', 'PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT','PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES'); + END; + +$$ LANGUAGE plpgsql; + +INSERT INTO schema_version (version_number, comment) VALUES (542, 'Remove_Specific_Perform_Bulk_Operation_User_Rights #10994'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** diff --git a/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml b/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml index a797fa13e74..2e4b0d39266 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml @@ -485,31 +485,11 @@ PERFORM_BULK_OPERATIONS - - PERFORM_BULK_OPERATIONS_EVENT - PERFORM_BULK_OPERATIONS_EVENT - - - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - - MANAGE_PUBLIC_EXPORT_CONFIGURATION MANAGE_PUBLIC_EXPORT_CONFIGURATION - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - - - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - - PERFORM_BULK_OPERATIONS_PSEUDONYM PERFORM_BULK_OPERATIONS_PSEUDONYM diff --git a/sormas-rest/src/main/webapp/WEB-INF/web.xml b/sormas-rest/src/main/webapp/WEB-INF/web.xml index 42c2ce25177..48531b21b75 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/web.xml @@ -396,26 +396,10 @@ PERFORM_BULK_OPERATIONS - - PERFORM_BULK_OPERATIONS_EVENT - - - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - - MANAGE_PUBLIC_EXPORT_CONFIGURATION - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - - - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - - PERFORM_BULK_OPERATIONS_PSEUDONYM 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 51b775637da..63d43e9d023 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 @@ -714,7 +714,7 @@ public HorizontalLayout createStatusFilterBar() { AbstractCaseGrid caseGrid = (AbstractCaseGrid) this.grid; // Bulk operation dropdown if (isBulkEditAllowed()) { - boolean hasBulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES); + boolean hasBulkOperationsRight = UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS); final List menuBarItems = new ArrayList<>(); @@ -921,7 +921,7 @@ private void updateStatusButtons() { private boolean isBulkEditAllowed() { return FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CASE_AND_CONTACT_BULK_ACTIONS) - && (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES) + && (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS) || FacadeProvider.getSormasToSormasFacade().isSharingCasesEnabledForUser()); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java index 24042f0aa4e..6280cc27f01 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java @@ -76,7 +76,7 @@ public EventGrid(EventCriteria criteria, Class viewClass) { boolean eventGroupsFeatureEnabled = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EVENT_GROUPS); boolean externalSurveillanceToolShareEnabled = FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled(); - if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_EVENT)) { + if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { setCriteria(criteria); setEagerDataProvider(); } else { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java index 94662bf6dc8..b1976690d24 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java @@ -59,7 +59,7 @@ public EventParticipantsGrid(EventParticipantCriteria criteria) { ViewConfiguration viewConfiguration = ViewModelProviders.of(EventParticipantsView.class).get(EventParticipantsViewConfiguration.class); setInEagerMode(viewConfiguration.isInEagerMode()); - if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT)) { + if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { setCriteria(criteria); setEagerDataProvider(); } else { 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 2390c10bf59..6a78ac8ccb4 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 @@ -210,7 +210,7 @@ public HorizontalLayout createTopBar() { topLayout.addComponent(filterForm); // Bulk operation dropdown - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT)) { + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { topLayout.setWidth(100, Unit.PERCENTAGE); List bulkActions = new ArrayList<>(); 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 18fec95c498..e58635549a5 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 @@ -287,7 +287,7 @@ public EventsView() { final PopupMenu moreButton = new PopupMenu(I18nProperties.getCaption(Captions.moreActions)); - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_EVENT) && isDefaultViewType()) { + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS) && isDefaultViewType()) { Button btnEnterBulkEditMode = ButtonHelper.createIconButton(Captions.actionEnterBulkEditMode, VaadinIcons.CHECK_SQUARE_O, null); { btnEnterBulkEditMode.setVisible(!viewConfiguration.isInEagerMode()); @@ -536,7 +536,7 @@ public HorizontalLayout createStatusFilterBar() { } // Bulk operation dropdown - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_EVENT) && isDefaultViewType()) { + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS) && isDefaultViewType()) { EventGrid eventGrid = (EventGrid) grid; List bulkActions = new ArrayList<>(); if (eventCriteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java index 5ae2fd47dfa..a6e8412ac19 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java @@ -361,7 +361,7 @@ private void showSinceDateSelectionWindow(Consumer dateConsumer) { } private boolean isBulkEditAllowed() { - return UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES); + return UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS); } private void enterBulkEditMode() { 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 4a8b80c0057..5afd2c07043 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 @@ -111,8 +111,7 @@ public SamplesView() { fileDownloader.extend(exportButton); } - if ((isHumanSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) - || (isEnvironmentSampleView() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS))) { + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { addBulkModeButtons(); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGrid.java index 39b802f3527..f1c2190e0c3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleGrid.java @@ -157,7 +157,7 @@ public JsonValue encode(Object value) { EnvironmentSampleIndexDto.UUID, e -> ControllerProvider.getEnvironmentSampleController().navigateToSample(e.getUuid()))); - if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { + if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { setCriteria(criteria); setEagerDataProvider(); } else { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGrid.java index 37be9a7b540..d902227c7b3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGrid.java @@ -62,7 +62,7 @@ public HumanSampleGrid(SampleCriteria criteria) { ViewConfiguration viewConfiguration = ViewModelProviders.of(SamplesView.class).get(SamplesViewConfiguration.class); setInEagerMode(viewConfiguration.isInEagerMode()); - if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { + if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { setCriteria(criteria); setEagerDataProvider(); } else { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGridComponent.java index fce4ca16533..4de5203b4d8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/HumanSampleGridComponent.java @@ -180,7 +180,7 @@ public HorizontalLayout createShipmentFilterBar() { } // Bulk operation dropdown - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES)) { + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { shipmentFilterLayout.setWidth(100, Unit.PERCENTAGE); if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { diff --git a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml index dc1bd0fc94d..e56208e232b 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml @@ -485,31 +485,11 @@ PERFORM_BULK_OPERATIONS - - PERFORM_BULK_OPERATIONS_EVENT - PERFORM_BULK_OPERATIONS_EVENT - - - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - - MANAGE_PUBLIC_EXPORT_CONFIGURATION MANAGE_PUBLIC_EXPORT_CONFIGURATION - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - - - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - - PERFORM_BULK_OPERATIONS_PSEUDONYM PERFORM_BULK_OPERATIONS_PSEUDONYM diff --git a/sormas-ui/src/main/webapp/WEB-INF/web.xml b/sormas-ui/src/main/webapp/WEB-INF/web.xml index cd9bbf84146..5080caffcbf 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/web.xml @@ -401,26 +401,10 @@ PERFORM_BULK_OPERATIONS - - PERFORM_BULK_OPERATIONS_EVENT - - - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - - MANAGE_PUBLIC_EXPORT_CONFIGURATION - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - - - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - - PERFORM_BULK_OPERATIONS_PSEUDONYM From 7880e41f0fc3b07a16c6c3f5f9c335cdc4339d42 Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Tue, 20 Feb 2024 09:44:38 +0000 Subject: [PATCH 52/65] [GitHub Actions] Update openAPI spec files --- sormas-rest/swagger.json | 6 +++--- sormas-rest/swagger.yaml | 12 ------------ 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index 0433a9cbbf0..e3e43e6c210 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -9889,7 +9889,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] + "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] } } } @@ -9919,7 +9919,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] + "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] } } } @@ -25196,7 +25196,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PERFORM_BULK_OPERATIONS_CASE_SAMPLES", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "PERFORM_BULK_OPERATIONS_EVENT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] + "enum" : [ "CASE_VIEW", "CASE_CREATE", "CASE_EDIT", "CASE_ARCHIVE", "CASE_DELETE", "CASE_IMPORT", "CASE_EXPORT", "CASE_INVESTIGATE", "CASE_CLASSIFY", "CASE_CHANGE_DISEASE", "CASE_CHANGE_EPID_NUMBER", "CASE_TRANSFER", "CASE_REFER_FROM_POE", "CASE_MERGE", "CASE_SHARE", "CASE_RESPONSIBLE", "GRANT_SPECIAL_CASE_ACCESS", "IMMUNIZATION_VIEW", "IMMUNIZATION_CREATE", "IMMUNIZATION_EDIT", "IMMUNIZATION_ARCHIVE", "IMMUNIZATION_DELETE", "PERSON_VIEW", "PERSON_EDIT", "PERSON_DELETE", "PERSON_EXPORT", "PERSON_CONTACT_DETAILS_DELETE", "PERSON_MERGE", "SAMPLE_VIEW", "SAMPLE_CREATE", "SAMPLE_EDIT", "SAMPLE_DELETE", "SAMPLE_EXPORT", "SAMPLE_TRANSFER", "SAMPLE_EDIT_NOT_OWNED", "PATHOGEN_TEST_CREATE", "PATHOGEN_TEST_EDIT", "PATHOGEN_TEST_DELETE", "ADDITIONAL_TEST_VIEW", "ADDITIONAL_TEST_CREATE", "ADDITIONAL_TEST_EDIT", "ADDITIONAL_TEST_DELETE", "CONTACT_VIEW", "CONTACT_CREATE", "CONTACT_EDIT", "CONTACT_ARCHIVE", "CONTACT_DELETE", "CONTACT_IMPORT", "CONTACT_EXPORT", "CONTACT_CONVERT", "CONTACT_REASSIGN_CASE", "CONTACT_MERGE", "CONTACT_RESPONSIBLE", "VISIT_CREATE", "VISIT_EDIT", "VISIT_DELETE", "VISIT_EXPORT", "TASK_VIEW", "TASK_CREATE", "TASK_EDIT", "TASK_DELETE", "TASK_EXPORT", "TASK_ASSIGN", "TASK_ARCHIVE", "ACTION_CREATE", "ACTION_DELETE", "ACTION_EDIT", "EVENT_VIEW", "EVENT_CREATE", "EVENT_EDIT", "EVENT_ARCHIVE", "EVENT_DELETE", "EVENT_IMPORT", "EVENT_EXPORT", "EVENT_RESPONSIBLE", "EVENTPARTICIPANT_VIEW", "EVENTPARTICIPANT_CREATE", "EVENTPARTICIPANT_EDIT", "EVENTPARTICIPANT_ARCHIVE", "EVENTPARTICIPANT_DELETE", "EVENTPARTICIPANT_IMPORT", "EVENTGROUP_CREATE", "EVENTGROUP_EDIT", "EVENTGROUP_ARCHIVE", "EVENTGROUP_DELETE", "EVENTGROUP_LINK", "USER_VIEW", "USER_CREATE", "USER_EDIT", "USER_ROLE_VIEW", "USER_ROLE_EDIT", "USER_ROLE_DELETE", "STATISTICS_ACCESS", "STATISTICS_EXPORT", "INFRASTRUCTURE_VIEW", "INFRASTRUCTURE_CREATE", "INFRASTRUCTURE_EDIT", "INFRASTRUCTURE_ARCHIVE", "INFRASTRUCTURE_IMPORT", "INFRASTRUCTURE_EXPORT", "POPULATION_MANAGE", "DASHBOARD_SURVEILLANCE_VIEW", "DASHBOARD_CONTACT_VIEW", "DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS", "DASHBOARD_CAMPAIGNS_VIEW", "DASHBOARD_SAMPLES_VIEW", "CASE_CLINICIAN_VIEW", "THERAPY_VIEW", "PRESCRIPTION_CREATE", "PRESCRIPTION_EDIT", "PRESCRIPTION_DELETE", "TREATMENT_CREATE", "TREATMENT_EDIT", "TREATMENT_DELETE", "CLINICAL_COURSE_VIEW", "CLINICAL_COURSE_EDIT", "CLINICAL_VISIT_CREATE", "CLINICAL_VISIT_EDIT", "CLINICAL_VISIT_DELETE", "PORT_HEALTH_INFO_VIEW", "PORT_HEALTH_INFO_EDIT", "WEEKLYREPORT_VIEW", "WEEKLYREPORT_CREATE", "AGGREGATE_REPORT_VIEW", "AGGREGATE_REPORT_EDIT", "AGGREGATE_REPORT_EXPORT", "SEE_PERSONAL_DATA_IN_JURISDICTION", "SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION", "SEE_SENSITIVE_DATA_IN_JURISDICTION", "SEE_SENSITIVE_DATA_OUTSIDE_JURISDICTION", "CAMPAIGN_VIEW", "CAMPAIGN_EDIT", "CAMPAIGN_ARCHIVE", "CAMPAIGN_DELETE", "CAMPAIGN_FORM_DATA_VIEW", "CAMPAIGN_FORM_DATA_EDIT", "CAMPAIGN_FORM_DATA_ARCHIVE", "CAMPAIGN_FORM_DATA_DELETE", "CAMPAIGN_FORM_DATA_EXPORT", "TRAVEL_ENTRY_MANAGEMENT_ACCESS", "TRAVEL_ENTRY_VIEW", "TRAVEL_ENTRY_CREATE", "TRAVEL_ENTRY_EDIT", "TRAVEL_ENTRY_ARCHIVE", "TRAVEL_ENTRY_DELETE", "ENVIRONMENT_VIEW", "ENVIRONMENT_CREATE", "ENVIRONMENT_EDIT", "ENVIRONMENT_ARCHIVE", "ENVIRONMENT_DELETE", "ENVIRONMENT_IMPORT", "ENVIRONMENT_EXPORT", "ENVIRONMENT_SAMPLE_VIEW", "ENVIRONMENT_SAMPLE_CREATE", "ENVIRONMENT_SAMPLE_EDIT", "ENVIRONMENT_SAMPLE_EDIT_DISPATCH", "ENVIRONMENT_SAMPLE_EDIT_RECEIVAL", "ENVIRONMENT_SAMPLE_DELETE", "ENVIRONMENT_SAMPLE_IMPORT", "ENVIRONMENT_SAMPLE_EXPORT", "ENVIRONMENT_PATHOGEN_TEST_CREATE", "ENVIRONMENT_PATHOGEN_TEST_EDIT", "ENVIRONMENT_PATHOGEN_TEST_DELETE", "DOCUMENT_VIEW", "DOCUMENT_UPLOAD", "DOCUMENT_DELETE", "PERFORM_BULK_OPERATIONS", "PERFORM_BULK_OPERATIONS_PSEUDONYM", "QUARANTINE_ORDER_CREATE", "SORMAS_REST", "SORMAS_UI", "DATABASE_EXPORT_ACCESS", "EXPORT_DATA_PROTECTION_DATA", "BAG_EXPORT", "SEND_MANUAL_EXTERNAL_MESSAGES", "MANAGE_EXTERNAL_SYMPTOM_JOURNAL", "EXTERNAL_VISITS", "SORMAS_TO_SORMAS_CLIENT", "SORMAS_TO_SORMAS_SHARE", "SORMAS_TO_SORMAS_PROCESS", "EXTERNAL_SURVEILLANCE_SHARE", "EXTERNAL_SURVEILLANCE_DELETE", "EXTERNAL_MESSAGE_VIEW", "EXTERNAL_MESSAGE_PROCESS", "EXTERNAL_MESSAGE_PUSH", "EXTERNAL_MESSAGE_DELETE", "OUTBREAK_VIEW", "OUTBREAK_EDIT", "MANAGE_PUBLIC_EXPORT_CONFIGURATION", "DOCUMENT_TEMPLATE_MANAGEMENT", "LINE_LISTING_CONFIGURE", "DEV_MODE", "EMAIL_TEMPLATE_MANAGEMENT", "EXTERNAL_EMAIL_SEND", "EXTERNAL_EMAIL_ATTACH_DOCUMENTS", "CUSTOMIZABLE_ENUM_MANAGEMENT" ] }, "uniqueItems" : true }, diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index 755f1a4212e..05bb46df683 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -7052,7 +7052,6 @@ paths: - SAMPLE_EXPORT - SAMPLE_TRANSFER - SAMPLE_EDIT_NOT_OWNED - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - PATHOGEN_TEST_CREATE - PATHOGEN_TEST_EDIT - PATHOGEN_TEST_DELETE @@ -7092,7 +7091,6 @@ paths: - EVENT_DELETE - EVENT_IMPORT - EVENT_EXPORT - - PERFORM_BULK_OPERATIONS_EVENT - EVENT_RESPONSIBLE - EVENTPARTICIPANT_VIEW - EVENTPARTICIPANT_CREATE @@ -7100,7 +7098,6 @@ paths: - EVENTPARTICIPANT_ARCHIVE - EVENTPARTICIPANT_DELETE - EVENTPARTICIPANT_IMPORT - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - EVENTGROUP_CREATE - EVENTGROUP_EDIT - EVENTGROUP_ARCHIVE @@ -7206,7 +7203,6 @@ paths: - EXTERNAL_MESSAGE_PROCESS - EXTERNAL_MESSAGE_PUSH - EXTERNAL_MESSAGE_DELETE - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - OUTBREAK_VIEW - OUTBREAK_EDIT - MANAGE_PUBLIC_EXPORT_CONFIGURATION @@ -7273,7 +7269,6 @@ paths: - SAMPLE_EXPORT - SAMPLE_TRANSFER - SAMPLE_EDIT_NOT_OWNED - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - PATHOGEN_TEST_CREATE - PATHOGEN_TEST_EDIT - PATHOGEN_TEST_DELETE @@ -7313,7 +7308,6 @@ paths: - EVENT_DELETE - EVENT_IMPORT - EVENT_EXPORT - - PERFORM_BULK_OPERATIONS_EVENT - EVENT_RESPONSIBLE - EVENTPARTICIPANT_VIEW - EVENTPARTICIPANT_CREATE @@ -7321,7 +7315,6 @@ paths: - EVENTPARTICIPANT_ARCHIVE - EVENTPARTICIPANT_DELETE - EVENTPARTICIPANT_IMPORT - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - EVENTGROUP_CREATE - EVENTGROUP_EDIT - EVENTGROUP_ARCHIVE @@ -7427,7 +7420,6 @@ paths: - EXTERNAL_MESSAGE_PROCESS - EXTERNAL_MESSAGE_PUSH - EXTERNAL_MESSAGE_DELETE - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - OUTBREAK_VIEW - OUTBREAK_EDIT - MANAGE_PUBLIC_EXPORT_CONFIGURATION @@ -25348,7 +25340,6 @@ components: - SAMPLE_EXPORT - SAMPLE_TRANSFER - SAMPLE_EDIT_NOT_OWNED - - PERFORM_BULK_OPERATIONS_CASE_SAMPLES - PATHOGEN_TEST_CREATE - PATHOGEN_TEST_EDIT - PATHOGEN_TEST_DELETE @@ -25388,7 +25379,6 @@ components: - EVENT_DELETE - EVENT_IMPORT - EVENT_EXPORT - - PERFORM_BULK_OPERATIONS_EVENT - EVENT_RESPONSIBLE - EVENTPARTICIPANT_VIEW - EVENTPARTICIPANT_CREATE @@ -25396,7 +25386,6 @@ components: - EVENTPARTICIPANT_ARCHIVE - EVENTPARTICIPANT_DELETE - EVENTPARTICIPANT_IMPORT - - PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT - EVENTGROUP_CREATE - EVENTGROUP_EDIT - EVENTGROUP_ARCHIVE @@ -25502,7 +25491,6 @@ components: - EXTERNAL_MESSAGE_PROCESS - EXTERNAL_MESSAGE_PUSH - EXTERNAL_MESSAGE_DELETE - - PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES - OUTBREAK_VIEW - OUTBREAK_EDIT - MANAGE_PUBLIC_EXPORT_CONFIGURATION From 11434993874dc38cbe665265f5a153334b78ae27 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Tue, 20 Feb 2024 12:00:42 +0200 Subject: [PATCH 53/65] #12793 - Display reporting user correctly --- .../src/main/java/de/symeda/sormas/api/i18n/Captions.java | 4 ++++ sormas-api/src/main/resources/captions.properties | 4 ++++ 2 files changed, 8 insertions(+) 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 d58e4606dad..4b4537e41a1 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 @@ -1117,6 +1117,7 @@ public interface Captions { String EnvironmentSample_positivePathogenTests = "EnvironmentSample.positivePathogenTests"; String EnvironmentSample_receivalDate = "EnvironmentSample.receivalDate"; String EnvironmentSample_received = "EnvironmentSample.received"; + String EnvironmentSample_reportingUser = "EnvironmentSample.reportingUser"; String EnvironmentSample_requestedPathogenTests = "EnvironmentSample.requestedPathogenTests"; String EnvironmentSample_sampleDateTime = "EnvironmentSample.sampleDateTime"; String EnvironmentSample_sampleMaterial = "EnvironmentSample.sampleMaterial"; @@ -1295,6 +1296,7 @@ public interface Captions { String EventParticipant_person = "EventParticipant.person"; String EventParticipant_personUuid = "EventParticipant.personUuid"; String EventParticipant_region = "EventParticipant.region"; + String EventParticipant_reportingUser = "EventParticipant.reportingUser"; String EventParticipant_responsibleDistrict = "EventParticipant.responsibleDistrict"; String EventParticipant_responsibleRegion = "EventParticipant.responsibleRegion"; String EventParticipant_sex = "EventParticipant.sex"; @@ -1589,6 +1591,7 @@ public interface Captions { String Immunization_recoveryDate = "Immunization.recoveryDate"; String Immunization_region = "Immunization.region"; String Immunization_reportDate = "Immunization.reportDate"; + String Immunization_reportingUser = "Immunization.reportingUser"; String Immunization_responsibleCommunity = "Immunization.responsibleCommunity"; String Immunization_responsibleDistrict = "Immunization.responsibleDistrict"; String Immunization_responsibleRegion = "Immunization.responsibleRegion"; @@ -2584,6 +2587,7 @@ public interface Captions { String TravelEntry_quarantineTypeDetails = "TravelEntry.quarantineTypeDetails"; String TravelEntry_recovered = "TravelEntry.recovered"; String TravelEntry_reportDate = "TravelEntry.reportDate"; + String TravelEntry_reportingUser = "TravelEntry.reportingUser"; String TravelEntry_responsibleCommunity = "TravelEntry.responsibleCommunity"; String TravelEntry_responsibleDistrict = "TravelEntry.responsibleDistrict"; String TravelEntry_responsibleRegion = "TravelEntry.responsibleRegion"; diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 2a7f5347e1b..10fa68093e5 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1173,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1352,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2163,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2504,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name From 5475c4c9beb14bb05a6daec2eb8a696ce5960881 Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Tue, 20 Feb 2024 11:03:45 +0100 Subject: [PATCH 54/65] qa-auto/HSP-6607 Stabilize "Update user permission rights 19.02.2024" - updated list of user permission rights for admin, survnet and s2s users * qa-auto/HSP-6607 Stabilize "Update user permission rights 19.02.2024" - updated list of user permission rights for admin, survnet and s2s users * qa-auto/HSP-6607 Stabilize "Update user permission rights 19.02.2024" - removed tags --- .../userRightsJsonTemplates/AutomationAdminUserRights.json | 2 +- .../userRightsJsonTemplates/AutomationAdminUserRightsDE.json | 2 +- .../userRightsJsonTemplates/SormasToSormasUserRights.json | 2 +- .../resources/userRightsJsonTemplates/SurvnetUserRights.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json index d83ae1dff27..7edc32d3e5d 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","GRANT_SPECIAL_CASE_ACCESS","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 d83ae1dff27..7edc32d3e5d 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","GRANT_SPECIAL_CASE_ACCESS","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/SormasToSormasUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/SormasToSormasUserRights.json index ebf4e074b5a..d4ec43b11a5 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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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 +["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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","GRANT_SPECIAL_CASE_ACCESS","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 ebf4e074b5a..4270d026ca8 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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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 + ["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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","GRANT_SPECIAL_CASE_ACCESS","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 From f02791c39e474d8d7f6075706cc7a814e5989b69 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Tue, 20 Feb 2024 13:55:15 +0200 Subject: [PATCH 55/65] #12984 Import and Export buttons are accessible on event participant list of a readonly event --- .../ui/events/EventParticipantsView.java | 427 +++++++++--------- 1 file changed, 207 insertions(+), 220 deletions(-) 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 6a78ac8ccb4..0dc4416cf6b 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 @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -78,6 +77,7 @@ import de.symeda.sormas.ui.utils.GridExportStreamResource; import de.symeda.sormas.ui.utils.LayoutUtil; import de.symeda.sormas.ui.utils.MenuBarHelper; +import de.symeda.sormas.ui.utils.MenuBarHelper.MenuBarItem; import de.symeda.sormas.ui.utils.VaadinUiUtil; import de.symeda.sormas.ui.utils.components.expandablebutton.ExpandableButton; @@ -93,7 +93,6 @@ public class EventParticipantsView extends AbstractEventView implements HasName private EventParticipantsGrid grid; private Button addButton; - private Button btnEnterBulkEditMode; private MenuBar bulkOperationsDropdown; private DetailSubComponentWrapper gridLayout; private Button activeStatusButton; @@ -117,84 +116,6 @@ public HorizontalLayout createTopBar() { topLayout.setSpacing(true); topLayout.setWidth("100%"); - VerticalLayout exportLayout = new VerticalLayout(); - { - exportLayout.setSpacing(true); - exportLayout.setMargin(true); - exportLayout.addStyleName(CssStyles.LAYOUT_MINIMAL); - exportLayout.setWidth(250, Unit.PIXELS); - } - - // import - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_IMPORT)) { - Button importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { - Window popupWindow = VaadinUiUtil.showPopupWindow(new EventParticipantImportLayout(getEventRef())); - popupWindow.setCaption(I18nProperties.getString(Strings.headingImportEventParticipant)); - popupWindow.addCloseListener(c -> this.grid.reload()); - }, ValoTheme.BUTTON_PRIMARY); - if (shouldDisableButton()) { - importButton.setEnabled(false); - } - - addHeaderComponent(importButton); - } - - // export - PopupButton exportPopupButton = ButtonHelper.createIconPopupButton(Captions.export, VaadinIcons.DOWNLOAD, exportLayout); - if (shouldDisableButton()) { - exportPopupButton.setEnabled(false); - } - addHeaderComponent(exportPopupButton); - - { - StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( - grid, - () -> this.grid.getSelectionModel() instanceof MultiSelectionModelImpl ? this.grid.asMultiSelect().getSelectedItems() : null, - ExportEntityName.EVENT_PARTICIPANTS); - addExportButton(streamResource, exportPopupButton, exportLayout, VaadinIcons.TABLE, Captions.exportBasic, Strings.infoBasicExport); - } - - { - StreamResource extendedExportStreamResource = - EventParticipantDownloadUtil.createExtendedEventParticipantExportResource(grid.getCriteria(), this::getSelectedRows, null); - - addExportButton( - extendedExportStreamResource, - exportPopupButton, - exportLayout, - VaadinIcons.FILE_TEXT, - Captions.exportDetailed, - Descriptions.descDetailedExportButton); - } - - { - Button btnCustomExport = ButtonHelper.createIconButton(Captions.exportCustom, VaadinIcons.FILE_TEXT, e -> { - Window customExportWindow = VaadinUiUtil.createPopupWindow(); - - ExportConfigurationsLayout customExportsLayout = new ExportConfigurationsLayout( - ExportType.EVENT_PARTICIPANTS, - ImportExportUtils.getEventParticipantExportProperties( - EventParticipantDownloadUtil::getPropertyCaption, - FacadeProvider.getConfigFacade().getCountryLocale()), - customExportWindow::close); - customExportsLayout.setExportCallback( - (exportConfig) -> Page.getCurrent() - .open( - EventParticipantDownloadUtil - .createExtendedEventParticipantExportResource(grid.getCriteria(), this::getSelectedRows, exportConfig), - null, - true)); - customExportWindow.setWidth(1024, Unit.PIXELS); - customExportWindow.setCaption(I18nProperties.getCaption(Captions.exportCustom)); - customExportWindow.setContent(customExportsLayout); - UI.getCurrent().addWindow(customExportWindow); - exportPopupButton.setPopupVisible(false); - }, ValoTheme.BUTTON_PRIMARY); - btnCustomExport.setDescription(I18nProperties.getString(Strings.infoCustomExport)); - btnCustomExport.setWidth(100, Unit.PERCENTAGE); - exportLayout.addComponent(btnCustomExport); - } - filterForm = new EventParticipantsFilterForm(); filterForm.addValueChangeListener(e -> { if (!filterForm.hasFilter()) { @@ -209,106 +130,6 @@ public HorizontalLayout createTopBar() { topLayout.addComponent(filterForm); - // Bulk operation dropdown - if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - topLayout.setWidth(100, Unit.PERCENTAGE); - - List bulkActions = new ArrayList<>(); - if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { - bulkActions - .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkEventParticipantsToContacts), VaadinIcons.HAND, mi -> { - grid.bulkActionHandler(items -> { - EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); - ControllerProvider.getContactController().openLineListingWindow(eventDto, items); - }, true); - })); - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_DELETE)) { - bulkActions.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, mi -> { - grid.bulkActionHandler(items -> { - ControllerProvider.getEventParticipantController().deleteAllSelectedItems(items, grid, () -> grid.reload()); - }, true); - })); - } - if (isDocGenerationAllowed()) { - bulkActions.add( - new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkActionCreatDocuments), VaadinIcons.FILE_TEXT, mi -> { - grid.bulkActionHandler(items -> { - List references = grid.asMultiSelect() - .getSelectedItems() - .stream() - .map(EventParticipantIndexDto::toReference) - .collect(Collectors.toList()); - if (references.size() == 0) { - new Notification( - I18nProperties.getString(Strings.headingNoEventParticipantsSelected), - I18nProperties.getString(Strings.messageNoEventParticipantsSelected), - Notification.Type.WARNING_MESSAGE, - false).show(Page.getCurrent()); - - return; - } - - EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); - - ControllerProvider.getDocGenerationController() - .showBulkEventParticipantQuarantineOrderDocumentDialog(references, eventDto.getDisease()); - }); - })); - } - } else if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_DELETE)) { - bulkActions.add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, mi -> { - grid.bulkActionHandler(items -> { - ControllerProvider.getEventParticipantController().restoreSelectedEventParticipants(items, grid, () -> grid.reload()); - }, true); - })); - } - - bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, bulkActions); - bulkOperationsDropdown.setVisible(viewConfiguration.isInEagerMode()); - - topLayout.addComponent(bulkOperationsDropdown); - topLayout.setComponentAlignment(bulkOperationsDropdown, Alignment.TOP_RIGHT); - - 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()); - - if (shouldDisableButton()) { - btnEnterBulkEditMode.setEnabled(false); - btnLeaveBulkEditMode.setEnabled(false); - bulkOperationsDropdown.setEnabled(false); - } - addHeaderComponent(btnLeaveBulkEditMode); - - btnEnterBulkEditMode.addClickListener(e -> { - bulkOperationsDropdown.setVisible(true); - ViewModelProviders.of(EventParticipantsView.class).get(EventParticipantsViewConfiguration.class).setInEagerMode(true); - btnEnterBulkEditMode.setVisible(false); - btnLeaveBulkEditMode.setVisible(true); - grid.reload(); - }); - btnLeaveBulkEditMode.addClickListener(e -> { - bulkOperationsDropdown.setVisible(false); - ViewModelProviders.of(EventParticipantsView.class).get(EventParticipantsViewConfiguration.class).setInEagerMode(false); - btnLeaveBulkEditMode.setVisible(false); - btnEnterBulkEditMode.setVisible(true); - navigateTo(criteria); - }); - - } - - if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_CREATE)) { - final ExpandableButton lineListingButton = new ExpandableButton(Captions.lineListing) - .expand(e -> ControllerProvider.getEventParticipantController().openLineListingWindow(getEventRef())); - addHeaderComponent(lineListingButton); - lineListingButton.setEnabled(allowActions()); - } - - topLayout.addStyleName(CssStyles.VSPACE_3); return topLayout; } @@ -380,59 +201,98 @@ private HorizontalLayout createStatusFilterBar(boolean isEditAllowed) { actionButtonsLayout.setSpacing(true); // Show active/archived/all dropdown - if (Objects.nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_VIEW)) { - - if (FacadeProvider.getFeatureConfigurationFacade() - .isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.EVENT_PARTICIPANT)) { - int daysAfterEventParticipantGetsArchived = FacadeProvider.getFeatureConfigurationFacade() - .getProperty( - FeatureType.AUTOMATIC_ARCHIVING, - DeletableEntityType.EVENT_PARTICIPANT, - FeatureTypeProperty.THRESHOLD_IN_DAYS, - Integer.class); - if (daysAfterEventParticipantGetsArchived > 0) { - relevanceStatusInfoLabel = - new Label( - VaadinIcons.INFO_CIRCLE.getHtml() + " " - + String - .format(I18nProperties.getString(Strings.infoArchivedEventParticipants), daysAfterEventParticipantGetsArchived), - ContentMode.HTML); - relevanceStatusInfoLabel.setVisible(false); - relevanceStatusInfoLabel.addStyleName(CssStyles.LABEL_VERTICAL_ALIGN_SUPER); - actionButtonsLayout.addComponent(relevanceStatusInfoLabel); - actionButtonsLayout.setComponentAlignment(relevanceStatusInfoLabel, Alignment.MIDDLE_RIGHT); - } + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTOMATIC_ARCHIVING, DeletableEntityType.EVENT_PARTICIPANT)) { + int daysAfterEventParticipantGetsArchived = FacadeProvider.getFeatureConfigurationFacade() + .getProperty( + FeatureType.AUTOMATIC_ARCHIVING, + DeletableEntityType.EVENT_PARTICIPANT, + FeatureTypeProperty.THRESHOLD_IN_DAYS, + Integer.class); + if (daysAfterEventParticipantGetsArchived > 0) { + relevanceStatusInfoLabel = new Label( + VaadinIcons.INFO_CIRCLE.getHtml() + " " + + String.format(I18nProperties.getString(Strings.infoArchivedEventParticipants), daysAfterEventParticipantGetsArchived), + ContentMode.HTML); + relevanceStatusInfoLabel.setVisible(false); + relevanceStatusInfoLabel.addStyleName(CssStyles.LABEL_VERTICAL_ALIGN_SUPER); + actionButtonsLayout.addComponent(relevanceStatusInfoLabel); + actionButtonsLayout.setComponentAlignment(relevanceStatusInfoLabel, Alignment.MIDDLE_RIGHT); + } + } + + eventParticipantRelevanceStatusFilter = buildRelevanceStatusFilter( + Captions.eventParticipantActiveEventParticipants, + Captions.eventParticipantArchivedEventParticipants, + Captions.eventParticipantActiveAndArchivedEventParticipants); + + eventParticipantRelevanceStatusFilter.addValueChangeListener(e -> { + viewConfiguration.setRelevanceStatusChangedEvent(getEventRef().getUuid()); + if (relevanceStatusInfoLabel != null) { + relevanceStatusInfoLabel.setVisible(EntityRelevanceStatus.ARCHIVED.equals(e.getProperty().getValue())); + } + criteria.relevanceStatus((EntityRelevanceStatus) e.getProperty().getValue()); + navigateTo(criteria); + }); + actionButtonsLayout.addComponent(eventParticipantRelevanceStatusFilter); + + if (isEditAllowed) { + Button btnEnterBulkEditMode = ButtonHelper.createIconButton(Captions.actionEnterBulkEditMode, VaadinIcons.CHECK_SQUARE_O, null); + btnEnterBulkEditMode.setVisible(!viewConfiguration.isInEagerMode()); + actionButtonsLayout.addComponent(btnEnterBulkEditMode); + + Button btnLeaveBulkEditMode = + ButtonHelper.createIconButton(Captions.actionLeaveBulkEditMode, VaadinIcons.CLOSE, null, ValoTheme.BUTTON_PRIMARY); + btnLeaveBulkEditMode.setVisible(viewConfiguration.isInEagerMode()); + + if (shouldDisableButton()) { + btnEnterBulkEditMode.setEnabled(false); + btnLeaveBulkEditMode.setEnabled(false); + bulkOperationsDropdown.setEnabled(false); } + actionButtonsLayout.addComponent(btnLeaveBulkEditMode); - eventParticipantRelevanceStatusFilter = buildRelevanceStatusFilter( - Captions.eventParticipantActiveEventParticipants, - Captions.eventParticipantArchivedEventParticipants, - Captions.eventParticipantActiveAndArchivedEventParticipants); - - eventParticipantRelevanceStatusFilter.addValueChangeListener(e -> { - viewConfiguration.setRelevanceStatusChangedEvent(getEventRef().getUuid()); - if (relevanceStatusInfoLabel != null) { - relevanceStatusInfoLabel.setVisible(EntityRelevanceStatus.ARCHIVED.equals(e.getProperty().getValue())); - } - criteria.relevanceStatus((EntityRelevanceStatus) e.getProperty().getValue()); + btnEnterBulkEditMode.addClickListener(e -> { + bulkOperationsDropdown.setVisible(true); + ViewModelProviders.of(EventParticipantsView.class).get(EventParticipantsViewConfiguration.class).setInEagerMode(true); + btnEnterBulkEditMode.setVisible(false); + btnLeaveBulkEditMode.setVisible(true); + grid.reload(); + }); + btnLeaveBulkEditMode.addClickListener(e -> { + bulkOperationsDropdown.setVisible(false); + ViewModelProviders.of(EventParticipantsView.class).get(EventParticipantsViewConfiguration.class).setInEagerMode(false); + btnLeaveBulkEditMode.setVisible(false); + btnEnterBulkEditMode.setVisible(true); navigateTo(criteria); }); - actionButtonsLayout.addComponent(eventParticipantRelevanceStatusFilter); - } - if (isEditAllowed) { + // Bulk operation dropdown + if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { + bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, getBulkActions()); + bulkOperationsDropdown.setVisible(viewConfiguration.isInEagerMode()); + + actionButtonsLayout.addComponent(bulkOperationsDropdown); + } + + addImportExportButtons(actionButtonsLayout); + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_CREATE)) { + final ExpandableButton lineListingButton = new ExpandableButton(Captions.lineListing) + .expand(e -> ControllerProvider.getEventParticipantController().openLineListingWindow(getEventRef())); + actionButtonsLayout.addComponent(lineListingButton); + lineListingButton.setEnabled(allowActions()); + addButton = ButtonHelper.createIconButton(Captions.eventParticipantAddPerson, VaadinIcons.PLUS_CIRCLE, e -> { ControllerProvider.getEventParticipantController().createEventParticipant(this.getEventRef(), r -> navigateTo(criteria)); }, ValoTheme.BUTTON_PRIMARY); actionButtonsLayout.addComponent(addButton); } - } - statusFilterLayout.addComponent(actionButtonsLayout); - statusFilterLayout.setComponentAlignment(actionButtonsLayout, Alignment.MIDDLE_RIGHT); - statusFilterLayout.setExpandRatio(actionButtonsLayout, 1); + statusFilterLayout.addComponent(actionButtonsLayout); + statusFilterLayout.setComponentAlignment(actionButtonsLayout, Alignment.MIDDLE_RIGHT); + statusFilterLayout.setExpandRatio(actionButtonsLayout, 1); + } return statusFilterLayout; } @@ -461,6 +321,133 @@ private ComboBox buildRelevanceStatusFilter( return relevanceStatusFilter; } + private List getBulkActions() { + List bulkActions = new ArrayList<>(); + if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { + bulkActions.add(new MenuBarItem(I18nProperties.getCaption(Captions.bulkEventParticipantsToContacts), VaadinIcons.HAND, mi -> { + grid.bulkActionHandler(items -> { + EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); + ControllerProvider.getContactController().openLineListingWindow(eventDto, items); + }, true); + })); + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_DELETE)) { + bulkActions.add(new MenuBarItem(I18nProperties.getCaption(Captions.bulkDelete), VaadinIcons.TRASH, mi -> { + grid.bulkActionHandler(items -> { + ControllerProvider.getEventParticipantController().deleteAllSelectedItems(items, grid, () -> grid.reload()); + }, true); + })); + } + if (isDocGenerationAllowed()) { + bulkActions.add(new MenuBarItem(I18nProperties.getCaption(Captions.bulkActionCreatDocuments), VaadinIcons.FILE_TEXT, mi -> { + grid.bulkActionHandler(items -> { + List references = + grid.asMultiSelect().getSelectedItems().stream().map(EventParticipantIndexDto::toReference).collect(Collectors.toList()); + if (references.size() == 0) { + new Notification( + I18nProperties.getString(Strings.headingNoEventParticipantsSelected), + I18nProperties.getString(Strings.messageNoEventParticipantsSelected), + Notification.Type.WARNING_MESSAGE, + false).show(Page.getCurrent()); + + return; + } + + EventDto eventDto = FacadeProvider.getEventFacade().getEventByUuid(getEventRef().getUuid(), false); + + ControllerProvider.getDocGenerationController() + .showBulkEventParticipantQuarantineOrderDocumentDialog(references, eventDto.getDisease()); + }); + })); + } + } else if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_DELETE)) { + bulkActions.add(new MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, mi -> { + grid.bulkActionHandler(items -> { + ControllerProvider.getEventParticipantController().restoreSelectedEventParticipants(items, grid, () -> grid.reload()); + }, true); + })); + } + return bulkActions; + } + + private void addImportExportButtons(HorizontalLayout actionButtonsLayout) { + VerticalLayout exportLayout = new VerticalLayout(); + { + exportLayout.setSpacing(true); + exportLayout.setMargin(true); + exportLayout.addStyleName(CssStyles.LAYOUT_MINIMAL); + exportLayout.setWidth(250, Unit.PIXELS); + } + + if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_IMPORT)) { + Button importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { + Window popupWindow = VaadinUiUtil.showPopupWindow(new EventParticipantImportLayout(getEventRef())); + popupWindow.setCaption(I18nProperties.getString(Strings.headingImportEventParticipant)); + popupWindow.addCloseListener(c -> this.grid.reload()); + }, ValoTheme.BUTTON_PRIMARY); + if (shouldDisableButton()) { + importButton.setEnabled(false); + } + + actionButtonsLayout.addComponent(importButton); + } + + // export + PopupButton exportPopupButton = ButtonHelper.createIconPopupButton(Captions.export, VaadinIcons.DOWNLOAD, exportLayout); + if (shouldDisableButton()) { + exportPopupButton.setEnabled(false); + } + actionButtonsLayout.addComponent(exportPopupButton); + + { + StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( + grid, + () -> this.grid.getSelectionModel() instanceof MultiSelectionModelImpl ? this.grid.asMultiSelect().getSelectedItems() : null, + ExportEntityName.EVENT_PARTICIPANTS); + addExportButton(streamResource, exportPopupButton, exportLayout, VaadinIcons.TABLE, Captions.exportBasic, Strings.infoBasicExport); + } + + { + StreamResource extendedExportStreamResource = + EventParticipantDownloadUtil.createExtendedEventParticipantExportResource(grid.getCriteria(), this::getSelectedRows, null); + + addExportButton( + extendedExportStreamResource, + exportPopupButton, + exportLayout, + VaadinIcons.FILE_TEXT, + Captions.exportDetailed, + Descriptions.descDetailedExportButton); + } + + { + Button btnCustomExport = ButtonHelper.createIconButton(Captions.exportCustom, VaadinIcons.FILE_TEXT, e -> { + Window customExportWindow = VaadinUiUtil.createPopupWindow(); + + ExportConfigurationsLayout customExportsLayout = new ExportConfigurationsLayout( + ExportType.EVENT_PARTICIPANTS, + ImportExportUtils.getEventParticipantExportProperties( + EventParticipantDownloadUtil::getPropertyCaption, + FacadeProvider.getConfigFacade().getCountryLocale()), + customExportWindow::close); + customExportsLayout.setExportCallback( + (exportConfig) -> Page.getCurrent() + .open( + EventParticipantDownloadUtil + .createExtendedEventParticipantExportResource(grid.getCriteria(), this::getSelectedRows, exportConfig), + null, + true)); + customExportWindow.setWidth(1024, Unit.PIXELS); + customExportWindow.setCaption(I18nProperties.getCaption(Captions.exportCustom)); + customExportWindow.setContent(customExportsLayout); + UI.getCurrent().addWindow(customExportWindow); + exportPopupButton.setPopupVisible(false); + }, ValoTheme.BUTTON_PRIMARY); + btnCustomExport.setDescription(I18nProperties.getString(Strings.infoCustomExport)); + btnCustomExport.setWidth(100, Unit.PERCENTAGE); + exportLayout.addComponent(btnCustomExport); + } + } + public void updateFilterComponents() { // TODO replace with Vaadin 8 databinding From a39865a370b354a780271bac65148b820d74c5e5 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Tue, 20 Feb 2024 15:40:49 +0200 Subject: [PATCH 56/65] #12758 Grant users special access to specific cases' personal data for a limited time - hide bulk menu item for deleted cases --- .../de/symeda/sormas/ui/caze/CasesView.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 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 63d43e9d023..a21f0700df6 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 @@ -821,6 +821,16 @@ public HorizontalLayout createStatusFilterBar() { items -> ControllerProvider.getCaseController() .linkSelectedCasesToEvent(items, (AbstractCaseGrid) grid)))); } + + if (UiUtil.permitted(UserRight.GRANT_SPECIAL_CASE_ACCESS)) { + menuBarItems.add( + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.bulkSpecialCaseAccess), + VaadinIcons.RASTER_LOWER_LEFT, + mi -> grid.bulkActionHandler( + items -> ControllerProvider.getSpecialCaseAccessController() + .createForSelectedCases(items, (AbstractCaseGrid) grid)))); + } } else { menuBarItems .add(new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.bulkRestore), VaadinIcons.ARROW_BACKWARD, mi -> { @@ -830,16 +840,6 @@ public HorizontalLayout createStatusFilterBar() { }, hasBulkOperationsRight && UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE))); } - if (UiUtil.permitted(UserRight.GRANT_SPECIAL_CASE_ACCESS)) { - menuBarItems.add( - new MenuBarHelper.MenuBarItem( - I18nProperties.getCaption(Captions.bulkSpecialCaseAccess), - VaadinIcons.RASTER_LOWER_LEFT, - mi -> grid.bulkActionHandler( - items -> ControllerProvider.getSpecialCaseAccessController() - .createForSelectedCases(items, (AbstractCaseGrid) grid)))); - } - bulkOperationsDropdown = MenuBarHelper.createDropDown(Captions.bulkActions, menuBarItems); bulkOperationsDropdown.setVisible(viewConfiguration.isInEagerMode()); From c1947648a1f24e80fc06b6a6b2b018c641db4dd4 Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:00:19 +0100 Subject: [PATCH 57/65] qa-auto/HSP-6610_2 Stabilize "S2S - Delete a case that was shared but not yet accepted" - increased timeout for "I check if editable fields are enabled for the case in view" step (#12992) --- .../e2etests/steps/web/application/cases/EditCaseSteps.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/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index b7bf678dcd5..b0d42b5c5a6 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 @@ -2202,7 +2202,7 @@ public EditCaseSteps( "I check if editable fields are enabled for the case in view", () -> { webDriverHelpers.waitForPageLoadingSpinnerToDisappear(30); - webDriverHelpers.waitForElementPresent(BACK_TO_CASES_LIST_BUTTON, 5); + webDriverHelpers.waitForElementPresent(BACK_TO_CASES_LIST_BUTTON, 8); softly.assertEquals( webDriverHelpers.isElementEnabled(INVESTIGATION_STATUS_OPTIONS), true, From c1f22452a8ee457bacaeb43d373bcf478d3d133f Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:40:40 +0100 Subject: [PATCH 58/65] qa-auto/HSP-6612 Stabilize "User can view and edit Sample card from Person view" - changed caption handled from SEE SAMPLES FOR THIS PERSON to SEE SAMPLE FOR THIS CASE for button in edit case directory * qa-auto/HSP-6612 Stabilize "User can view and edit Sample card from Person view" - changed caption handled from SEE SAMPLES FOR THIS PERSON to SEE SAMPLE FOR THIS CASE for button in edit case directory * qa-auto/HSP-6612 Stabilize "User can view and edit Sample card from Person view" - added time sleep for wait to page loaded --- .../e2etests/pages/application/cases/EditCasePage.java | 2 ++ .../web/application/aCommonComponents/SideCardsSteps.java | 1 + .../e2etests/steps/web/application/cases/EditCaseSteps.java | 6 ++++++ .../steps/web/application/samples/EditSampleSteps.java | 5 ----- .../src/test/resources/features/sanity/web/Case.feature | 2 +- .../test/resources/features/sanity/web/SharedCases.feature | 6 +++--- 6 files changed, 13 insertions(+), 9 deletions(-) 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 8407729d3d8..a49551eebc7 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 @@ -52,6 +52,8 @@ public class EditCasePage { By.cssSelector("[id='Proben f\u00FCr diese Person ansehen']"); public static final By SEE_CONTACTS_FOR_THIS_PERSON_BUTTON = By.cssSelector("[id='See contacts for this person']"); + public static final By SEE_SAMPLES_FOR_THIS_CASE_BUTTON = + By.cssSelector("[id='See samples for this case']"); public static final By NEW_SAMPLE_BUTTON_DE = By.cssSelector("[id='Neue Probe']"); public static final By EDIT_SAMPLE_PENCIL_BUTTON = By.cssSelector("div[id^='edit-sample']"); public static final By EYE_SAMPLE_BUTTON = By.cssSelector("div[id^='view-sample']"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java index be0bd86f28b..1340252fffd 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/aCommonComponents/SideCardsSteps.java @@ -167,6 +167,7 @@ public SideCardsSteps( When( "I check if Immunization area contains {string}", (String name) -> { + TimeUnit.SECONDS.sleep(2); //waiting for page loaded softly.assertTrue( webDriverHelpers.isElementPresent(checkTextInImmunizationSideComponent(name)), "Element is not present"); 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 b0d42b5c5a6..f703ceb33b2 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 @@ -2328,6 +2328,12 @@ public EditCaseSteps( SEE_CONTACTS_FOR_THIS_PERSON_BUTTON); webDriverHelpers.clickOnWebElementBySelector(SEE_CONTACTS_FOR_THIS_PERSON_BUTTON); break; + case "See samples for this case": + webDriverHelpers.scrollToElement(SEE_SAMPLES_FOR_THIS_CASE_BUTTON); + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + SEE_SAMPLES_FOR_THIS_CASE_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(SEE_SAMPLES_FOR_THIS_CASE_BUTTON); + break; } }); 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 24f8fdeb4d7..6357652d44c 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 @@ -52,7 +52,6 @@ import static org.sormas.e2etests.pages.application.samples.EditSamplePage.SAMPLE_TYPE_COMBOBOX; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.SAMPLE_TYPE_INPUT; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.SAVE_SAMPLE_BUTTON; -import static org.sormas.e2etests.pages.application.samples.EditSamplePage.SEE_SAMPLES_FOR_THIS_PERSON_BUTTON_DE; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.SPECIFY_TEST_DETAILS_INPUT; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.SPECIMEN_CONDITION_COMBOBOX; import static org.sormas.e2etests.pages.application.samples.EditSamplePage.SPECIMEN_CONDITION_INPUT; @@ -367,10 +366,6 @@ public EditSampleSteps( softly.assertAll(); }); - When( - "I click on See samples for this person button", - () -> webDriverHelpers.clickOnWebElementBySelector(SEE_SAMPLES_FOR_THIS_PERSON_BUTTON_DE)); - When( "I set date sample was collected minus (\\d+) days ago on Sample Edit page", (Integer days) -> { 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 eeff483efac..3ddd3da105f 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 @@ -1989,7 +1989,7 @@ Feature: Case end to end tests And I click on edit sample icon of the 2 displayed sample on Edit Case page And I check that all editable fields are enabled for a sample And I navigate to case tab - Then I click on the "See samples for this person" button on Edit Case Page + Then I click on the "See samples for this case" button on Edit Case Page And I check that number of displayed sample results is 2 @tmsLink=HSP-6420 @env_main 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 8ad2b81c505..e389d32baae 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 @@ -112,7 +112,7 @@ Feature: Sharing cases between environments tests And I refresh current page Then I check if Immunization area contains "Comirnaty (COVID-19-mRNA Impfstoff)" Then I check if Immunization area contains "COVID-19 Impfstoff Moderna (mRNA-Impfstoff)" - And I click on See samples for this person button + And I click on the "See samples for this case" button on Edit Case Page And I check that number of displayed sample results is 2 @tmsLink=SORDEV-12095 @env_s2s_1 @@ -226,7 +226,7 @@ Feature: Sharing cases between environments tests And I check that number of displayed cases results is 1 Then I click on the first Case ID from Case Directory Then I check if Immunization area contains "COVID-19 Impfstoff Moderna (mRNA-Impfstoff)" - And I click on See samples for this person button + And I click on the "See samples for this case" button on Edit Case Page And I check that number of displayed sample results is 1 @tmsLink=SORDEV-12095 @env_s2s_1 @@ -318,7 +318,7 @@ Feature: Sharing cases between environments tests And I refresh current page Then I check if Immunization area contains "Comirnaty (COVID-19-mRNA Impfstoff)" Then I check if Immunization area contains "COVID-19 Impfstoff Moderna (mRNA-Impfstoff)" - And I click on See samples for this person button + Then I click on the "See samples for this case" button on Edit Case Page And I check that number of displayed sample results is 2 @tmsLink=SORDEV-12095 @env_s2s_1 From 138ef7e9bbfc7ba4b7888d91ba52954b22d120bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 21 Feb 2024 10:14:02 +0100 Subject: [PATCH 59/65] New Crowdin updates (#12971) * New translations strings.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations strings.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations strings.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations strings.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations strings.properties (French, Tunisia) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Urdu (Pakistan)) * New translations enum.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Czech) * New translations captions.properties (Czech) * New translations enum.properties (Czech) * New translations captions.properties (Spanish, Bolivia) * New translations enum.properties (Spanish, Bolivia) * New translations strings.properties (Spanish, Bolivia) * New translations validations.properties (Spanish, Bolivia) * New translations captions.properties (Polish) * New translations captions.properties (Hindi) * New translations captions.properties (Romanian) * New translations strings.properties (Romanian) * New translations captions.properties (French) * New translations strings.properties (French) * New translations captions.properties (Spanish) * New translations strings.properties (Spanish) * New translations captions.properties (Arabic) * New translations strings.properties (Arabic) * New translations captions.properties (German) * New translations strings.properties (German) * New translations captions.properties (Finnish) * New translations strings.properties (Finnish) * New translations captions.properties (Italian) * New translations strings.properties (Italian) * New translations captions.properties (Japanese) * New translations strings.properties (Japanese) * New translations captions.properties (Dutch) * New translations strings.properties (Dutch) * New translations captions.properties (Norwegian) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations captions.properties (Portuguese) * New translations strings.properties (Portuguese) * New translations captions.properties (Russian) * New translations strings.properties (Russian) * New translations captions.properties (Swedish) * New translations strings.properties (Swedish) * New translations captions.properties (Turkish) * New translations strings.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations strings.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations strings.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations strings.properties (Urdu (Pakistan)) * New translations captions.properties (Croatian) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations captions.properties (Filipino) * New translations strings.properties (Filipino) * New translations captions.properties (Fijian) * New translations strings.properties (Fijian) * New translations captions.properties (Swahili) * New translations strings.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations strings.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations strings.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations strings.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations strings.properties (Dari) * New translations captions.properties (Pashto) * New translations strings.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations strings.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations strings.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (English, Ghana) * New translations captions.properties (French, Congo) * New translations strings.properties (French, Congo) * New translations captions.properties (French, Tunisia) * New translations strings.properties (French, Tunisia) * New translations validations.properties (Urdu (Pakistan)) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Romanian) * New translations validations.properties (Romanian) * New translations enum.properties (French) * New translations validations.properties (French) * New translations enum.properties (Spanish) * New translations validations.properties (Spanish) * New translations enum.properties (Arabic) * New translations validations.properties (Arabic) * New translations validations.properties (Czech) * New translations enum.properties (German) * New translations validations.properties (German) * New translations enum.properties (Finnish) * New translations validations.properties (Finnish) * New translations enum.properties (Italian) * New translations validations.properties (Italian) * New translations enum.properties (Japanese) * New translations validations.properties (Japanese) * New translations enum.properties (Dutch) * New translations validations.properties (Dutch) * New translations enum.properties (Norwegian) * New translations validations.properties (Norwegian) * New translations enum.properties (Polish) * New translations validations.properties (Polish) * New translations enum.properties (Portuguese) * New translations validations.properties (Portuguese) * New translations enum.properties (Russian) * New translations validations.properties (Russian) * New translations enum.properties (Swedish) * New translations validations.properties (Swedish) * New translations enum.properties (Turkish) * New translations validations.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations validations.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations validations.properties (Chinese Simplified) * New translations enum.properties (Croatian) * New translations validations.properties (Croatian) * New translations enum.properties (Hindi) * New translations validations.properties (Hindi) * New translations enum.properties (Filipino) * New translations validations.properties (Filipino) * New translations enum.properties (Fijian) * New translations validations.properties (Fijian) * New translations enum.properties (Swahili) * New translations validations.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations validations.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations validations.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations validations.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations validations.properties (Dari) * New translations enum.properties (Pashto) * New translations validations.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations validations.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations validations.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations validations.properties (English, Ghana) * New translations enum.properties (French, Congo) * New translations validations.properties (French, Congo) * New translations enum.properties (French, Tunisia) * New translations validations.properties (French, Tunisia) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Urdu (Pakistan)) * New translations validations.properties (Urdu (Pakistan)) * New translations strings.xml (Urdu (Pakistan)) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations enum.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations captions.properties (Czech) * New translations enum.properties (Czech) * New translations enum.properties (Czech) * New translations enum.properties (Spanish, Bolivia) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Romanian) * New translations enum.properties (French) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * 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 (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 (Czech) * New translations captions.properties (Polish) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * 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 (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 (Spanish, Bolivia) * 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) --- .../main/resources/captions_ar-SA.properties | 16 + .../main/resources/captions_cs-CZ.properties | 16 + .../main/resources/captions_de-CH.properties | 16 + .../main/resources/captions_de-DE.properties | 16 + .../main/resources/captions_en-AF.properties | 16 + .../main/resources/captions_en-GH.properties | 16 + .../main/resources/captions_en-NG.properties | 16 + .../main/resources/captions_es-BO.properties | 18 +- .../main/resources/captions_es-CU.properties | 16 + .../main/resources/captions_es-ES.properties | 16 + .../main/resources/captions_fa-AF.properties | 16 + .../main/resources/captions_fi-FI.properties | 16 + .../main/resources/captions_fil-PH.properties | 16 + .../main/resources/captions_fj-FJ.properties | 16 + .../main/resources/captions_fr-CD.properties | 16 + .../main/resources/captions_fr-CH.properties | 16 + .../main/resources/captions_fr-FR.properties | 16 + .../main/resources/captions_fr-TN.properties | 16 + .../main/resources/captions_hi-IN.properties | 16 + .../main/resources/captions_hr-HR.properties | 16 + .../main/resources/captions_it-CH.properties | 16 + .../main/resources/captions_it-IT.properties | 16 + .../main/resources/captions_ja-JP.properties | 16 + .../main/resources/captions_ne-NP.properties | 16 + .../main/resources/captions_nl-NL.properties | 16 + .../main/resources/captions_no-NO.properties | 16 + .../main/resources/captions_pl-PL.properties | 16 + .../main/resources/captions_ps-AF.properties | 16 + .../main/resources/captions_pt-PT.properties | 16 + .../main/resources/captions_ro-RO.properties | 16 + .../main/resources/captions_ru-RU.properties | 16 + .../main/resources/captions_sv-SE.properties | 16 + .../main/resources/captions_sw-KE.properties | 16 + .../main/resources/captions_tr-TR.properties | 16 + .../main/resources/captions_uk-UA.properties | 16 + .../main/resources/captions_ur-PK.properties | 16 + .../main/resources/captions_zh-CN.properties | 16 + .../src/main/resources/enum_ar-SA.properties | 10 +- .../src/main/resources/enum_cs-CZ.properties | 10 +- .../src/main/resources/enum_de-CH.properties | 10 +- .../src/main/resources/enum_de-DE.properties | 10 +- .../src/main/resources/enum_en-AF.properties | 10 +- .../src/main/resources/enum_en-GH.properties | 10 +- .../src/main/resources/enum_en-NG.properties | 10 +- .../src/main/resources/enum_es-BO.properties | 10 +- .../src/main/resources/enum_es-CU.properties | 10 +- .../src/main/resources/enum_es-ES.properties | 10 +- .../src/main/resources/enum_fa-AF.properties | 10 +- .../src/main/resources/enum_fi-FI.properties | 10 +- .../src/main/resources/enum_fil-PH.properties | 10 +- .../src/main/resources/enum_fj-FJ.properties | 10 +- .../src/main/resources/enum_fr-CD.properties | 10 +- .../src/main/resources/enum_fr-CH.properties | 10 +- .../src/main/resources/enum_fr-FR.properties | 10 +- .../src/main/resources/enum_fr-TN.properties | 10 +- .../src/main/resources/enum_hi-IN.properties | 10 +- .../src/main/resources/enum_hr-HR.properties | 10 +- .../src/main/resources/enum_it-CH.properties | 10 +- .../src/main/resources/enum_it-IT.properties | 10 +- .../src/main/resources/enum_ja-JP.properties | 10 +- .../src/main/resources/enum_ne-NP.properties | 10 +- .../src/main/resources/enum_nl-NL.properties | 10 +- .../src/main/resources/enum_no-NO.properties | 10 +- .../src/main/resources/enum_pl-PL.properties | 10 +- .../src/main/resources/enum_ps-AF.properties | 10 +- .../src/main/resources/enum_pt-PT.properties | 10 +- .../src/main/resources/enum_ro-RO.properties | 10 +- .../src/main/resources/enum_ru-RU.properties | 10 +- .../src/main/resources/enum_sv-SE.properties | 10 +- .../src/main/resources/enum_sw-KE.properties | 10 +- .../src/main/resources/enum_tr-TR.properties | 10 +- .../src/main/resources/enum_uk-UA.properties | 10 +- .../src/main/resources/enum_ur-PK.properties | 120 +++--- .../src/main/resources/enum_zh-CN.properties | 10 +- .../main/resources/strings_ar-SA.properties | 10 + .../main/resources/strings_cs-CZ.properties | 10 + .../main/resources/strings_de-CH.properties | 10 + .../main/resources/strings_de-DE.properties | 10 + .../main/resources/strings_en-AF.properties | 10 + .../main/resources/strings_en-GH.properties | 10 + .../main/resources/strings_en-NG.properties | 10 + .../main/resources/strings_es-BO.properties | 10 + .../main/resources/strings_es-CU.properties | 10 + .../main/resources/strings_es-ES.properties | 10 + .../main/resources/strings_fa-AF.properties | 10 + .../main/resources/strings_fi-FI.properties | 10 + .../main/resources/strings_fil-PH.properties | 10 + .../main/resources/strings_fj-FJ.properties | 10 + .../main/resources/strings_fr-CD.properties | 10 + .../main/resources/strings_fr-CH.properties | 10 + .../main/resources/strings_fr-FR.properties | 10 + .../main/resources/strings_fr-TN.properties | 10 + .../main/resources/strings_hi-IN.properties | 10 + .../main/resources/strings_hr-HR.properties | 10 + .../main/resources/strings_it-CH.properties | 10 + .../main/resources/strings_it-IT.properties | 10 + .../main/resources/strings_ja-JP.properties | 10 + .../main/resources/strings_ne-NP.properties | 10 + .../main/resources/strings_nl-NL.properties | 10 + .../main/resources/strings_no-NO.properties | 10 + .../main/resources/strings_pl-PL.properties | 10 + .../main/resources/strings_ps-AF.properties | 10 + .../main/resources/strings_pt-PT.properties | 10 + .../main/resources/strings_ro-RO.properties | 10 + .../main/resources/strings_ru-RU.properties | 10 + .../main/resources/strings_sv-SE.properties | 10 + .../main/resources/strings_sw-KE.properties | 10 + .../main/resources/strings_tr-TR.properties | 10 + .../main/resources/strings_uk-UA.properties | 10 + .../main/resources/strings_ur-PK.properties | 344 +++++++++--------- .../main/resources/strings_zh-CN.properties | 10 + .../resources/validations_ar-SA.properties | 1 + .../resources/validations_cs-CZ.properties | 1 + .../resources/validations_de-CH.properties | 1 + .../resources/validations_de-DE.properties | 1 + .../resources/validations_en-AF.properties | 1 + .../resources/validations_en-GH.properties | 1 + .../resources/validations_en-NG.properties | 1 + .../resources/validations_es-BO.properties | 1 + .../resources/validations_es-CU.properties | 1 + .../resources/validations_es-ES.properties | 1 + .../resources/validations_fa-AF.properties | 1 + .../resources/validations_fi-FI.properties | 1 + .../resources/validations_fil-PH.properties | 1 + .../resources/validations_fj-FJ.properties | 1 + .../resources/validations_fr-CD.properties | 1 + .../resources/validations_fr-CH.properties | 1 + .../resources/validations_fr-FR.properties | 1 + .../resources/validations_fr-TN.properties | 1 + .../resources/validations_hi-IN.properties | 1 + .../resources/validations_hr-HR.properties | 1 + .../resources/validations_it-CH.properties | 1 + .../resources/validations_it-IT.properties | 1 + .../resources/validations_ja-JP.properties | 1 + .../resources/validations_ne-NP.properties | 1 + .../resources/validations_nl-NL.properties | 1 + .../resources/validations_no-NO.properties | 1 + .../resources/validations_pl-PL.properties | 1 + .../resources/validations_ps-AF.properties | 1 + .../resources/validations_pt-PT.properties | 1 + .../resources/validations_ro-RO.properties | 1 + .../resources/validations_ru-RU.properties | 1 + .../resources/validations_sv-SE.properties | 1 + .../resources/validations_sw-KE.properties | 1 + .../resources/validations_tr-TR.properties | 1 + .../resources/validations_uk-UA.properties | 1 + .../resources/validations_ur-PK.properties | 49 +-- .../resources/validations_zh-CN.properties | 1 + .../src/main/res/values-ur-rPK/strings.xml | 78 ++-- 149 files changed, 1359 insertions(+), 582 deletions(-) diff --git a/sormas-api/src/main/resources/captions_ar-SA.properties b/sormas-api/src/main/resources/captions_ar-SA.properties index f1a0c5bc805..2ca62893eff 100644 --- a/sormas-api/src/main/resources/captions_ar-SA.properties +++ b/sormas-api/src/main/resources/captions_ar-SA.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index 57b674607db..a803dcee118 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -302,6 +302,7 @@ bulkRestore=Obnovit bulkCompleted=%d/%d Dokončeno bulkSkipped=%d přeskočeno bulkSuccessful=%d úspěšný +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Aktivní kampaně campaignAllCampaigns=Všechny kampaně @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Zbytky chloru celkem (mg/L) EnvironmentSample.laboratory = Laboratoř EnvironmentSample.laboratoryDetails = Detaily laboratoře EnvironmentSample.requestedPathogenTests = Požadované patogeny k testování +EnvironmentSample.reportingUser = Reporting user 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ů? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=ID případu EventParticipant.approximateAge=Věk EventParticipant.name=Jméno EventParticipant.sex=Pohlaví +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Odpovědný region EventParticipant.responsibleDistrict=Odpovědný okres EventParticipant.personUuid=Identifikační číslo osoby @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Počet WBC z posledního dodatečného testu # Immunization Immunization=Imunizace Immunization.reportDate=Datum zprávy +Immunization.reportingUser = Reporting user Immunization.externalId=Externí ID Immunization.country=Země imunizace Immunization.deletionReason=Důvod odstranění @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=Pro tuto osobu nejsou žádné záznamy o TravelEntry=Cestovní vstup TravelEntry.person=Osoba s cestovním vstupem TravelEntry.reportDate=Datum zprávy +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=ID cestovního vstupu TravelEntry.externalId=Externí ID TravelEntry.personFirstName=Jméno osoby @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Šablona externalEmailSentBy=Odeslal externalEmailSentTo=Příjemce externalEmailAttachedDocuments=Připojené dokumenty + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Případ +assignedTo = Přiřazeno k +assignedBy = Přiřazeno +endDateTime = Přístup do +assignmentDate = Date assigned + +specialCaseAccessNew=Nový +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index 6992dcc7d6e..4a08ee82b6c 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Aktive Kampagnen campaignAllCampaigns=Alle Kampagnen @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Fall-ID EventParticipant.approximateAge=Alter EventParticipant.name=Name EventParticipant.sex=Geschlecht +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Zuständiger Kanton EventParticipant.responsibleDistrict=Zuständiger Bezirk EventParticipant.personUuid=Personen-ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Anzahl an weissen Blutkörperchen beim letzten zusätzlich # Immunization Immunization=Immunisierung Immunization.reportDate=Meldedatum +Immunization.reportingUser = Reporting user Immunization.externalId=Externe ID Immunization.country=Immunisierungs-Land Immunization.deletionReason=Grund des Löschens @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=Es gibt keine Einreisen für diese Person TravelEntry=Einreise TravelEntry.person=Einreiseperson TravelEntry.reportDate=Meldedatum +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Einreise-ID TravelEntry.externalId=Externe ID TravelEntry.personFirstName=Vorname der Person @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_de-DE.properties b/sormas-api/src/main/resources/captions_de-DE.properties index 9483cc390a5..eeb05f36946 100644 --- a/sormas-api/src/main/resources/captions_de-DE.properties +++ b/sormas-api/src/main/resources/captions_de-DE.properties @@ -302,6 +302,7 @@ bulkRestore=Wiederherstellen bulkCompleted=%d/%d abgeschlossen bulkSkipped=%d übersprungen bulkSuccessful=%d Erfolgreich +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Aktive Kampagnen campaignAllCampaigns=Alle Kampagnen @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Gesamte Chlorreste (mg/L) EnvironmentSample.laboratory = Labor EnvironmentSample.laboratoryDetails = Labordetails EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user EnvironmentSample.otherRequestedPathogenTests = Other requested pathogens to be tested EnvironmentSample.weatherConditions = Wetter zum Zeitpunkt der Probenahme EnvironmentSample.heavyRain = Schwere Regen in den letzten 24 Stunden vor der Probe? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Fall-ID EventParticipant.approximateAge=Alter EventParticipant.name=Name EventParticipant.sex=Geschlecht +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Zuständiges Bundesland EventParticipant.responsibleDistrict=Zuständige/r Landkreis/Kreisfreie Stadt EventParticipant.personUuid=Personen-ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Anzahl an weißen Blutkörperchen beim letzten zusätzlich # Immunization Immunization=Immunisierung Immunization.reportDate=Meldedatum +Immunization.reportingUser = Reporting user Immunization.externalId=Externe ID Immunization.country=Immunisierungs-Land Immunization.deletionReason=Grund des Löschens @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=Es gibt keine Einreisen für diese Person TravelEntry=Einreise TravelEntry.person=Einreiseperson TravelEntry.reportDate=Meldedatum +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Einreise-ID TravelEntry.externalId=Externe ID TravelEntry.personFirstName=Vorname der Person @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_en-AF.properties b/sormas-api/src/main/resources/captions_en-AF.properties index 913e807d4f9..b0edb6821f8 100644 --- a/sormas-api/src/main/resources/captions_en-AF.properties +++ b/sormas-api/src/main/resources/captions_en-AF.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_en-GH.properties b/sormas-api/src/main/resources/captions_en-GH.properties index 8a0891a8f57..12b7cfb7e19 100644 --- a/sormas-api/src/main/resources/captions_en-GH.properties +++ b/sormas-api/src/main/resources/captions_en-GH.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_en-NG.properties b/sormas-api/src/main/resources/captions_en-NG.properties index e9274806809..db4ac5c9bf1 100644 --- a/sormas-api/src/main/resources/captions_en-NG.properties +++ b/sormas-api/src/main/resources/captions_en-NG.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_es-BO.properties b/sormas-api/src/main/resources/captions_es-BO.properties index e7605fab90d..bc5dba9649a 100644 --- a/sormas-api/src/main/resources/captions_es-BO.properties +++ b/sormas-api/src/main/resources/captions_es-BO.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2930,4 +2935,15 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_es-CU.properties b/sormas-api/src/main/resources/captions_es-CU.properties index b9bd07d4646..8643f120ec5 100644 --- a/sormas-api/src/main/resources/captions_es-CU.properties +++ b/sormas-api/src/main/resources/captions_es-CU.properties @@ -302,6 +302,7 @@ bulkRestore=Restaurar bulkCompleted=%d/%d completado bulkSkipped=%d omitido bulkSuccessful=%d exitoso +bulkSpecialCaseAccess=Otorgar acceso especial # Campaign campaignActiveCampaigns=Campañas activas campaignAllCampaigns=Todas las campañas @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Residuos totales de clorina (mg/L) EnvironmentSample.laboratory = Laboratorio EnvironmentSample.laboratoryDetails = Detalles de laboratorio EnvironmentSample.requestedPathogenTests = Pruebas de patógeno solicitadas +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=ID de caso EventParticipant.approximateAge=Edad EventParticipant.name=Nombre EventParticipant.sex=Sexo +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Provincia responsable EventParticipant.responsibleDistrict=Municipio responsable EventParticipant.personUuid=ID de la persona @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Número de leucocitos de la última prueba adicional # Immunization Immunization=Inmunización Immunization.reportDate=Fecha de informe +Immunization.reportingUser = Reporting user Immunization.externalId=ID externo Immunization.country=País de inmunización Immunization.deletionReason=Motivo de eliminación @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=No hay entradas de viaje para esta persona TravelEntry=Entrada de viaje TravelEntry.person=Persona de entrada de viaje TravelEntry.reportDate=Fecha del informe +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=ID de entrada de viaje TravelEntry.externalId=ID externa TravelEntry.personFirstName=Nombre de la persona @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Plantilla externalEmailSentBy=Enviado por externalEmailSentTo=Enviado a externalEmailAttachedDocuments=Documentos adjuntos + +# SpecialCaseAccess +SpecialCaseAccess=Acceso especial a casos +caze = Caso +assignedTo = Asignado a +assignedBy = Asignado por +endDateTime = Acceso hasta +assignmentDate = Fecha de asignación + +specialCaseAccessNew=Nuevo +specailCaseAccessNoAccessGranted=No se otorgó acceso especial para este caso diff --git a/sormas-api/src/main/resources/captions_es-ES.properties b/sormas-api/src/main/resources/captions_es-ES.properties index e7b4a6b2dd2..e0d647b4d8d 100644 --- a/sormas-api/src/main/resources/captions_es-ES.properties +++ b/sormas-api/src/main/resources/captions_es-ES.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fa-AF.properties b/sormas-api/src/main/resources/captions_fa-AF.properties index 36503bf43e2..1c4e3441940 100644 --- a/sormas-api/src/main/resources/captions_fa-AF.properties +++ b/sormas-api/src/main/resources/captions_fa-AF.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=کمپاین های فعال campaignAllCampaigns=همه کمپاین ها @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fi-FI.properties b/sormas-api/src/main/resources/captions_fi-FI.properties index 4a585461016..0dfb4820d63 100644 --- a/sormas-api/src/main/resources/captions_fi-FI.properties +++ b/sormas-api/src/main/resources/captions_fi-FI.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Aktiiviset kampanjat campaignAllCampaigns=Kaikka kampanjat @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Potilas ID EventParticipant.approximateAge=Ikä EventParticipant.name=Nimi EventParticipant.sex=Sukupuoli +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Henkilön ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Valkosolujen kokonaismäärä viimeisimmässä lisätestis # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fil-PH.properties b/sormas-api/src/main/resources/captions_fil-PH.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_fil-PH.properties +++ b/sormas-api/src/main/resources/captions_fil-PH.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fj-FJ.properties b/sormas-api/src/main/resources/captions_fj-FJ.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_fj-FJ.properties +++ b/sormas-api/src/main/resources/captions_fj-FJ.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fr-CD.properties b/sormas-api/src/main/resources/captions_fr-CD.properties index 0dc47e090da..4d1fefa29fd 100644 --- a/sormas-api/src/main/resources/captions_fr-CD.properties +++ b/sormas-api/src/main/resources/captions_fr-CD.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fr-CH.properties b/sormas-api/src/main/resources/captions_fr-CH.properties index a181d60893f..0e021aa31fa 100644 --- a/sormas-api/src/main/resources/captions_fr-CH.properties +++ b/sormas-api/src/main/resources/captions_fr-CH.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Campagnes actives campaignAllCampaigns=Toutes les campagnes @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=ID de cas EventParticipant.approximateAge=Âge EventParticipant.name=Nom EventParticipant.sex=Sexe +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=ID de personne @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Nombre de WBC du dernier test supplémentaire # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index 7f529662793..884f914a7aa 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -302,6 +302,7 @@ bulkRestore=Restaurer bulkCompleted=%d/%d Effectué bulkSkipped=%d Ignoré bulkSuccessful=%d Succès +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Campagnes actives campaignAllCampaigns=Toutes les campagnes @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=ID du cas EventParticipant.approximateAge=Âge EventParticipant.name=Nom EventParticipant.sex=Sexe +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Région responsable EventParticipant.responsibleDistrict=Département responsable EventParticipant.personUuid=ID de la personne @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Nombre de WBC du dernier test supplémentaire # Immunization Immunization=Immunisation Immunization.reportDate=Date du rapport +Immunization.reportingUser = Reporting user Immunization.externalId=ID externe Immunization.country=Pays de vaccination Immunization.deletionReason=Raison de la suppression @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=Il n'y a pas de voyages répertoriés pour TravelEntry=Entrée de voyage TravelEntry.person=Personne d'entrée de voyage TravelEntry.reportDate=Date du rapport +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=ID d'entrée de voyage TravelEntry.externalId=ID externe TravelEntry.personFirstName=Prénom de la personne @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_fr-TN.properties b/sormas-api/src/main/resources/captions_fr-TN.properties index 6a1a6407755..84a056bb359 100644 --- a/sormas-api/src/main/resources/captions_fr-TN.properties +++ b/sormas-api/src/main/resources/captions_fr-TN.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Campagnes actives campaignAllCampaigns=Toutes les campagnes @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=ID du cas EventParticipant.approximateAge=Âge EventParticipant.name=Nom EventParticipant.sex=Sexe +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Gouvernorat responsable EventParticipant.responsibleDistrict=Département responsable EventParticipant.personUuid=ID de la personne @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Nombre de WBC du dernier test supplémentaire # Immunization Immunization=Immunisation Immunization.reportDate=Date du rapport +Immunization.reportingUser = Reporting user Immunization.externalId=ID externe Immunization.country=Pays de vaccination Immunization.deletionReason=Raison de la suppression @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=Il n'y a pas de voyages répertoriés pour TravelEntry=Entrée de voyage TravelEntry.person=Personne d'entrée de voyage TravelEntry.reportDate=Date du rapport +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=ID d'entrée de voyage TravelEntry.externalId=ID externe TravelEntry.personFirstName=Prénom de la personne @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_hi-IN.properties b/sormas-api/src/main/resources/captions_hi-IN.properties index b616ffb8374..0690f400963 100644 --- a/sormas-api/src/main/resources/captions_hi-IN.properties +++ b/sormas-api/src/main/resources/captions_hi-IN.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_hr-HR.properties b/sormas-api/src/main/resources/captions_hr-HR.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_hr-HR.properties +++ b/sormas-api/src/main/resources/captions_hr-HR.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_it-CH.properties b/sormas-api/src/main/resources/captions_it-CH.properties index ba00432798e..28c6385ee4d 100644 --- a/sormas-api/src/main/resources/captions_it-CH.properties +++ b/sormas-api/src/main/resources/captions_it-CH.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Campagne attive campaignAllCampaigns=Tutte le campagne @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=ID caso EventParticipant.approximateAge=Età EventParticipant.name=Nome EventParticipant.sex=Sesso +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=ID Persona @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Numero globuli bianchi dell'ultimo test supplementare # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_it-IT.properties b/sormas-api/src/main/resources/captions_it-IT.properties index 937dd5f0ac2..b46ba170812 100644 --- a/sormas-api/src/main/resources/captions_it-IT.properties +++ b/sormas-api/src/main/resources/captions_it-IT.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Campagne attive campaignAllCampaigns=Tutte le campagne @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=ID caso EventParticipant.approximateAge=Età EventParticipant.name=Nome EventParticipant.sex=Sesso +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=ID Persona @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=Numero globuli bianchi dell'ultimo test supplementare # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_ja-JP.properties b/sormas-api/src/main/resources/captions_ja-JP.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_ja-JP.properties +++ b/sormas-api/src/main/resources/captions_ja-JP.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_ne-NP.properties b/sormas-api/src/main/resources/captions_ne-NP.properties index f1a0c5bc805..2ca62893eff 100644 --- a/sormas-api/src/main/resources/captions_ne-NP.properties +++ b/sormas-api/src/main/resources/captions_ne-NP.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_nl-NL.properties b/sormas-api/src/main/resources/captions_nl-NL.properties index 45a96c60f06..b17035d9358 100644 --- a/sormas-api/src/main/resources/captions_nl-NL.properties +++ b/sormas-api/src/main/resources/captions_nl-NL.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_no-NO.properties b/sormas-api/src/main/resources/captions_no-NO.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_no-NO.properties +++ b/sormas-api/src/main/resources/captions_no-NO.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index a327e008096..eb007c34041 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Wiek EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Imię osoby @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Szablon externalEmailSentBy=Wysłane przez externalEmailSentTo=Wysłane do externalEmailAttachedDocuments=Załączone dokumenty + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_ps-AF.properties b/sormas-api/src/main/resources/captions_ps-AF.properties index 0513ef54833..8cfc5e259ec 100644 --- a/sormas-api/src/main/resources/captions_ps-AF.properties +++ b/sormas-api/src/main/resources/captions_ps-AF.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=فعال کمپاینونه campaignAllCampaigns=ټول کمپاینونه @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_pt-PT.properties b/sormas-api/src/main/resources/captions_pt-PT.properties index 7d1448bfd76..74ba7aa7d2b 100644 --- a/sormas-api/src/main/resources/captions_pt-PT.properties +++ b/sormas-api/src/main/resources/captions_pt-PT.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_ro-RO.properties b/sormas-api/src/main/resources/captions_ro-RO.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_ro-RO.properties +++ b/sormas-api/src/main/resources/captions_ro-RO.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_ru-RU.properties b/sormas-api/src/main/resources/captions_ru-RU.properties index 091e72fdcba..d4cabb0f327 100644 --- a/sormas-api/src/main/resources/captions_ru-RU.properties +++ b/sormas-api/src/main/resources/captions_ru-RU.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_sv-SE.properties b/sormas-api/src/main/resources/captions_sv-SE.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_sv-SE.properties +++ b/sormas-api/src/main/resources/captions_sv-SE.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_sw-KE.properties b/sormas-api/src/main/resources/captions_sw-KE.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_sw-KE.properties +++ b/sormas-api/src/main/resources/captions_sw-KE.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_tr-TR.properties b/sormas-api/src/main/resources/captions_tr-TR.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_tr-TR.properties +++ b/sormas-api/src/main/resources/captions_tr-TR.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_uk-UA.properties b/sormas-api/src/main/resources/captions_uk-UA.properties index 994f0898223..86c6b786867 100644 --- a/sormas-api/src/main/resources/captions_uk-UA.properties +++ b/sormas-api/src/main/resources/captions_uk-UA.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=Immunization Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index 0aa294eeeaf..9525aeecf5c 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -302,6 +302,7 @@ bulkRestore=بحال کریں bulkCompleted=%d%d مکمل ہو گیا bulkSkipped=%d نظر انداز ہو گیا bulkSuccessful=%d کامیاب ہو گیا +bulkSpecialCaseAccess=خصوصی رسائی کی اجازت دیں # Campaign campaignActiveCampaigns=فعال مہمات campaignAllCampaigns=تمام مہمات @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = کل کلورین کی باقیات (مل EnvironmentSample.laboratory = لیبارٹری EnvironmentSample.laboratoryDetails = لیبارٹری کی تفصیلات EnvironmentSample.requestedPathogenTests = درخواست کردہ پیتھوجینز کے ٹیسٹ +EnvironmentSample.reportingUser = Reporting user EnvironmentSample.otherRequestedPathogenTests = دیگر درخواست کردہ پیتھوجینز کی جانچ کی جائے EnvironmentSample.weatherConditions = نمونے لینے کے وقت موسمی حالات EnvironmentSample.heavyRain = نمونے لینے سے پہلے گزشتہ 24 گھنٹوں میں شدید بارش؟ @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=کیس کی شناخت EventParticipant.approximateAge=عمر EventParticipant.name=نام EventParticipant.sex=جنس +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=ذمہ دار علاقہ EventParticipant.responsibleDistrict=ذمہ دار ضلع EventParticipant.personUuid=شخص کی شناخت @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=تازہ ترین اضافی ٹیسٹ کی WBC گنتی # Immunization Immunization=امیونائزیشن Immunization.reportDate=رپورٹ کی تاریخ +Immunization.reportingUser = Reporting user Immunization.externalId=بیرونی شناخت Immunization.country=امیونائزیشن ملک Immunization.deletionReason=مٹانے کی وجہ @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=اس شخص کے لیے کوئی سفری TravelEntry=سفری اندراج TravelEntry.person=سفری داخلہ شخص TravelEntry.reportDate=رپورٹ کی تاریخ +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=سفری اندراج کی شناخت TravelEntry.externalId=بیرونی شناخت TravelEntry.personFirstName=شخص کا پہلا نام @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=ٹیمپلیٹ externalEmailSentBy=کی طرف سے بھیجا externalEmailSentTo=کو بھیجا گیا externalEmailAttachedDocuments=منسلک دستاویزات + +# SpecialCaseAccess +SpecialCaseAccess=خصوصی کیس تک رسائی +caze = کیس +assignedTo = کرنے والا +assignedBy = منصوب کرنے والا +endDateTime = تک رسائی +assignmentDate = منصوب تاریخ + +specialCaseAccessNew=نیا +specailCaseAccessNoAccessGranted=اس کیس کے لیے کوئی خاص رسائی نہیں دی گئی diff --git a/sormas-api/src/main/resources/captions_zh-CN.properties b/sormas-api/src/main/resources/captions_zh-CN.properties index c68db6f11af..3d479305579 100644 --- a/sormas-api/src/main/resources/captions_zh-CN.properties +++ b/sormas-api/src/main/resources/captions_zh-CN.properties @@ -302,6 +302,7 @@ bulkRestore=Restore bulkCompleted=%d/%d Completed bulkSkipped=%d Skipped bulkSuccessful=%d Successful +bulkSpecialCaseAccess=Grant special access # Campaign campaignActiveCampaigns=Active campaigns campaignAllCampaigns=All campaigns @@ -1172,6 +1173,7 @@ EnvironmentSample.chlorineResiduals = Total chlorine residuals (mg/L) EnvironmentSample.laboratory = Laboratory EnvironmentSample.laboratoryDetails = Laboratory details EnvironmentSample.requestedPathogenTests = Requested pathogens to be tested +EnvironmentSample.reportingUser = Reporting user 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? @@ -1351,6 +1353,7 @@ EventParticipant.caseUuid=Case ID EventParticipant.approximateAge=Age EventParticipant.name=Name EventParticipant.sex=Sex +EventParticipant.reportingUser = Reporting user EventParticipant.responsibleRegion=Responsible Region EventParticipant.responsibleDistrict=Responsible District EventParticipant.personUuid=Person ID @@ -2162,6 +2165,7 @@ SampleExport.wbcCount=WBC count of latest additional test # Immunization Immunization=免疫 Immunization.reportDate=Date of report +Immunization.reportingUser = Reporting user Immunization.externalId=External ID Immunization.country=Immunization country Immunization.deletionReason=Reason for deletion @@ -2503,6 +2507,7 @@ travelEntriesNoTravelEntriesForPerson=There are no travel entries for this perso TravelEntry=Travel entry TravelEntry.person=Travel entry person TravelEntry.reportDate=Date of report +TravelEntry.reportingUser = Reporting user TravelEntry.uuid=Travel Entry ID TravelEntry.externalId=External ID TravelEntry.personFirstName=Person First Name @@ -2931,3 +2936,14 @@ externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to externalEmailAttachedDocuments=Attached documents + +# SpecialCaseAccess +SpecialCaseAccess=Special case access +caze = Case +assignedTo = Assigned to +assignedBy = Assigned by +endDateTime = Access until +assignmentDate = Date assigned + +specialCaseAccessNew=New +specailCaseAccessNoAccessGranted=No special access granted for this case diff --git a/sormas-api/src/main/resources/enum_ar-SA.properties b/sormas-api/src/main/resources/enum_ar-SA.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_ar-SA.properties +++ b/sormas-api/src/main/resources/enum_ar-SA.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_cs-CZ.properties b/sormas-api/src/main/resources/enum_cs-CZ.properties index 4778eb7c186..31a2e7a4902 100644 --- a/sormas-api/src/main/resources/enum_cs-CZ.properties +++ b/sormas-api/src/main/resources/enum_cs-CZ.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Importovat účastníky události UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Odeslat manuální externí zprávy UserRight.STATISTICS_ACCESS = Statistiky přístupu UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Spravovat konfigurace veřejného exportu -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Provést hromadné operace v případech a vzorcích UserRight.INFRASTRUCTURE_EXPORT = Exportovat data infrastruktury ze SORMAS UserRight.INFRASTRUCTURE_IMPORT = Importovat data infrastruktury UserRight.INFRASTRUCTURE_ARCHIVE = Importovat data infrastruktury @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Pracovat se zprávami UserRight.EXTERNAL_MESSAGE_PUSH = Nabídnout odeslání externí zprávy do systému UserRight.EXTERNAL_MESSAGE_DELETE = Odstranit zprávy ze systému UserRight.CASE_SHARE = Sdílet případy s celou zemí -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Provést hromadné operace v seznamu zpráv UserRight.IMMUNIZATION_VIEW = Zobrazit existující imunizace a očkování UserRight.IMMUNIZATION_CREATE = Vytvořit novou imunizaci a očkování UserRight.IMMUNIZATION_EDIT = Upravit existující imunizaci a očkování @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Upravit existující skupiny událostí UserRight.EVENTGROUP_LINK = Propojit události se skupinami událostí UserRight.EVENTGROUP_ARCHIVE = Archivovat skupiny událostí UserRight.EVENTGROUP_DELETE = Odstranit skupiny událostí ze systému -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Provést hromadné operace v adresáři událostí -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Provést hromadné operace v adresáři účastníků událostí UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Přístup k adresáři míst vstupu UserRight.TRAVEL_ENTRY_VIEW = Zobrazit existující místa vstupu UserRight.TRAVEL_ENTRY_CREATE = Vytvořit nové místo vstupu @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Odeslat externí e-maily UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Připojit dokumenty k externím e-mailům +UserRight.GRANT_SPECIAL_CASE_ACCESS=Povolit přístup pro zvláštní případy # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Může importovat účastníky událost UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Může odesílat manuální externí zprávy UserRight.Desc.STATISTICS_ACCESS = Může mít přístup ke statistikám UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Může spravovat konfigurace veřejného exportu -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Může provádět hromadné operace na vzorcích případu UserRight.Desc.INFRASTRUCTURE_EXPORT = Může exportovat údaje ze SORMAS o infrastruktuře UserRight.Desc.INFRASTRUCTURE_IMPORT = Může importovat data infrastruktury UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Může archivovat data infrastruktury @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Může pracovat se zprávami UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Možnost odesílat externí zprávy do systému UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Může smazat zprávy UserRight.Desc.CASE_SHARE = Může sdílet případy s celou zemí -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Může provádět hromadné operace v seznamu zpráv UserRight.Desc.IMMUNIZATION_VIEW = Může vidět existující imunizaci a očkování UserRight.Desc.IMMUNIZATION_CREATE = Může vytvářet nové imunizace a očkování UserRight.Desc.IMMUNIZATION_EDIT = Může upravit existující imunizaci a očkování @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Může upravit existující skupiny událostí UserRight.Desc.EVENTGROUP_LINK = Může odkazovat události na skupiny událostí UserRight.Desc.EVENTGROUP_ARCHIVE = Může archivovat skupiny událostí UserRight.Desc.EVENTGROUP_DELETE = Může odstranit skupiny událostí ze systému -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Může provádět hromadné operace v adresáři událostí -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Může provádět hromadné operace v adresáři účastníků událostí UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Může přístupovat k adresáři míst vstupu UserRight.Desc.TRAVEL_ENTRY_VIEW = Může zobrazit stávající místa vstupu UserRight.Desc.TRAVEL_ENTRY_CREATE = Může vytvářet nová místa vstupu @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Může spravovat šablony e-mailů UserRight.Desc.EXTERNAL_EMAIL_SEND=Může odeslat externí e-maily UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Může připojit dokumenty k externím e-mailům +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = Obecné diff --git a/sormas-api/src/main/resources/enum_de-CH.properties b/sormas-api/src/main/resources/enum_de-CH.properties index 570805998e9..a2c5625a48a 100644 --- a/sormas-api/src/main/resources/enum_de-CH.properties +++ b/sormas-api/src/main/resources/enum_de-CH.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Ereignisteilnehmer importieren UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Manuelle externe Nachrichten senden UserRight.STATISTICS_ACCESS = Zugriff auf Statistik UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Verwalten geteilter Exportkonfigurationen -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Massenbearbeitungen für Fälle und Proben durchführen UserRight.INFRASTRUCTURE_EXPORT = Infrastrukturdaten von SORMAS exportieren UserRight.INFRASTRUCTURE_IMPORT = Infrastrukturdaten importieren UserRight.INFRASTRUCTURE_ARCHIVE = Infrastrukturdaten archivieren @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Mit Meldungen arbeiten UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Meldungen aus dem System löschen UserRight.CASE_SHARE = Fälle mit dem ganzen Land teilen -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Massenbearbeitungen in der Meldungsliste ausführen UserRight.IMMUNIZATION_VIEW = Bestehende Immunisierungen und Impfungen anzeigen UserRight.IMMUNIZATION_CREATE = Neue Immunisierungen und Impfungen erstellen UserRight.IMMUNIZATION_EDIT = Bestehende Immunisierungen und Impfungen bearbeiten @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Vorhandene Ereignisgruppen bearbeiten UserRight.EVENTGROUP_LINK = Ereignisse mit Ereignisgruppen verknüpfen UserRight.EVENTGROUP_ARCHIVE = Ereignisgruppen archivieren UserRight.EVENTGROUP_DELETE = Ereignisgruppen aus dem System löschen -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Massenbearbeitungen im Ereignisverzeichnis ausführen -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Massenbearbeitungen im Ereignisteilnehmerverzeichnis ausführen UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Zugriff auf das Einreiseverzeichnis UserRight.TRAVEL_ENTRY_VIEW = Vorhandene Einreisen anzeigen UserRight.TRAVEL_ENTRY_CREATE = Neue Einreisen erstellen @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Kann Ereignisteilnehmer importieren UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Kann manuelle externe Nachrichten senden UserRight.Desc.STATISTICS_ACCESS = Kann auf Statistiken zugreifen UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Kann öffentliche Exportkonfigurationen verwalten -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Kann Massenbearbeitungen für Fall-Proben ausführen UserRight.Desc.INFRASTRUCTURE_EXPORT = Kann Infrastrukturdaten von SORMAS exportieren UserRight.Desc.INFRASTRUCTURE_IMPORT = Kann Infrastrukturdaten importieren UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Kann Infrastrukturdaten archivieren @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Kann mit Meldungen arbeiten UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Kann Meldungen löschen UserRight.Desc.CASE_SHARE = Kann Fälle mit dem ganzen Land teilen -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Kann Massenbearbeitungen in der Meldungsliste ausführen UserRight.Desc.IMMUNIZATION_VIEW = Kann bestehende Immunisierungen und Impfungen einsehen UserRight.Desc.IMMUNIZATION_CREATE = Kann neue Immunisierungen und Impfungen erstellen UserRight.Desc.IMMUNIZATION_EDIT = Kann bestehende Immunisierungen und Impfungen bearbeiten @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Kann bestehende Ereignisgruppen bearbeiten UserRight.Desc.EVENTGROUP_LINK = Kann Ereignisse mit Ereignisgruppen verknüpfen UserRight.Desc.EVENTGROUP_ARCHIVE = Kann Ereignisgruppen archivieren UserRight.Desc.EVENTGROUP_DELETE = Kann Ereignisgruppen aus dem System löschen -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Kann Massenbearbeitungen im Ereignisverzeichnis ausführen -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Kann Massenbearbeitungen in Ereignisteilnehmerverzeichnissen ausführen UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Kann auf das Einreiseverzeichnis zugreifen UserRight.Desc.TRAVEL_ENTRY_VIEW = Kann bestehende Einreisen einsehen UserRight.Desc.TRAVEL_ENTRY_CREATE = Kann neue Einreisen erstellen @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = Allgemein diff --git a/sormas-api/src/main/resources/enum_de-DE.properties b/sormas-api/src/main/resources/enum_de-DE.properties index b056d1d1a26..e944a7febfa 100644 --- a/sormas-api/src/main/resources/enum_de-DE.properties +++ b/sormas-api/src/main/resources/enum_de-DE.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Ereignisteilnehmer importieren UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Manuelle externe Nachrichten senden UserRight.STATISTICS_ACCESS = Zugriff auf Statistik UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Verwalten geteilter Exportkonfigurationen -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Massenbearbeitungen für Fälle und Proben durchführen UserRight.INFRASTRUCTURE_EXPORT = Infrastrukturdaten von SORMAS exportieren UserRight.INFRASTRUCTURE_IMPORT = Infrastrukturdaten importieren UserRight.INFRASTRUCTURE_ARCHIVE = Infrastrukturdaten archivieren @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Mit Meldungen arbeiten UserRight.EXTERNAL_MESSAGE_PUSH = Externe Nachrichten an das System senden UserRight.EXTERNAL_MESSAGE_DELETE = Meldungen aus dem System löschen UserRight.CASE_SHARE = Fälle mit dem ganzen Land teilen -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Massenbearbeitungen in der Meldungsliste ausführen UserRight.IMMUNIZATION_VIEW = Bestehende Immunisierungen und Impfungen anzeigen UserRight.IMMUNIZATION_CREATE = Neue Immunisierungen und Impfungen erstellen UserRight.IMMUNIZATION_EDIT = Bestehende Immunisierungen und Impfungen bearbeiten @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Vorhandene Ereignisgruppen bearbeiten UserRight.EVENTGROUP_LINK = Ereignisse mit Ereignisgruppen verknüpfen UserRight.EVENTGROUP_ARCHIVE = Ereignisgruppen archivieren UserRight.EVENTGROUP_DELETE = Ereignisgruppen aus dem System löschen -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Massenbearbeitungen im Ereignisverzeichnis ausführen -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Massenbearbeitungen im Ereignisteilnehmerverzeichnis ausführen UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Zugriff auf das Einreiseverzeichnis UserRight.TRAVEL_ENTRY_VIEW = Vorhandene Einreisen anzeigen UserRight.TRAVEL_ENTRY_CREATE = Neue Einreisen erstellen @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Kann Ereignisteilnehmer importieren UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Kann manuelle externe Nachrichten senden UserRight.Desc.STATISTICS_ACCESS = Kann auf Statistiken zugreifen UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Kann öffentliche Exportkonfigurationen verwalten -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Kann Massenbearbeitungen für Fall-Proben ausführen UserRight.Desc.INFRASTRUCTURE_EXPORT = Kann Infrastrukturdaten von SORMAS exportieren UserRight.Desc.INFRASTRUCTURE_IMPORT = Kann Infrastrukturdaten importieren UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Kann Infrastrukturdaten archivieren @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Kann mit Meldungen arbeiten UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Möglichkeit, externe Nachrichten an das System zu senden UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Kann Meldungen löschen UserRight.Desc.CASE_SHARE = Kann Fälle mit dem ganzen Land teilen -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Kann Massenbearbeitungen in der Meldungsliste ausführen UserRight.Desc.IMMUNIZATION_VIEW = Kann bestehende Immunisierungen und Impfungen einsehen UserRight.Desc.IMMUNIZATION_CREATE = Kann neue Immunisierungen und Impfungen erstellen UserRight.Desc.IMMUNIZATION_EDIT = Kann bestehende Immunisierungen und Impfungen bearbeiten @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Kann bestehende Ereignisgruppen bearbeiten UserRight.Desc.EVENTGROUP_LINK = Kann Ereignisse mit Ereignisgruppen verknüpfen UserRight.Desc.EVENTGROUP_ARCHIVE = Kann Ereignisgruppen archivieren UserRight.Desc.EVENTGROUP_DELETE = Kann Ereignisgruppen aus dem System löschen -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Kann Massenbearbeitungen im Ereignisverzeichnis ausführen -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Kann Massenbearbeitungen in Ereignisteilnehmerverzeichnissen ausführen UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Kann auf das Einreiseverzeichnis zugreifen UserRight.Desc.TRAVEL_ENTRY_VIEW = Kann bestehende Einreisen einsehen UserRight.Desc.TRAVEL_ENTRY_CREATE = Kann neue Einreisen erstellen @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = Allgemein diff --git a/sormas-api/src/main/resources/enum_en-AF.properties b/sormas-api/src/main/resources/enum_en-AF.properties index 950ca20b7df..6c516b8f2a0 100644 --- a/sormas-api/src/main/resources/enum_en-AF.properties +++ b/sormas-api/src/main/resources/enum_en-AF.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_en-GH.properties b/sormas-api/src/main/resources/enum_en-GH.properties index 00ac6fc3d2b..28268c7f28f 100644 --- a/sormas-api/src/main/resources/enum_en-GH.properties +++ b/sormas-api/src/main/resources/enum_en-GH.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_en-NG.properties b/sormas-api/src/main/resources/enum_en-NG.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_en-NG.properties +++ b/sormas-api/src/main/resources/enum_en-NG.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_es-BO.properties b/sormas-api/src/main/resources/enum_es-BO.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_es-BO.properties +++ b/sormas-api/src/main/resources/enum_es-BO.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_es-CU.properties b/sormas-api/src/main/resources/enum_es-CU.properties index de6e967f55a..37337d5e049 100644 --- a/sormas-api/src/main/resources/enum_es-CU.properties +++ b/sormas-api/src/main/resources/enum_es-CU.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Importar participantes de evento UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Enviar mensajes externos manuales UserRight.STATISTICS_ACCESS = Acceso a estadísticas UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Administrar configuraciones públicas de exportación -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Realizar operaciones masivas en casos y muestras UserRight.INFRASTRUCTURE_EXPORT = Exportar datos de infraestructura de SORMAS UserRight.INFRASTRUCTURE_IMPORT = Importar datos de infraestructura UserRight.INFRASTRUCTURE_ARCHIVE = Archivar datos de infraestructura @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Trabajar con mensajes UserRight.EXTERNAL_MESSAGE_PUSH = Enviar mensajes externos al sistema UserRight.EXTERNAL_MESSAGE_DELETE = Eliminar mensajes del sistema UserRight.CASE_SHARE = Compartir casos con todo el país -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Realizar operaciones masivas en la lista de mensajes UserRight.IMMUNIZATION_VIEW = Ver inmunizaciones y vacunaciones existentes UserRight.IMMUNIZATION_CREATE = Crear nuevas inmunizaciones y vacunaciones UserRight.IMMUNIZATION_EDIT = Editar inmunizaciones y vacunaciones existentes @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Editar grupos de eventos existentes UserRight.EVENTGROUP_LINK = Vincular eventos a grupos de eventos UserRight.EVENTGROUP_ARCHIVE = Archivar grupos de eventos UserRight.EVENTGROUP_DELETE = Eliminar grupos de eventos del sistema -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Realizar operaciones masivas en el directorio de eventos -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Realizar operaciones masivas en el directorio de participantes de evento UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Acceder al directorio de entradas de viaje UserRight.TRAVEL_ENTRY_VIEW = Ver entradas de viaje existentes UserRight.TRAVEL_ENTRY_CREATE = Crear nuevas entradas de viaje @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Eliminar pruebas de patógeno para UserRight.EMAIL_TEMPLATE_MANAGEMENT=Administrar plantillas de mensajes UserRight.EXTERNAL_EMAIL_SEND=Enviar mensajes externos UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Adjuntar documentos a mensajes externos +UserRight.GRANT_SPECIAL_CASE_ACCESS=Otorgar acceso especial a casos # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Puede importar participantes de evento UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Puede enviar mensajes externos manuales UserRight.Desc.STATISTICS_ACCESS = Puede acceder a estadísticas UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Puede gestionar configuraciones de exportación públicas -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Puede realizar operaciones masivas en muestras de casos UserRight.Desc.INFRASTRUCTURE_EXPORT = Puede exportar datos de infraestructura de SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Puede importar datos de infraestructura UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Puede archivar datos de infraestructura @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Puede trabajar con mensajes UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Puede enviar mensajes externos al sistema UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Puede eliminar mensajes UserRight.Desc.CASE_SHARE = Puede compartir casos con todo el país -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Puede realizar operaciones masivas en listas de mensajes UserRight.Desc.IMMUNIZATION_VIEW = Puede ver inmunizaciones y vacunaciones existentes UserRight.Desc.IMMUNIZATION_CREATE = Puede crear nuevas inmunizaciones y vacunaciones UserRight.Desc.IMMUNIZATION_EDIT = Puede editar inmunizaciones y vacunaciones existentes @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Puede editar grupos de eventos existentes UserRight.Desc.EVENTGROUP_LINK = Puede vincular eventos a grupos de eventos UserRight.Desc.EVENTGROUP_ARCHIVE = Puede archivar grupos de eventos UserRight.Desc.EVENTGROUP_DELETE = Puede eliminar grupos de eventos del sistema -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Puede realizar operaciones masivas en el directorio de eventos -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Puede realizar operaciones masivas en el directorio de participantes de evento UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Puede acceder al directorio de entradas de viaje UserRight.Desc.TRAVEL_ENTRY_VIEW = Puede ver entradas de viaje existentes UserRight.Desc.TRAVEL_ENTRY_CREATE = Puede crear nuevas entradas de viaje @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Puede eliminar pruebas de pat UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Puede administrar plantillas de mensajes UserRight.Desc.EXTERNAL_EMAIL_SEND=Puede enviar mensajes externos UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Puede adjuntar documentos a mensajes externos +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Puede otorgar acceso especial a casos # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_es-ES.properties b/sormas-api/src/main/resources/enum_es-ES.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_es-ES.properties +++ b/sormas-api/src/main/resources/enum_es-ES.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fa-AF.properties b/sormas-api/src/main/resources/enum_fa-AF.properties index 341abb1c0aa..9f5561f3ccd 100644 --- a/sormas-api/src/main/resources/enum_fa-AF.properties +++ b/sormas-api/src/main/resources/enum_fa-AF.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fi-FI.properties b/sormas-api/src/main/resources/enum_fi-FI.properties index bce2a53f569..3d717a3b03b 100644 --- a/sormas-api/src/main/resources/enum_fi-FI.properties +++ b/sormas-api/src/main/resources/enum_fi-FI.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fil-PH.properties b/sormas-api/src/main/resources/enum_fil-PH.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_fil-PH.properties +++ b/sormas-api/src/main/resources/enum_fil-PH.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fj-FJ.properties b/sormas-api/src/main/resources/enum_fj-FJ.properties index 515db8547a5..4d6ab7a0b79 100644 --- a/sormas-api/src/main/resources/enum_fj-FJ.properties +++ b/sormas-api/src/main/resources/enum_fj-FJ.properties @@ -1485,7 +1485,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1536,7 +1535,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1549,8 +1547,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1592,6 +1588,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1687,7 +1684,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1738,7 +1734,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1751,8 +1746,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1793,6 +1786,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fr-CD.properties b/sormas-api/src/main/resources/enum_fr-CD.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_fr-CD.properties +++ b/sormas-api/src/main/resources/enum_fr-CD.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fr-CH.properties b/sormas-api/src/main/resources/enum_fr-CH.properties index 24428f05498..dcd75ef6639 100644 --- a/sormas-api/src/main/resources/enum_fr-CH.properties +++ b/sormas-api/src/main/resources/enum_fr-CH.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fr-FR.properties b/sormas-api/src/main/resources/enum_fr-FR.properties index b379752459e..9241a37c756 100644 --- a/sormas-api/src/main/resources/enum_fr-FR.properties +++ b/sormas-api/src/main/resources/enum_fr-FR.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Importer les participants à l'événement UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Envoyer des messages externes manuels UserRight.STATISTICS_ACCESS = Statistiques d'accès UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Gérer les configurations d'exportation publiques -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Effectuer des opérations en masse sur des caisses et des échantillons UserRight.INFRASTRUCTURE_EXPORT = Exporter les données d'infrastructure depuis SORMAS UserRight.INFRASTRUCTURE_IMPORT = Importer des données d'infrastructure UserRight.INFRASTRUCTURE_ARCHIVE = Archiver les données d'infrastructure @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Travailler avec les messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Supprimer messages des personnes du système UserRight.CASE_SHARE = Partagez des cas avec tout le pays -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Effectuer des opérations en masse dans la liste des messages UserRight.IMMUNIZATION_VIEW = Voir les immunisations et vaccinations existantes UserRight.IMMUNIZATION_CREATE = Créer des nouvelles immunisations et vaccinations UserRight.IMMUNIZATION_EDIT = Modifier les immunisations et vaccinations existantes @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Modifier les groupes d'événements existants UserRight.EVENTGROUP_LINK = Lier des événements à des groupes d'événements UserRight.EVENTGROUP_ARCHIVE = Archiver des groupes d'événements UserRight.EVENTGROUP_DELETE = Supprimer des groupes d'événements du système -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Effectuer des opérations en masse dans l'annuaire de l'événement -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Effectuer des opérations en masse dans l'annuaire des participants à l'événement UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Accéder à l'annuaire des entrées de voyage UserRight.TRAVEL_ENTRY_VIEW = Voir les entrées de voyage existantes UserRight.TRAVEL_ENTRY_CREATE = Créer de nouvelles entrées de voyage @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Gérer les modèles d'e-mail UserRight.EXTERNAL_EMAIL_SEND=Envoyer des e-mails externes UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Joindre des documents aux e-mails externes +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Capable d'importer les participants à UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Capable d'envoyer des messages externes manuels UserRight.Desc.STATISTICS_ACCESS = Capable d'accéder aux statistiques UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Capable de gérer les configurations d'exportation publiques -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Capable d'effectuer des opérations en masse sur des échantillons de cas UserRight.Desc.INFRASTRUCTURE_EXPORT = Capable d'exporter les données d'infrastructure depuis SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Capable d'importer des données d'infrastructure UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Capable d'archiver des données d'infrastructure @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Capable de travailler avec les message UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Capable de supprimer les messages UserRight.Desc.CASE_SHARE = Capable de partager des cas avec tout le pays -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Capable d'effectuer des opérations en masse dans la liste des messages UserRight.Desc.IMMUNIZATION_VIEW = Capable de voir les immunisations et vaccinations existantes UserRight.Desc.IMMUNIZATION_CREATE = Capable de créer des nouvelles immunisations et vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Capable de modifier les immunisations et vaccinations existantes @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Capable de modifier des groupes d'événements UserRight.Desc.EVENTGROUP_LINK = Capable de lier des événements à des groupes d'événements UserRight.Desc.EVENTGROUP_ARCHIVE = Capable d'archiver des groupes d'événements UserRight.Desc.EVENTGROUP_DELETE = Capable de supprimer des groupes d'événements du système -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Capable d'effectuer des opérations en masse dans le répertoire de l'événement -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Capable d'effectuer des opérations en masse dans le répertoire des participants à l'événement UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Capable d'accéder au répertoire des entrées de voyage UserRight.Desc.TRAVEL_ENTRY_VIEW = Capable de voir les entrées de voyage existantes UserRight.Desc.TRAVEL_ENTRY_CREATE = Capable de créer de nouvelles entrées de voyage @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Capable de gérer les modèles d'e-mail UserRight.Desc.EXTERNAL_EMAIL_SEND=Capable d'envoyer des e-mails externes UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Capable de joindre des documents à des e-mails externes +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = Général diff --git a/sormas-api/src/main/resources/enum_fr-TN.properties b/sormas-api/src/main/resources/enum_fr-TN.properties index 0b4268d50bd..881262b2a30 100644 --- a/sormas-api/src/main/resources/enum_fr-TN.properties +++ b/sormas-api/src/main/resources/enum_fr-TN.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Importer les participants à l'événement UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Envoyer des messages externes manuels UserRight.STATISTICS_ACCESS = Statistiques d'accès UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Gérer les configurations d'exportation publiques -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Effectuer des opérations en masse sur des caisses et des échantillons UserRight.INFRASTRUCTURE_EXPORT = Exporter les données d'infrastructure depuis SORMAS UserRight.INFRASTRUCTURE_IMPORT = Importer des données d'infrastructure UserRight.INFRASTRUCTURE_ARCHIVE = Archiver les données d'infrastructure @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Travailler avec les messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Supprimer messages des personnes du système UserRight.CASE_SHARE = Partagez des cas avec tout le pays -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Effectuer des opérations en masse dans la liste des messages UserRight.IMMUNIZATION_VIEW = Voir les immunisations et vaccinations existantes UserRight.IMMUNIZATION_CREATE = Créer des nouvelles immunisations et vaccinations UserRight.IMMUNIZATION_EDIT = Modifier les immunisations et vaccinations existantes @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Modifier les groupes d'événements existants UserRight.EVENTGROUP_LINK = Lier des événements à des groupes d'événements UserRight.EVENTGROUP_ARCHIVE = Archiver des groupes d'événements UserRight.EVENTGROUP_DELETE = Supprimer des groupes d'événements du système -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Effectuer des opérations en masse dans l'annuaire de l'événement -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Effectuer des opérations en masse dans l'annuaire des participants à l'événement UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Accéder à l'annuaire des entrées de voyage UserRight.TRAVEL_ENTRY_VIEW = Voir les entrées de voyage existantes UserRight.TRAVEL_ENTRY_CREATE = Créer de nouvelles entrées de voyage @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Capable d'importer les participants à UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Capable d'envoyer des messages externes manuels UserRight.Desc.STATISTICS_ACCESS = Capable d'accéder aux statistiques UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Capable de gérer les configurations d'exportation publiques -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Capable d'effectuer des opérations en masse sur des échantillons de cas UserRight.Desc.INFRASTRUCTURE_EXPORT = Capable d'exporter les données d'infrastructure depuis SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Capable d'importer des données d'infrastructure UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Capable d'archiver des données d'infrastructure @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Capable de travailler avec les message UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Capable de supprimer les messages UserRight.Desc.CASE_SHARE = Capable de partager des cas avec tout le pays -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Capable d'effectuer des opérations en masse dans la liste des messages UserRight.Desc.IMMUNIZATION_VIEW = Capable de voir les immunisations et vaccinations existantes UserRight.Desc.IMMUNIZATION_CREATE = Capable de créer des nouvelles immunisations et vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Capable de modifier les immunisations et vaccinations existantes @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Capable de modifier des groupes d'événements UserRight.Desc.EVENTGROUP_LINK = Capable de lier des événements à des groupes d'événements UserRight.Desc.EVENTGROUP_ARCHIVE = Capable d'archiver des groupes d'événements UserRight.Desc.EVENTGROUP_DELETE = Capable de supprimer des groupes d'événements du système -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Capable d'effectuer des opérations en masse dans le répertoire de l'événement -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Capable d'effectuer des opérations en masse dans le répertoire des participants à l'événement UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Capable d'accéder au répertoire des entrées de voyage UserRight.Desc.TRAVEL_ENTRY_VIEW = Capable de voir les entrées de voyage existantes UserRight.Desc.TRAVEL_ENTRY_CREATE = Capable de créer de nouvelles entrées de voyage @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = Général diff --git a/sormas-api/src/main/resources/enum_hi-IN.properties b/sormas-api/src/main/resources/enum_hi-IN.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_hi-IN.properties +++ b/sormas-api/src/main/resources/enum_hi-IN.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_hr-HR.properties b/sormas-api/src/main/resources/enum_hr-HR.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_hr-HR.properties +++ b/sormas-api/src/main/resources/enum_hr-HR.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_it-CH.properties b/sormas-api/src/main/resources/enum_it-CH.properties index e531aae5c28..d7f3c168bb4 100644 --- a/sormas-api/src/main/resources/enum_it-CH.properties +++ b/sormas-api/src/main/resources/enum_it-CH.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_it-IT.properties b/sormas-api/src/main/resources/enum_it-IT.properties index 3d870fa1a7c..a18cd42a0ee 100644 --- a/sormas-api/src/main/resources/enum_it-IT.properties +++ b/sormas-api/src/main/resources/enum_it-IT.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ja-JP.properties b/sormas-api/src/main/resources/enum_ja-JP.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_ja-JP.properties +++ b/sormas-api/src/main/resources/enum_ja-JP.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ne-NP.properties b/sormas-api/src/main/resources/enum_ne-NP.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_ne-NP.properties +++ b/sormas-api/src/main/resources/enum_ne-NP.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_nl-NL.properties b/sormas-api/src/main/resources/enum_nl-NL.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_nl-NL.properties +++ b/sormas-api/src/main/resources/enum_nl-NL.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_no-NO.properties b/sormas-api/src/main/resources/enum_no-NO.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_no-NO.properties +++ b/sormas-api/src/main/resources/enum_no-NO.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_pl-PL.properties b/sormas-api/src/main/resources/enum_pl-PL.properties index 7cdd984388f..3905537627c 100644 --- a/sormas-api/src/main/resources/enum_pl-PL.properties +++ b/sormas-api/src/main/resources/enum_pl-PL.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ps-AF.properties b/sormas-api/src/main/resources/enum_ps-AF.properties index 341abb1c0aa..9f5561f3ccd 100644 --- a/sormas-api/src/main/resources/enum_ps-AF.properties +++ b/sormas-api/src/main/resources/enum_ps-AF.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_pt-PT.properties b/sormas-api/src/main/resources/enum_pt-PT.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_pt-PT.properties +++ b/sormas-api/src/main/resources/enum_pt-PT.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ro-RO.properties b/sormas-api/src/main/resources/enum_ro-RO.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_ro-RO.properties +++ b/sormas-api/src/main/resources/enum_ro-RO.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ru-RU.properties b/sormas-api/src/main/resources/enum_ru-RU.properties index 4aa47fbadad..54e5f486fc0 100644 --- a/sormas-api/src/main/resources/enum_ru-RU.properties +++ b/sormas-api/src/main/resources/enum_ru-RU.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_sv-SE.properties b/sormas-api/src/main/resources/enum_sv-SE.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_sv-SE.properties +++ b/sormas-api/src/main/resources/enum_sv-SE.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_sw-KE.properties b/sormas-api/src/main/resources/enum_sw-KE.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_sw-KE.properties +++ b/sormas-api/src/main/resources/enum_sw-KE.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_tr-TR.properties b/sormas-api/src/main/resources/enum_tr-TR.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_tr-TR.properties +++ b/sormas-api/src/main/resources/enum_tr-TR.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_uk-UA.properties b/sormas-api/src/main/resources/enum_uk-UA.properties index a470fa223b8..576784144d3 100644 --- a/sormas-api/src/main/resources/enum_uk-UA.properties +++ b/sormas-api/src/main/resources/enum_uk-UA.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ur-PK.properties b/sormas-api/src/main/resources/enum_ur-PK.properties index 960e7e205ef..a82f1c22bc9 100644 --- a/sormas-api/src/main/resources/enum_ur-PK.properties +++ b/sormas-api/src/main/resources/enum_ur-PK.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = تقریب کے شرکاء کو امپورٹ UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = دستی بیرونی پیغامات بھیجیں UserRight.STATISTICS_ACCESS = اعدادوشمار تک رسائی UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = عوامی ايکسپورٹ کنفیگریشنز مینج کریں -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = کیسز اور نمونوں پر بڑی تعداد میں آپریشن کریں UserRight.INFRASTRUCTURE_EXPORT = سورماس سے انفراسٹرکچر ڈیٹا ايکسپورٹ کریں UserRight.INFRASTRUCTURE_IMPORT = انفراسٹرکچر ڈیٹا امپورٹ کریں UserRight.INFRASTRUCTURE_ARCHIVE = انفراسٹرکچر ڈیٹا آرکائیو کریں @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = پیغامات کے ساتھ کام کری UserRight.EXTERNAL_MESSAGE_PUSH = سسٹم میں بیرونی پیغامات کو بھیجیں۔ UserRight.EXTERNAL_MESSAGE_DELETE = سسٹم سے پیغامات مٹا دیں UserRight.CASE_SHARE = کیسز پورے ملک کے ساتھ شیئر کریں -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = پیغامات کی فہرست میں بلک آپریشنز انجام دیں UserRight.IMMUNIZATION_VIEW = موجودہ امیونائزیشن اور ویکسینیشن دیکھیں UserRight.IMMUNIZATION_CREATE = نئے امیونائزیشن اور ویکسینیشن بنائیں UserRight.IMMUNIZATION_EDIT = موجودہ امیونائزیشنز اور ویکسینز میں ترمیم کریں @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = موجودہ تقریب کے گروپس میں تر UserRight.EVENTGROUP_LINK = تقریبات کو تقریب کے گروپس سے لنک کریں UserRight.EVENTGROUP_ARCHIVE = آرکائیو تقریب کے گروپس UserRight.EVENTGROUP_DELETE = سسٹم سے تقریب کے گروپس کو مٹا دیں -UserRight.PERFORM_BULK_OPERATIONS_EVENT = تقریب ک ڈائرکٹری میں بلک آپریشنز انجام دیں -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = تقریب کے شرکاہ کی ڈائرکٹری میں بلک آپریشنز انجام دیں UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = سفری اندراج کی ڈائرکٹری تک رسائی حاصل کریں UserRight.TRAVEL_ENTRY_VIEW = موجودہ سفری اندراجات دیکھیں UserRight.TRAVEL_ENTRY_CREATE = نئے سفری اندراجات بنائیں @@ -1579,18 +1575,19 @@ UserRight.ENVIRONMENT_IMPORT = ماحول امپورٹ کریں UserRight.ENVIRONMENT_EXPORT = ایکسپورٹ ماحول UserRight.ENVIRONMENT_SAMPLE_VIEW = موجودہ ماحول کے نمونے دیکھیں UserRight.ENVIRONMENT_SAMPLE_CREATE = ماحول کے نئے نمونے بنائیں -UserRight.ENVIRONMENT_SAMPLE_EDIT = Edit existing environment samples -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 -UserRight.ENVIRONMENT_SAMPLE_EXPORT = Export environment samples -UserRight.ENVIRONMENT_PATHOGEN_TEST_CREATE = Create environment sample pathogen tests -UserRight.ENVIRONMENT_PATHOGEN_TEST_EDIT = Edit environment sample pathogen tests -UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen tests -UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates -UserRight.EXTERNAL_EMAIL_SEND=Send external emails -UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.ENVIRONMENT_SAMPLE_EDIT = موجودہ ماحول کے نمونوں میں ترمیم کریں +UserRight.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = ماحول کے نمونے بھیجنے کی معلومات میں ترمیم کریں +UserRight.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = ماحولیاتی نمونوں کی وصولی کی معلومات میں ترمیم کریں +UserRight.ENVIRONMENT_SAMPLE_DELETE = سسٹم سے ماحولیاتی نمونے مٹاءیں +UserRight.ENVIRONMENT_SAMPLE_IMPORT = ماحولیاتی نمونے امپورٹ کریں +UserRight.ENVIRONMENT_SAMPLE_EXPORT = ماحولیاتی نمونے اککسپورٹ کریں +UserRight.ENVIRONMENT_PATHOGEN_TEST_CREATE = ماحولیاتی نمونہ پیتھوجین ٹیسٹ بنائیں +UserRight.ENVIRONMENT_PATHOGEN_TEST_EDIT = ماحولیاتی نمونہ پیتھوجین ٹیسٹ میں ترمیم کریں +UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = ماحولیاتی نمونہ پیتھوجین ٹیسٹ مٹائیں +UserRight.EMAIL_TEMPLATE_MANAGEMENT=ای میل ٹیمپلیٹس کا نظم کریں +UserRight.EXTERNAL_EMAIL_SEND=بیرونی ای میلز بھیجیں +UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=دستاویزات کو بیرونی ای میلز سے منسلک کریں +UserRight.GRANT_SPECIAL_CASE_ACCESS=خصوصی کیس تک رسائی کی اجازت دیں # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = تقریب کے شرکاء کو امپ UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = دستی بیرونی پیغامات بھیجنے کے قابل UserRight.Desc.STATISTICS_ACCESS = اعدادوشمار تک رسائی حاصل کرنے کے قابل UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = عوامی ايکسپورٹ کنفیگریشنز مینج کرنے کے قابل -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = کیس کے نمونوں پر بلک آپریشنز انجام دینے کے قابل UserRight.Desc.INFRASTRUCTURE_EXPORT = سورماس سے انفراسٹرکچر ڈیٹا ايکسپورٹ کرنے کے قابل UserRight.Desc.INFRASTRUCTURE_IMPORT = انفراسٹرکچر ڈیٹا امپورٹ کرنے کے قابل UserRight.Desc.INFRASTRUCTURE_ARCHIVE = انفراسٹرکچر ڈیٹا آرکائیو کرنے کے قابل @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = پیغامات کے ساتھ کام ک UserRight.Desc.EXTERNAL_MESSAGE_PUSH = سسٹم میں بیرونی پیغامات کو آگے بڑھانے کے قابل UserRight.Desc.EXTERNAL_MESSAGE_DELETE = پیغامات کو مٹانے کے قابل UserRight.Desc.CASE_SHARE = کیسز پورے ملک کے ساتھ شیئرکرنے کے قابل -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = پیغامات کی فہرست میں بلک آپریشنز انجام دینے کے قابل UserRight.Desc.IMMUNIZATION_VIEW = موجودہ امیونائزیشن اور ویکسینیشن دیکھنے کے قابل UserRight.Desc.IMMUNIZATION_CREATE = نئے امیونائزیشن اور ویکسینیشن بنانے کے قابل UserRight.Desc.IMMUNIZATION_EDIT = موجودہ امیونائزیشن اور ویکسینیشن ترمیم کرنے کے قابل @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = موجودہ تقریبات کے گروپس م UserRight.Desc.EVENTGROUP_LINK = تقریبات کو تقریب کے گروپس سے لنک کرنے کے قابل UserRight.Desc.EVENTGROUP_ARCHIVE = تقریبات کے گروپس کو آرکائیو کرنے کے قابل UserRight.Desc.EVENTGROUP_DELETE = سسٹم سے تقریب کے گروپس کو مٹانے کے قابل -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = تقریب ک ڈائرکٹری میں بلک آپریشنز انجام دینے کے قابل -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = تقریب کے شرکاہ کی ڈائرکٹری میں بلک آپریشنز انجام دینے کے قابل UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = سفری اندراج کی ڈائرکٹری تک رسائی حاصل کرنے کے قابل UserRight.Desc.TRAVEL_ENTRY_VIEW = موجودہ سفری اندراجات دیکھنے کے قابل UserRight.Desc.TRAVEL_ENTRY_CREATE = نئے سفری اندراجات بنانے کے قابل @@ -1767,7 +1760,7 @@ UserRight.Desc.SORMAS_REST = SORMAS REST انٹرفیس تک رسائی حاصل UserRight.Desc.EXTERNAL_VISITS = بیرونی دوروں تک رسائی حاصل کرنے کے قابل REST اینڈ پوائنٹس UserRight.Desc.SORMAS_UI = SORMAS گرافیکل یوزر انٹرفیس تک رسائی حاصل کرنے کے قابل UserRight.Desc.DEV_MODE = کنفیگریشن ڈائرکٹری میں ڈویلپر کے اختیارات تک رسائی حاصل کرنے کے قابل -UserRight.Desc.CUSTOMIZABLE_ENUM_MANAGEMENT = Able to create, edit and delete customizable enum values +UserRight.Desc.CUSTOMIZABLE_ENUM_MANAGEMENT = حسب ضرورت اینوم اقدار تخلیق، ترمیم اور مٹانے کے قابل UserRight.Desc.DOCUMENT_VIEW = موجودہ دستاویزات دیکھنے کے قابل UserRight.Desc.DOCUMENT_UPLOAD = موجودہ دستاویزات اپ لوڈ کرنےکے قابل UserRight.Desc.DOCUMENT_DELETE = سسٹم سے دستاویزات مٹانے کے قابل @@ -1778,20 +1771,21 @@ UserRight.Desc.ENVIRONMENT_ARCHIVE = ماحول کو آرکائیو کرنے ک UserRight.Desc.ENVIRONMENT_DELETE = سسٹم سے ماحول کو مٹانے کے قابل UserRight.Desc.ENVIRONMENT_IMPORT = ماحول امپورٹ کرنے کے قابل UserRight.Desc.ENVIRONMENT_EXPORT = ماحول ایکسپورٹ کرنے کے قابل -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_PATHOGEN_TEST_CREATE = Able to create environment sample pathogen tests -UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_EDIT = Able to edit environment sample pathogen tests -UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sample pathogen tests -UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates -UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails -UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.ENVIRONMENT_SAMPLE_VIEW = موجودہ ماحول کے نمونے دیکھنے کے قابل +UserRight.Desc.ENVIRONMENT_SAMPLE_CREATE = نئے ماحول کے نمونے بنانے کے قابل +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT = موجودہ ماحول کے نمونوں میں ترمیم کرنے کے قابل +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_DISPATCH = ماحولیاتی نمونے بھیجنے کی معلومات میں ترمیم کرنے کے قابل +UserRight.Desc.ENVIRONMENT_SAMPLE_EDIT_RECEIVAL = ماحولیاتی نمونوں کی وصولی کی معلومات میں ترمیم کرنے کے قابل +UserRight.Desc.ENVIRONMENT_SAMPLE_DELETE = سسٹم سے ماحولیاتی نمونے مٹانے کے قابل +UserRight.Desc.ENVIRONMENT_SAMPLE_IMPORT = ماحول کے نمونے امپمرٹ کرنے کے قابل +UserRight.Desc.ENVIRONMENT_SAMPLE_EXPORT = ماحولیاتی نمونے ایکسپورٹ کرنے کے قابل +UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_CREATE = ماحولیاتی نمونہ پیتھوجین ٹیسٹ بنانے کے قابل +UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_EDIT = ماحولیاتی نمونہ پیتھوجین ٹیسٹ میں ترمیم کرنے کے قابل +UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = ماحولیاتی نمونہ پیتھوجین ٹیسٹ کو مٹانے کے قابل +UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=ای میل ٹیمپلیٹس کا انتظام کرنے کے قابل +UserRight.Desc.EXTERNAL_EMAIL_SEND=بیرونی ای میلز بھیجنے کے قابل +UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=بیرونی ای میلز کے ساتھ دستاویزات منسلک کرنے کے قابل +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=مقدمات تک خصوصی رسائی دینے کے قابل # UserRightGroup UserRightGroup.GENERAL = جنرل @@ -1817,7 +1811,7 @@ UserRightGroup.USER = صارفین UserRightGroup.INFRASTRUCTURE = انفراسٹرکچر UserRightGroup.CONFIGURATION = کنفیگریشن UserRightGroup.DOCUMENT = دستاویزات -UserRightGroup.EXTERNAL_EMAILS=External emails +UserRightGroup.EXTERNAL_EMAILS=بیرونی ای میلز UserRightGroup.ENVIRONMENT = ماحولیات # Vaccination @@ -2234,37 +2228,37 @@ SampleShipmentStatus.NOT_SHIPPED=بھیجا نہیں گیا SampleShipmentStatus.RECEIVED=موصول ہوا #Pathogen Customizable enum -Pathogen.CAMPYLOBACTER_JEJUNI = Campylobacter jejuni -Pathogen.ESCHERICHIA_COLI = Escherichia coli -Pathogen.SALMONELLA_SPP = Salmonella spp. -Pathogen.SHIGELLA_SPP = Shigella spp. -Pathogen.VIBRIO_CHOLERAE = Vibrio cholerae -Pathogen.YERSINIA_SPP = Yersinia spp. +Pathogen.CAMPYLOBACTER_JEJUNI = کیمپائلوبیکٹر جیجونی +Pathogen.ESCHERICHIA_COLI = ایسچریچیا کولی +Pathogen.SALMONELLA_SPP = سالمونیلا ایس پی پی. +Pathogen.SHIGELLA_SPP = شگیلا ایس پی پی۔ +Pathogen.VIBRIO_CHOLERAE = وبریو ہیضہ +Pathogen.YERSINIA_SPP = یرسینیا ایس پی پی۔ Pathogen.SARS_COV_2 = SARS-CoV-2 -Pathogen.ADENOVIRUS = Adenovirus -Pathogen.ASTROVIRUS = Astrovirus -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.POLIO_VIRUS = Polio virus 2 -Pathogen.REOVIRUS = Reovirus -Pathogen.ROTAVIRUS = Rotavirus -Pathogen.TT_HEPATITIS = TT hepatitis -Pathogen.OTHER = Other +Pathogen.ADENOVIRUS = اڈینو وائرس +Pathogen.ASTROVIRUS = ایسٹرو وائرس +Pathogen.COXSACKIE_VIRUS = کوکسسکی وائرس +Pathogen.ECHOVIRUS = ایکو وائرس +Pathogen.HEPATITIS_A_VIRUS = ہیپاٹائٹس اے وائرس +Pathogen.HEPATITIS_E_VIRUS = ہیپاٹائٹس ای وائرس +Pathogen.HUMAN_CALICIVIRUS = انسانی کیلیسوائرس +Pathogen.POLIO_VIRUS = پولیو وائرس 2 +Pathogen.REOVIRUS = ریوائرس +Pathogen.ROTAVIRUS = روٹا وائرس +Pathogen.TT_HEPATITIS = ٹی ٹی ہیپاٹائٹس +Pathogen.OTHER = دیگر # EnvironmentSampleMaterial -EnvironmentSampleMaterial.WATER = Water -EnvironmentSampleMaterial.SOIL = Soil -EnvironmentSampleMaterial.AIR = Air -EnvironmentSampleMaterial.VECTORS = Vectors -EnvironmentSampleMaterial.OTHER = Other +EnvironmentSampleMaterial.WATER = پانی +EnvironmentSampleMaterial.SOIL = مٹی +EnvironmentSampleMaterial.AIR = ہوا +EnvironmentSampleMaterial.VECTORS = ویکٹرز +EnvironmentSampleMaterial.OTHER = دیگر # WeatherCondition -WeatherCondition.SUNNY = Sunny -WeatherCondition.CLOUDY = Cloudy -WeatherCondition.RAINING = Raining -WeatherCondition.WINDY = Windy +WeatherCondition.SUNNY = دھوپ +WeatherCondition.CLOUDY = ابر آلود +WeatherCondition.RAINING = بارش ہو رہی +WeatherCondition.WINDY = تیز ہوا #Pathogen Customizable enum diff --git a/sormas-api/src/main/resources/enum_zh-CN.properties b/sormas-api/src/main/resources/enum_zh-CN.properties index e2d538c91aa..f8fc17b6d09 100644 --- a/sormas-api/src/main/resources/enum_zh-CN.properties +++ b/sormas-api/src/main/resources/enum_zh-CN.properties @@ -1484,7 +1484,6 @@ UserRight.EVENTPARTICIPANT_IMPORT = Import event participants UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Send manual external messages UserRight.STATISTICS_ACCESS = Access statistics UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Manage public export configurations -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples UserRight.INFRASTRUCTURE_EXPORT = Export infrastructure data from SORMAS UserRight.INFRASTRUCTURE_IMPORT = Import infrastructure data UserRight.INFRASTRUCTURE_ARCHIVE = Archive infrastructure data @@ -1535,7 +1534,6 @@ UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages UserRight.EXTERNAL_MESSAGE_PUSH = Push external messages to the system UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Share cases with the whole country -UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations @@ -1548,8 +1546,6 @@ UserRight.EVENTGROUP_EDIT = Edit existing event groups UserRight.EVENTGROUP_LINK = Link events to event groups UserRight.EVENTGROUP_ARCHIVE = Archive event groups UserRight.EVENTGROUP_DELETE = Delete event groups from the system -UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory -UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Perform bulk operations in the event participants directory UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries @@ -1591,6 +1587,7 @@ UserRight.ENVIRONMENT_PATHOGEN_TEST_DELETE = Delete environment sample pathogen UserRight.EMAIL_TEMPLATE_MANAGEMENT=Manage email templates UserRight.EXTERNAL_EMAIL_SEND=Send external emails UserRight.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Attach documents to external emails +UserRight.GRANT_SPECIAL_CASE_ACCESS=Grant special case access # UserRight descriptions @@ -1686,7 +1683,6 @@ UserRight.Desc.EVENTPARTICIPANT_IMPORT = Able to import event participants UserRight.Desc.SEND_MANUAL_EXTERNAL_MESSAGES = Able to send manual external messages UserRight.Desc.STATISTICS_ACCESS = Able to access statistics UserRight.Desc.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Able to manage public export configurations -UserRight.Desc.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Able to perform bulk operations on case samples UserRight.Desc.INFRASTRUCTURE_EXPORT = Able to export infrastructure data from SORMAS UserRight.Desc.INFRASTRUCTURE_IMPORT = Able to import infrastructure data UserRight.Desc.INFRASTRUCTURE_ARCHIVE = Able to archive infrastructure data @@ -1737,7 +1733,6 @@ UserRight.Desc.EXTERNAL_MESSAGE_PROCESS = Able to work with messages UserRight.Desc.EXTERNAL_MESSAGE_PUSH = Able to push external messages to the system UserRight.Desc.EXTERNAL_MESSAGE_DELETE = Able to delete messages UserRight.Desc.CASE_SHARE = Able to share cases with the whole country -UserRight.Desc.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Able to perform bulk operations in messages list UserRight.Desc.IMMUNIZATION_VIEW = Able to view existing immunizations and vaccinations UserRight.Desc.IMMUNIZATION_CREATE = Able to create new immunizations and vaccinations UserRight.Desc.IMMUNIZATION_EDIT = Able to edit existing immunizations and vaccinations @@ -1750,8 +1745,6 @@ UserRight.Desc.EVENTGROUP_EDIT = Able to edit existing event groups UserRight.Desc.EVENTGROUP_LINK = Able to link events to event groups UserRight.Desc.EVENTGROUP_ARCHIVE = Able to archive event groups UserRight.Desc.EVENTGROUP_DELETE = Able to delete event groups from the system -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENT = Able to perform bulk operations in the event directory -UserRight.Desc.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Able to perform bulk operations in the event participants directory UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry directory UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries @@ -1792,6 +1785,7 @@ UserRight.Desc.ENVIRONMENT_PATHOGEN_TEST_DELETE = Able to delete environment sam UserRight.Desc.EMAIL_TEMPLATE_MANAGEMENT=Able to manage email templates UserRight.Desc.EXTERNAL_EMAIL_SEND=Able to send external emails UserRight.Desc.EXTERNAL_EMAIL_ATTACH_DOCUMENTS=Able to attach documents to external emails +UserRight.Desc.GRANT_SPECIAL_CASE_ACCESS=Able to grant special access to cases # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index 143279107fb..206f93c6e1c 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ 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 4d3f1e8a705..020c86e6db8 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Graf konečných výsledků laboratoře headingSampleDashboardMap=Mapa stavu vzorků infoHeadingSampleDashboardMap=Vzorky se zobrazují pomocí souřadnic GPS adresy bydliště dané osoby infoHeadingEnvironmentSampleDashboardMap=Vzorky životního prostředí jsou uvedeny pomocí souřadnic GPS těchto vzorků, nebo pokud nejsou k dispozici, jejich přiřazeného prostředí. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index 83eb784316f..b9959b675ca 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index 8f08a3eb363..59f7930f95d 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Tabelle der endgültigen Laborergebnisse headingSampleDashboardMap=Proben Übersichtskarte infoHeadingSampleDashboardMap=Proben werden anhand der GPS-Koordinaten der Heimatadresse der Person angezeigt infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index 5a4e0518eab..d8c4efcb171 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index 301fbf4a9b1..a49cdd4f296 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index 178a97a3295..809be0d1de3 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_es-BO.properties b/sormas-api/src/main/resources/strings_es-BO.properties index a0b5ece201f..9909fb3bd0b 100644 --- a/sormas-api/src/main/resources/strings_es-BO.properties +++ b/sormas-api/src/main/resources/strings_es-BO.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address. infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 79e1841f7d8..88043b13e9a 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Gráfico de resultados finales de laboratorio headingSampleDashboardMap=Mapa de estado de muestras infoHeadingSampleDashboardMap=Las muestras se presentan usando la coordenada GPS de la dirección de la persona infoHeadingEnvironmentSampleDashboardMap=Las muestras ambientales se presentan usando las coordenadas GPS de esas muestras o, si no están disponibles, el ambiente que tienen asociado. + +headingSpecailCaseAccess = Otorgar acceso especial +headingCreateSpecailCaseAccess = Crear nuevo acceso especial +headingEditSpecailCaseAccess = Editar acceso especial +headingConfirmBulkGrantSpecialAccess = Confirmar guardado de acceso especial +confirmationBulkGrantSpecialAccess = El usuario seleccionado ya tiene acceso especial a al menos uno de los casos seleccionados. Guardar sobrescribirá el acceso especial existente. ¿Desea continuar? +headingBulkSpecialCaseAccessSomeNotProcessed= Otorgado acceso especial a algunos de los casos seleccionados +headingBulkSpecialCaseAccessNoneProcessed = No se otorgó acceso especial a ninguno de los casos seleccionados +messageBulkSpecialCaseAccessAllProcessed = Otorgado acceso especial a todos los casos seleccionados +messageCountAccessesNotGrantedDueToError=%s casos no se han procesado\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index 479d0bc23e7..84bede9d1cf 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fr-CD.properties b/sormas-api/src/main/resources/strings_fr-CD.properties index 6d4f3b7823c..b54600c20d1 100644 --- a/sormas-api/src/main/resources/strings_fr-CD.properties +++ b/sormas-api/src/main/resources/strings_fr-CD.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index dfc0e401429..2d7ecc9c77b 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index 6796327e25e..4b01da5f980 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_fr-TN.properties b/sormas-api/src/main/resources/strings_fr-TN.properties index e883b1eeb6d..3f08fe0dba2 100644 --- a/sormas-api/src/main/resources/strings_fr-TN.properties +++ b/sormas-api/src/main/resources/strings_fr-TN.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index fc6e9e965a3..8a6eaa46359 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index 0dd2484fdd3..3a82b9d0bb7 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index 143279107fb..206f93c6e1c 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index 4743e2e39a2..269d25f3820 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index ad6ecba4518..23dfc337b25 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index 6823645d3d5..784e5a07c59 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 7a3f058763d..3b5aa7a3698 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 0b6a24aaf96..033fc6fb934 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -38,7 +38,7 @@ fileName = پہلا نام forCase = کیس کے لۓ forContact = رابطہ کے لۓ forEventParticipant = تقریب کے شرکاء کے لۓ -forEnvironment = for environment +forEnvironment = ماحول کے لئے inactive = غیر فعال inColumn = کالم میں lastTwoDays = گزشتہ دو دن @@ -59,7 +59,7 @@ quarantineEnd = فالو اپ کے اختتام پر قرنطینہ ختم ہو quarterShort = Q reportedBy = رپورٹ کنندہ reportedOn = پر رپورٹ کیا -reportingUser = Reporting user\: +reportingUser = رپورٹنگ صارف\: step = قدم setTo = پر سیٹ کریں toCase = کیس کے لئے @@ -121,7 +121,7 @@ classificationYearsOrMore = سال یا اس سے زیادہ classificationLastVaccinationDateWithin = کے اندر آخری ویکسین کی تاریخ # Confirmation -close = Close +close = بند کریں confirmationAlsoAdjustQuarantine = آپ نے فالو اپ بڑھا دیا ہے۔ کیا قرنطینہ کے اختتام کو اس کے مطابق ایڈجسٹ کیا جانا چاہئے؟ confirmationArchiveCampaign = کیا آپ واقعی اس مہم کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف عام مہم ڈائریکٹری سے چھپائے گا۔ confirmationArchiveCase = کیا آپ واقعی اس کیس کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل کیس ڈائرکٹری سے چھپائے گا۔ @@ -275,9 +275,9 @@ entityDistrict=ضلع entityDistricts=اضلاع entityDocuments=دستاویزات entityEnvironment = ماحول -entityEnvironments = Environments -entityEnvironmentSample = Environment sample -entityEnvironmentSamples = Environment samples +entityEnvironments = ماحولیات +entityEnvironmentSample = ماحولیاتی نمونے +entityEnvironmentSamples = ماحولیاتی نمونے entityEvent=تقریب entityEvents=تقریبات entityEventGroup=تقریب کا گروہ @@ -419,11 +419,11 @@ errorNoRightsForChangingMultipleFields = آپ کو %s اور متعلقہ فیل errorNotFound = درخواست کردہ چیز نہیں ملی errorDeleteUserRoleUsedAlone = صارف کے کردار کو مٹایا نہیں جا سکتا، کیونکہ درج ذیل صارفین صارف کے کردار کے بغیر رہیں گے\:

%s

براہ کرم انہیں ایک مختلف کردار دیں اور اسے مٹانے کی دوبارہ کوشش کریں۔ errorSurveillanceReportNotEditable = یہ رپورٹ مزید قابل ترمیم نہیں ہے -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 -errorSendingExternalEmail = Email could not be sent. Please contact an admin and notify them about this problem. -errorExternalEmailAttachmentCannotEncrypt=Can't send email with attachments. The person has no national health id or primary phone number to send the password to or the SMS service is not set up in the system. +errorEnvironmentSampleNotEditable = یہ ماحول کا نمونہ اب قابل تدوین نہیں ہے +errorEnvironmentSampleNoDispatchRight = آپ کے پاس اس ماحول کے نمونے کی ترسیل کی حیثیت کو تبدیل کرنے کا ضروری صارف حق نہیں ہے۔ +errorEnvironmentSampleNoReceivalRight = آپ کے پاس اس ماحول کے نمونے کی وصولی کی حیثیت کو تبدیل کرنے کا ضروری صارف حق نہیں ہے۔ +errorSendingExternalEmail = ای میل نہیں بھیجی جا سکی۔ براہ کرم کسی منتظم سے رابطہ کریں اور انہیں اس مسئلے کے بارے میں مطلع کریں۔ +errorExternalEmailAttachmentCannotEncrypt=منسلکات کے ساتھ ای میل نہیں بھیج سکتے۔ اس شخص کے پاس پاس ورڈ بھیجنے کے لیے کوئی قومی صحت آئی ڈی یا بنیادی فون نمبر نہیں ہے یا سسٹم میں ایس ایم ایس سروس سیٹ اپ نہیں ہے۔ # headings headingAccessDenied = رسائی مسترد کر دی @@ -450,8 +450,8 @@ headingCaseImport = کیس امپورٹ headingPointOfEntryImport = داخلے کی جگہ امپورٹ headingCaseStatusMap = کیس کی حالت کا نقشہ headingCasesDeleted = کیسز مٹا دیے گئے -headingCasesNotDeleted = None of the cases were deleted -headingCasesNotRestored = None of the cases were restored +headingCasesNotDeleted = کوئی بھی کیس مٹا نہیں ہوا +headingCasesNotRestored = کوئی بھی کیس بحال نہیں ہوا headingCaseConversion = کیس میں تبدیل headingChangeCaseDisease = کیس کی بیماری کو تبدیل کریں headingCasesGuide = گائیڈ\: کیس ڈائرکٹری @@ -473,10 +473,10 @@ headingUnderFollowUp = فالو اپ جاری ہے headingContactInformation = رابطے کی معلومات headingContactMap = رابطہ کا نقشہ headingContactsDeleted = رابطے مٹا دیے گئے -headingContactsNotDeleted = None of the contacts were deleted -headingContactsNotLinked = None of the contacts were linked -headingCasesNotLinked = None of the cases were linked -headingContactsNotRestored = \= None of the contacts were restored +headingContactsNotDeleted = کسی بھی رابطے کو مٹایا نہیں گیا تھا +headingContactsNotLinked = کوئی بھی رابطہ منسلک نہیں تھا +headingCasesNotLinked = کوئی بھی کیس منسلک نہیں تھا +headingContactsNotRestored = \= کوئی بھی رابطہ بحال نہیں ہوا headingCreateAdditionalTest = نئے اضافی ٹیسٹ کے نتائج بنائیں headingCreateEntry = اندراج بنائیں headingCreateNewAction = نئی کارروائی بنائیں @@ -503,7 +503,7 @@ headingCreateNewTreatment = نیاعلاج لکھیں headingCreateNewUser = نیا صارف بنائیں headingCreateNewUserRole = نیا صارف کردار بنائیں headingCreateNewVisit = نئے دورے بنائیں -headingCreateNewEnvironmentSample = Create new environment sample +headingCreateNewEnvironmentSample = ماحول کا نیا نمونہ بنائیں headingCreatePathogenTestResult = نئے پیتھوجین ٹیسٹ کا نتیجہ بنائیں headingDatabaseExportFailed = ڈیٹا بیس ایکسپورٹ ناکام ہو گیا headingDearchiveCampaign = مہمات کو ڈی آرکائیو کريں @@ -519,7 +519,7 @@ headingDefineOutbreakDistricts = وضاحت کریں کہ کون سے اضلاع headingDeleteConfirmation = مٹانے کی تصدیق کریں headingRestoreConfirmation = بحالی کی تصدیق کریں headingDownloadDocumentTemplateGuide = سورماس دستاویز ٹیمپلیٹ گائیڈ ڈاؤن لوڈ کریں -headingDownloadEmailTemplateGuide = Download the SORMAS Email Template Guide +headingDownloadEmailTemplateGuide = SORMAS ای میل ٹیمپلیٹ گائیڈ ڈاؤن لوڈ کریں headingDownloadImportTemplate = امپورٹ ٹیمپلیٹ ڈاؤن لوڈ کریں headingDownloadErrorReport = خرابی کی رپورٹ ڈاؤن لوڈ کریں headingDownloadImportGuide = سورماس امپورٹ گائیڈ اور ڈیٹا ڈکشنری ڈاؤن لوڈ کریں @@ -544,24 +544,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 +headingEntitiesNotArchived = کسی بھی چیز کو محفوظ نہیں کیا گیا +headingEntitiesNotDearchived = کسی بھی چیز کو ڈی آرکائیو نہیں کیا گیا +headingEntitiesNotEdited = کسی بھی چیز میں ترمیم نہیں کی گئی +headingEntitiesNotSent = کسی بھی چیز کو نہیں بھیجا گیا headingEnvironmentalExposure = ماحولیاتی سامنہ headingEpiCurve = وبائی امراض کا کرو headingErrorReportNotAvailable = خرابی کی رپورٹ دستیاب نہیں ہے headingEventData = تقریب کا ڈیٹا headingEventGroupData = تقریب گروپ ڈیٹا headingEventParticipantsDeleted = تقریب کے شرکاء کو مٹا دیا گیا -headingEventParticipantsNotDeleted = None of the event participants were deleted -headingEventParticipantsNotRestored = None of the event participants were restored +headingEventParticipantsNotDeleted = تقریب کے شرکاء میں سے کسی کو بھی مٹایا نہیں گیا +headingEventParticipantsNotRestored = تقریب کے شرکاء میں سے کوئی بھی بحال نہیں ہوا۔ headingEventParticipantResponsibleJurisdictionUpdated = تقریب کے شرکاء کے دائرہ اختیار کی اپ ڈیٹ headingEventJurisdictionUpdated = تقریب کے دائرہ اختیار کی اپ ڈیٹ headingEventsDeleted = تقریبات مٹا کر دیی گئی -headingEventsNotLinked = None of the events were linked -headingEventsNotDeleted = None of the events were deleted -headingEventsNotRestored = None of the events were restored +headingEventsNotLinked = تقریبات میں سے کوئی بھی منسلک نہیں تھا +headingEventsNotDeleted = تقریبات میں سے کوئی بھی مٹایا نہیں گیا +headingEventsNotRestored = تقریبات میں سے کوئی بھی بحال نہیں ہوا headingExportFailed = ایکسپورٹ ناکام ہوا headingFatalities=ہلاکتیں headingFileExists = ڈپلیکیٹ فائل @@ -596,7 +596,7 @@ headingImportAllSubcontinents = پہلے سے طے شدہ برصغیر ایمپ headingImportAreas = خطے امپورٹ کریں headingImportRegions= علاقے امپورٹ کریں headingImportTravelEntries = سفری اندراجات امپورٹ کریں -headingImportEnvironments = Import Environments +headingImportEnvironments = ماحولیات امپورٹ کریں headingInformationSource = معلومات کا ذریعہ headingInfrastructureLocked = انفراسٹرکچر کو تالہ لگا دیا گیا headingIntroduction = تعارف @@ -664,8 +664,8 @@ headingRequestedPathogenTests = درخواست کردہ پیتھوجین ٹیس headingResponsibleJurisdiction=ذمہ دار دائرہ اختیار headingResults = نتائج headingSamplesDeleted = نمونے مٹا دیے گئے -headingSamplesNotDeleted = None of the samples were deleted -headingSamplesNotRestored = None of the samples were restored +headingSamplesNotDeleted = کسی بھی نمونے کو مٹایا نہیں گیا +headingSamplesNotRestored = کسی بھی نمونے کو بحال نہیں کیا گیا headingSaveNotification = نوٹیفکیشن کو محفوظ کریں headingSecurityAlert=سیکیورٹی الرٹ headingSelectCampaign = ایک مہم منتخب کریں @@ -675,14 +675,14 @@ headingSignsAndSymptoms = طبی نشانیاں اور علامات headingSimilarImmunization = اسی طرح کی امیونائزیشن headingSyncUsers = صارفین کی مطابقت پذیری headingTasksDeleted = کاموں کو مٹا دیا گیا -headingTasksNotDeleted = None of the tasks were deleted +headingTasksNotDeleted = کوئی بھی کام مٹایا نہیں گیا headingTemplateNotAvailable = ٹیمپلیٹ دستیاب نہیں ہے headingTests = پیتھوجین ٹیسٹس headingTransferCase = کیس کی منتقلی headingTravelEntryData = سفر کے اندراج کا ڈیٹا headingTravelEntriesDeleted = سفری اندراجات مٹا دیے گئے -headingTravelEntriesNotDeleted = None of the travel entries were deleted -headingTravelEntriesNotRestored = None of the travel entries were restored +headingTravelEntriesNotDeleted = سفری اندراجات میں سے کوئی بھی مٹایا نہیں گیا +headingTravelEntriesNotRestored = سفری اندراجات میں سے کوئی بھی بحال نہیں کیا گیا headingReferCaseFromPointOfEntry = داخلے کا جگہ سے کیس کا حوالہ دیں headingTreatments = عمل شدہ علاج headingTreatmentsDeleted = علاج مٹا دیے گیے @@ -702,9 +702,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 +headingVisitsNotCancelled= فالو اپ وزٹس میں سے کوئی بھی منسوخ نہیں ہوا +headingVisitsNotDeleted = کسی بھی وزٹ کو مٹایا نہیں گیا +headingVisitsNotSetToLost= فالو اپ وزٹ میں سے کوئی بھی ضائع ہونے کے لیے سیٹ نہیں کیا گیا تھا headingVisualization = ویژولائزیشن headingWrongFileType = فائل کی غلط قسم headingWaterUse = پانی کا استعمال @@ -736,9 +736,9 @@ headingCasesRestored = مقدمات بحال کر دیے گئے headingContactsRestored = رابطے بحال ہو گئے headingEventsRestored = تقریبات بحال ہو گئیں headingEventParticipantsRestored = تقریب کے شرکا بحال ہو گئے -headingImmunizationsDeleted = Immunizations deleted -headingImmunizationsNotDeleted = None of the immunizations were deleted -headingImmunizationsNotRestored = None of the immunizations were restored +headingImmunizationsDeleted = حفاظتی ٹیکے مٹا دیے گئے +headingImmunizationsNotDeleted = حفاظتی ٹیکوں میں سے کوئی بھی مٹایا نہیں گیا تھا +headingImmunizationsNotRestored = حفاظتی ٹیکوں میں سے کوئی بھی بحال نہیں ہوا headingImmunizationsRestored = امیونائزیشنز کو بحال کیا گیا headingSamplesRestored = نمونے بحال کر دیے گئے headingTravelEntriesRestored = سفری اندراجات بحال ہو گئے @@ -753,21 +753,21 @@ headingNoEventFound = کوئی تقریب نہیں ملی headingEventNotDeleted = تقریب مٹی نہیں headingSomeCasesNotRestored = کچھ کیسز بحال نہیں ہوئے headingSomeContactsNotRestored = کچھ رابطے بحال نہیں ہوئے تھے -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 +headingSomeEntitiesNotArchived= کچھ چیزوں کو آرکائیو نہیں کیا گیا تھا +headingSomeEntitiesNotDearchived = کچھ چیزوں کو ڈی آرکائیو نہیں کیا گیا تھا +headingSomeEntitiesNotDeleted= کچھ چیزوں کو مٹایا نہیں گیا تھا +headingSomeEntitiesNotEdited = کچھ چیزوں میں ترمیم نہیں کی گئی +headingSomeEnvironmentSamplesNotRestored = ماحول کے کچھ نمونے بحال نہیں ہوئے تھے headingSomeEventParticipantsNotRestored = تقریب کے کچھ شرکاء کو بحال نہیں کیا گیا تھا -headingSomeEventsNotLinked = Some events were not linked +headingSomeEventsNotLinked = کچھ تقریبات منسلک نہیں تھے headingSomeEventsNotRestored = کچھ تقریبات بحال نہیں ہوئی تھی۔ headingSomeImmunizationsNotRestored = کچھ امیونائزیشنز کو بحال نہیں کیا گیا تھا headingSomeSamplesNotRestored = کچھ نمونے بحال نہیں ہوئے تھے headingSomeTravelEntriesNotRestored = کچھ سفری اندراجات بحال نہیں ہوئے تھے -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 +headingSomeUsersNotDisabled = کچھ صارفین کو غیر فعال نہیں کیا گیا تھا +headingSomeUsersNotEnabled= کچھ صارفین کو فعال نہیں کیا گیا تھا +headingSomeVisitsNotCancelled= کچھ فالو اپ دورے منسوخ نہیں ہوئے تھے +headingSomeVisitsNotSetToLost= کچھ فالو اپ وزٹس ضائع ہونے پر سیٹ نہیں تھے headingContactConfirmationRequired = رابطہ کی تصدیق درکار ہے headingContactConversionFollowUpCommentLarge = فالو اپ کمنٹ کی اجازت زیادہ سے زیادہ حروف سے تجاوز کر جائے گے headingSelectSourceCase = سورس کیس کو منتخب کریں @@ -800,7 +800,7 @@ headingExportUserRightsFailed = صارف کے حقوق ایکسپورٹ کرنے headingExternalMessageDownload = پیغام ڈاؤن لوڈ کریں headingNoExternalMessagesSelected = کوئی پیغامات منتخب نہیں کیے گئے headingExternalMessagesDeleted = پیغامات مٹا دیے گئے -headingExternalMessagesNotDeleted = None of the external messages were deleted +headingExternalMessagesNotDeleted = بیرونی پیغامات میں سے کوئی بھی مٹایا نہیں گیا headingExternalMessageCorrection = تصحیحی پیغام headingExternalMessageProcessSample = نمونے اور ٹیسٹ رپورٹس پر عمل کریں headingExternalMessageSampleInformation = نمونہ کی معلومات @@ -809,8 +809,8 @@ headingExternalMessageNewPathogenTests = نیا پیتھوجین ٹیسٹ headingFetchExternalMessages = پیغامات حاصل کریں headingCaution = انتباہ headingUnavailableTaskEdition = غیر دستیاب ٹاسک ایڈیشن -headingUsersNotDisabled = None of the users were disabled -headingUsersNotEnabled = None of the users were enabled +headingUsersNotDisabled = صارفین میں سے کوئی بھی غیر فعال نہیں تھا +headingUsersNotEnabled = صارفین میں سے کوئی بھی فعال نہیں تھا headingDeleteVaccinations = امیونائزیشن کی ویکسین کو مٹا دیں headingDocumentCreated = دستاویز بنائی گئی headingConfirmUnclearLabMessage=غیر واضح کی تصدیق کریں @@ -850,22 +850,22 @@ immunizationRecoveryHeading = بازیابی headingAutomaticDeletionStarted = خودکار حذف مٹانا شروع ہو گیا headingBulkOperationProgress = بلک آپریشن کی پیشرفت میں headingSomeContactsAlreadyInEvent = کچھ رابطے پہلے ہی تقریب سے منسلک ہیں -headingSomeCasesAlreadyInEvent = Some cases are already linked -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 -headingLaboratoryEnvironmentSample = Laboratory sample -headingEnvironmentSampleMeasurements = Sample measurements -headingEnvironmentSampleLocation = Location of sampling site -headingEnvironmentSampleManagement = Sample management -headingEnvironmentSampleRequestedPathogenTests = Requested pathogens to be tested -headingLimitedDiseases=Disease restrictions -headingExternalEmailSend=Send email -headingExternalEmailDetails=Email details -headingCustomizableEnumConfigurationInfo=Customizable enum configuration +headingSomeCasesAlreadyInEvent = کچھ کیسز پہلے ہی منسلک ہیں +headingEnvironmentJurisdictionUpdated = ماحولیاتی مقام کی اپ ڈیٹ +headingNoEnvironmentSamplesSelected = ماحول کے کوئی نمونے منتخب نہیں کیے گئے +headingEnvironmentSamplesDeleted = ماحولیاتی نمونے مٹا دیے گئے +headingEnvironmentSamplesNotDeleted = ماحولیاتی نمونوں میں سے کوئی بھی مٹایا نہیں گیا تھا +headingEnvironmentSamplesNotRestored = ماحولیاتی نمونوں میں سے کوئی بھی بحال نہیں کیا گیا تھا +headingEnvironmentSamplesRestored = ماحولیاتی نمونے بحال کر دیے گئے +headingLaboratoryEnvironmentSample = لیبارٹری کا نمونہ +headingEnvironmentSampleMeasurements = نمونے کی پیمائش +headingEnvironmentSampleLocation = نمونے لینے کی جگہ کا مقام +headingEnvironmentSampleManagement = نمونہ کا انتظام +headingEnvironmentSampleRequestedPathogenTests = پیتھوجینز کی جانچ کی درخواست کی +headingLimitedDiseases=بیماری کی پابندیاں +headingExternalEmailSend=ای میل بھیجیں +headingExternalEmailDetails=ای میل کی تفصیلات +headingCustomizableEnumConfigurationInfo=حسب ضرورت اینوم کنفیگریشن # Info texts infoActivityAsCaseInvestigation = براہ کرم انفیکشن کے بعد تمام متعلقہ سرگرمیوں کو دستاویز کریں\: @@ -906,7 +906,7 @@ infoDocumentAlreadyExists = فائل نام "%s" کے ساتھ ایک دستاو infoDocumentOverride = فائل نام "%s" کے ساتھ ایک دستاویز پہلے سے موجود ہے۔ اوور رائٹ؟ infoDontShareCheckboxAlreadyShared = کیس پہلے ہی شیئر کیا گیا تھا۔ اسے بیرونی رپورٹنگ ٹول کے ساتھ اشتراک نہ کرنے پر سیٹ نہیں کیا جا سکتا۔ infoDownloadDocumentTemplateImportGuide = اگر آپ پہلی بار سورماس پر دستاویز کے ٹیمپلیٹس کو اپ لوڈ کر رہے ہیں، تو ہم پرزور مشورہ دیتے ہیں کہ پہلے دستاویز کے ٹیمپلیٹ گائیڈ کو پڑھیں۔ -infoDownloadEmailTemplateImportGuide = If this is your first time uploading email templates to SORMAS, we strongly recommend to read the email template guide first. +infoDownloadEmailTemplateImportGuide = اگر یہ آپ پہلی بار SORMAS پر ای میل ٹیمپلیٹس اپ لوڈ کر رہے ہیں، تو ہم پرزور مشورہ دیتے ہیں کہ پہلے ای میل ٹیمپلیٹ گائیڈ کو پڑھیں۔ infoDownloadExport = ایکسپورٹ کی تیاری کی جا رہی ہے۔ اس میں کچھ وقت لگ سکتا ہے۔
ڈاؤن لوڈ مکمل ہونے کے بعد آپ اس ڈائیلاگ کو بند کر سکتے ہیں۔ infoDownloadCaseImportTemplate = آپ اپنے ڈیٹا کو اس فارمیٹ میں لانے کے لیے اس ٹیمپلیٹ .csv فائل کا استعمال کر سکتے ہیں جو سورماس پڑھ سکتا ہے۔ براہ کرم ہر بار جب آپ ڈیٹا امپورٹ کرتے ہیں تو یہ کریں، کبھی بھی ایسی فائل استعمال نہ کریں جو آپ نے پہلے ڈاؤن لوڈ کی ہیں۔ infoDownloadImportTemplate = آپ اپنے ڈیٹا کو اس فارمیٹ میں لانے کے لیے اس ٹیمپلیٹ .csv فائل کا استعمال کر سکتے ہیں جو سورماس پڑھ سکتا ہے۔ براہ کرم ہر بار جب آپ ڈیٹا امپورٹ کرتے ہیں تو یہ کریں، کبھی بھی ایسی فائل استعمال نہ کریں جو آپ نے پہلے ڈاؤن لوڈ کی ہیں۔ @@ -1057,16 +1057,16 @@ infoDashboardFinalLaboratoryResult = جب ایک کیس میں ایک سے زی infoBulkProcess = فی الحال %d منتخب اندراجات پر کارروائی ہو رہی ہے۔ اس میں کچھ وقت لگ سکتا ہے۔ پیشرفت ہر 20 اندراجات کے لیے اپ ڈیٹ کی جائے گی جن پر کارروائی کی گئی ہے۔ infoBulkProcessFinished = تمام منتخب اندراجات پر کارروائی ہو چکی ہے\!
اب آپ اس ونڈو کو بند کر سکتے ہیں۔ infoBulkProcessFinishedWithIneligibleItems = بڑی تعداد میں عمل کامیابی سے مکمل ہو گیا ہے\!
تاہم، کچھ منتخب اندراجات پر کارروائی نہیں ہو سکی، کیونکہ وہ اہل نہیں تھیں۔ -infoBulkProcessFinishedWithoutSuccess = Bulk process finished without success\!
None of the entries were successfully processed\! +infoBulkProcessFinishedWithoutSuccess = بڑی تعداد میں عمل کامیابی کے بغیر ختم ہوگیا\!
انٹریز میں سے کسی پر بھی کامیابی سے کارروائی نہیں ہوئی\! 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. +infoBulkProcessFinishedWithSkipsOutsideJurisdictionOrNotEligible = بڑی تعداد میں کارروائی کامیابی کے ساتھ مکمل ہو گئی ہے\!
تاہم، کچھ منتخب اندراجات پر کارروائی نہیں ہو سکی، زیادہ تر امکان اس لیے کہ وہ آپ کے دائرہ اختیار سے باہر تھیں یا اہل نہیں تھیں۔ infoBulkProcessNoEligibleEntries = بڑی تعداد میں عمل کو منسوخ کر دیا گیا ہے کیونکہ اس آپریشن کے لیے کوئی اہل اندراجات نہیں ہیں\! infoBulkProcessCancelled = بلک پروسیس کو منسوخ کر دیا گیا ہے\!
اس پوائنٹ پر کارروائی ہونے تک تمام منتخب اندراجات۔ اب آپ اس ونڈو کو بند کر سکتے ہیں۔ تمام ابھی تک پروسیس شدہ اندراجات کا انتخاب نہیں کیا جائے گا۔ infoBulkUnresponsiveWindowHint = اشارہ\: اگر پروگریس بار غیر جوابی لگتا ہے اور تھوڑی دیر کے بعد کوئی پیش رفت نظر نہیں آتی ہے، تو اس پاپ اپ ونڈو پر کلک کرنے کی کوشش کریں یا اپنی براؤزر ونڈو کا سائز تبدیل کریں۔ -infoNoEnvironmentSamples = No samples have been created for this environment -infoRestrictDiseasesDescription=Mark all diseases that the user is supposed to have access to -infoNoCustomizableEnumTranslations = Click on the + button below to add translations to this customizable enum value. -infoCustomizableEnumConfigurationInfo = Customizable enums are value sets that can be customized in order to react to the individual needs of your country or a specific epidemiological situation. The table on this screen contains all customizable enum values in the database. Each value is associated with a data type, e.g. disease variants or occupation types. Some of these data types have default values that are automatically added to the database when SORMAS is set up or new data types are added to the system.

You can add new enum values or edit existing ones, add translations for languages supported by SORMAS, select the diseases that the value should be visible for (by default, customizable enum values are visible for all diseases), and configure additional properties.

Properties are used to further control the behaviour of customizable enum values. E.g. the "has details" property that is supported by most enum values toggles whether selecting this enum value would bring up an additional text field that users can add more information to. +infoNoEnvironmentSamples = اس ماحول کے لیے کوئی نمونے نہیں بنائے گئے ہیں +infoRestrictDiseasesDescription=ان تمام بیماریوں کو نشان زد کریں جن تک صارف کو رسائی حاصل ہے +infoNoCustomizableEnumTranslations = اس حسب ضرورت اینوم ویلیو میں ترجمہ شامل کرنے کے لیے نیچے + بٹن پر کلک کریں۔ +infoCustomizableEnumConfigurationInfo = حسب ضرورت enums قدر کے سیٹ ہیں جو آپ کے ملک کی انفرادی ضروریات یا ایک مخصوص وبائی صورتحال کے مطابق رد عمل ظاہر کرنے کے لیے اپنی مرضی کے مطابق بنائے جا سکتے ہیں۔ اس اسکرین پر موجود جدول ڈیٹا بیس میں تمام حسب ضرورت اینوم اقدار پر مشتمل ہے۔ ہر قدر ڈیٹا کی قسم سے وابستہ ہے، جیسے بیماری کی مختلف قسمیں یا پیشے کی اقسام۔ ان میں سے کچھ ڈیٹا کی قسموں کی ڈیفالٹ ویلیوز ہوتی ہیں جو خود بخود ڈیٹا بیس میں شامل ہو جاتی ہیں جب SORMAS سیٹ اپ ہوتا ہے یا سسٹم میں ڈیٹا کی نئی اقسام شامل کی جاتی ہیں۔

آپ نئی اینوم ویلیوز شامل کر سکتے ہیں یا موجودہ ویلیوز میں ترمیم کر سکتے ہیں، SORMAS کے ذریعے تعاون یافتہ زبانوں کے ترجمے، ان بیماریوں کا انتخاب کریں جن کے لیے قدر نظر آنی چاہیے (بطور ڈیفالٹ، حسب ضرورت اینوم ویلیوز تمام بیماریوں کے لیے نظر آتی ہیں)، اور اضافی خصوصیات کو ترتیب دیں۔

پراپرٹیز کو مزید کنٹرول کرنے کے لیے استعمال کیا جاتا ہے۔ حسب ضرورت اینوم اقدار کا برتاؤ۔ جیسے "تفصیلات ہیں" پراپرٹی جو زیادہ تر enum ویلیوز کے ذریعہ سپورٹ ہوتی ہے ٹوگل کرتی ہے کہ آیا اس enum ویلیو کو منتخب کرنے سے ایک اضافی ٹیکسٹ فیلڈ سامنے آئے گا جس میں صارف مزید معلومات شامل کر سکتے ہیں۔ # Messages messageActionOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر کی کارروائی کو حذف نہیں کیا جا سکتا @@ -1138,7 +1138,7 @@ messageContactsMerged = روابط کو ضم کر دیا گیا اور ڈپلی messageCopyPassword = براہ کرم اس پاس ورڈ کو کاپی کریں، یہ صرف ایک بار دکھایا گیا ہے۔ messageCountCasesAlreadyInEvent = %s کیسز پہلے سے ہی تقریب سے منسلک تھے، باقی تمام منسلک تھے۔ messageCountContactsAlreadyInEvent = %s روابط پہلے سے ہی تقریب سے منسلک تھے، باقی تمام منسلک تھے۔ -messageCountEnvironmentSamplesNotRestored = %s environment samples not restored. UUIDs of samples not restored\: %s +messageCountEnvironmentSamplesNotRestored = %s ماحول کے نمونے بحال نہیں ہوئے۔ نمونوں کے UUID بحال نہیں ہوئے\: %s messageCreateCollectionTask = آپ نے نمونہ کی شرط کو مناسب نہ ہونے پر سیٹ کیا ہے۔
کیا آپ نمونہ جمع کرنے کا نیا کام بنانا چاہتے ہیں؟ messageDatabaseExportFailed = براہ کرم کسی منتظم سے رابطہ کریں اور انہیں اس مسئلے کے بارے میں مطلع کریں۔ messageEntryCreated = اندراج بنایا گیا @@ -1180,60 +1180,60 @@ messageEventSaved = تقریب کا ڈیٹا محفوظ ہو گیا messageEventGroupSaved = تقریبی گروہ کا ڈیٹا محفوظ ہو گیا 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 +messageCountCasesNotArchivedExternalReason = %s کیسز محفوظ نہیں کیے گئے کیونکہ رپورٹنگ ٹول کے ساتھ مواصلت ناکام ہو گئی\: %s +messageCountCasesNotDearchivedExternalReason = %s کیسز ڈی آرکائیو نہیں کیے گئے کیونکہ رپورٹنگ ٹول کے ساتھ مواصلت ناکام ہو گئی\: %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 -messageCountCasesNotLinkableAccessDeniedReason = %s cases not linked because the case is not editable anymore or the user is missing the rights\: %s +messageCountCasesNotDeletedAccessDeniedReason = %s کیسز مٹائے نہیں گئے کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %s +messageCountCasesNotDeletedExternalReason = %s کیسز مٹایے نہیں ہوئے کیونکہ رپورٹنگ ٹول کے ساتھ مواصلت ناکام ہو گئی\: %s +messageCountCasesNotDeletedSormasToSormasReason = %s زیر التواء شیئر کی درخواستوں کو منسوخ کرنے کی ناکام کوشش کی وجہ سے %s کیسز مٹے نہیں ہوئے\: %s +messageCountCasesNotLinkableAccessDeniedReason = %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 +messageCountContactsNotDeletedAccessDeniedReason = %s رابطے مٹایۓ نہیں گئے کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %s +messageCountContactsNotDeletedSormasToSormasReason = %s زیر التواء شیئر کی درخواستوں کو منسوخ کرنے کی ناکام کوشش کی وجہ سے %s رابطے مٹے نہیں ہوئے\: %s +messageCountContactsNotLinkableAccessDeniedReason = %s رابطے منسلک نہیں ہیں کیونکہ رابطہ اب قابل تدوین نہیں ہے یا صارف حقوق سے محروم ہے\: %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 +messageCountEntitiesNotArchived = %s چیزوں کو محفوظ نہیں کیا جا سکتا\: %s +messageCountEntitiesNotArchivedAccessDeniedReason = %s بنیادی ڈھانچے کی چیزوں کو آرکائیو نہیں کیا جا سکتا کیونکہ چیزوں کا استعمال دوسرے انفراسٹرکچر ڈیٹا میں کیا جاتا ہے\: %s +messageCountEntitiesNotDearchived = %s چیزوں کو ڈی آرکائیو نہیں کیا جا سکتا\: %s +messageCountEntitiesNotDearchivedAccessDeniedReason = %s انفراسٹرکچر کی چیزوں کو ڈی آرکائیو نہیں کیا جا سکتا کیونکہ اداروں نے بنیادی انفراسٹرکچر کو محفوظ کر لیا ہے\: %s +messageCountEntitiesNotEdited = %s چیزوں میں ترمیم نہیں کی جا سکتی کیونکہ وہ مختلف دائرہ اختیار میں ہیں یا پہلے ہی محفوظ شدہ ہیں۔\: %s +messageCountEntitiesNotEditedAccessDeniedReason = %s چیزوں میں ترمیم نہیں کی گئی کیونکہ چیز اب قابل تدوین نہیں ہے\: %s +messageCountEntitiesNotSent = %s چیزوں کو رپورٹنگ ٹول پر نہیں بھیجا جا سکتا\: %s +messageCountEntitiesNotSentAccessDeniedReason = %s چیزوں کو رپورٹنگ ٹول پر نہیں بھیجا جا سکتا کیونکہ صارف کے پاس مناسب حقوق نہیں ہیں\: %s +messageCountEntitiesNotSentExternalReason = %s چیزوں کو رپورٹنگ ٹول پر نہیں بھیجا جا سکتا کیونکہ رپورٹنگ ٹول کے ساتھ بات چیت ناکام ہو گئی\: %s +messageCountEventsNotArchivedExternalReason = %s تقریبات محفوظ نہیں کیے گئے کیونکہ رپورٹنگ ٹول کے ساتھ مواصلت ناکام ہو گئی\: %s +messageCountEventsNotDearchivedExternalReason = %s تقریبات ڈی آرکائیو نہیں کیے گئے کیونکہ رپورٹنگ ٹول کے ساتھ مواصلت ناکام ہو گئی\: %s +messageCountEventsNotLinked = %s تقریبات کو لنک نہیں کیا جا سکتا یا وہ پہلے سے ہی ایونٹ گروپ سے منسلک ہیں\: %s +messageCountEventsNotLinkedAccessDeniedReason = %s تقریبات کو تقریبی گروپ سے منسلک نہیں کیا جا سکتا کیونکہ اسے کسی دوسرے علاقے کے تقریبات کو تقریبی گروپ سے منسلک کرنے کی اجازت نہیں ہے۔\: %s messageCountEventsNotRestored = %s تقریبات بحال نہیں ہوئے۔ تقریبات کے UUID بحال نہیں ہوئے\: %s messageCountEventParticipantsNotDeleted = %s تقریب کے شرکاء کو مٹایا نہیں گیا۔ تقریب کے شرکاء کے UUID مٹایۓ نہیں گئے\: %s -messageCountEventParticipantsNotDeletedAccessDeniedReason = %s event participants not deleted because they are not in jurisdiction or owned\: %s +messageCountEventParticipantsNotDeletedAccessDeniedReason = %s تقریب کے شرکاء کو مٹایا نہیں گیا کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %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 +messageCountImmunizationsNotDeleted = %s حفاظتی ٹیکوں کو حذف نہیں کیا گیا\: %s +messageCountImmunizationsNotDeletedAccessDeniedReason = %s حفاظتی ٹیکوں کو مٹایا نہیں گیا کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %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 +messageCountTasksNotDeletedAccessDeniedReason = %s کام مٹائے نہیں گئے کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %s messageCountTravelEntriesNotDeleted = %s سفری اندراجات مٹے نہیں ہوئے۔ سفری اندراجات کے UUID مٹے نہیں ہوئے\: %s -messageCountTravelEntriesNotDeletedAccessDeniedReason = %s travel entries not deleted because they are not in jurisdiction or owned\: %s +messageCountTravelEntriesNotDeletedAccessDeniedReason = %s سفری اندراجات کو مٹایا نہیں گیا کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %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 +messageCountUsersNotDisabled = %s صارفین غیر فعال نہیں ہیں\: %s +messageCountUsersNotEnabled = %s صارفین فعال نہیں ہیں\: %s +messageCountVisitsNotCancelled = %s فالو اپ وزٹ منسوخ نہیں ہوئے\: %s +messageCountVisitsNotCancelledAccessDeniedReason = %s فالو اپ وزٹ منسوخ نہیں ہوئے کیونکہ رابطہ اب قابل تدوین نہیں ہے یا صارف کے دائرہ اختیار سے باہر ہے\: %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 +messageCountVisitsNotDeletedAccessDeniedReason = %s دورے مٹے نہیں ہوئے کیونکہ وہ دائرہ اختیار میں نہیں ہیں یا ملکیت میں نہیں ہیں\: %s +messageCountVisitsNotSetToLost = %s فالو اپ وزٹ ضائع ہونے پر سیٹ نہیں\: %s +messageCountVisitsNotSetToLostAccessDeniedReason = %s فالو اپ وزٹس ضائع ہونے پر سیٹ نہیں ہیں کیونکہ رابطہ اب قابل تدوین نہیں ہے یا صارف کے دائرہ اختیار سے باہر ہے\: %s messageCountEventsNotDeleted = %s تقریبات مٹے نہیں ہوئے۔ تقریبات کے UUIDs مٹے نہیں ہوئے\: %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 +messageCountEventsNotDeletedAccessDeniedReason = %s تقریبات مٹایے نہیں گئے کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %s +messageCountEventsNotDeletedExternalReason = %s تقریبات مٹایے نہیں ہوئے کیونکہ رپورٹنگ ٹول کے ساتھ مواصلت ناکام ہو گئی\: %s messageEventsNotDeletedLinkedEntitiesReason = کسی بھی تقریب کو مٹایا نہیں جائے گا جس میں تقریب کے شرکاء سے منسلک ہوں۔ براہ کرم تقریب کے شرکاء کو تقریب سے ہٹا دیں تاکہ اسے مٹایا کیا جا سکے۔ -messageCountEventsNotDeletedSormasToSormasReason = %s events not deleted because of failed attempt to revoke pending share request(s)\: %s +messageCountEventsNotDeletedSormasToSormasReason = %s زیر التواء شیئر کی درخواستوں کو منسوخ کرنے کی ناکام کوشش کی وجہ سے %s تقریبات مٹے نہیں ہوئے\: %s messageExportFailed = ڈیٹا کو ایکسپورٹ کرنے سے روکنے میں ایک خرابی تھی۔ براہ کرم ایڈمن سے رابطہ کریں اور انہیں اس مسئلے سے آگاہ کریں۔ messageExportConfigurationDeleted = ايکسپورٹ کنفیگریشن مٹا دی گئ messageExportConfigurationSaved = ایکسپورٹ کنفیگریشن محفوظ ہو گئی @@ -1272,10 +1272,10 @@ messageNoContactsSelected = آپ نے کوئی رابطہ منتخب نہیں ک messageNoCsvFile = آپ نے اپ لوڈ کرنے کے لیے فائل کا انتخاب نہیں کیا ہے۔ براہ کرم ایک .csv فائل منتخب کریں جس میں وہ ڈیٹا موجود ہو جسے آپ اپنے کمپیوٹر سے امپورٹ کرنا چاہتے ہیں۔ messageNoDocumentTemplateUploadFile = آپ نے اپ لوڈ کرنے کے لیے فائل کا انتخاب نہیں کیا ہے۔ براہ کرم ایک .docx ٹیمپلیٹ فائل منتخب کریں جسے آپ اپنے کمپیوٹر سے امپورٹ کرنا چاہتے ہیں۔ messageNoDocumentUploadFile = آپ نے اپ لوڈ کرنے کے لیے فائل کا انتخاب نہیں کیا ہے۔ براہ کرم ایک فائل منتخب کریں جسے آپ اپنے کمپیوٹر سے امپورٹ کرنا چاہتے ہیں۔ -messageNoEligibleEntityForEditing = None of the selected entities are eligible for editing +messageNoEligibleEntityForEditing = منتخب کردہ چیزوں میں سے کوئی بھی ترمیم کے اہل نہیں ہے 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 +messageNoEligibleVisitForCancellation = فالو اپ وزٹس میں سے کوئی بھی منسوخی کا اہل نہیں تھا +messageNoEligibleVisitForSettingToLost = فالو اپ وزٹس میں سے کوئی بھی گم ہونے کی ترتیب کے لیے اہل نہیں تھا messageNoEnvironmentsSelected = آپ نے کوئی ماحول منتخب نہیں کیا ہے messageNoEventParticipantsSelected = آپ نے کسی بھی تقریب کے شرکاء کا انتخاب نہیں کیا ہے messageNoEventsSelected = آپ نے کوئی تقریبات منتخب نہیں کی۔ @@ -1288,7 +1288,7 @@ messageNoTasksSelected = آپ نے کوئی کام منتخب نہیں کیے messageNoTreatmentsSelected = آپ نے کوئی علاج منتخب نہیں کیے messageNoVisitsSelected = آپ نے کوئی دورے منتخب نہیں کیے messageNoUsersSelected = آپ نے کسی صارف کو منتخب نہیں کیا ہے -messageNoUserSelected = No user has been selected +messageNoUserSelected = کوئی صارف منتخب نہیں کیا گیا ہے messageOutbreakSaved = پھیلاو والی معلومات محفوظ ہو گئیں messagePasswordReset = صارف کا پاس ورڈ دوبارہ ترتیب دیا گیا تھا messagePasswordResetEmailLink = پاس ورڈ کو دوبارہ ترتیب دینے کا ایک لنک صارف کے ای میل پر بھیجا گیا تھا @@ -1337,8 +1337,8 @@ messageUserRoleCombination = کے ساتھ مل کر نہیں کیا جا سکت messageUserRoleSaved = صارف کا کردار محفوظ ہو گیا messageVaccinationOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر کی ویکسینیشن کو حذف نہیں کیا جا سکتا 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 +messageVisitsWithWrongStatusNotCancelled = فالو اپ وزٹس کو منسوخ یا کوئی فالو اپ سٹیٹس کے ساتھ منسوخ نہیں کیا جا سکتا +messageVisitsWithWrongStatusNotSetToLost = NO FOLLOW-UP اسٹیٹس کے ساتھ فالو اپ وزٹس کو ضائع پر سیٹ نہیں کیا جا سکتا messageWrongFileType = براہ کرم ایک .csv فائل فراہم کریں جس میں وہ ڈیٹا موجود ہو جسے آپ امپورٹ کرنا چاہتے ہیں۔ امپورٹ ٹیمپلیٹ فائل کو آغاز کے طور پر استعمال کرنے کی تجویز کی جاتی ہے۔ messageWrongTemplateFileType=%s کے لیے، براہ کرم ایک .%s فائل فراہم کریں۔ messageLineListingDisabled = لائن لسٹنگ کو غیر فعال کر دیا گیا ہے @@ -1404,7 +1404,7 @@ messageForwardedExternalMessageFound = اسی رپورٹ آئی ڈی کے سات messageNoCaseFound = کوئی ایسا کیس نہیں مل سکا جو درج کردہ تلاش کی اصطلاح سے میل کھاتا ہو۔ messageNoCaseFoundToLinkImmunization = ایسا کوئی معاملہ نہیں ہے جو تلاش کے معیار اور لنک کی شرائط سے میل کھاتا ہو۔ messageNoEventFound = کوئی ایسی تقریب نہیں مل سکی جو درج کردہ تلاش کی اصطلاح سے میل کھاتی ہو۔ -messageContactToCaseConfirmationRequired = You can only convert contacts to cases that have been confirmed. Please confirm and save this contact before creating a case for its contact person. +messageContactToCaseConfirmationRequired = آپ رابطوں کو صرف ان کیسز میں تبدیل کر سکتے ہیں جن کی تصدیق ہو چکی ہے۔ براہ کرم اس رابطہ شخص کے لیے کیس بنانے سے پہلے اس کی تصدیق اور محفوظ کریں۔ messageContactConversionFollowUpCommentLarge = اس عمل کو انجام دینے سے فالو اپ خود بخود منسوخ ہو جائے گا اور مندرجہ ذیل پیغام کو فالو اپ کمنٹ میں شامل کر دیا جائے گا\:


%s
فالو اپ کمنٹ فیلڈ کی زیادہ سے زیادہ لمبائی شامل کرنے سے بڑھ جائے گی۔ یہ پیغام. براہ کرم منتخب کریں کہ آیا آپ کارروائی کو منسوخ کرنا چاہتے ہیں، فالو اپ کمنٹ کی لمبائی کو کم کریں اور دوبارہ کوشش کریں، یا اوپر دکھائے گئے پیغام کو چھوڑ دیں۔ messageContactConversionFollowUpCommentLargeAdjustComment = کمنٹ کو ایڈجسٹ کریں messageContactConversionFollowUpCommentLargeOmitMessage = پیغام چھوڑ دیں @@ -1420,7 +1420,7 @@ messageSelectedPeriodTooLong = آپ نے ایک مدت کا انتخاب کیا messagePersonAlreadyEventParticipant = کیس پرسن پہلے سے ہی منتخب تقریب میں تقریب کا شریک ہے۔ اس کیس کو منتخب تقریب سے جوڑ دیا گیا ہے۔ messageThisPersonAlreadyEventParticipant = یہ شخص پہلے سے ہی منتخب کردہ تقریب میں شرکت کرنے والا ہے۔ messagePersonAddedAsEventParticipant = تقریب کا نیا شرکت کنندہ بنا دیا گیا۔ -messagePersonListAddedAsEventPerticipants = New event participants were created from person list submitted +messagePersonListAddedAsEventPerticipants = نئے تقریب کے شرکاء جمع کرائی گئی افراد کی فہرست سے بنائے گئے تھے messagePersonAlreadyCaseInEvent = یہ کیس پہلے ہی منتخب تقریب سے منسلک ہے۔ messagePersonContactDetailsPrimaryDuplicate = اس شخص کے لیے اس قسم کی ابتدائی رابطے کی تفصیلات پہلے سے ہی ریکارڈ کی گئی ہیں۔ کیا آپ اس کے بجائے رابطے کی ان تفصیلات کو بنیادی رابطے کی تفصیلات کے طور پر سیٹ کرنا چاہتے ہیں؟ messageUserSyncCanceled = مطابقت پذیری منسوخ ہوگئی\!
مطابقت پذیری منسوخ کردی گئی ہے۔ تمام پہلے سے پروسیس شدہ صارفین کو کامیابی سے ہم آہنگ کر دیا گیا ہے۔ اب آپ اس ونڈو کو بند کر سکتے ہیں۔ @@ -1454,7 +1454,7 @@ messageVaccinationNotRelevantForEventParticipant = یہ ویکسینیشن اس messageVaccinationNoDateNotRelevantForEventParticipant = یہ ویکسینیشن اس تقریب کے شرکاء کے لیے متعلقہ نہیں ہے کیونکہ اس میں ویکسینیشن کی تاریخ نہیں ہے۔ messageAcceptRequestToNavigate = درخواست ابھی تک قبول نہیں ہوئی ہے۔ وہاں جانے کے لیے آپ کو پہلے اسے قبول کرنا ہوگا۔ messageEntityNotFound = سسٹم میں %s نہیں ملا۔ -messageEntitiesNotEditable = There are no entities which are allowed to be edited +messageEntitiesNotEditable = کوئی چیز نہیں ہے جس میں ترمیم کرنے کی اجازت ہے messageSormasToSormasSimilarCaseFound = آپ کے سسٹم میں کم از کم ایک ایسا ہی کیس ہے۔ اگر آپ درخواست کو قبول کرتے ہیں تو یہ کیس آپ کے سسٹم میں ڈپلیکیٹ کے طور پر ہو سکتا ہے۔
اگر ایسا ہے تو، آپ کو قبول کرنے کے بعد کیسز کو یکجا کرنا چاہیے۔ messageSormasToSormasSimilarConvertedCaseFound = آپ کے سسٹم میں کم از کم ایک ایسا ہی کیس ہے۔ اگر آپ درخواست کو قبول کرتے ہیں تو یہ کیس آپ کے سسٹم میں ڈپلیکیٹ کے طور پر ہو سکتا ہے۔
اگر ایسا ہے تو، آپ کو قبول کرنے کے بعد کیسز کویقینی بنانا چاہیے۔کیسز کو یکجا کرنے کے بعد، کچھ رابطوں کو قبول شدہ کیس میں دستی طور پر تبدیل کرنا ضروری ہو سکتا ہے۔۔
براہ کرم یقینی بنائیں کہ آپ اس مقصد کے لیے قبول شدہ کیس کا استعمال کرتے ہیں۔ messageSormasToSormasSimilarContactToCaseFound = آپ کے سسٹم میں کم از کم ایک ایسا ہی رابطہ موجود ہے۔
درخواست قبول کرنے کے بعد، ان رابطوں کو قبول شدہ کیس میں دستی طور پر تبدیل کرنا ضروری ہو سکتا ہے۔ @@ -1470,34 +1470,34 @@ messageUserRoleHasNoRights = اس صارف کے کردار کا کوئی حق ن messageEntriesEdited = تمام اندراجات میں ترمیم کی گئی ہے messageAllEntitiesArchived = تمام منتخب اندراجات کو آرکائیو کر لیا گیا ہے messageAllEntitiesDearchived = تمام منتخب اندراجات کو ڈی آرکائیو کر دیا گیا ہے -messageAllEventsAlreadyLinkedToGroup = All the selected events were already linked to the event group. +messageAllEventsAlreadyLinkedToGroup = تمام منتخب تقریبات پہلے ہی تقریبی گروپ سے منسلک تھے 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 -messageEnvironmentSampleSaved = Environment sample saved -messageRestoreNotPossibleAlreadyInEvent = Event participant can't be restored because the person already has another active event participant in this event -messageDuplicateEnvironmentFound = A similar environment already exists in the database (UUID\: %s) -messageCasePersonHasNoEmail=Case person has no email address specified -messageContactPersonHasNoEmail=Contact person has no email address specified -messageEventParticipantPersonHasNoEmail=Event participant person has no email address specified -messageTravelEntryPersonHasNoEmail=Travel entry person has no email address specified -messageNoExternalEmailToCaseSent=No email sent to case person -messageNoExternalEmailToContactSent=No email sent to contact person -messageNoExternalEmailToEventParticipantSent=No email sent to event participant person -messageNoExternalEmailToTravelEntrySent=No email sent to travel entry person -messageExternalEmailNoAttachments=No attachments -messageCustomizableEnumValueSaved = Customizable enum value saved -messageExternalEmailAttachmentPassword=Please use this password to open the documents sent to you via email from SORMAS\: %s -messageExternalEmailAttachmentNotAvailableInfo=Attaching documents is disabled because encryption would not be possible. To encrypt documents, the person needs to have either a national health ID specified, or a primary mobile phone number set with SMS sending set up on this system. -messagePersonNationalHealthIdInvalid=The entered national health ID does not seem to be correct +messageEnvironmentSampleOutsideJurisdictionDeletionDenied = صارف کے دائرہ اختیار سے باہر ماحول کا نمونہ مٹایا نہیں جا سکتا +messageEnvironmentJurisdictionUpdated = اس ماحول کے مقام کو تبدیل کرنے سے آپ اس کی تفصیلات تک رسائی سے محروم ہو سکتے ہیں اور/یا آپ کو مستقبل میں ترمیم کرنے کی اجازت نہیں دے سکتے۔ کیا آپ واقعی آگے بڑھنا چاہتے ہیں؟ +messageNoEnvironmentSamplesSelected = آپ نے ماحول کے کسی نمونے کا انتخاب نہیں کیا ہے +messageEnvironmentSamplesDeleted = تمام منتخب کردہ اہل ماحول کے نمونے مٹا دیے گئے ہیں +messageCountEnvironmentSamplesNotDeleted = %s ماحول کے نمونے مٹایے نہیں ہوئے\: %s +messageCountEnvironmentSamplesNotDeletedAccessDeniedReason = %s ماحولیاتی نمونے مٹاۓ نہیں گئے کیونکہ وہ دائرہ اختیار یا ملکیت میں نہیں ہیں\: %s +messageEnvironmentSamplesRestored = تمام منتخب ماحول کے نمونے بحال کر دیے گئے ہیں +messageEnvironmentSampleSaved = ماحول کا نمونہ محفوظ کر لیا گیا +messageRestoreNotPossibleAlreadyInEvent = تقریب کے شرکت کنندہ کو بحال نہیں کیا جا سکتا کیونکہ اس شخص کے پاس پہلے سے ہی اس تقریب میں ایک اور فعال شریک شریک ہے +messageDuplicateEnvironmentFound = اسی طرح کا ماحول پہلے سے ہی ڈیٹا بیس میں موجود ہے (UUID\: %s) +messageCasePersonHasNoEmail=کیس والے کا کوئی ای میل ایڈریس متعین نہیں ہے +messageContactPersonHasNoEmail=رابطہ کرنے والے شخص کا کوئی ای میل پتہ متعین نہیں ہے +messageEventParticipantPersonHasNoEmail=تقریب میں شرکت کرنے والے شخص کا کوئی ای میل پتہ نہیں ہے +messageTravelEntryPersonHasNoEmail=سفری اندراج والے شخص کا کوئی ای میل پتہ متعین نہیں ہے +messageNoExternalEmailToCaseSent=کیس والے شخص کو کوئی ای میل نہیں بھیجی گئی +messageNoExternalEmailToContactSent=رابطہ کرنے والے شخص کو کوئی ای میل نہیں بھیجی گئی +messageNoExternalEmailToEventParticipantSent=تقریب میں شرکت کرنے والے شخص کو کوئی ای میل نہیں بھیجی گئی +messageNoExternalEmailToTravelEntrySent=سفر میں داخل ہونے والے شخص کو کوئی ای میل نہیں بھیجی گئی +messageExternalEmailNoAttachments=کوئی منسلکات نہیں۔ +messageCustomizableEnumValueSaved = حسب ضرورت اینوم ویلیو محفوظ ہو گئی +messageExternalEmailAttachmentPassword=براہ کرم SORMAS سے ای میل کے ذریعے آپ کو بھیجے گئے دستاویزات کو کھولنے کے لیے اس پاس ورڈ کا استعمال کریں\: %s +messageExternalEmailAttachmentNotAvailableInfo=دستاویزات کو منسلک کرنا غیر فعال ہے کیونکہ انکرپشن ممکن نہیں ہوگی۔ دستاویزات کو انکرپٹ کرنے کے لیے، اس شخص کے پاس یا تو قومی صحت کی شناخت کی ضرورت ہوتی ہے، یا اس سسٹم پر ایس ایم ایس بھیجنے کے ساتھ ایک بنیادی موبائل فون نمبر سیٹ کرنا ہوتا ہے۔ +messagePersonNationalHealthIdInvalid=درج کردہ قومی صحت کی شناخت درست معلوم نہیں ہوتی # Notifications notificationCaseClassificationChanged = کیس %s کی درجہ بندی %s میں تبدیل ہو گئی ہے۔ notificationCaseInvestigationDone = کیس %s کی تفتیش ہو چکی ہے۔ @@ -1523,7 +1523,7 @@ notificationTaskAssociatedCaseLink = متعلقہ کیس کا لنک\: %s notificationTaskAssociatedContactLink = منسلک رابطے کا لنک\: %s notificationTaskAssociatedEventLink = متعلقہ تقریب کا لنک\: %s notificationTaskAssociatedTravelEntryLink = متعلقہ سفری اندراج کا لنک\: %s -notificationTaskAssociatedEnvironmentLink = Link to the associated environment entry\: %s +notificationTaskAssociatedEnvironmentLink = منسلک ماحول کے اندراج کا لنک\: %s notificationTaskGeneralUpdatedAssigneeUserSource = آپ کا %s کام دوسرے صارف کو دے دیا گیا ہے۔ اب آپ اس کام کے ذمہ دار نہیں ہیں۔ notificationTaskGeneralUpdatedAssigneeUserTarget = A(n) %s کام آپ کو دیا گیا ہے۔ notificationTaskSpecificUpdatedAssigneeUserSource = %s کے لیے آپ کا %s کام دوسرے صارف کو دے دیا گیا ہے۔ اب آپ اس کام کے ذمہ دار نہیں ہیں۔ @@ -1537,7 +1537,7 @@ notificationEventAddedToEventGroup = %s کو تقریبی گروہ %s (%s) می notificationEventRemovedFromEventGroup = %s کو تقریبی گروہ %s (%s) سے %s کے ذریعے ہٹا دیا گیا۔ notificationEventGroupSummary = تقریبی گروہ میں اب موجود تقریبات کا خلاصہ یہ ہے\:\n%s notificationEventGroupSummaryEmpty = یہ تقریبی گروہ خالی ہے۔ -notificationExternalEmailSent = Email message sent. +notificationExternalEmailSent = ای میل پیغام بھیجا گیا۔ #Labels labelActualLongSeed = حقیقی لمبا بیج @@ -1682,23 +1682,23 @@ 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 +promptEnvironmentSampleFreetext = نمونہ ID، لیب نمونہ ID، ماحولیاتی ID، ماحولیات کا نام +promptEnvironmentSampleRegion = ماحولیات کا علاقہ +promptEnvironmentSampleDistrict = ماحولیات کا ضلع +promptEnvironmentSampleLab = لیبارٹری +promptEnvironmentSampleTestedPathogen = ٹیسٹ شدہ پیتھوجین +promptEnvironmentSampleDateFrom = رپورٹ کی تاریخ سے... +promptEnvironmentSampleDateTo = ... تک +promptEnvironmentSampleEpiWeekFrom = ایپی ہفتہ سے رپورٹ کی تاریخ... +promptEnvironmentSampleEpiWeekTo = ...EPI ہفتہ تک +promptEnvironmentSampleLatFrom= ماحولیاتی عرض بلد سے... +promptEnvironmentSampleLatTo= ... تک +promptEnvironmentSampleLonFrom= ماحولیاتی طول البلد سے... +promptEnvironmentSampleLonTo= ... تک -promptCustomizableEnumTranslationLanguage = Language -promptCustomizableEnumTranslationCaption = Translated caption -promptCustomizableEnumSearchField = Search by value or caption... +promptCustomizableEnumTranslationLanguage = زبان +promptCustomizableEnumTranslationCaption = ترجمہ شدہ عنوان +promptCustomizableEnumSearchField = قدر یا عنوان سے تلاش کریں... # Unsaved changes unsavedChanges.warningTitle = غیر محفوظ تبدیلیاں @@ -1720,7 +1720,7 @@ ExternalSurveillanceToolGateway.notificationEntrySent = رپورٹنگ ٹول پ ExternalSurveillanceToolGateway.notificationEntriesSent = تمام منتخب اندراجات رپورٹنگ ٹول کو بھیج دیے گئے ہیں. ExternalSurveillanceToolGateway.notificationEntriesDeleted = رپورٹنگ ٹول میں تمام منتخب اندراجات کو کامیابی کے ساتھ مٹا دیا گیا ہے۔ ExternalSurveillanceToolGateway.notificationEntryNotSent = اندراج نہیں بھیجا جا سکا -ExternalSurveillanceToolGateway.notificationErrorArchiving = The entity was not archived because the communication with the reporting tool failed +ExternalSurveillanceToolGateway.notificationErrorArchiving = چیز کو آرکائیو نہیں کیا گیا کیونکہ رپورٹنگ ٹول کے ساتھ مواصلت ناکام ہو گئی۔ ExternalSurveillanceToolGateway.notificationErrorSending = اندراج بھیجتے وقت خرابی ExternalSurveillanceToolGateway.unableToSend=براہ کرم رپورٹنگ ٹول کو %s بھیجنے سے پہلے کسی بھی غیر محفوظ شدہ تبدیلیوں کو محفوظ یا رد کر دیں۔ ExternalSurveillanceToolGateway.confirmSendCase=کیا آپ واقعی کیس کو رپورٹنگ ٹول کو بھیجنا چاہتے ہیں؟ @@ -1764,4 +1764,14 @@ promptSampleDashboardFilterDateType=نمونہ حوالہ کی تاریخ headingSampleDashboardEpiCurve=حتمی لیبارٹری کے نتائج کا چارٹ headingSampleDashboardMap=نمونہ کی سٹیٹس کا نقشہ infoHeadingSampleDashboardMap=نمونے اس شخص کے گھر کے پتے کے GPS کوآرڈینیٹ کا استعمال کرتے ہوئے دکھائے جاتے ہیں۔ -infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. +infoHeadingEnvironmentSampleDashboardMap=ماحولیات کے نمونے ان نمونوں کے GPS کوآرڈینیٹس کا استعمال کرتے ہوئے دکھائے جاتے ہیں یا، اگر دستیاب نہ ہوں تو، ان سے منسلک ماحول۔ + +headingSpecailCaseAccess = خصوصی رسائی کی اجازت دیں +headingCreateSpecailCaseAccess = نئی خصوصی رسائی بنائیں +headingEditSpecailCaseAccess = خصوصی رسائی میں ترمیم کریں +headingConfirmBulkGrantSpecialAccess = خصوصی رسائی محفوظ کرنے کی تصدیق کریں +confirmationBulkGrantSpecialAccess = منتخب صارف کو پہلے سے ہی کم از کم ایک منتخب کیس تک خصوصی رسائی حاصل ہے۔ محفوظ کرنا موجودہ خصوصی رسائی کو اوور رائٹ کر دے گا۔ کیا آپ جاری رکھنا چاہتے ہیں؟ +headingBulkSpecialCaseAccessSomeNotProcessed= کچھ منتخب کیسز تک خصوصی رسائی دی گئی +headingBulkSpecialCaseAccessNoneProcessed = کسی بھی منتخب کیس تک خصوصی رسائی نہیں دی گئی +messageBulkSpecialCaseAccessAllProcessed = تمام منتخب کیسز تک خصوصی رسائی دی گئی +messageCountAccessesNotGrantedDueToError=%s کیسز پر کارروائی نہیں ہوئی ہے\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index 7e3ee10115e..0ee7bc010a2 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -1765,3 +1765,13 @@ headingSampleDashboardEpiCurve=Final Laboratory Results Chart headingSampleDashboardMap=Sample Status Map infoHeadingSampleDashboardMap=Samples are shown using the GPS coordinate of the person's home address infoHeadingEnvironmentSampleDashboardMap=Environment samples are shown using the GPS coordinates of those samples or, if not available, their associated environment. + +headingSpecailCaseAccess = Grant special access +headingCreateSpecailCaseAccess = Create new special access +headingEditSpecailCaseAccess = Edit special access +headingConfirmBulkGrantSpecialAccess = Confirm saving special access +confirmationBulkGrantSpecialAccess = The selected user already has special access to at least one of the selected cases. Saving will overwrite the existing special access. Do you want to continue? +headingBulkSpecialCaseAccessSomeNotProcessed= Granted special access to some of the selected cases +headingBulkSpecialCaseAccessNoneProcessed = Not granted special access to any of the selected cases +messageBulkSpecialCaseAccessAllProcessed = Granted special access to all selected cases +messageCountAccessesNotGrantedDueToError=%s cases have not been processed\: %s \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations_ar-SA.properties b/sormas-api/src/main/resources/validations_ar-SA.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_ar-SA.properties +++ b/sormas-api/src/main/resources/validations_ar-SA.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_cs-CZ.properties b/sormas-api/src/main/resources/validations_cs-CZ.properties index 54c85230e7d..6b8d727d5b9 100644 --- a/sormas-api/src/main/resources/validations_cs-CZ.properties +++ b/sormas-api/src/main/resources/validations_cs-CZ.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Toto číslo EPID již existuje. duplicateExternalToken = Tento externí token již existuje. futureDate = %s nemůže být delší než %s dní v budoucnu futureDateStrict = %s nemůže být v budoucnu +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Typ vlastnosti %s není povolen při importu případů importEventParticipantsPropertyTypeNotAllowed = Typ vlastnosti %s není povolen při importu událostí importEventsPropertyTypeNotAllowed = Typ vlastnosti %s není povolen při importu událostí diff --git a/sormas-api/src/main/resources/validations_de-CH.properties b/sormas-api/src/main/resources/validations_de-CH.properties index 1a9b00623e3..94608449a16 100644 --- a/sormas-api/src/main/resources/validations_de-CH.properties +++ b/sormas-api/src/main/resources/validations_de-CH.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Diese EPID-Nummer ist bereits vergeben. duplicateExternalToken = Dieses Aktenzeichen existiert bereits. futureDate = %s darf nicht mehr als %s Tage in der Zukunft sein futureDateStrict = %s kann nicht in der Zukunft liegen +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Objektart %s ist beim Import von Fällen nicht erlaubt importEventParticipantsPropertyTypeNotAllowed = Objektart %s ist beim Import von Ereignisteilnehmern nicht erlaubt importEventsPropertyTypeNotAllowed = Objektart %s ist beim Import von Ereignissen nicht erlaubt diff --git a/sormas-api/src/main/resources/validations_de-DE.properties b/sormas-api/src/main/resources/validations_de-DE.properties index 13cccfc2159..cb572ef66f4 100644 --- a/sormas-api/src/main/resources/validations_de-DE.properties +++ b/sormas-api/src/main/resources/validations_de-DE.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Diese EPID-Nummer ist bereits vergeben. duplicateExternalToken = Dieses externe Aktenzeichen existiert bereits. futureDate = %s darf nicht mehr als %s Tage in der Zukunft sein futureDateStrict = %s kann nicht in der Zukunft liegen +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Objektart %s ist beim Import von Fällen nicht erlaubt importEventParticipantsPropertyTypeNotAllowed = Objektart %s ist beim Import von Ereignisteilnehmern nicht erlaubt importEventsPropertyTypeNotAllowed = Objektart %s ist beim Import von Ereignissen nicht erlaubt diff --git a/sormas-api/src/main/resources/validations_en-AF.properties b/sormas-api/src/main/resources/validations_en-AF.properties index 9c415edd895..ff37122616a 100644 --- a/sormas-api/src/main/resources/validations_en-AF.properties +++ b/sormas-api/src/main/resources/validations_en-AF.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_en-GH.properties b/sormas-api/src/main/resources/validations_en-GH.properties index 083ea9a7118..fe16578e374 100644 --- a/sormas-api/src/main/resources/validations_en-GH.properties +++ b/sormas-api/src/main/resources/validations_en-GH.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_en-NG.properties b/sormas-api/src/main/resources/validations_en-NG.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_en-NG.properties +++ b/sormas-api/src/main/resources/validations_en-NG.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_es-BO.properties b/sormas-api/src/main/resources/validations_es-BO.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_es-BO.properties +++ b/sormas-api/src/main/resources/validations_es-BO.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_es-CU.properties b/sormas-api/src/main/resources/validations_es-CU.properties index c4eb9f4e8e1..332bc44a2ea 100644 --- a/sormas-api/src/main/resources/validations_es-CU.properties +++ b/sormas-api/src/main/resources/validations_es-CU.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Este número EPID ya existe. duplicateExternalToken = Este token externo ya existe. futureDate = %s no puede ser más de %s días en el futuro futureDateStrict = %s no puede ser en el futuro +pastDate = %s no puede ser en el pasado importCasesPropertyTypeNotAllowed = El tipo de propiedad %s no está permitido al importar casos importEventParticipantsPropertyTypeNotAllowed = El tipo de propiedad %s no está permitido al importar participantes de eventos importEventsPropertyTypeNotAllowed = El tipo de propiedad %s no está permitido al importar eventos diff --git a/sormas-api/src/main/resources/validations_es-ES.properties b/sormas-api/src/main/resources/validations_es-ES.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_es-ES.properties +++ b/sormas-api/src/main/resources/validations_es-ES.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_fa-AF.properties b/sormas-api/src/main/resources/validations_fa-AF.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_fa-AF.properties +++ b/sormas-api/src/main/resources/validations_fa-AF.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_fi-FI.properties b/sormas-api/src/main/resources/validations_fi-FI.properties index 353764dc451..b9a360813c9 100644 --- a/sormas-api/src/main/resources/validations_fi-FI.properties +++ b/sormas-api/src/main/resources/validations_fi-FI.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Tämä EPID numero on jo olemassa. duplicateExternalToken = This external token already exists. futureDate = %s ei voi olla enempää kuin %s päivää tulevaisuudessa futureDateStrict = %s ei voi olla tulevaisuudessa +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Ominaisuus %s ei ole sallittu tapausten tuonnissa importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_fil-PH.properties b/sormas-api/src/main/resources/validations_fil-PH.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_fil-PH.properties +++ b/sormas-api/src/main/resources/validations_fil-PH.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_fj-FJ.properties b/sormas-api/src/main/resources/validations_fj-FJ.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_fj-FJ.properties +++ b/sormas-api/src/main/resources/validations_fj-FJ.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_fr-CD.properties b/sormas-api/src/main/resources/validations_fr-CD.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_fr-CD.properties +++ b/sormas-api/src/main/resources/validations_fr-CD.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_fr-CH.properties b/sormas-api/src/main/resources/validations_fr-CH.properties index af79483ed48..14187c65ba7 100644 --- a/sormas-api/src/main/resources/validations_fr-CH.properties +++ b/sormas-api/src/main/resources/validations_fr-CH.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Ce numéro EPID existe déjà. duplicateExternalToken = This external token already exists. futureDate = %s ne peut pas être plus de %s jours dans le futur futureDateStrict = %s ne peut pas être dans le futur +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Type de propriété %s non autorisé lors de l'importation des cas importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_fr-FR.properties b/sormas-api/src/main/resources/validations_fr-FR.properties index 935dcabc62f..595c85d6453 100644 --- a/sormas-api/src/main/resources/validations_fr-FR.properties +++ b/sormas-api/src/main/resources/validations_fr-FR.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Ce numéro EPID existe déjà. duplicateExternalToken = Cette référence externe existe déjà. futureDate = %s ne peut pas être plus de %s jours dans le futur futureDateStrict = %s ne peut pas être dans le futur +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Type de propriété %s non autorisé lors de l'importation des cas importEventParticipantsPropertyTypeNotAllowed = Type de propriété %s non autorisé lors de l'importation des participants à l'événement importEventsPropertyTypeNotAllowed = Type de propriété %s non autorisé lors de l'importation d'événements diff --git a/sormas-api/src/main/resources/validations_fr-TN.properties b/sormas-api/src/main/resources/validations_fr-TN.properties index 764a4b0c535..beee95fc9b8 100644 --- a/sormas-api/src/main/resources/validations_fr-TN.properties +++ b/sormas-api/src/main/resources/validations_fr-TN.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Ce numéro EPID existe déjà. duplicateExternalToken = Cette référence externe existe déjà. futureDate = %s ne peut pas être plus de %s jours dans le futur futureDateStrict = %s ne peut pas être dans le futur +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Type de propriété %s non autorisé lors de l'importation des cas importEventParticipantsPropertyTypeNotAllowed = Type de propriété %s non autorisé lors de l'importation des participants à l'événement importEventsPropertyTypeNotAllowed = Type de propriété %s non autorisé lors de l'importation d'événements diff --git a/sormas-api/src/main/resources/validations_hi-IN.properties b/sormas-api/src/main/resources/validations_hi-IN.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_hi-IN.properties +++ b/sormas-api/src/main/resources/validations_hi-IN.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_hr-HR.properties b/sormas-api/src/main/resources/validations_hr-HR.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_hr-HR.properties +++ b/sormas-api/src/main/resources/validations_hr-HR.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_it-CH.properties b/sormas-api/src/main/resources/validations_it-CH.properties index e410535ef83..39fd6a1fd92 100644 --- a/sormas-api/src/main/resources/validations_it-CH.properties +++ b/sormas-api/src/main/resources/validations_it-CH.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Questo numero EPID esiste già. duplicateExternalToken = This external token already exists. futureDate = %s non può essere più di %s giorni nel futuro futureDateStrict = %s non può essere nel futuro +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Tipo di proprietà %s non consentito quando si importano casi importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_it-IT.properties b/sormas-api/src/main/resources/validations_it-IT.properties index 53948a0f676..a0b25c7446a 100644 --- a/sormas-api/src/main/resources/validations_it-IT.properties +++ b/sormas-api/src/main/resources/validations_it-IT.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = Questo numero EPID esiste già. duplicateExternalToken = This external token already exists. futureDate = %s non può essere più di %s giorni nel futuro futureDateStrict = %s non può essere nel futuro +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Tipo di proprietà %s non consentito quando si importano casi importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_ja-JP.properties b/sormas-api/src/main/resources/validations_ja-JP.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_ja-JP.properties +++ b/sormas-api/src/main/resources/validations_ja-JP.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_ne-NP.properties b/sormas-api/src/main/resources/validations_ne-NP.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_ne-NP.properties +++ b/sormas-api/src/main/resources/validations_ne-NP.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_nl-NL.properties b/sormas-api/src/main/resources/validations_nl-NL.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_nl-NL.properties +++ b/sormas-api/src/main/resources/validations_nl-NL.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_no-NO.properties b/sormas-api/src/main/resources/validations_no-NO.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_no-NO.properties +++ b/sormas-api/src/main/resources/validations_no-NO.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_pl-PL.properties b/sormas-api/src/main/resources/validations_pl-PL.properties index 296d58a2806..8a45d6603cd 100644 --- a/sormas-api/src/main/resources/validations_pl-PL.properties +++ b/sormas-api/src/main/resources/validations_pl-PL.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_ps-AF.properties b/sormas-api/src/main/resources/validations_ps-AF.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_ps-AF.properties +++ b/sormas-api/src/main/resources/validations_ps-AF.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_pt-PT.properties b/sormas-api/src/main/resources/validations_pt-PT.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_pt-PT.properties +++ b/sormas-api/src/main/resources/validations_pt-PT.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_ro-RO.properties b/sormas-api/src/main/resources/validations_ro-RO.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_ro-RO.properties +++ b/sormas-api/src/main/resources/validations_ro-RO.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_ru-RU.properties b/sormas-api/src/main/resources/validations_ru-RU.properties index 8d7fbfb7092..5f3c41c7b2e 100644 --- a/sormas-api/src/main/resources/validations_ru-RU.properties +++ b/sormas-api/src/main/resources/validations_ru-RU.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_sv-SE.properties b/sormas-api/src/main/resources/validations_sv-SE.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_sv-SE.properties +++ b/sormas-api/src/main/resources/validations_sv-SE.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_sw-KE.properties b/sormas-api/src/main/resources/validations_sw-KE.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_sw-KE.properties +++ b/sormas-api/src/main/resources/validations_sw-KE.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_tr-TR.properties b/sormas-api/src/main/resources/validations_tr-TR.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_tr-TR.properties +++ b/sormas-api/src/main/resources/validations_tr-TR.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_uk-UA.properties b/sormas-api/src/main/resources/validations_uk-UA.properties index a2113fed499..79a4bc8bc2a 100644 --- a/sormas-api/src/main/resources/validations_uk-UA.properties +++ b/sormas-api/src/main/resources/validations_uk-UA.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events diff --git a/sormas-api/src/main/resources/validations_ur-PK.properties b/sormas-api/src/main/resources/validations_ur-PK.properties index f417b7b83ea..519133b2e5e 100644 --- a/sormas-api/src/main/resources/validations_ur-PK.properties +++ b/sormas-api/src/main/resources/validations_ur-PK.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = یہ EPID نمبر پہلے سے موجود ہے۔ duplicateExternalToken = یہ بیرونی ٹوکن پہلے سے موجود ہے۔ futureDate = %sسے زیادہ نہیں ہو سکتا%sمستقبل میں دن futureDateStrict = %s مستقبل میں نہیں ہو سکتا +pastDate = %s ماضی میں نہیں ہو سکتا importCasesPropertyTypeNotAllowed = کیسز درآمد کرتے وقت پراپرٹی کی قسم %s کی اجازت نہیں ہے۔ importEventParticipantsPropertyTypeNotAllowed = تقریب کے شرکاء کو امپورٹ کرتے وقت پراپرٹی کی قسم %s کی اجازت نہیں ہے importEventsPropertyTypeNotAllowed = تقریبات کو امپورٹ کرتے وقت پراپرٹی کی قسم %s کی اجازت نہیں ہے @@ -72,8 +73,8 @@ importPersonContactDetailsWithoutFacilityType = آپ کو اس ایڈریس کے importProbablyInvalidSeparator=اپ لوڈ کردہ csv فائل شاید پہلے سے طے شدہ سیپریٹر سے مختلف سیپریٹر استعمال کرتی ہے۔ براہ کرم امپورٹ کرنے سے پہلے درست سیپریٹرمنتخب کریں۔ importIncompleteContent=فائل کا مواد نامکمل ہے۔ سرخی غائب ہیں یا امپورٹ کرنے کے لیے کوئی ڈیٹا نہیں ہے۔ ایک درست امپورٹ فائل بنانے کے لیے براہ کرم امپورٹ والی ہدایات کو چیک کریں۔ importEnvironmentPropertyTypeNotAllowed = ماحولیات کو امپورٹ کرتے وقت پراپرٹی کی قسم %s کی اجازت نہیں ہے -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 +importEnvironmentUnexpectedError = اس ماحول کو امپورٹ کرنے کی کوشش کرتے وقت غیر متوقع خرابی۔ براہ کرم اپنی غلطی کی رپورٹ فائل، ایڈمنسٹریٹر کو بھیجیں اور اس کیس کو اپنی امپورٹ فائل سے ہٹا دیں۔ +importInvalidWaterUseValue = %s کے لیے غلط قدر %s؛ ممکنہ چابیاں [%s] اور بولین ویلیو کے ساتھ json آبجیکٹ ہونا چاہیے۔ investigationStatusUnclassifiedCase = کسی غیر درجہ بند کیس کے لیے تفتیش کی حیثیت کو سب ٹھیک ہے کرنے کی اجازت نہیں ہے۔ jurisdictionChangeUserAssignment = دائرہ اختیار کی سطح کو تبدیل نہیں کیا جا سکتا کیونکہ صارف کا کردار کم از کم ایک صارف کے استعمال میں ہے۔ caseClassificationInvalid = کیس کی درجہ بندی لیب کے نتائج اور کیس کی علامات سے مطابقت نہیں رکھتی۔ @@ -129,15 +130,15 @@ validPerson = آپ کو سورماس ڈیٹا بیس سے ایک درست شخص validRegion = آپ کو ایک درست علاقہ بتانا ہوگا validResponsibleRegion = آپ کو ایک درست ذمہ دار علاقہ بتانا ہوگا validReportDateTime = آپ کو ایک درست رپورٹ کی تاریخ بتانی ہوگی -pathogenTestValidSampleOrEnvironment = You have to specify a valid sample or environment from the SORMAS database -pathogenTestValidDisease = You have to specify a valid disease -pathogenTestValidPathogen = You have to specify a valid pathogen +pathogenTestValidSampleOrEnvironment = آپ کو SORMAS ڈیٹا بیس سے ایک درست نمونہ یا ماحول بتانا ہوگا +pathogenTestValidDisease = آپ کو ایک درست بیماری بتانا ہوگی +pathogenTestValidPathogen = آپ کو ایک درست پیتھوجین کی وضاحت کرنی ہوگی validFacilityType = آپ کو ایک درست سہولت گاہ کی قسم بتانی ہوگی validHealthConditions = آپ کو صحت کی درست شرائط کو لنک کرنا ہوگا validImmunization = آپ کو ایک درست امیونائزیشن کو لنک کرنا ہوگا validReportingUser = آپ کو سورماس ڈیٹا بیس سے ایک درست صارف کی نشاندہی کرنی ہوگی validDateOfArrival = براہ کرم آمد کی درست تاریخ بتائیں -validLaboratory = You have to specify a valid laboratory +validLaboratory = آپ کو ایک درست لیبارٹری کی وضاحت کرنی ہوگی visitAfterFollowUp = فالو اپ دورانیہ کے اختتام کے بعد دورہ%d دنوں سے زیادہ نہیں ہو سکتا۔ visitBeforeCaseReport=دورہ کیس رپورٹ کی تاریخ سے پہلے %d دن سے زیادہ نہیں ہو سکتا۔ visitBeforeContactReport=رابطےکی رپورٹ کی تاریخ سے پہلے %d دن سے زیادہ کا دورہ نہیں ہو سکتا۔ @@ -146,8 +147,8 @@ visitBeforeSymptomsOnSet=دورہ، علامات شروع ہونے سے پہلے visitDate = آپ کو دورہ کی تاریخ بتانی ہوگی۔ visitSymptoms = آپ کو دورے کے لیے علامات بتانا ہوں گی۔ visitStatus = آپ کو دورہ کے لیے حالت بتانا ہوگا۔ -environmentName = You have to specify an environment name -environmentMedia = You have to specify the environment media +environmentName = آپ کو ماحول کا نام بتانا ہوگا +environmentMedia = آپ کو ماحولیاتی میڈیا کی وضاحت کرنی ہوگی softApproximateAgeTooHigh = براہ مہربانی یقینی بنائیں کہ عمر کا یہ تخمینہ درست ہے۔ اگر قابل اطلاق ہو تو اسے 150 سے کم میں تبدیل کریں۔ validPointOfEntry = آپ کو داخلے کی ایک درست جگہ بتانا ہوگا exportNoNameSpecified = براہ مہربانی اپنی ايکسپورٹ کنفیگریشن کے لیے نام ٹائپ کریں @@ -277,19 +278,19 @@ removeRolesWithEditRightFromOwnUser = فی الحال لاگ ان صارف کے removeUserRightEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف میں ترمیم کریں کو مٹایا نہیں جا سکتا removeUserEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف کے حق میں ترمیم کریں کو مٹایا نہیں جا سکتا externalMessageRefersToMultipleEntities = بیرونی پیغام سے مراد متعدد اداروں (یا تو کم از کم دو کیسز یا کیس اور ایک رابطہ یا ایونٹ میں شریک) -environmentWaterFieldsSetWithNotWaterMedia = The following fields can be set only if the media type is Water\: %s -gpsCoordinatesRequired = GPS coordinates are required -latitudeBetween = Latitude must be between -90 and 90 -longitudeBetween = Longitude must be between -180 and 180 -defaultInfrastructureAlreadyExisting = There already is another default %s in the database. Only one default %s is allowed. -defaultInfrastructureInvalidParentRegion = This district is in a different region than the default region, or there is no default region. -defaultInfrastructureInvalidParentDistrict = This community is in a different district than the default district, or there is no default district. -defaultInfrastructureNotRemovableChildCommunity = You have to remove the default community before removing the default district. -defaultInfrastructureNotRemovableChildDistrict = You have to remove the default district before removing the default region. -emailTemplateSubjectInvalid=The first line of the email template needs to start with a "\#" character followed by at most 50 characters -customizableEnumValueAllowedCharacters = Value may only consist of uppercase letters, numbers, and the characters "_" and ".". -customizableEnumValueEmptyTranslations = Please select languages and enter captions for all translations in the list. -customizableEnumValueDuplicateLanguage = Please only add one translation per language. -customizableEnumValueDuplicateValue = The value %s already exists for data type %s. Enum values have to be unique. -attachedDocumentNotRelatedToEntity=The attached document is not related to the entity. -invalidNationalHealthId=This value does not seem to be a correct national health ID \ No newline at end of file +environmentWaterFieldsSetWithNotWaterMedia = درج ذیل فیلڈز کو صرف اس صورت میں سیٹ کیا جا سکتا ہے جب میڈیا کی قسم واٹر ہو\: %s +gpsCoordinatesRequired = GPS کوآرڈینیٹ درکار ہیں +latitudeBetween = عرض البلد -90 اور 90 کے درمیان ہونا چاہیے۔ +longitudeBetween = عرض البلد -180 اور 180 کے درمیان ہونا چاہیے۔ +defaultInfrastructureAlreadyExisting = ڈیٹا بیس میں پہلے سے ہی ایک اور ڈیفالٹ %s موجود ہے۔ صرف ایک ڈیفالٹ %s کی اجازت ہے۔ +defaultInfrastructureInvalidParentRegion = یہ ضلع پہلے سے طے شدہ علاقے سے مختلف علاقے میں ہے، یا کوئی ڈیفالٹ علاقہ نہیں ہے۔ +defaultInfrastructureInvalidParentDistrict = یہ کمیونٹی پہلے سے طے شدہ ضلع سے مختلف ضلع میں ہے، یا کوئی ڈیفالٹ ضلع نہیں ہے۔ +defaultInfrastructureNotRemovableChildCommunity = ڈیفالٹ ضلع کو ہٹانے سے پہلے آپ کو ڈیفالٹ کمیونٹی کو ہٹانا ہوگا۔ +defaultInfrastructureNotRemovableChildDistrict = پہلے سے طے شدہ علاقے کو ہٹانے سے پہلے آپ کو پہلے سے طے شدہ ضلع کو ہٹانا ہوگا۔ +emailTemplateSubjectInvalid=ای میل ٹیمپلیٹ کی پہلی لائن کو "\#" حرف سے شروع کرنے کی ضرورت ہے جس کے بعد زیادہ سے زیادہ 50 حروف ہوں +customizableEnumValueAllowedCharacters = قدر صرف بڑے حروف، اعداد، اور حروف "_" اور "." پر مشتمل ہو سکتی ہے۔ +customizableEnumValueEmptyTranslations = فہرست میں تمام تراجم کے لیے براہ کرم زبانیں منتخب کریں اور کیپشن درج کریں۔ +customizableEnumValueDuplicateLanguage = براہ کرم فی زبان صرف ایک ترجمہ شامل کریں۔ +customizableEnumValueDuplicateValue = ڈیٹا کی قسم %s کے لیے قدر %s پہلے سے موجود ہے۔ اینوم کی قدریں منفرد ہونی چاہئیں۔ +attachedDocumentNotRelatedToEntity=منسلک دستاویز چیز سے متعلق نہیں ہے۔ +invalidNationalHealthId=یہ قدر صحیح قومی صحت کی شناخت نہیں لگتی ہے \ 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 26ade444ac6..2d68fe4f3ce 100644 --- a/sormas-api/src/main/resources/validations_zh-CN.properties +++ b/sormas-api/src/main/resources/validations_zh-CN.properties @@ -25,6 +25,7 @@ duplicateEpidNumber = This EPID number already exists. duplicateExternalToken = This external token already exists. futureDate = %s cannot be more than %s days in the future futureDateStrict = %s cannot be in the future +pastDate = %s cannot be in the past importCasesPropertyTypeNotAllowed = Property type %s not allowed when importing cases importEventParticipantsPropertyTypeNotAllowed = Property type %s not allowed when importing event participants importEventsPropertyTypeNotAllowed = Property type %s not allowed when importing events 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 aa026914546..46d4e4a3921 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 @@ -42,7 +42,7 @@ تصدیق کریں۔ اندراج کریں اس رابطہ شدہ شخص کے لیے کیس بنائیں - Create a case for this event participant + اس تقریب کے شریک کے لیے ایک کیس بنائیں علاج کا انداج کریں ڈیٹا میں ترمیم کریں مٹا ديں @@ -54,10 +54,10 @@ ترمیم کریں کیس میں ترمیم کریں رابطہ شدہ شخص کی معلومات میں ترمیم کریں - Edit Environment + ماحولیات میں ترمیم کریں تقریب میں ترمیم کریں نمونہ میں ترمیم کریں - Edit Environment Sample + ماحولیاتی نمونہ میں ترمیم کریں پن بھول گئے؟ مد د انسٹال کریں @@ -73,14 +73,14 @@ نئی امیونائزیشن مہم کا نیا ڈیٹا فارم نیا رابطہ شدہ شخص - New Environment + نیا ماحول نئی تقریب نیا نمونہ - New Environment Sample + نیا ماحول کا نمونہ نیا کام غیر قابل عمل ٹھیک ہے - Open Case of Event Participant + تقریب کے شریک کا کھلا کیس نسخہ کھولیں نتیجہ خیز کیس کھولیں اوپن سورس کیس @@ -103,7 +103,7 @@ تقریب میں شریک شخص کو محفوظ کریں نسخہ محفوظ کریں نمونہ محفوظ کریں - Save Environment Sample + ماحولیاتی نمونہ محفوظ کریں کام کو محفوظ کریں۔ علاج محفوظ کریں فالو اپ وزٹ کو محفوظ کریں @@ -169,18 +169,18 @@ چھوڑ دیا EPI ہفتہ رپورٹ - E-mail: - Environment Information - Environment Samples - Environment Tasks - Environment Sample Information + ای میل + ماحولیات کی معلومات + ماحولیاتی نمونے + ماحولیات کے کام + ماحولیات کے نمونے کی معلومات تفصیل تقریب کی معلومات پتہ - Event Participant + تقریب میں شریک تقریب کے شرکاء کی امیونائزیشن تقریب کے شرکاء کی ویکسینیشنز - Event Participants + تقریب کے شرکاہ تقریب کی تاریخ تقریب کےکام سرانجام کندہ @@ -200,7 +200,7 @@ منفی نیا کیس نیا ربط - New Event Participant + تقریب کا نیا شریک نیا نمونہ نیا پیتھوجین ٹیسٹ نیا کام @@ -213,7 +213,7 @@ مدت کا اختتام مدت کا آغاز ذاتی معلومات - Phone number: + فون نمبر: مثبت ممکنہ تقریبات تجویز کندہ @@ -286,7 +286,7 @@ کیا آپ واقعی قرنطینہ میں توسیع کرنا چاہتے ہیں؟ کیا آپ واقعی قرنطینہ کو کم کرنا چاہتے ہیں؟ کیا آپ بھی چاہیں گے کہ فالو اپ کی مدت اسی کے مطابق بڑھائی جائے؟ - 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? + اس ماحول کے مقام کو تبدیل کرنے سے آپ اس کی تفصیلات تک رسائی سے محروم ہو سکتے ہیں اور/یا آپ کو مستقبل میں ترمیم کرنے کی اجازت نہیں دے سکتے۔ کیا آپ واقعی آگے بڑھنا چاہتے ہیں؟ EPI ہفتہ پہلا نام آخری نام @@ -336,7 +336,7 @@ پن کی تصدیق کریں تصدیق رابطہ شدہ شخص میں ترمیم کریں - Contact information + رابطے کی معلومات نیا رابطہ شدہ شخص رابطہ شدہ شخص کوپڑھیں رابطہ شدہ شخص کا خلاصہ @@ -353,8 +353,8 @@ اُف، کچھ غلط ہو گیا ہے تقریب میں ترمیم کریں نئی تقریب - Event Participant - New Event Participant + تقریب میں شریک + تقریب کا نیا شریک تقریب کوپڑھیں تقریب کا خلاصہ تقریب کی فہرست @@ -393,17 +393,17 @@ نمونہ میں ترمیم کریں نیا نمونہ نمونہ پڑھیں - Read Environment Sample - Edit Environment Sample - New Environment Sample + ماحولیاتی نمونہ پڑھیں + ماحولیاتی نمونہ میں ترمیم کریں + نیا ماحول کا نمونہ نمونہ کا خلاصہ نمونہ کی فہرست - Environment Sample Listing - Environment Listing - Edit Environment - New Environment - Read Environment - Environment location update + ماحولیات کے نمونے کی فہرست + ماحولیات کی فہرست + ماحولیات میں ترمیم کریں + نیا ماحول + ماحولیات پڑھیں + ماحولیاتی مقام کی اپ ڈیٹ امیونائزیشن میں ترمیم کریں نئی امیونائزیشن امیونائزیشن پڑھیں @@ -452,10 +452,10 @@ ویکسینیش کی ترمیم کریں نئی ویکسینیشن مخصوص کیس تلاش کریں - Laboratory sample - Sample measurements - Location of sampling site - Sample management + لیبارٹری کا نمونہ + نمونے کی پیمائش + نمونے لینے کی جگہ کا مقام + نمونہ کا انتظام اوپر دائیں جانب \"+\" علامت کو دبا کر ایک نئا اندراج شامل کریں مٹا دیں برائے مہربانی ایک چار ہندسوں کا پن منتخب کریں جسے آپ جب بھی سورماس ایپ کھولیں گے تو اپنی تصدیق کے لیے استعمال کریں گے @@ -529,7 +529,7 @@ رپورٹس نمونے ماحولیات - Environment Samples + ماحولیاتی نمونے امیونائزیشنز ترتیبات کام @@ -558,8 +558,8 @@ آپ انٹرنیٹ سے منسلک نہیں ہیں۔ کوئی مماثل افراد نہیں ملے۔ ظاہر کرنے کے لیے مزید اندراجات نہیں ہیں۔ - No user has been selected - Not specified + کوئی صارف منتخب نہیں کیا گیا ہے + متعین نہیں ہے پن کامیابی کے ساتھ تبدیل کر دیا گیا ہے۔ پن درست ہے۔ سورماس شروع ہو رہا ہے... پن میں لگاتار نمبر نہیں ہونےچاہیے۔ @@ -698,7 +698,7 @@ ویکسینیشن کی تاریخ دستیاب نہیں ہے ویکسین دستیاب نہیں مینوفیکچرر دستیاب نہیں ہے - Environment Name N/A - Use rapid event participant entry - Environment Media N/A + ماحولیات کا نام N/A + تیزی سے تقریب میں شرکت کرنے والے اندراج کا استعمال کریں + ماحولیاتی میڈیا N/A From 09a7a09b7bf3316bb0488663390e82fc8522589b Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Wed, 21 Feb 2024 14:03:30 +0200 Subject: [PATCH 60/65] #12963 Incorrect saving message appears when saving a sample --- .../de/symeda/sormas/ui/samples/PathogenTestController.java | 4 +++- .../sormas/ui/samples/humansample/SampleController.java | 4 ++++ .../humansample/SampleEditPathogenTestListHandler.java | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) 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 b649828a8d2..6d5e572083b 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 @@ -311,7 +311,9 @@ public void savePathogenTests(List pathogenTests, SampleReferen handleAssociatedCase(pathogenTests, associatedCase, suppressNavigateToCase); } - Notification.show(I18nProperties.getString(Strings.messagePathogenTestsSavedShort), TRAY_NOTIFICATION); + Notification.show( + I18nProperties.getString(pathogenTests.size() == 1 ? Strings.messagePathogenTestSavedShort : Strings.messagePathogenTestsSavedShort), + TRAY_NOTIFICATION); } private void handleAssociatedCase(List pathogenTests, CaseReferenceDto associatedCase, boolean suppressNavigateToCase) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleController.java index 80d4b0a8b3f..484ce53a27a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleController.java @@ -304,6 +304,8 @@ private CommitDiscardWrapperComponent getSampleCreateComponent if (callback != null) { callback.run(); } + + Notification.show(I18nProperties.getString(Strings.messageSampleSaved), Type.TRAY_NOTIFICATION); } }); @@ -360,6 +362,8 @@ public CommitDiscardWrapperComponent getSampleReferralCreateCo SampleDto updatedSample = FacadeProvider.getSampleFacade().getSampleByUuid(existingSample.getUuid()); updatedSample.setReferredTo(referralSample.toReference()); FacadeProvider.getSampleFacade().saveSample(updatedSample); + + Notification.show(I18nProperties.getString(Strings.messageSampleSaved), Type.TRAY_NOTIFICATION); } }); return createView; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditPathogenTestListHandler.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditPathogenTestListHandler.java index bef6f496c85..8e4fd0a6cca 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditPathogenTestListHandler.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/humansample/SampleEditPathogenTestListHandler.java @@ -39,6 +39,8 @@ public List getPathogenTests() { } public void saveAll(SampleReferenceDto sample) { - ControllerProvider.getPathogenTestController().savePathogenTests(pathogenTests, sample, true); + if (!pathogenTests.isEmpty()) { + ControllerProvider.getPathogenTestController().savePathogenTests(pathogenTests, sample, true); + } } } From 0c831e40f0382b2e2a2c6d629317189918296b50 Mon Sep 17 00:00:00 2001 From: Carina Paul Date: Thu, 22 Feb 2024 10:12:05 +0200 Subject: [PATCH 61/65] #12983 - Exposure data tab has error when edit/save --- .../main/java/de/symeda/sormas/ui/exposure/ExposuresField.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java index dc6903ec691..c4fe101590a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java @@ -226,8 +226,9 @@ private void addGeneratedColumns(Table table) { table.addGeneratedColumn(COLUMN_SOURCE_CASE_NAME, (Table.ColumnGenerator) (source, itemId, columnId) -> { ExposureDto exposure = (ExposureDto) itemId; + ContactReferenceDto contactToCase = exposure.getContactToCase(); return !isPseudonymized - ? DataHelper.toStringNullable(getContactCaseName(exposure.getContactToCase())) + ? DataHelper.toStringNullable(contactToCase != null ? getContactCaseName(contactToCase) : null) : I18nProperties.getCaption(Captions.inaccessibleValue); }); } From 921c121e8859aab53b8dc5185ccb31deed700bac Mon Sep 17 00:00:00 2001 From: mk-sgent <97879405+mk-sgent@users.noreply.github.com> Date: Thu, 22 Feb 2024 10:18:44 +0100 Subject: [PATCH 62/65] qa-auto/HSP-6630 Stabilize User permission rights 22.02.2024 - updated user permission rights for all users * qa-auto/HSP-6630 Stabilize User permission rights 22.02.2024 - updated user permission rights for all users * qa-auto/HSP-6630 Stabilize User permission rights 22.02.2024 - added tags * qa-auto/HSP-6630 Stabilize User permission rights 22.02.2024 - tags has been removed --- .../userRightsJsonTemplates/AutomationAdminUserRights.json | 2 +- .../userRightsJsonTemplates/AutomationAdminUserRightsDE.json | 2 +- .../resources/userRightsJsonTemplates/NationalUserRights.json | 2 +- .../userRightsJsonTemplates/NationalUserRightsDE.json | 3 +-- .../userRightsJsonTemplates/SormasToSormasUserRights.json | 2 +- .../resources/userRightsJsonTemplates/SurvnetUserRights.json | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json index 7edc32d3e5d..c0c5dbd7695 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRights.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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","GRANT_SPECIAL_CASE_ACCESS","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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","GRANT_SPECIAL_CASE_ACCESS","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_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 7edc32d3e5d..c0c5dbd7695 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/AutomationAdminUserRightsDE.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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","GRANT_SPECIAL_CASE_ACCESS","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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","GRANT_SPECIAL_CASE_ACCESS","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_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 f59cc339141..485c477ca2d 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRights.json @@ -1 +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","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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","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 8c3becda9dc..485c477ca2d 100644 --- a/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json +++ b/sormas-e2e-tests/src/main/resources/userRightsJsonTemplates/NationalUserRightsDE.json @@ -1,2 +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","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","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","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 d4ec43b11a5..ed4bdae782a 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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","GRANT_SPECIAL_CASE_ACCESS","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 +["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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","GRANT_SPECIAL_CASE_ACCESS","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_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 4270d026ca8..ed4bdae782a 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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","GRANT_SPECIAL_CASE_ACCESS","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 +["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","CUSTOMIZABLE_ENUM_MANAGEMENT","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","EMAIL_TEMPLATE_MANAGEMENT","ENVIRONMENT_ARCHIVE","ENVIRONMENT_CREATE","ENVIRONMENT_DELETE","ENVIRONMENT_EDIT","ENVIRONMENT_EXPORT","ENVIRONMENT_IMPORT","ENVIRONMENT_PATHOGEN_TEST_CREATE","ENVIRONMENT_PATHOGEN_TEST_DELETE","ENVIRONMENT_PATHOGEN_TEST_EDIT","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_EMAIL_ATTACH_DOCUMENTS","EXTERNAL_EMAIL_SEND","EXTERNAL_MESSAGE_DELETE","EXTERNAL_MESSAGE_PROCESS","EXTERNAL_MESSAGE_VIEW","EXTERNAL_SURVEILLANCE_DELETE","EXTERNAL_SURVEILLANCE_SHARE","GRANT_SPECIAL_CASE_ACCESS","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_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 From 61d42196624986f4df1d2a1ea842169976ee159b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 22 Feb 2024 10:45:15 +0100 Subject: [PATCH 63/65] Increase minimum required API version --- .../src/main/java/de/symeda/sormas/api/utils/InfoProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/InfoProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/InfoProvider.java index a8f72e7d5f4..10ba422c0d7 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/InfoProvider.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/InfoProvider.java @@ -77,7 +77,7 @@ static String createLastCommitHistoryUrl(String gitRemoteOriginUrl, String commi * @return */ public String getMinimumRequiredVersion() { - return "1.90.0"; + return "1.94.0"; } /** From 538bd5d95ed3a187d1e638c7519205bfe1bd8376 Mon Sep 17 00:00:00 2001 From: jen kins Date: Thu, 22 Feb 2024 13:39:59 +0100 Subject: [PATCH 64/65] Updated version number --- .../resources/doc/SORMAS_Data_Dictionary.xlsx | Bin 273493 -> 273500 bytes .../main/resources/doc/SORMAS_User_Roles.xlsx | Bin 35095 -> 34796 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 39fb8289ac0eeeb5d5328b7100aa49be4a4d3647..25705655ea8989890a4ab2dc667cc53150d363b5 100644 GIT binary patch delta 118238 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

%H4H@6lyVLRch6*&1L^V1f;Ms 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

EVqW0<=>Q+)|xVj#$iN9)e_ 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 z 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 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 77b355ff3cd1a5c86c4e4ab6aa80294c4b8d08d2..2128e535e1be155a637697a876ede65be211626b 100644 GIT binary patch literal 34796 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 L0G+95#()0<>x6j) From 870ed75c4e81a6a1a56d054f8700c3c673a4bacc Mon Sep 17 00:00:00 2001 From: jenkins Date: Thu, 22 Feb 2024 13:40:07 +0100 Subject: [PATCH 65/65] [GITFLOW]updating poms for branch'release-1.95.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 5d9d3081e73..1f173c8d7a9 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index f91cdef48f2..a349d709b6c 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 3f5cd7773c7..4f0590a6068 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base 4.0.0 diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 1d317fa7be4..8af754a59a2 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.95.0-SNAPSHOT + 1.95.0 3.6.3 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index d5cd58a79eb..92ebe36ccee 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index d304af4c2af..32a69d39c01 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index e5b8ed57ef7..800710258bf 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.95.0-SNAPSHOT + 1.95.0 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index c7ef31458bc..002d51033f5 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base diff --git a/sormas-serverlibs/pom.xml b/sormas-serverlibs/pom.xml index bbb89ea43ee..e2e17db5df2 100644 --- a/sormas-serverlibs/pom.xml +++ b/sormas-serverlibs/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base 4.0.0 diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 026122208f0..5ce70ae2e7a 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 2cf7c307fb2..2fa822d3938 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.95.0-SNAPSHOT + 1.95.0 ../sormas-base 4.0.0