diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java b/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java index 060afed1471..54e6ff91c5f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java @@ -127,22 +127,15 @@ public enum DocumentWorkflow { ROOT_TRAVEL_ENTRY, ROOT_PERSON, ROOT_USER), - SURVEY_DOCUMENT(DocumentWorkflowType.DOCUMENT, - "survey", - DOCX, - UserRight.SURVEY_EDIT, - ROOT_CASE, - ROOT_PERSON, - ROOT_USER, - ROOT_SAMPLE), + SURVEY_DOCUMENT(DocumentWorkflowType.DOCUMENT, "survey", DOCX, UserRight.SURVEY_EDIT, ROOT_CASE, ROOT_PERSON, ROOT_USER, ROOT_SAMPLE), SURVEY_EMAIL(DocumentWorkflowType.EMAIL, - Constants.EMAIL_TEMPLATES_FOLDER + "/surveys", - TXT, - UserRight.SURVEY_EDIT, - ROOT_CASE, - ROOT_PERSON, - ROOT_USER, - ROOT_SAMPLE),; + Constants.EMAIL_TEMPLATES_FOLDER + "/surveys", + TXT, + UserRight.SURVEY_EDIT, + ROOT_CASE, + ROOT_PERSON, + ROOT_USER, + ROOT_SAMPLE),; private final DocumentWorkflowType type; private final String templateDirectory; 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 e1558a9f1db..d40289a68d4 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 @@ -185,6 +185,7 @@ import de.symeda.sormas.api.sormastosormas.ShareTreeCriteria; import de.symeda.sormas.api.sormastosormas.SormasToSormasException; import de.symeda.sormas.api.sormastosormas.SormasToSormasRuntimeException; +import de.symeda.sormas.api.survey.SurveyTokenCriteria; import de.symeda.sormas.api.symptoms.SymptomsDto; import de.symeda.sormas.api.symptoms.SymptomsHelper; import de.symeda.sormas.api.task.TaskContext; @@ -330,6 +331,8 @@ 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.survey.SurveyToken; +import de.symeda.sormas.backend.survey.SurveyTokenService; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb; import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb.SymptomsFacadeEjbLocal; @@ -517,6 +520,8 @@ public class CaseFacadeEjb extends AbstractCoreFacadeEjb tokens = surveyService.findBy(new SurveyTokenCriteria().caseAssignedTo(otherCase.toReference())); + tokens.forEach(s -> { + s.setCaseAssignedTo(leadCase); + surveyService.ensurePersisted(s); + }); + } } private void copyDtoValues(CaseDataDto leadCaseData, CaseDataDto otherCaseData, boolean cloning) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/survey/SurveyTokenService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/survey/SurveyTokenService.java index 2d06684deb5..304999b89b9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/survey/SurveyTokenService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/survey/SurveyTokenService.java @@ -15,6 +15,8 @@ package de.symeda.sormas.backend.survey; +import java.util.List; + import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.persistence.criteria.CriteriaBuilder; @@ -101,6 +103,26 @@ public SurveyToken getToken(SurveyTokenCriteria criteria) { return QueryHelper.getFirstResult(em, cq); } + /** + * Finds survey tokens based on the provided criteria. The results are ordered by assignment date in descending order. + * + * @param criteria + * @return List + */ + public List findBy(SurveyTokenCriteria criteria) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(SurveyToken.class); + Root root = cq.from(SurveyToken.class); + cq.select(root); + Predicate filter = CriteriaBuilderHelper.and(cb, this.buildCriteriaFilter(criteria, cb, root, new SurveyTokenJoins(root))); + if (filter != null) { + cq.where(filter); + } + cq.orderBy(cb.desc(root.get(SurveyToken.ASSIGNMENT_DATE))); + + return em.createQuery(cq).getResultList(); + } + public SurveyToken getBySurveyAndToken(SurveyReferenceDto survey, String token) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(SurveyToken.class); 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 3a22d06a743..13e6d6c666f 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 @@ -128,6 +128,7 @@ import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestStatus; import de.symeda.sormas.api.specialcaseaccess.SpecialCaseAccessDto; import de.symeda.sormas.api.survey.SurveyDto; +import de.symeda.sormas.api.survey.SurveyTokenDto; import de.symeda.sormas.api.systemevents.SystemEventDto; import de.symeda.sormas.api.systemevents.SystemEventStatus; import de.symeda.sormas.api.systemevents.SystemEventType; @@ -2476,6 +2477,19 @@ public SurveyDto createSurvey(String name, Disease disease) { return beanTest.getSurveyFacade().save(survey); } + /** + * + * @param caze + * @return + */ + public SurveyTokenDto createSurveyToken(CaseReferenceDto caze) { + SurveyDto survey = this.createSurvey("Malaria-Survey", Disease.MALARIA); + SurveyTokenDto token = SurveyTokenDto.build(survey.toReference()); + token.setToken("MALA01"); + token.setCaseAssignedTo(caze); + return beanTest.getSurveyTokenFacade().save(token); + } + public NotifierDto createNotifier(String firstName, String lastName, String email, String phone, String address, String registrationNumber) { NotifierDto notifier = new NotifierDto(); notifier.setFirstName(firstName); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/survey/SurveyServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/survey/SurveyServiceTest.java new file mode 100644 index 00000000000..6646e2e80fc --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/survey/SurveyServiceTest.java @@ -0,0 +1,66 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2026 SORMAS Foundation gGmbH + * 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.survey; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.survey.SurveyTokenCriteria; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.backend.AbstractBeanTest; +import de.symeda.sormas.backend.TestDataCreator; + +/** + * Test class for testing the SurveyService. + */ +public class SurveyServiceTest extends AbstractBeanTest { + + private UserDto surveillanceOfficer; + private TestDataCreator.RDCF rdcf; + + /** + * @see AbstractBeanTest#init() + * Initializing the primary data for the test. + */ + @Override + public void init() { + super.init(); + rdcf = creator.createRDCF("Region", "District", "Community", "Facility"); + surveillanceOfficer = creator.createSurveillanceOfficer(rdcf); + } + + /** + * Test method for {@link de.symeda.sormas.backend.survey.SurveyService#findBy(de.symeda.sormas.api.survey.SurveyTokenCriteria)}. + * + */ + @Test + public void testSurveyTokens() { + CaseDataDto caze = creator.createCase(surveillanceOfficer.toReference(), rdcf, (c) -> { + c.setDisease(Disease.MALARIA); + }); + creator.createSurveyToken(caze.toReference()); + List tokenList = getSurveyTokenService().findBy(new SurveyTokenCriteria()); + assertThat(tokenList.size(), is(greaterThan(0))); + assertThat(tokenList.get(0).getToken(), is(equalTo("MALA01"))); + } +}