Search in sources :

Example 1 with PlagueType

use of de.symeda.sormas.api.caze.PlagueType in project SORMAS-Project by hzi-braunschweig.

the class CaseFacadeEjb method onCaseChanged.

public void onCaseChanged(CaseDataDto existingCase, Case newCase, boolean syncShares) {
    // If its a new case and the case is new and the geo coordinates of the case's
    // health facility are null, set its coordinates to the case's report
    // coordinates, if available. Else if case report coordinates are null set them
    // to the facility's coordinates
    Facility facility = newCase.getHealthFacility();
    if (existingCase == null && facility != null && !FacilityHelper.isOtherOrNoneHealthFacility(facility.getUuid())) {
        if ((facility.getLatitude() == null || facility.getLongitude() == null) && newCase.getReportLat() != null && newCase.getReportLon() != null) {
            facility.setLatitude(newCase.getReportLat());
            facility.setLongitude(newCase.getReportLon());
            facilityService.ensurePersisted(facility);
        } else if (newCase.getReportLat() == null && newCase.getReportLon() == null && newCase.getReportLatLonAccuracy() == null) {
            newCase.setReportLat(facility.getLatitude());
            newCase.setReportLon(facility.getLongitude());
        }
    }
    // Clear facility type if no facility or home was selected
    if (newCase.getHealthFacility() == null || FacilityDto.NONE_FACILITY_UUID.equals(newCase.getHealthFacility().getUuid())) {
        newCase.setFacilityType(null);
    }
    // Generate epid number if missing or incomplete
    FieldVisibilityCheckers fieldVisibilityCheckers = FieldVisibilityCheckers.withCountry(configFacade.getCountryLocale());
    if (fieldVisibilityCheckers.isVisible(CaseDataDto.class, CaseDataDto.EPID_NUMBER) && !CaseLogic.isCompleteEpidNumber(newCase.getEpidNumber())) {
        newCase.setEpidNumber(generateEpidNumber(newCase.getEpidNumber(), newCase.getUuid(), newCase.getDisease(), newCase.getReportDate(), newCase.getResponsibleDistrict().getUuid()));
    }
    // update the plague type based on symptoms
    if (newCase.getDisease() == Disease.PLAGUE) {
        PlagueType plagueType = DiseaseHelper.getPlagueTypeForSymptoms(SymptomsFacadeEjb.toDto(newCase.getSymptoms()));
        if (plagueType != newCase.getPlagueType() && plagueType != null) {
            newCase.setPlagueType(plagueType);
        }
    }
    District survOffDistrict = newCase.getSurveillanceOfficer() != null ? newCase.getSurveillanceOfficer().getDistrict() : null;
    if (survOffDistrict == null || (!survOffDistrict.equals(newCase.getResponsibleDistrict()) && !survOffDistrict.equals(newCase.getDistrict()))) {
        setResponsibleSurveillanceOfficer(newCase);
    }
    updateInvestigationByStatus(existingCase, newCase);
    updatePersonAndCaseByOutcome(existingCase, newCase);
    updateCaseAge(existingCase, newCase);
    // Change the disease of all contacts if the case disease or disease details have changed
    if (existingCase != null && (newCase.getDisease() != existingCase.getDisease() || !StringUtils.equals(newCase.getDiseaseDetails(), existingCase.getDiseaseDetails()))) {
        for (Contact contact : contactService.findBy(new ContactCriteria().caze(newCase.toReference()), null)) {
            if (contact.getDisease() != newCase.getDisease() || !StringUtils.equals(contact.getDiseaseDetails(), newCase.getDiseaseDetails())) {
                // Only do the change if it hasn't been done in the mobile app before
                contact.setDisease(newCase.getDisease());
                contact.setDiseaseDetails(newCase.getDiseaseDetails());
                contactService.ensurePersisted(contact);
            }
        }
    }
    if (existingCase != null && (newCase.getDisease() != existingCase.getDisease() || !Objects.equals(newCase.getReportDate(), existingCase.getReportDate()) || !Objects.equals(newCase.getSymptoms().getOnsetDate(), existingCase.getSymptoms().getOnsetDate()))) {
        // Update follow-up until and status of all contacts
        for (Contact contact : contactService.findBy(new ContactCriteria().caze(newCase.toReference()), null)) {
            contactService.updateFollowUpDetails(contact, false);
            contactService.udpateContactStatus(contact);
        }
        for (Contact contact : contactService.getAllByResultingCase(newCase)) {
            contactService.updateFollowUpDetails(contact, false);
            contactService.udpateContactStatus(contact);
        }
    }
    updateTasksOnCaseChanged(newCase, existingCase);
    // Update case classification if the feature is enabled
    CaseClassification classification = null;
    if (configFacade.isFeatureAutomaticCaseClassification()) {
        if (newCase.getCaseClassification() != CaseClassification.NO_CASE) {
            // calculate classification
            CaseDataDto newCaseDto = toDto(newCase);
            classification = caseClassificationFacade.getClassification(newCaseDto);
            // only update when classification by system changes - user may overwrite this
            if (classification != newCase.getSystemCaseClassification()) {
                newCase.setSystemCaseClassification(classification);
                // really a change? (user may have already set it)
                if (classification != newCase.getCaseClassification()) {
                    newCase.setCaseClassification(classification);
                    newCase.setClassificationUser(null);
                    newCase.setClassificationDate(new Date());
                }
            }
        }
    }
    // calculate reference definition for cases
    if (configFacade.isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
        boolean fulfilled = evaluateFulfilledCondition(toDto(newCase), classification);
        newCase.setCaseReferenceDefinition(fulfilled ? CaseReferenceDefinition.FULFILLED : CaseReferenceDefinition.NOT_FULFILLED);
    }
    // are not empty
    if (!newCase.getHospitalization().getPreviousHospitalizations().isEmpty() && YesNoUnknown.YES != newCase.getHospitalization().getHospitalizedPreviously()) {
        newCase.getHospitalization().setHospitalizedPreviously(YesNoUnknown.YES);
    }
    if (!newCase.getEpiData().getExposures().isEmpty() && !YesNoUnknown.YES.equals(newCase.getEpiData().getExposureDetailsKnown())) {
        newCase.getEpiData().setExposureDetailsKnown(YesNoUnknown.YES);
    }
    // Update completeness value
    newCase.setCompleteness(null);
    // changed
    if (existingCase != null && existingCase.getCaseClassification() != newCase.getCaseClassification()) {
        try {
            String message = String.format(I18nProperties.getString(MessageContents.CONTENT_CASE_CLASSIFICATION_CHANGED), DataHelper.getShortUuid(newCase.getUuid()), newCase.getCaseClassification().toString());
            notificationService.sendNotifications(NotificationType.CASE_CLASSIFICATION_CHANGED, JurisdictionHelper.getCaseRegions(newCase), null, MessageSubject.CASE_CLASSIFICATION_CHANGED, message);
        } catch (NotificationDeliveryFailedException e) {
            logger.error("NotificationDeliveryFailedException when trying to notify supervisors about the change of a case classification. ");
        }
    }
    // Unspecified VHF case has changed
    if (existingCase != null && existingCase.getDisease() == Disease.UNSPECIFIED_VHF && existingCase.getDisease() != newCase.getDisease()) {
        try {
            String message = String.format(I18nProperties.getString(MessageContents.CONTENT_DISEASE_CHANGED), DataHelper.getShortUuid(newCase.getUuid()), existingCase.getDisease().toString(), newCase.getDisease().toString());
            notificationService.sendNotifications(NotificationType.DISEASE_CHANGED, JurisdictionHelper.getCaseRegions(newCase), null, MessageSubject.DISEASE_CHANGED, message);
        } catch (NotificationDeliveryFailedException e) {
            logger.error("NotificationDeliveryFailedException when trying to notify supervisors about the change of a case disease.");
        }
    }
    // If the case is a newly created case or if it was not in a CONFIRMED status
    // and now the case is in a CONFIRMED status, notify related surveillance officers
    Set<CaseClassification> confirmedClassifications = CaseClassification.getConfirmedClassifications();
    if ((existingCase == null || !confirmedClassifications.contains(existingCase.getCaseClassification())) && confirmedClassifications.contains(newCase.getCaseClassification())) {
        sendConfirmedCaseNotificationsForEvents(newCase);
    }
    if (existingCase != null && syncShares && sormasToSormasFacade.isFeatureConfigured()) {
        syncSharesAsync(new ShareTreeCriteria(existingCase.getUuid()));
    }
    // This logic should be consistent with CaseDataForm.onQuarantineEndChange
    if (existingCase != null && existingCase.getQuarantineTo() != null && !existingCase.getQuarantineTo().equals(newCase.getQuarantineTo())) {
        newCase.setPreviousQuarantineTo(existingCase.getQuarantineTo());
    }
    if (existingCase == null) {
        vaccinationFacade.updateVaccinationStatuses(newCase);
    }
    // On German systems, correct and clean up reinfection data
    if (configFacade.isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
        newCase.setReinfectionDetails(cleanUpReinfectionDetails(newCase.getReinfectionDetails()));
        newCase.setReinfectionStatus(CaseLogic.calculateReinfectionStatus(newCase.getReinfectionDetails()));
    }
}
Also used : ShareTreeCriteria(de.symeda.sormas.api.sormastosormas.ShareTreeCriteria) CaseDataDto(de.symeda.sormas.api.caze.CaseDataDto) CaseClassification(de.symeda.sormas.api.caze.CaseClassification) PlagueType(de.symeda.sormas.api.caze.PlagueType) FieldVisibilityCheckers(de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers) Date(java.util.Date) LocalDate(java.time.LocalDate) ExternalShareInfoCountAndLatestDate(de.symeda.sormas.backend.share.ExternalShareInfoCountAndLatestDate) Contact(de.symeda.sormas.backend.contact.Contact) ContactCriteria(de.symeda.sormas.api.contact.ContactCriteria) Facility(de.symeda.sormas.backend.infrastructure.facility.Facility) District(de.symeda.sormas.backend.infrastructure.district.District) NotificationDeliveryFailedException(de.symeda.sormas.backend.common.messaging.NotificationDeliveryFailedException)

Aggregations

CaseClassification (de.symeda.sormas.api.caze.CaseClassification)1 CaseDataDto (de.symeda.sormas.api.caze.CaseDataDto)1 PlagueType (de.symeda.sormas.api.caze.PlagueType)1 ContactCriteria (de.symeda.sormas.api.contact.ContactCriteria)1 ShareTreeCriteria (de.symeda.sormas.api.sormastosormas.ShareTreeCriteria)1 FieldVisibilityCheckers (de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers)1 NotificationDeliveryFailedException (de.symeda.sormas.backend.common.messaging.NotificationDeliveryFailedException)1 Contact (de.symeda.sormas.backend.contact.Contact)1 District (de.symeda.sormas.backend.infrastructure.district.District)1 Facility (de.symeda.sormas.backend.infrastructure.facility.Facility)1 ExternalShareInfoCountAndLatestDate (de.symeda.sormas.backend.share.ExternalShareInfoCountAndLatestDate)1 LocalDate (java.time.LocalDate)1 Date (java.util.Date)1