Search in sources :

Example 1 with Task

use of de.symeda.sormas.backend.task.Task in project SORMAS-Project by hzi-braunschweig.

the class CaseFacadeEjb method mergeCase.

private void mergeCase(CaseDataDto leadCaseData, CaseDataDto otherCaseData, boolean cloning) {
    // 1 Merge Dtos
    // 1.1 Case
    copyDtoValues(leadCaseData, otherCaseData, cloning);
    save(leadCaseData, !cloning, true, true, false);
    // 1.2 Person - Only merge when the persons have different UUIDs
    if (!cloning && !DataHelper.equal(leadCaseData.getPerson().getUuid(), otherCaseData.getPerson().getUuid())) {
        PersonDto leadPerson = personFacade.getPersonByUuid(leadCaseData.getPerson().getUuid());
        PersonDto otherPerson = personFacade.getPersonByUuid(otherCaseData.getPerson().getUuid());
        personFacade.mergePerson(leadPerson, otherPerson);
    } else {
        assert (DataHelper.equal(leadCaseData.getPerson().getUuid(), otherCaseData.getPerson().getUuid()));
    }
    // 2 Change CaseReference
    Case leadCase = service.getByUuid(leadCaseData.getUuid());
    Case otherCase = service.getByUuid(otherCaseData.getUuid());
    // 2.1 Contacts
    List<Contact> contacts = contactService.findBy(new ContactCriteria().caze(otherCase.toReference()), null);
    for (Contact contact : contacts) {
        if (cloning) {
            ContactDto newContact = ContactDto.build(leadCase.toReference(), leadCase.getDisease(), leadCase.getDiseaseDetails(), leadCase.getDiseaseVariant());
            newContact.setPerson(new PersonReferenceDto(contact.getPerson().getUuid()));
            DtoHelper.copyDtoValues(newContact, contactFacade.toDto(contact), cloning);
            contactFacade.save(newContact, false, false);
        } else {
            // simply move existing entities to the merge target
            contact.setCaze(leadCase);
            contactService.ensurePersisted(contact);
        }
    }
    // 2.2 Samples
    List<Sample> samples = sampleService.findBy(new SampleCriteria().caze(otherCase.toReference()), null);
    for (Sample sample : samples) {
        if (cloning) {
            SampleDto newSample = SampleDto.build(sample.getReportingUser().toReference(), leadCase.toReference());
            DtoHelper.copyDtoValues(newSample, SampleFacadeEjb.toDto(sample), cloning);
            sampleFacade.saveSample(newSample, false, true, true);
            // 2.2.1 Pathogen Tests
            for (PathogenTest pathogenTest : sample.getPathogenTests()) {
                PathogenTestDto newPathogenTest = PathogenTestDto.build(newSample.toReference(), pathogenTest.getLabUser().toReference());
                DtoHelper.copyDtoValues(newPathogenTest, PathogenTestFacadeEjbLocal.toDto(pathogenTest), cloning);
                sampleTestFacade.savePathogenTest(newPathogenTest);
            }
            for (AdditionalTest additionalTest : sample.getAdditionalTests()) {
                AdditionalTestDto newAdditionalTest = AdditionalTestDto.build(newSample.toReference());
                DtoHelper.copyDtoValues(newAdditionalTest, AdditionalTestFacadeEjbLocal.toDto(additionalTest), cloning);
                additionalTestFacade.saveAdditionalTest(newAdditionalTest);
            }
        } else {
            // simply move existing entities to the merge target
            sample.setAssociatedCase(leadCase);
            sampleService.ensurePersisted(sample);
        }
    }
    // 2.3 Tasks
    if (!cloning) {
        // simply move existing entities to the merge target
        List<Task> tasks = taskService.findBy(new TaskCriteria().caze(new CaseReferenceDto(otherCase.getUuid())), true);
        for (Task task : tasks) {
            task.setCaze(leadCase);
            taskService.ensurePersisted(task);
        }
    }
    // 3 Change Therapy Reference
    // 3.1 Treatments
    List<Treatment> treatments = treatmentService.findBy(new TreatmentCriteria().therapy(new TherapyReferenceDto(otherCase.getTherapy().getUuid())));
    TherapyReferenceDto leadCaseTherapyReference = new TherapyReferenceDto(leadCase.getTherapy().getUuid());
    for (Treatment treatment : treatments) {
        if (cloning) {
            TreatmentDto newTreatment = TreatmentDto.build(leadCaseTherapyReference);
            DtoHelper.copyDtoValues(newTreatment, TreatmentFacadeEjb.toDto(treatment), cloning);
            treatmentFacade.saveTreatment(newTreatment);
        } else {
            // simply move existing entities to the merge target
            treatment.setTherapy(leadCase.getTherapy());
            treatmentService.ensurePersisted(treatment);
        }
    }
    // 3.2 Prescriptions
    List<Prescription> prescriptions = prescriptionService.findBy(new PrescriptionCriteria().therapy(new TherapyReferenceDto(otherCase.getTherapy().getUuid())));
    for (Prescription prescription : prescriptions) {
        if (cloning) {
            PrescriptionDto newPrescription = PrescriptionDto.buildPrescription(leadCaseTherapyReference);
            DtoHelper.copyDtoValues(newPrescription, PrescriptionFacadeEjb.toDto(prescription), cloning);
            prescriptionFacade.savePrescription(newPrescription);
        } else {
            // simply move existing entities to the merge target
            prescription.setTherapy(leadCase.getTherapy());
            prescriptionService.ensurePersisted(prescription);
        }
    }
    // 4 Change Clinical Course Reference
    // 4.1 Clinical Visits
    List<ClinicalVisit> clinicalVisits = clinicalVisitService.findBy(new ClinicalVisitCriteria().clinicalCourse(new ClinicalCourseReferenceDto(otherCase.getClinicalCourse().getUuid())));
    for (ClinicalVisit clinicalVisit : clinicalVisits) {
        if (cloning) {
            ClinicalVisitDto newClinicalVisit = ClinicalVisitDto.build(leadCaseData.getClinicalCourse().toReference(), leadCase.getDisease());
            DtoHelper.copyDtoValues(newClinicalVisit, ClinicalVisitFacadeEjb.toDto(clinicalVisit), cloning);
            clinicalVisitFacade.saveClinicalVisit(newClinicalVisit, leadCase.getUuid(), false);
        } else {
            // simply move existing entities to the merge target
            clinicalVisit.setClinicalCourse(leadCase.getClinicalCourse());
            clinicalVisitService.ensurePersisted(clinicalVisit);
        }
    }
    // (set the person and the disease of the visit, saveVisit does the rest)
    for (VisitDto otherVisit : otherCase.getVisits().stream().map(VisitFacadeEjb::toDto).collect(Collectors.toList())) {
        otherVisit.setPerson(leadCaseData.getPerson());
        otherVisit.setDisease(leadCaseData.getDisease());
        visitFacade.saveVisit(otherVisit);
    }
    // 6 Documents
    List<Document> documents = documentService.getRelatedToEntity(DocumentRelatedEntityType.CASE, otherCase.getUuid());
    for (Document document : documents) {
        document.setRelatedEntityUuid(leadCaseData.getUuid());
        documentService.ensurePersisted(document);
    }
    // 7 Persist Event links through eventparticipants
    Set<EventParticipant> eventParticipants = otherCase.getEventParticipants();
    for (EventParticipant eventParticipant : eventParticipants) {
        eventParticipant.setResultingCase(leadCase);
        eventParticipantService.ensurePersisted(eventParticipant);
    }
    otherCase.getEventParticipants().clear();
    // 8 Exposures - Make sure there are no two probable infection environments
    // if there are more than 2 exposures marked as probable infection environment, find the one that originates from the otherCase and set it to false
    // the one originating from the otherCase should always be found at the higher index
    List<Exposure> probableExposuresList = leadCase.getEpiData().getExposures().stream().filter(Exposure::isProbableInfectionEnvironment).collect(Collectors.toList());
    while (probableExposuresList.size() >= 2) {
        // should never be > 2, but still make sure to set all but one exposures to false
        probableExposuresList.get(probableExposuresList.size() - 1).setProbableInfectionEnvironment(false);
        exposureService.ensurePersisted(probableExposuresList.get(probableExposuresList.size() - 1));
        probableExposuresList.remove(probableExposuresList.size() - 1);
    }
    // 9 Reports
    List<SurveillanceReport> surveillanceReports = surveillanceReportService.getByCaseUuids(Collections.singletonList(otherCase.getUuid()));
    surveillanceReports.forEach(surveillanceReport -> {
        SurveillanceReportDto surveillanceReportDto = SurveillanceReportFacadeEjb.toDto(surveillanceReport);
        surveillanceReportDto.setCaze(leadCase.toReference());
        surveillanceReportFacade.saveSurveillanceReport(surveillanceReportDto);
    });
    // 10 Activity as case
    final EpiData otherEpiData = otherCase.getEpiData();
    if (otherEpiData != null && YesNoUnknown.YES == otherEpiData.getActivityAsCaseDetailsKnown() && CollectionUtils.isNotEmpty(otherEpiData.getActivitiesAsCase())) {
        final EpiData leadEpiData = leadCase.getEpiData();
        leadEpiData.setActivityAsCaseDetailsKnown(YesNoUnknown.YES);
        epiDataService.ensurePersisted(leadEpiData);
    }
    // Travel entries reference
    List<TravelEntry> travelEntries = travelEntryService.getAllByResultingCase(otherCase);
    travelEntries.forEach(t -> {
        t.setResultingCase(leadCase);
        travelEntryService.ensurePersisted(t);
    });
}
Also used : AdditionalTest(de.symeda.sormas.backend.sample.AdditionalTest) Prescription(de.symeda.sormas.backend.therapy.Prescription) TravelEntry(de.symeda.sormas.backend.travelentry.TravelEntry) PrescriptionCriteria(de.symeda.sormas.api.therapy.PrescriptionCriteria) Task(de.symeda.sormas.backend.task.Task) SurveillanceReport(de.symeda.sormas.backend.caze.surveillancereport.SurveillanceReport) PersonReferenceDto(de.symeda.sormas.api.person.PersonReferenceDto) ClinicalVisitCriteria(de.symeda.sormas.api.clinicalcourse.ClinicalVisitCriteria) PathogenTestDto(de.symeda.sormas.api.sample.PathogenTestDto) Document(de.symeda.sormas.backend.document.Document) TreatmentDto(de.symeda.sormas.api.therapy.TreatmentDto) ContactCriteria(de.symeda.sormas.api.contact.ContactCriteria) ContactDto(de.symeda.sormas.api.contact.ContactDto) PrescriptionDto(de.symeda.sormas.api.therapy.PrescriptionDto) TreatmentCriteria(de.symeda.sormas.api.therapy.TreatmentCriteria) TaskCriteria(de.symeda.sormas.api.task.TaskCriteria) EpiData(de.symeda.sormas.backend.epidata.EpiData) ClinicalCourseReferenceDto(de.symeda.sormas.api.clinicalcourse.ClinicalCourseReferenceDto) PersonDto(de.symeda.sormas.api.person.PersonDto) CasePersonDto(de.symeda.sormas.api.caze.CasePersonDto) Sample(de.symeda.sormas.backend.sample.Sample) SampleCriteria(de.symeda.sormas.api.sample.SampleCriteria) TherapyReferenceDto(de.symeda.sormas.api.therapy.TherapyReferenceDto) Exposure(de.symeda.sormas.backend.exposure.Exposure) PathogenTest(de.symeda.sormas.backend.sample.PathogenTest) ClinicalVisit(de.symeda.sormas.backend.clinicalcourse.ClinicalVisit) Contact(de.symeda.sormas.backend.contact.Contact) Treatment(de.symeda.sormas.backend.therapy.Treatment) ClinicalVisitDto(de.symeda.sormas.api.clinicalcourse.ClinicalVisitDto) VisitDto(de.symeda.sormas.api.visit.VisitDto) ClinicalVisitDto(de.symeda.sormas.api.clinicalcourse.ClinicalVisitDto) SurveillanceReportDto(de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportDto) SampleDto(de.symeda.sormas.api.sample.SampleDto) CaseReferenceDto(de.symeda.sormas.api.caze.CaseReferenceDto) EventParticipant(de.symeda.sormas.backend.event.EventParticipant) AdditionalTestDto(de.symeda.sormas.api.sample.AdditionalTestDto)

Example 2 with Task

use of de.symeda.sormas.backend.task.Task in project SORMAS-Project by hzi-braunschweig.

the class CaseFacadeEjb method reassignTasksOfCase.

/**
 * Reassigns tasks related to `caze`. With `forceReassignment` beeing false, the function will only reassign
 * the tasks if the assignees lack jurisdiction on the case. When forced, all tasks will be reassigned.
 *
 * @param caze
 *            the case which related tasks are reassigned.
 * @param forceReassignment
 *            force reassignment of case tasks.
 */
public void reassignTasksOfCase(Case caze, boolean forceReassignment) {
    // otherwise we will reassign the task
    for (Task task : caze.getTasks()) {
        if (task.getTaskStatus() != TaskStatus.PENDING) {
            continue;
        }
        User taskAssignee = task.getAssigneeUser();
        if (forceReassignment || taskAssignee == null || !service.inJurisdiction(caze, taskAssignee)) {
            // if there is any mismatch between the jurisdiction of the case and the assigned user,
            // we need to reassign the tasks
            assignOfficerOrSupervisorToTask(caze, task);
            taskService.ensurePersisted(task);
        }
    }
}
Also used : Task(de.symeda.sormas.backend.task.Task) User(de.symeda.sormas.backend.user.User)

Example 3 with Task

use of de.symeda.sormas.backend.task.Task in project SORMAS-Project by hzi-braunschweig.

the class CaseFacadeEjb method createInvestigationTask.

private void createInvestigationTask(Case caze) {
    Task task = new Task();
    task.setTaskStatus(TaskStatus.PENDING);
    task.setTaskContext(TaskContext.CASE);
    task.setCaze(caze);
    task.setTaskType(TaskType.CASE_INVESTIGATION);
    task.setSuggestedStart(TaskHelper.getDefaultSuggestedStart());
    task.setDueDate(TaskHelper.getDefaultDueDate());
    task.setPriority(TaskPriority.NORMAL);
    assignOfficerOrSupervisorToTask(caze, task);
    taskService.ensurePersisted(task);
}
Also used : Task(de.symeda.sormas.backend.task.Task)

Example 4 with Task

use of de.symeda.sormas.backend.task.Task in project SORMAS-Project by hzi-braunschweig.

the class CaseFacadeEjb method updateInvestigationByStatus.

public void updateInvestigationByStatus(CaseDataDto existingCase, Case caze) {
    CaseReferenceDto caseRef = caze.toReference();
    InvestigationStatus investigationStatus = caze.getInvestigationStatus();
    if (investigationStatus != InvestigationStatus.PENDING) {
        // Set the investigation date
        if (caze.getInvestigatedDate() == null) {
            caze.setInvestigatedDate(new Date());
        }
        // the case status has been updated manually
        if (existingCase != null) {
            List<Task> pendingTasks = taskService.findBy(new TaskCriteria().taskType(TaskType.CASE_INVESTIGATION).caze(caseRef).taskStatus(TaskStatus.PENDING), true);
            final boolean caseStatusSetToDone = caze.getInvestigationStatus() == InvestigationStatus.DONE && existingCase.getInvestigationStatus() != InvestigationStatus.DONE;
            for (Task task : pendingTasks) {
                task.setTaskStatus(caseStatusSetToDone ? TaskStatus.DONE : TaskStatus.REMOVED);
                task.setStatusChangeDate(new Date());
            }
            if (caseStatusSetToDone) {
                sendInvestigationDoneNotifications(caze);
            }
        }
    } else {
        // Remove the investigation date
        caze.setInvestigatedDate(null);
        // Create a new investigation task if none is present
        long pendingCount = existingCase != null ? taskService.getCount(new TaskCriteria().taskType(TaskType.CASE_INVESTIGATION).caze(caseRef).taskStatus(TaskStatus.PENDING)) : 0;
        if (pendingCount == 0 && featureConfigurationFacade.isTaskGenerationFeatureEnabled(TaskType.CASE_INVESTIGATION)) {
            createInvestigationTask(caze);
        }
    }
}
Also used : Task(de.symeda.sormas.backend.task.Task) TaskCriteria(de.symeda.sormas.api.task.TaskCriteria) InvestigationStatus(de.symeda.sormas.api.caze.InvestigationStatus) CaseReferenceDto(de.symeda.sormas.api.caze.CaseReferenceDto) Date(java.util.Date) LocalDate(java.time.LocalDate) ExternalShareInfoCountAndLatestDate(de.symeda.sormas.backend.share.ExternalShareInfoCountAndLatestDate)

Example 5 with Task

use of de.symeda.sormas.backend.task.Task in project SORMAS-Project by hzi-braunschweig.

the class TravelEntryService method delete.

@Override
public void delete(TravelEntry travelEntry) {
    // Delete all tasks associated with this travel entry
    List<Task> tasks = taskService.findBy(new TaskCriteria().travelEntry(new TravelEntryReferenceDto(travelEntry.getUuid(), travelEntry.getExternalId(), travelEntry.getPerson().getFirstName(), travelEntry.getPerson().getLastName())), true);
    for (Task task : tasks) {
        taskService.delete(task);
    }
    // Mark the travel entry as deleted
    super.delete(travelEntry);
}
Also used : Task(de.symeda.sormas.backend.task.Task) TaskCriteria(de.symeda.sormas.api.task.TaskCriteria) TravelEntryReferenceDto(de.symeda.sormas.api.travelentry.TravelEntryReferenceDto)

Aggregations

Task (de.symeda.sormas.backend.task.Task)15 TaskCriteria (de.symeda.sormas.api.task.TaskCriteria)10 User (de.symeda.sormas.backend.user.User)6 CaseReferenceDto (de.symeda.sormas.api.caze.CaseReferenceDto)4 Sample (de.symeda.sormas.backend.sample.Sample)4 Date (java.util.Date)4 ContactCriteria (de.symeda.sormas.api.contact.ContactCriteria)3 ContactDto (de.symeda.sormas.api.contact.ContactDto)3 LocalDateTime (java.time.LocalDateTime)3 TransactionAttribute (javax.ejb.TransactionAttribute)3 Disease (de.symeda.sormas.api.Disease)2 EntityRelevanceStatus (de.symeda.sormas.api.EntityRelevanceStatus)2 InvestigationStatus (de.symeda.sormas.api.caze.InvestigationStatus)2 VaccinationStatus (de.symeda.sormas.api.caze.VaccinationStatus)2 ClinicalCourseReferenceDto (de.symeda.sormas.api.clinicalcourse.ClinicalCourseReferenceDto)2 ClinicalVisitCriteria (de.symeda.sormas.api.clinicalcourse.ClinicalVisitCriteria)2 FollowUpStatus (de.symeda.sormas.api.contact.FollowUpStatus)2 MapContactDto (de.symeda.sormas.api.contact.MapContactDto)2 DashboardContactDto (de.symeda.sormas.api.dashboard.DashboardContactDto)2 ExternalDataDto (de.symeda.sormas.api.externaldata.ExternalDataDto)2