diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java
index ccb758c907c..e4483dbec43 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestDto.java
@@ -1,17 +1,14 @@
/*
* 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 .
*/
@@ -31,6 +28,7 @@
import de.symeda.sormas.api.sormastosormas.SormasToSormasConfig;
import de.symeda.sormas.api.user.UserDto;
import de.symeda.sormas.api.user.UserReferenceDto;
+import de.symeda.sormas.api.user.UserRole;
import de.symeda.sormas.api.utils.DataHelper;
import de.symeda.sormas.api.utils.DateFormatHelper;
import de.symeda.sormas.api.utils.FieldConstraints;
@@ -133,6 +131,9 @@ public static PathogenTestDto build(SampleDto sample, UserDto currentUser) {
if (sample.getSamplePurpose() == SamplePurpose.INTERNAL) {
pathogenTest.setTestResultVerified(true);
}
+ if (currentUser.getUserRoles().contains(UserRole.LAB_USER)) {
+ pathogenTest.setTestResultVerified(false);
+ }
pathogenTest.setLab(currentUser.getLaboratory());
if (pathogenTest.getLab() == null) {
pathogenTest.setLab(sample.getLab());
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 d7653931546..68fd0c36c54 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
@@ -31,6 +31,8 @@
import static de.symeda.sormas.api.user.UserRole.EXTERNAL_LAB_USER;
import static de.symeda.sormas.api.user.UserRole.HOSPITAL_INFORMANT;
import static de.symeda.sormas.api.user.UserRole.IMPORT_USER;
+import static de.symeda.sormas.api.user.UserRole.LAB_ATTENDANT;
+import static de.symeda.sormas.api.user.UserRole.LAB_SUPERVISOR;
import static de.symeda.sormas.api.user.UserRole.LAB_USER;
import static de.symeda.sormas.api.user.UserRole.NATIONAL_CLINICIAN;
import static de.symeda.sormas.api.user.UserRole.NATIONAL_OBSERVER;
@@ -71,6 +73,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -94,6 +97,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_ATTENDANT,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -114,6 +119,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -164,6 +170,8 @@ public enum UserRight {
SURVEILLANCE_OFFICER,
CASE_SUPERVISOR,
LAB_USER,
+ LAB_ATTENDANT,
+ LAB_SUPERVISOR,
COMMUNITY_OFFICER
),
CASE_CHANGE_DISEASE(
@@ -207,7 +215,8 @@ public enum UserRight {
CASE_SUPERVISOR,
CONTACT_SUPERVISOR,
POE_SUPERVISOR,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR
),
CASE_SHARE(
ADMIN,
@@ -250,6 +259,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -270,6 +281,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -290,6 +302,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -319,6 +332,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -339,6 +354,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -367,6 +383,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
COMMUNITY_OFFICER
),
SAMPLE_VIEW(
@@ -387,6 +404,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EXTERNAL_LAB_USER,
EVENT_OFFICER,
COMMUNITY_OFFICER
@@ -404,6 +423,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER,
COMMUNITY_OFFICER
),
@@ -411,7 +431,8 @@ public enum UserRight {
ADMIN,
SURVEILLANCE_SUPERVISOR,
ADMIN_SUPERVISOR,
- EVENT_OFFICER
+ EVENT_OFFICER,
+ LAB_SUPERVISOR
),
SAMPLE_DELETE(
ADMIN,
@@ -426,6 +447,7 @@ public enum UserRight {
ADMIN_SUPERVISOR,
CASE_SUPERVISOR,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER
),
SAMPLE_EXPORT(
@@ -436,7 +458,8 @@ public enum UserRight {
ADMIN_SUPERVISOR,
CASE_SUPERVISOR,
CONTACT_SUPERVISOR,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR
),
PATHOGEN_TEST_CREATE(
ADMIN,
@@ -448,6 +471,7 @@ public enum UserRight {
CASE_SUPERVISOR,
EVENT_OFFICER,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER,
COMMUNITY_OFFICER
),
@@ -461,6 +485,7 @@ public enum UserRight {
CASE_SUPERVISOR,
EVENT_OFFICER,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER,
COMMUNITY_OFFICER
),
@@ -474,6 +499,8 @@ public enum UserRight {
CASE_SUPERVISOR,
CASE_OFFICER,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EXTERNAL_LAB_USER
),
ADDITIONAL_TEST_CREATE(
@@ -482,6 +509,7 @@ public enum UserRight {
CASE_SUPERVISOR,
CASE_OFFICER,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER
),
ADDITIONAL_TEST_EDIT(
@@ -490,6 +518,7 @@ public enum UserRight {
CASE_SUPERVISOR,
CASE_OFFICER,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER
),
ADDITIONAL_TEST_DELETE(
@@ -522,7 +551,9 @@ public enum UserRight {
CONTACT_OFFICER,
EVENT_OFFICER,
COMMUNITY_OFFICER,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT
),
CONTACT_ASSIGN(
@@ -539,7 +570,8 @@ public enum UserRight {
CONTACT_SUPERVISOR,
CONTACT_OFFICER,
COMMUNITY_OFFICER,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR
),
CONTACT_DELETE(
ADMIN,
@@ -571,7 +603,8 @@ public enum UserRight {
ADMIN_SUPERVISOR,
CASE_SUPERVISOR,
CONTACT_SUPERVISOR,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR
),
// reassign or remove the case from an existing contact
CONTACT_REASSIGN_CASE(
@@ -623,7 +656,8 @@ public enum UserRight {
ADMIN_SUPERVISOR,
CASE_SUPERVISOR,
CONTACT_SUPERVISOR,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR
),
TASK_CREATE(
ADMIN,
@@ -636,6 +670,7 @@ public enum UserRight {
CONTACT_SUPERVISOR,
POE_SUPERVISOR,
LAB_USER,
+ LAB_SUPERVISOR,
SURVEILLANCE_OFFICER,
COMMUNITY_OFFICER
),
@@ -659,6 +694,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EXTERNAL_LAB_USER,
EVENT_OFFICER,
COMMUNITY_OFFICER
@@ -680,6 +717,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER,
EVENT_OFFICER,
COMMUNITY_OFFICER
@@ -695,6 +733,7 @@ public enum UserRight {
CONTACT_SUPERVISOR,
POE_SUPERVISOR,
LAB_USER,
+ LAB_SUPERVISOR,
SURVEILLANCE_OFFICER,
COMMUNITY_OFFICER
),
@@ -719,6 +758,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EXTERNAL_LAB_USER,
EVENT_OFFICER,
COMMUNITY_OFFICER
@@ -773,7 +813,9 @@ public enum UserRight {
COMMUNITY_INFORMANT,
EVENT_OFFICER,
COMMUNITY_OFFICER,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT
),
EVENT_EDIT(
ADMIN,
@@ -799,7 +841,8 @@ public enum UserRight {
CASE_SUPERVISOR,
CONTACT_SUPERVISOR,
POE_SUPERVISOR,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR
),
EVENT_ARCHIVE(
ADMIN,
@@ -829,7 +872,8 @@ public enum UserRight {
SURVEILLANCE_OFFICER,
EVENT_OFFICER,
COMMUNITY_OFFICER,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR
),
EVENTPARTICIPANT_DELETE(
ADMIN,
@@ -971,6 +1015,8 @@ public enum UserRight {
CONTACT_SUPERVISOR,
POE_SUPERVISOR,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
COMMUNITY_OFFICER
),
STATISTICS_EXPORT(
@@ -984,6 +1030,7 @@ public enum UserRight {
CONTACT_SUPERVISOR,
POE_SUPERVISOR,
LAB_USER,
+ LAB_SUPERVISOR,
COMMUNITY_OFFICER
),
DATABASE_EXPORT_ACCESS(
@@ -1057,6 +1104,8 @@ public enum UserRight {
CASE_SUPERVISOR,
POE_SUPERVISOR,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EVENT_OFFICER,
SURVEILLANCE_OFFICER,
CASE_OFFICER,
@@ -1100,7 +1149,9 @@ public enum UserRight {
NATIONAL_CLINICIAN,
CASE_SUPERVISOR,
CASE_OFFICER,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT
),
THERAPY_VIEW(
ADMIN,
@@ -1191,6 +1242,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -1282,7 +1335,9 @@ public enum UserRight {
REST_EXTERNAL_VISITS_USER,
SORMAS_TO_SORMAS_CLIENT,
COMMUNITY_OFFICER,
- LAB_USER
+ LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT
),
SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION(
REST_EXTERNAL_VISITS_USER,
@@ -1304,6 +1359,8 @@ public enum UserRight {
COMMUNITY_INFORMANT,
POE_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
REST_EXTERNAL_VISITS_USER,
SORMAS_TO_SORMAS_CLIENT,
COMMUNITY_OFFICER
@@ -1428,6 +1485,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -1451,6 +1510,8 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
+ LAB_ATTENDANT,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -1471,6 +1532,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
@@ -1491,6 +1553,7 @@ public enum UserRight {
HOSPITAL_INFORMANT,
COMMUNITY_INFORMANT,
LAB_USER,
+ LAB_SUPERVISOR,
EVENT_OFFICER,
COMMUNITY_OFFICER
),
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRole.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRole.java
index b9214402cb8..4ac8ada56b2 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRole.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRole.java
@@ -51,6 +51,8 @@ public enum UserRole
CONTACT_OFFICER(false, true, false, false, JurisdictionLevel.DISTRICT),
EVENT_OFFICER(true, false, false, false, JurisdictionLevel.REGION),
LAB_USER(false, false, false, false, JurisdictionLevel.LABORATORY),
+ LAB_ATTENDANT(false, false, false, false, JurisdictionLevel.LABORATORY),
+ LAB_SUPERVISOR(false, false, false, false, JurisdictionLevel.LABORATORY),
EXTERNAL_LAB_USER(false, false, false, false, JurisdictionLevel.EXTERNAL_LABORATORY),
NATIONAL_OBSERVER(false, false, false, false, JurisdictionLevel.NATION),
STATE_OBSERVER(false, false, false, false, JurisdictionLevel.REGION),
@@ -85,6 +87,8 @@ public enum UserRole
public static final String _CONTACT_OFFICER = CONTACT_OFFICER.name();
public static final String _EVENT_OFFICER = EVENT_OFFICER.name();
public static final String _LAB_USER = LAB_USER.name();
+ public static final String _LAB_ATTENDANT = LAB_ATTENDANT.name();
+ public static final String _LAB_SUPERVISOR = LAB_SUPERVISOR.name();
public static final String _EXTERNAL_LAB_USER = EXTERNAL_LAB_USER.name();
public static final String _NATIONAL_OBSERVER = NATIONAL_OBSERVER.name();
public static final String _NATIONAL_CLINICIAN = NATIONAL_CLINICIAN.name();
@@ -173,6 +177,8 @@ public void addAssignableRoles(Collection collection) {
collection.add(CONTACT_OFFICER);
collection.add(SURVEILLANCE_OFFICER);
collection.add(LAB_USER);
+ collection.add(LAB_ATTENDANT);
+ collection.add(LAB_SUPERVISOR);
collection.add(NATIONAL_OBSERVER);
collection.add(STATE_OBSERVER);
collection.add(DISTRICT_OBSERVER);
@@ -209,6 +215,12 @@ public void addAssignableRoles(Collection collection) {
case LAB_USER:
collection.add(LAB_USER);
break;
+ case LAB_ATTENDANT:
+ collection.add(LAB_ATTENDANT);
+ break;
+ case LAB_SUPERVISOR:
+ collection.add(LAB_SUPERVISOR);
+ break;
case EXTERNAL_LAB_USER:
collection.add(EXTERNAL_LAB_USER);
break;
@@ -306,7 +318,10 @@ public static boolean isPortHealthUser(Collection roles) {
}
public static boolean isLabUser(Collection roles) {
- return roles.contains(UserRole.LAB_USER) || roles.contains(UserRole.EXTERNAL_LAB_USER);
+ return roles.contains(UserRole.LAB_USER)
+ || roles.contains(UserRole.EXTERNAL_LAB_USER)
+ || roles.contains(UserRole.LAB_ATTENDANT)
+ || roles.contains(UserRole.LAB_SUPERVISOR);
}
public static void validate(Collection roles) throws UserRoleValidationException {
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/DefaultEntityHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DefaultEntityHelper.java
index 8ef00913fd0..9a9087420de 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/DefaultEntityHelper.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DefaultEntityHelper.java
@@ -32,6 +32,7 @@ public class DefaultEntityHelper {
public static final DataHelper.Pair CASE_SUP_USERNAME_AND_PASSWORD = new DataHelper.Pair<>("CaseSup", "CaseSup");
public static final DataHelper.Pair CONT_SUP_USERNAME_AND_PASSWORD = new DataHelper.Pair<>("ContSup", "ContSup");
public static final DataHelper.Pair POE_SUP_USERNAME_AND_PASSWORD = new DataHelper.Pair<>("PoeSup", "PoeSup");
+ public static final DataHelper.Pair LAB_SUP_USERNAME_AND_PASSWORD = new DataHelper.Pair<>("LabSup", "LabSup");
public static final DataHelper.Pair LAB_OFF_USERNAME_AND_PASSWORD = new DataHelper.Pair<>("LabOff", "LabOff");
public static final DataHelper.Pair EVE_OFF_USERNAME_AND_PASSWORD = new DataHelper.Pair<>("EveOff", "EveOff");
public static final DataHelper.Pair NAT_USER_USERNAME_AND_PASSWORD = new DataHelper.Pair<>("NatUser", "NatUser");
@@ -51,6 +52,7 @@ public class DefaultEntityHelper {
CASE_SUP_USERNAME_AND_PASSWORD,
CONT_SUP_USERNAME_AND_PASSWORD,
POE_SUP_USERNAME_AND_PASSWORD,
+ LAB_SUP_USERNAME_AND_PASSWORD,
LAB_OFF_USERNAME_AND_PASSWORD,
EVE_OFF_USERNAME_AND_PASSWORD,
NAT_USER_USERNAME_AND_PASSWORD,
diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties
index 2a4ff680135..02fc5aba997 100644
--- a/sormas-api/src/main/resources/enum.properties
+++ b/sormas-api/src/main/resources/enum.properties
@@ -1446,6 +1446,8 @@ UserRole.EXTERNAL_LAB_USER = External Lab Officer
UserRole.HOSPITAL_INFORMANT = Hospital Informant
UserRole.IMPORT_USER = Import User
UserRole.LAB_USER = Lab Officer
+UserRole.LAB_SUPERVISOR = Lab Supervisor
+UserRole.LAB_ATTENDANT = Lab Attendant
UserRole.NATIONAL_CLINICIAN = National Clinician
UserRole.NATIONAL_OBSERVER = National Observer
UserRole.NATIONAL_USER = National User
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java
index d1c21cb78c0..1ff05ed7df8 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java
@@ -378,6 +378,14 @@ private void createDefaultUsers() {
DefaultEntityHelper.POE_SUP_USERNAME_AND_PASSWORD,
u -> u.setRegion(region));
+ // Create Point of Lab Supervisor
+ createAndPersistDefaultUser(
+ UserRole.LAB_SUPERVISOR,
+ "Laboratory",
+ "Supervisor",
+ DefaultEntityHelper.LAB_SUP_USERNAME_AND_PASSWORD,
+ u -> u.setLaboratory(laboratory));
+
// Create Laboratory Officer
createAndPersistDefaultUser(
UserRole.LAB_USER,
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java
index 21a52a344b8..d9119a336bc 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java
@@ -336,7 +336,7 @@ public List getLabUsersOfLab(Facility facility) {
Predicate filter = cb.and(
createDefaultFilter(cb, from),
cb.equal(from.get(User.LABORATORY), facility),
- joinRoles.in(Arrays.asList(UserRole.LAB_USER, UserRole.EXTERNAL_LAB_USER)));
+ joinRoles.in(Arrays.asList(UserRole.LAB_USER, UserRole.EXTERNAL_LAB_USER, UserRole.LAB_ATTENDANT, UserRole.LAB_SUPERVISOR)));
cq.where(filter).distinct(true);
return em.createQuery(cq).getResultList();
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 ca03fb66794..1e4da937cef 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
@@ -46,6 +46,14 @@
LAB_USER
LAB_USER
+
+ LAB_SUPERVISOR
+ LAB_SUPERVISOR
+
+
+ LAB_ATTENDANT
+ LAB_ATTENDANT
+
EXTERNAL_LAB_USER
EXTERNAL_LAB_USER
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java
index 4fcf3e76b40..4a753f4bc6e 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java
@@ -53,8 +53,10 @@
import de.symeda.sormas.api.sample.PathogenTestType;
import de.symeda.sormas.api.sample.SampleDto;
import de.symeda.sormas.api.sample.SamplePurpose;
+import de.symeda.sormas.api.user.UserRole;
import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers;
import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers;
+import de.symeda.sormas.ui.UserProvider;
import de.symeda.sormas.ui.utils.AbstractEditForm;
import de.symeda.sormas.ui.utils.CssStyles;
import de.symeda.sormas.ui.utils.DateComparisonValidator;
@@ -123,7 +125,6 @@ protected void addFields() {
if (sample == null) {
return;
}
-
pathogenTestHeadingLabel = new Label();
pathogenTestHeadingLabel.addStyleName(H3);
getContent().addComponent(pathogenTestHeadingLabel, PATHOGEN_TEST_HEADING_LOC);
@@ -170,11 +171,14 @@ protected void addFields() {
cqValueField.setConversionError(I18nProperties.getValidationError(Validations.onlyNumbersAllowed, cqValueField.getCaption()));
NullableOptionGroup testResultVerifiedField = addField(PathogenTestDto.TEST_RESULT_VERIFIED, NullableOptionGroup.class);
testResultVerifiedField.setRequired(true);
+ if (UserProvider.getCurrent().hasUserRole(UserRole.LAB_USER)) {
+ testResultVerifiedField.setRequired(false);
+ testResultVerifiedField.setVisible(false);
+ }
CheckBox fourFoldIncrease = addField(PathogenTestDto.FOUR_FOLD_INCREASE_ANTIBODY_TITER, CheckBox.class);
CssStyles.style(fourFoldIncrease, VSPACE_3, VSPACE_TOP_4);
fourFoldIncrease.setVisible(false);
fourFoldIncrease.setEnabled(false);
-
addField(PathogenTestDto.TEST_RESULT_TEXT, TextArea.class).setRows(6);
addField(PathogenTestDto.PRELIMINARY).addStyleName(CssStyles.VSPACE_4);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java
index f5419adc9af..0f0310934a0 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java
@@ -144,7 +144,9 @@ public SampleGrid(SampleCriteria criteria) {
addItemClickListener(
new ShowDetailsListener<>(SampleIndexDto.UUID, e -> ControllerProvider.getSampleController().navigateToData(e.getUuid())));
- if (UserProvider.getCurrent().hasUserRole(UserRole.LAB_USER) || UserProvider.getCurrent().hasUserRole(UserRole.EXTERNAL_LAB_USER)) {
+ if (UserProvider.getCurrent().hasUserRole(UserRole.LAB_USER)
+ || UserProvider.getCurrent().hasUserRole(UserRole.EXTERNAL_LAB_USER)
+ || UserProvider.getCurrent().hasUserRole(UserRole.LAB_SUPERVISOR)) {
removeColumn(SampleIndexDto.SHIPMENT_DATE);
} else {
removeColumn(SampleIndexDto.RECEIVED_DATE);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java
index 46c92370db1..68fd574f72e 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java
@@ -139,8 +139,9 @@ public HorizontalLayout createAssigneeFilterBar() {
Button myTasks = createAndAddStatusButton(Captions.taskMyTasks, MY_TASKS, buttonFilterLayout);
// Default filter for lab users (that don't have any other role) is "My tasks"
- if ((UserProvider.getCurrent().hasUserRole(UserRole.LAB_USER) || UserProvider.getCurrent().hasUserRole(UserRole.EXTERNAL_LAB_USER))
- && UserProvider.getCurrent().getUserRoles().size() == 1) {
+ if ((UserProvider.getCurrent().hasUserRole(UserRole.LAB_USER)
+ || UserProvider.getCurrent().hasUserRole(UserRole.EXTERNAL_LAB_USER)
+ || UserProvider.getCurrent().hasUserRole(UserRole.LAB_SUPERVISOR)) && UserProvider.getCurrent().getUserRoles().size() == 1) {
activeStatusButton = myTasks;
} else {
activeStatusButton = allTasks;
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 e365d2bfb00..f9a89638d27 100644
--- a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml
+++ b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml
@@ -17,6 +17,8 @@
CONTACT_OFFICER
EVENT_OFFICER
LAB_USER
+ LAB_SUPERVISOR
+ LAB_ATTENDANT
EXTERNAL_LAB_USER
NATIONAL_USER
NATIONAL_OBSERVER
diff --git a/sormas-ui/src/main/webapp/WEB-INF/web.xml b/sormas-ui/src/main/webapp/WEB-INF/web.xml
index ea3f7f4f085..5354d57f4cb 100644
--- a/sormas-ui/src/main/webapp/WEB-INF/web.xml
+++ b/sormas-ui/src/main/webapp/WEB-INF/web.xml
@@ -36,6 +36,12 @@
LAB_USER
+
+ LAB_SUPERVISOR
+
+
+ LAB_ATTENDANT
+
EXTERNAL_LAB_USER