diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/activityascase/ActivityAsCaseType.java b/sormas-api/src/main/java/de/symeda/sormas/api/activityascase/ActivityAsCaseType.java index 9d6c7ed1613..3ada946e7c4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/activityascase/ActivityAsCaseType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/activityascase/ActivityAsCaseType.java @@ -41,6 +41,8 @@ public enum ActivityAsCaseType { @HideForCountriesExcept CARED_FOR, OTHER, + BLOOD_DONATION, + BONE_MARROW_DONATION, UNKNOWN; @Override diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/epidata/EpiDataDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/epidata/EpiDataDto.java index 7c49bddcb97..85c2e5ef928 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/epidata/EpiDataDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/epidata/EpiDataDto.java @@ -18,7 +18,6 @@ package de.symeda.sormas.api.epidata; import java.util.ArrayList; -import java.util.Date; import java.util.List; import javax.validation.Valid; @@ -70,6 +69,10 @@ public class EpiDataDto extends PseudonymizableDto { public static final String IMPORTED_CASE = "importedCase"; public static final String COUNTRY = "country"; public static final String OTHER_DETAILS = "otherDetails"; + public static final String AIRPORT_WORKER = "airportWorker"; + public static final String HEALTHCARE_PROFESSIONAL = "healthcareProfessional"; + public static final String PLACE_OF_INFECTION = "placeOfInfection"; + public static final String RESIDENCE_AT_ONSET = "residenceAtOnset"; private YesNoUnknown exposureDetailsKnown; private YesNoUnknown activityAsCaseDetailsKnown; @@ -114,12 +117,14 @@ public class EpiDataDto extends PseudonymizableDto { @Diseases({ Disease.GIARDIASIS, - Disease.CRYPTOSPORIDIOSIS }) + Disease.CRYPTOSPORIDIOSIS, + Disease.MALARIA }) private ModeOfTransmission modeOfTransmission; @Diseases({ Disease.GIARDIASIS, - Disease.CRYPTOSPORIDIOSIS }) + Disease.CRYPTOSPORIDIOSIS, + Disease.MALARIA }) @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) private String modeOfTransmissionType; @@ -143,6 +148,29 @@ public class EpiDataDto extends PseudonymizableDto { private List activitiesAsCase = new ArrayList<>(); private String otherDetails; + // airport worker should be applicable for all countries and diseases. + @Diseases + @HideForCountriesExcept + private YesNoUnknown airportWorker; + @Diseases({ + Disease.MALARIA }) + @HideForCountriesExcept(countries = { + CountryHelper.COUNTRY_CODE_LUXEMBOURG }) + private YesNoUnknown healthcareProfessional; + + @Diseases({ + Disease.DENGUE }) + @HideForCountriesExcept(countries = { + CountryHelper.COUNTRY_CODE_LUXEMBOURG }) + @Size(max = 255, message = Validations.textTooLong) + private String placeOfInfection; + + @Diseases({ + Disease.DENGUE }) + @HideForCountriesExcept(countries = { + CountryHelper.COUNTRY_CODE_LUXEMBOURG }) + @Size(max = 255, message = Validations.textTooLong) + private String residenceAtOnset; public YesNoUnknown getExposureDetailsKnown() { return exposureDetailsKnown; @@ -305,6 +333,38 @@ public void setOtherDetails(String otherDetails) { this.otherDetails = otherDetails; } + public YesNoUnknown getAirportWorker() { + return airportWorker; + } + + public void setAirportWorker(YesNoUnknown airportWorker) { + this.airportWorker = airportWorker; + } + + public YesNoUnknown getHealthcareProfessional() { + return healthcareProfessional; + } + + public void setHealthcareProfessional(YesNoUnknown healthcareProfessional) { + this.healthcareProfessional = healthcareProfessional; + } + + public String getPlaceOfInfection() { + return placeOfInfection; + } + + public void setPlaceOfInfection(String placeOfInfection) { + this.placeOfInfection = placeOfInfection; + } + + public String getResidenceAtOnset() { + return residenceAtOnset; + } + + public void setResidenceAtOnset(String residenceAtOnset) { + this.residenceAtOnset = residenceAtOnset; + } + @Override public EpiDataDto clone() throws CloneNotSupportedException { EpiDataDto clone = (EpiDataDto) super.clone(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureCategory.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureCategory.java index 9fcd3ce4e8b..854488f43c0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureCategory.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureCategory.java @@ -28,10 +28,13 @@ public enum ExposureCategory { FOOD_BORNE, VECTOR_BORNE, VERTICAL_TRANSMISSION, - WATER_BORNE; + WATER_BORNE, + MEDICAL_CARE, + LAB, + OTHER; public boolean hasNoSetting() { - return EnumSet.of(ANIMAL_CONTACT, FOMITE_TRANSMISSION, FOOD_BORNE).contains(this); + return EnumSet.of(ANIMAL_CONTACT, FOMITE_TRANSMISSION, FOOD_BORNE, MEDICAL_CARE, LAB, OTHER).contains(this); } public boolean hasNoSubSetting() { 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 f86616d195e..dc5ce0a47d9 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 @@ -135,6 +135,10 @@ public class ExposureDto extends PseudonymizableDto { public static final String SUB_SETTINGS = "subSettings"; public static final String CONTACT_FACTORS = "contactFactors"; public static final String PROTECTIVE_MEASURES = "protectiveMeasures"; + public static final String PROPHYLAXIS_ADHERENCE = "prophylaxisAdherence"; + public static final String PROPHYLAXIS_ADHERENCE_DETAILS = "prophylaxisAdherenceDetails"; + public static final String TRAVEL_PURPOSE = "travelPurpose"; + public static final String TRAVEL_PURPOSE_DETAILS = "travelPurposeDetails"; @SensitiveData private UserReferenceDto reportingUser; @@ -432,6 +436,24 @@ public class ExposureDto extends PseudonymizableDto { private Set subSettings; private Set contactFactors; private Set protectiveMeasures; + @Diseases({ + Disease.MALARIA, + Disease.DENGUE }) + private ProphylaxisAdherence prophylaxisAdherence; + @Diseases({ + Disease.MALARIA, + Disease.DENGUE }) + @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) + private String prophylaxisAdherenceDetails; + @Diseases({ + Disease.MALARIA, + Disease.DENGUE }) + private TravelPurpose travelPurpose; + @Diseases({ + Disease.MALARIA, + Disease.DENGUE }) + @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) + private String travelPurposeDetails; public static ExposureDto build(ExposureType exposureType) { @@ -1096,6 +1118,38 @@ public void setProtectiveMeasures(Set protectiveMeasu this.protectiveMeasures = protectiveMeasures; } + public TravelPurpose getTravelPurpose() { + return travelPurpose; + } + + public void setTravelPurpose(TravelPurpose travelPurpose) { + this.travelPurpose = travelPurpose; + } + + public String getTravelPurposeDetails() { + return travelPurposeDetails; + } + + public void setTravelPurposeDetails(String travelPurposeDetails) { + this.travelPurposeDetails = travelPurposeDetails; + } + + public ProphylaxisAdherence getProphylaxisAdherence() { + return prophylaxisAdherence; + } + + public void setProphylaxisAdherence(ProphylaxisAdherence prophylaxisAdherence) { + this.prophylaxisAdherence = prophylaxisAdherence; + } + + public String getProphylaxisAdherenceDetails() { + return prophylaxisAdherenceDetails; + } + + public void setProphylaxisAdherenceDetails(String prophylaxisAdherenceDetails) { + this.prophylaxisAdherenceDetails = prophylaxisAdherenceDetails; + } + @Override public ExposureDto clone() throws CloneNotSupportedException { ExposureDto clone = (ExposureDto) super.clone(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSetting.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSetting.java index 19c3a1b496f..eee66a982f1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSetting.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSetting.java @@ -30,6 +30,7 @@ public enum ExposureSetting { OUTDOOR(ExposureCategory.AIR_BORNE, ExposureCategory.VECTOR_BORNE), PERSON_TO_PERSON(ExposureCategory.DIRECT_CONTACT), + OTHER_DIRECT_CONTACT(ExposureCategory.DIRECT_CONTACT), MOSQUITO_BORNE(ExposureCategory.VECTOR_BORNE), TICK_BORNE(ExposureCategory.VECTOR_BORNE), diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java index 92a89025fa9..b83eadecb62 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java @@ -37,8 +37,12 @@ public enum ExposureSubSetting { HIGH_TOUCH_ENVIRONMENTS(ExposureCategory.DIRECT_CONTACT, ExposureSetting.PERSON_TO_PERSON), SEXUAL_ACTIVITY(ExposureCategory.DIRECT_CONTACT, ExposureSetting.PERSON_TO_PERSON), + BLOOD_TRANSFUSION_RECIPIENT(ExposureCategory.DIRECT_CONTACT, ExposureSetting.OTHER_DIRECT_CONTACT), + BONE_MARROW_TRANSPLANT_RECIPIENT(ExposureCategory.DIRECT_CONTACT, ExposureSetting.OTHER_DIRECT_CONTACT), + STANDING_WATER_AREAS(ExposureCategory.VECTOR_BORNE, ExposureSetting.MOSQUITO_BORNE), HIGH_MOSQUITO_ACTIVITY_REGIONS(ExposureCategory.VECTOR_BORNE, ExposureSetting.MOSQUITO_BORNE), + TRAVELED_ABROAD(ExposureCategory.VECTOR_BORNE, ExposureSetting.MOSQUITO_BORNE), FORESTED_GRASSY_RURAL(ExposureCategory.VECTOR_BORNE, ExposureSetting.TICK_BORNE), WILDLIFE_RESERVOIR_AREAS(ExposureCategory.VECTOR_BORNE, ExposureSetting.TICK_BORNE), diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ModeOfTransmission.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ModeOfTransmission.java index a5caff1ff38..5e0245df8c7 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ModeOfTransmission.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ModeOfTransmission.java @@ -14,23 +14,84 @@ */ package de.symeda.sormas.api.exposure; +import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.utils.Diseases; public enum ModeOfTransmission { + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) ANIMAL_TO_HUMAN, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) FOOD_OR_WATER, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) PERSON_TO_PERSON, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) RECREATIONAL_WATER, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) HEALTHCARE_ASSOCIATED, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) INJECTING_DRUG_USERS, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) LAB_OCCUPATIONAL_EXPOSURE, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) MOTHER_TO_CHILD, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) SEXUAL, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) TRANSFUSION_RECIPIENT, + @Diseases({ + Disease.GIARDIASIS, + Disease.CRYPTOSPORIDIOSIS }) ORGAN_RECIPIENT, - UNKNOWN, - OTHER; + + @Diseases(value = { + Disease.MALARIA }) + MOSQUITOES_FROM_ENDEMIC_COUNTRY, + @Diseases(value = { + Disease.MALARIA }) + MOSQUITOES_BY_AIR, + @Diseases(value = { + Disease.MALARIA }) + MEDICAL_CARE, + @Diseases(value = { + Disease.MALARIA }) + MOSQUITOES_WITH_STRONG_EPI_EVIDENCE, + @Diseases(value = { + Disease.MALARIA }) + MOSQUITOES_WITHOUT_EVIDENCE, + @Diseases(value = { + Disease.MALARIA }) + FROM_MOTHER_TO_CHILD, + @Diseases(value = { + Disease.MALARIA }) + BY_LAB, + @Diseases(value = { + Disease.MALARIA }) + TRANSFUSION_TRANSPLANT_RECIPIENT, + + OTHER, + UNKNOWN; @Override public String toString() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/epidata/DiseaseTransmission.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ProphylaxisAdherence.java similarity index 64% rename from sormas-api/src/main/java/de/symeda/sormas/api/epidata/DiseaseTransmission.java rename to sormas-api/src/main/java/de/symeda/sormas/api/exposure/ProphylaxisAdherence.java index 61f573df864..91fd018143b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/epidata/DiseaseTransmission.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ProphylaxisAdherence.java @@ -12,25 +12,26 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.symeda.sormas.api.epidata; +package de.symeda.sormas.api.exposure; import de.symeda.sormas.api.i18n.I18nProperties; -public enum DiseaseTransmission { +/** + * Enumeration of Prophylaxis Adherence. + * To be used for prophylaxis drug and its adherence to treatment. + */ +public enum ProphylaxisAdherence { + + PROPHYLAXIS_COMPLETED, + PROPHYLAXIS_PARTIAL, + PROPHYLAXIS_NOT_STARTED, + PROPHYLAXIS_NOT_PRESCRIBED, + OTHER, + UNKNOWN; - TRANSMITTED_WITH_MOSQUITOES_FROM_ENDEMIC_COUNTRY, - TRANSMITTED_WITH_MOSQUITOES_BY_AIR, - TRANSMITTED_THROUGH_MEDICAL_CARE, - TRANSMITTED_WITH_STRONG_EPI_EVIDENCE, - TRANSMITTED_WITHOUT_EVIDENCE, - TRANSMITTED_FROM_MOTHER_TO_CHILD, - TRANSMITTED_BY_LAB, - TRANSFUSION_TRANSPLANT_RECIPIENT, - OTHER, - UNKNOWN; + @Override + public String toString() { + return I18nProperties.getEnumCaption(this); + } - @Override - public String toString() { - return I18nProperties.getEnumCaption(this); - } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/TravelPurpose.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/TravelPurpose.java new file mode 100644 index 00000000000..da61cd43e83 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/TravelPurpose.java @@ -0,0 +1,40 @@ +/* + * 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.api.exposure; + +import de.symeda.sormas.api.i18n.I18nProperties; + +/** + * Enumeration of travel purpose. + * To be used for specific travel and its purpose. + */ +public enum TravelPurpose { + + BUSINESS, + VISITING_FAMILY_FRIENDS, + MIGRATION, + MILITARY, + HUMANITARIAN_MISSION, + TRAVELER_FROM_ENDEMIC_COUNTRY, + STUDENT, + TOURISM, + OTHER, + UNKNOWN; + + @Override + public String toString() { + return I18nProperties.getEnumCaption(this); + } +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java index bee975b50fa..fb0a3643ee8 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportReferenceDto; import de.symeda.sormas.api.clinicalcourse.ComplianceWithTreatment; import de.symeda.sormas.api.disease.DiseaseVariant; +import de.symeda.sormas.api.exposure.ModeOfTransmission; import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Validations; @@ -119,6 +120,10 @@ public class ExternalMessageDto extends SormasToSormasShareableDto { public static final String TUBERCULOSIS_INFECTION_YEAR = "tuberculosisInfectionYear"; public static final String PREVIOUS_TUBERCULOSIS_TREATMENT = "previousTuberculosisTreatment"; public static final String COMPLIANCE_WITH_TREATMENT = "complianceWithTreatment"; + public static final String MALARIA = "malaria"; + public static final String MALARIA_INFECTED_YEAR = "malariaInfectedYear"; + public static final String AIRPORT_WORKER = "airportWorker"; + public static final String HEALTHCARE_PROFESSIONAL = "healthcareProfessional"; @AuditIncludeProperty private ExternalMessageType type; @@ -266,6 +271,14 @@ public class ExternalMessageDto extends SormasToSormasShareableDto { private Boolean tuberculosisMdrXdrTuberculosis; private Boolean tuberculosisBeijingLineage; + // Malaria and Dengue changes + private YesNoUnknown malaria; + private Integer malariaInfectedYear; + private YesNoUnknown airportWorker; + private YesNoUnknown healthcareProfessional; + private ModeOfTransmission modeOfTransmission; + private String modeOfTransmissionType; + public ExternalMessageType getType() { return type; } @@ -959,4 +972,52 @@ public Boolean getTuberculosisBeijingLineage() { public void setTuberculosisBeijingLineage(Boolean tuberculosisBeijingLineage) { this.tuberculosisBeijingLineage = tuberculosisBeijingLineage; } + + public YesNoUnknown getMalaria() { + return malaria; + } + + public void setMalaria(YesNoUnknown malaria) { + this.malaria = malaria; + } + + public Integer getMalariaInfectedYear() { + return malariaInfectedYear; + } + + public void setMalariaInfectedYear(Integer malariaInfectedYear) { + this.malariaInfectedYear = malariaInfectedYear; + } + + public YesNoUnknown getAirportWorker() { + return airportWorker; + } + + public void setAirportWorker(YesNoUnknown airportWorker) { + this.airportWorker = airportWorker; + } + + public YesNoUnknown getHealthcareProfessional() { + return healthcareProfessional; + } + + public void setHealthcareProfessional(YesNoUnknown healthcareProfessional) { + this.healthcareProfessional = healthcareProfessional; + } + + public ModeOfTransmission getModeOfTransmission() { + return modeOfTransmission; + } + + public void setModeOfTransmission(ModeOfTransmission modeOfTransmission) { + this.modeOfTransmission = modeOfTransmission; + } + + public String getModeOfTransmissionType() { + return modeOfTransmissionType; + } + + public void setModeOfTransmissionType(String modeOfTransmissionType) { + this.modeOfTransmissionType = modeOfTransmissionType; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/labmessage/TestReportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/labmessage/TestReportDto.java index edb0a3099aa..028220d36c4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/labmessage/TestReportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/labmessage/TestReportDto.java @@ -19,6 +19,7 @@ import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.api.sample.RsvSubtype; import de.symeda.sormas.api.sample.SeroGroupSpecification; +import de.symeda.sormas.api.sample.Serotype; import de.symeda.sormas.api.sample.SerotypingMethod; import de.symeda.sormas.api.therapy.DrugSusceptibilityType; import de.symeda.sormas.api.utils.DataHelper; @@ -212,7 +213,9 @@ public class TestReportDto extends EntityDto { private String seroGroupSpecificationText; private SerotypingMethod seroTypingMethod; private String seroTypingMethodText; - private String serotype; + private Serotype serotype; + @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong) + private String serotypeText; public SampleReportReferenceDto getSampleReport() { return sampleReport; @@ -893,11 +896,20 @@ public void setSeroTypingMethodText(String seroTypingMethodText) { this.seroTypingMethodText = seroTypingMethodText; } - public String getSerotype() { + public Serotype getSerotype() { return serotype; } - public void setSerotype(String serotype) { + public void setSerotype(Serotype serotype) { this.serotype = serotype; } + + public String getSerotypeText() { + return serotypeText; + } + + public void setSerotypeText(String serotypeText) { + this.serotypeText = serotypeText; + } + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/ExternalMessageMapper.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/ExternalMessageMapper.java index 2e8ede5222e..a37b8dd134a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/ExternalMessageMapper.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/ExternalMessageMapper.java @@ -717,11 +717,12 @@ public List mapToPathogenTest(TestReportDto sourceTestReport, Pathogen pathogenTest.getSeroGroupSpecificationText(), sourceTestReport.getSeroGroupSpecificationText(), PathogenTestDto.SERO_GROUP_SPECIFICATION), + Mapping.of(pathogenTest::setSerotype, pathogenTest.getSerotype(), sourceTestReport.getSerotype(), PathogenTestDto.SEROTYPE), Mapping.of( - pathogenTest::setSerotype, - pathogenTest.getSerotype(), - Serotype.fromString(sourceTestReport.getSerotype()), - PathogenTestDto.SEROTYPE), + pathogenTest::setSerotypeText, + pathogenTest.getSerotypeText(), + sourceTestReport.getSerotypeText(), + PathogenTestDto.SEROTYPE_TEXT), Mapping.of( pathogenTest::setSeroTypingMethod, pathogenTest.getSeroTypingMethod(), diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/doctordeclaration/AbstractDoctorDeclarationMessageProcessingFlow.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/doctordeclaration/AbstractDoctorDeclarationMessageProcessingFlow.java index bac52ae9cdd..2fc628b1be5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/doctordeclaration/AbstractDoctorDeclarationMessageProcessingFlow.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/processing/doctordeclaration/AbstractDoctorDeclarationMessageProcessingFlow.java @@ -215,12 +215,32 @@ protected void postBuildHealthConditions(CaseDataDto caseDto, ExternalMessageDto if (Disease.TUBERCULOSIS.equals(externalMessageDto.getDisease())) { postBuildTuberculosisHealthConditions(healthConditionsDto, externalMessageDto); + } else if (Disease.MALARIA.equals(externalMessageDto.getDisease())) { + postBuildMalariaHealthConditions(healthConditionsDto, externalMessageDto); + } else { + logger.debug("[POST BUILD HEALTH CONDITIONS] Health conditions not set for case. Disease: {}", externalMessageDto.getDisease()); } // we need to set it in case it is newly created caseDto.setHealthConditions(healthConditionsDto); } + /** + * Sets malaria-specific health conditions for the case from the external message. + * + * @param healthConditionsDto + * + * @param externalMessageDto + */ + private void postBuildMalariaHealthConditions(HealthConditionsDto healthConditionsDto, ExternalMessageDto externalMessageDto) { + healthConditionsDto.setMalaria(externalMessageDto.getMalaria()); + healthConditionsDto.setMalariaInfectedYear(externalMessageDto.getMalariaInfectedYear()); + logger.debug( + "[POST BUILD HEALTH CONDITIONS] Malaria health conditions set for case. Malaria: {}, Malaria Infected Year: {}", + externalMessageDto.getMalaria(), + externalMessageDto.getMalariaInfectedYear()); + } + /** * Sets tuberculosis-specific health conditions for the case from the external message. * @@ -364,6 +384,10 @@ protected void postBuildExposure(CaseDataDto caseDto, ExternalMessageDto externa epiData.setExposureDetailsKnown(YesNoUnknown.YES); epiData.setExposures(exposures); + epiData.setAirportWorker(externalMessageDto.getAirportWorker()); + epiData.setHealthcareProfessional(externalMessageDto.getHealthcareProfessional()); + epiData.setModeOfTransmission(externalMessageDto.getModeOfTransmission()); + epiData.setModeOfTransmissionType(externalMessageDto.getModeOfTransmissionType()); } } else { 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 9b238b2e334..402f110b303 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 @@ -1611,6 +1611,7 @@ public interface Captions { String EpiData = "EpiData"; String EpiData_activitiesAsCase = "EpiData.activitiesAsCase"; String EpiData_activityAsCaseDetailsKnown = "EpiData.activityAsCaseDetailsKnown"; + String EpiData_airportWorker = "EpiData.airportWorker"; String EpiData_areaInfectedAnimals = "EpiData.areaInfectedAnimals"; String EpiData_caseImportedStatus = "EpiData.caseImportedStatus"; String EpiData_clusterRelated = "EpiData.clusterRelated"; @@ -1620,6 +1621,7 @@ public interface Captions { String EpiData_country = "EpiData.country"; String EpiData_exposureDetailsKnown = "EpiData.exposureDetailsKnown"; String EpiData_exposures = "EpiData.exposures"; + String EpiData_healthcareProfessional = "EpiData.healthcareProfessional"; String EpiData_highTransmissionRiskArea = "EpiData.highTransmissionRiskArea"; String EpiData_importedCase = "EpiData.importedCase"; String EpiData_infectionSource = "EpiData.infectionSource"; @@ -1628,6 +1630,8 @@ public interface Captions { String EpiData_modeOfTransmission = "EpiData.modeOfTransmission"; String EpiData_modeOfTransmissionType = "EpiData.modeOfTransmissionType"; String EpiData_otherDetails = "EpiData.otherDetails"; + String EpiData_placeOfInfection = "EpiData.placeOfInfection"; + String EpiData_residenceAtOnset = "EpiData.residenceAtOnset"; String epiDataNoSourceContacts = "epiDataNoSourceContacts"; String epipulseActiveExports = "epipulseActiveExports"; String epipulseAllExports = "epipulseAllExports"; @@ -1926,6 +1930,8 @@ public interface Captions { String Exposure_physicalContactWithBody = "Exposure.physicalContactWithBody"; String Exposure_probableInfectionEnvironment = "Exposure.probableInfectionEnvironment"; String Exposure_prophylaxis = "Exposure.prophylaxis"; + String Exposure_prophylaxisAdherence = "Exposure.prophylaxisAdherence"; + String Exposure_prophylaxisAdherenceDetails = "Exposure.prophylaxisAdherenceDetails"; String Exposure_prophylaxisDate = "Exposure.prophylaxisDate"; String Exposure_protectiveMeasureDetails = "Exposure.protectiveMeasureDetails"; String Exposure_protectiveMeasures = "Exposure.protectiveMeasures"; @@ -1943,6 +1949,8 @@ public interface Captions { String Exposure_symptomaticIndividualText = "Exposure.symptomaticIndividualText"; String Exposure_travelAccommodation = "Exposure.travelAccommodation"; String Exposure_travelAccommodationType = "Exposure.travelAccommodationType"; + String Exposure_travelPurpose = "Exposure.travelPurpose"; + String Exposure_travelPurposeDetails = "Exposure.travelPurposeDetails"; String Exposure_typeOfAnimal = "Exposure.typeOfAnimal"; String Exposure_typeOfAnimalDetails = "Exposure.typeOfAnimalDetails"; String Exposure_typeOfChildcareFacility = "Exposure.typeOfChildcareFacility"; @@ -3031,6 +3039,7 @@ public interface Captions { String Symptoms_eyePainLightSensitive = "Symptoms.eyePainLightSensitive"; String Symptoms_eyesBleeding = "Symptoms.eyesBleeding"; String Symptoms_fastHeartRate = "Symptoms.fastHeartRate"; + String Symptoms_fatalRisk = "Symptoms.fatalRisk"; String Symptoms_fatigue = "Symptoms.fatigue"; String Symptoms_fatigueWeakness = "Symptoms.fatigueWeakness"; String Symptoms_feelingIll = "Symptoms.feelingIll"; 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 950cfc14c65..8e4daf69149 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 @@ -685,6 +685,7 @@ public interface Strings { String headingExportUserRightsFailed = "headingExportUserRightsFailed"; String headingExposureDetails = "headingExposureDetails"; String headingExposureInvestigation = "headingExposureInvestigation"; + String headingExposurePeriodConsider = "headingExposurePeriodConsider"; String headingExposures = "headingExposures"; String headingExtendFollowUp = "headingExtendFollowUp"; String headingExtendQuarantine = "headingExtendQuarantine"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/Serotype.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/Serotype.java index accb5754deb..9acacc5d094 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/Serotype.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/Serotype.java @@ -18,8 +18,8 @@ package de.symeda.sormas.api.sample; -import java.util.Arrays; import java.util.Locale; +import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; @@ -45,6 +45,7 @@ public enum Serotype { @Diseases({ Disease.DENGUE }) DENV_4, + UNKNOWN, OTHER; // if a serotype is not in the list (existing serotypes) -> will be displayed with OTHER along with its value in the serotypetext. @@ -54,7 +55,7 @@ public static Serotype fromString(String serotype) { } String serotypeEnumVal = StringUtils.trim(serotype).toUpperCase(Locale.ROOT).replaceAll("[-_\\s]+", "_"); - return Arrays.asList(Serotype.values()).stream().noneMatch(s -> s.name().equals(serotypeEnumVal)) ? OTHER : Serotype.valueOf(serotypeEnumVal); + return Stream.of(Serotype.values()).noneMatch(s -> s.name().equals(serotypeEnumVal)) ? OTHER : Serotype.valueOf(serotypeEnumVal); } @Override diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/symptoms/SymptomsDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/symptoms/SymptomsDto.java index 1a5721650d4..08fe3d8df5a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/symptoms/SymptomsDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/symptoms/SymptomsDto.java @@ -372,6 +372,7 @@ public class SymptomsDto extends PseudonymizableDto { public static final String SCANT_HEMORRHAGE = "scantHemorrhage"; public static final String OTHER_NEUROLOCAL_SYMPTOM = "otherNeurolocalSymptom"; public static final String OTHER_NEUROLOCAL_SYMPTOM_TEXT = "otherNeurolocalSymptomText"; + public static final String FATAL_RISK = "fatalRisk"; // Fields are declared in the order they should appear in the import template @@ -3071,6 +3072,14 @@ public static SymptomsDto build() { @SymptomGrouping(SymptomGroup.NERVOUS_SYSTEM) private String otherNeurolocalSymptomText; + @Diseases({ + DENGUE }) + @SymptomGrouping(SymptomGroup.GENERAL) + @Complication({ + DENGUE }) + // mCComplicationsPotentiellementMortelles to map the life threatening complications of dengue + private SymptomState fatalRisk; + @Order(0) public Float getTemperature() { return temperature; @@ -5175,4 +5184,13 @@ public String getOtherNeurolocalSymptomText() { public void setOtherNeurolocalSymptomText(String otherNeurolocalSymptomText) { this.otherNeurolocalSymptomText = otherNeurolocalSymptomText; } + + public SymptomState getFatalRisk() { + return fatalRisk; + } + + public void setFatalRisk(SymptomState fatalRisk) { + this.fatalRisk = fatalRisk; + } + } diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 0477e6e5986..9ee5c7030f8 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1148,7 +1148,7 @@ 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.largeOutbreaksArea=Infection has occurred following exposure outside the reporting country during a time compatible with the incubation period of the infection EpiData.contactWithSourceCaseKnown=Contacts with source case known EpiData.caseImportedStatus=Case imported status EpiData.clusterRelated=Cluster Related @@ -1161,6 +1161,11 @@ EpiData.infectionSourceText= Specify source of infection EpiData.importedCase= Imported Case EpiData.country= Country of contamination EpiData.otherDetails= General comment +EpiData.airportWorker=Working at an airport +EpiData.healthcareProfessional=Working as a healthcare professional +EpiData.placeOfInfection=Probable place of infection +EpiData.residenceAtOnset=Residence at the time of symptom onset + #Therapy Therapy.directlyObservedTreatment = Directly observed treatment Therapy.mdrXdrTuberculosis = MDR/XDR tuberculosis @@ -1605,6 +1610,10 @@ Exposure.contactFactorDetails=Other contact factors details Exposure.protectiveMeasures=Protective measures Exposure.protectiveMeasureDetails=Other protective measures details Exposure.exposureComment=Comment +Exposure.prophylaxisAdherence=Prophylaxis adherence +Exposure.prophylaxisAdherenceDetails=Prophylaxis adherence details +Exposure.travelPurpose=Reason for travel +Exposure.travelPurposeDetails=Reason for travel details titleExposuresSection=Exposure details titleExposureActivitySection=Activity details titleExposureLocationSection=Location of exposure @@ -3062,8 +3071,9 @@ Symptoms.clinicalManifestation= Clinical manifestation of the disease according Symptoms.clinicalManifestationText=Specify clinical manifestation Symptoms.disseminatedIntraVascularCoagulation=Disseminated intra-vascular coagulation Symptoms.scantHemorrhage=Other minor bleeding -Symptoms.otherNeurolocalSymptom=Neurological symptom +Symptoms.otherNeurolocalSymptom=Other neurological symptoms Symptoms.otherNeurolocalSymptomText= Specify neurological symptom +Symptoms.fatalRisk=Fatal risk titleComplications=Complications titleNoComplications=No complications @@ -3696,7 +3706,7 @@ DiseaseConfiguration.ageGroups=Age groups DiseaseConfiguration.automaticSampleAssignmentThreshold=Automatic sample assignment threshold DiseaseConfiguration.incubationPeriodEnabled=Incubation period enabled DiseaseConfiguration.minIncubationPeriod=Minimum incubation period -DiseaseConfiguration.maxIncubationPeriod=Maximum incubation period +DiseaseConfiguration.maxIncubationPeriod=Maximum incubation period DiseaseConfiguration.exposureCategories=Exposure categories DiseaseConfiguration.exposureCategoryNames=Exposure categories titleDiseaseConfigurationGeneral=General diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index c52494fdb13..fcde5ef6726 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -53,6 +53,9 @@ ActivityAsCaseType.PERSONAL_SERVICES=Personal Services ActivityAsCaseType.CARED_FOR=Cared for ActivityAsCaseType.OTHER=Other ActivityAsCaseType.UNKNOWN=Unknown +ActivityAsCaseType.BLOOD_DONATION=Blood donation +ActivityAsCaseType.BONE_MARROW_DONATION=Bone marrow donation + # AdditionalTestingStatus AdditionalTestingStatus.NOT_REQUESTED = Not requested @@ -649,17 +652,6 @@ DiseaseTransmissionMode.FOOD = Primarily via food DiseaseTransmissionMode.VECTOR_BORNE = Primarily vector-borne DiseaseTransmissionMode.UNKNOWN = Unknown -# DiseaseTransmission -DiseaseTransmission.TRANSMITTED_WITH_MOSQUITOES_FROM_ENDEMIC_COUNTRY=Contracted from infected mosquitoes in an endemic country -DiseaseTransmission.TRANSMITTED_WITH_MOSQUITOES_BY_AIR=Contracted from infected mosquitoes transported by air from an endemic country to a non-endemic country -DiseaseTransmission.TRANSMITTED_THROUGH_MEDICAL_CARE=Contracted while receiving medical care -DiseaseTransmission.TRANSMITTED_WITH_STRONG_EPI_EVIDENCE=Acquired locally through mosquito transmission with strong epidemiological evidence directly linking it to a known imported case -DiseaseTransmission.TRANSMITTED_WITHOUT_EVIDENCE=Acquired locally through mosquito transmission without evidence of importation and without a direct link to transmission from an imported case -DiseaseTransmission.TRANSMITTED_FROM_MOTHER_TO_CHILD=Mother-to-child transmission -DiseaseTransmission.TRANSMITTED_BY_LAB=Laboratory transmission due to occupational exposure -DiseaseTransmission.TRANSFUSION_TRANSPLANT_RECIPIENT=Transfusion/transplant recipient -DiseaseTransmission.OTHER = Other -DiseaseTransmission.UNKNOWN = Unknown # DocumentRelatedEntityType DocumentRelatedEntityType.ACTION = Action @@ -1082,6 +1074,14 @@ ModeOfTransmission.TRANSFUSION_RECIPIENT = Transfusion recipient ModeOfTransmission.ORGAN_RECIPIENT = Organ recipient ModeOfTransmission.UNKNOWN = Unknown ModeOfTransmission.OTHER = Other +ModeOfTransmission.MOSQUITOES_FROM_ENDEMIC_COUNTRY = Contracted from infected mosquitoes in an endemic country +ModeOfTransmission.MOSQUITOES_BY_AIR = Contracted from infected mosquitoes transported by air from an endemic country to a non-endemic country +ModeOfTransmission.MEDICAL_CARE = Contracted while receiving medical care +ModeOfTransmission.MOSQUITOES_WITH_STRONG_EPI_EVIDENCE = Acquired locally through mosquito transmission with strong epidemiological evidence directly linking it to a known imported case +ModeOfTransmission.MOSQUITOES_WITHOUT_EVIDENCE = Acquired locally through mosquito transmission without evidence of importation and without a direct link to transmission from an imported case +ModeOfTransmission.FROM_MOTHER_TO_CHILD = Mother-to-child transmission +ModeOfTransmission.BY_LAB = Laboratory transmission due to occupational exposure +ModeOfTransmission.TRANSFUSION_TRANSPLANT_RECIPIENT = Transfusion/transplant recipient # Month @@ -1407,6 +1407,7 @@ Serotype.DENV_1=DENV-1 Serotype.DENV_2=DENV-2 Serotype.DENV_3=DENV-3 Serotype.DENV_4=DENV-4 +Serotype.UNKNOWN=Unknown Serotype.OTHER=Other # SerotypingMethod @@ -1601,6 +1602,26 @@ TravelAccommodation.RENTED_APARTMENT_OR_HOUSE = Rented apartment/ house TravelAccommodation.FRIENDS_OR_FAMILY = Friends/Family TravelAccommodation.OTHER = Other +# TravelPurpose +TravelPurpose.BUSINESS=Business +TravelPurpose.VISITING_FAMILY_FRIENDS=Visiting family or friends +TravelPurpose.MIGRATION=Migration +TravelPurpose.MILITARY=Military +TravelPurpose.HUMANITARIAN_MISSION=Humanitarian mission +TravelPurpose.TRAVELER_FROM_ENDEMIC_COUNTRY=Traveler from an endemic country +TravelPurpose.STUDENT=Student +TravelPurpose.TOURISM=Tourism +TravelPurpose.OTHER=Other +TravelPurpose.UNKNOWN=Unknown + +# ProphylaxisAdherence +ProphylaxisAdherence.PROPHYLAXIS_COMPLETED=Prophylaxis prescribed and course completed +ProphylaxisAdherence.PROPHYLAXIS_PARTIAL=Prophylaxis prescribed but course not completed +ProphylaxisAdherence.PROPHYLAXIS_NOT_STARTED=Prophylaxis prescribed and not taken +ProphylaxisAdherence.PROPHYLAXIS_NOT_PRESCRIBED=No prophylaxis prescribed +ProphylaxisAdherence.OTHER=Other +ProphylaxisAdherence.UNKNOWN=Unknown + # TreatmentRoute TreatmentRoute.ORAL = Oral TreatmentRoute.IV = IV @@ -2951,11 +2972,16 @@ ExposureCategory.FOOD_BORNE=Food-borne ExposureCategory.VECTOR_BORNE=Vector-borne ExposureCategory.VERTICAL_TRANSMISSION=Vertical transmission ExposureCategory.WATER_BORNE=Water-borne +ExposureCategory.MEDICAL_CARE=Medical care +ExposureCategory.LAB=Lab +ExposureCategory.OTHER=Other # ExposureSetting ExposureSetting.INDOOR=Indoor ExposureSetting.OUTDOOR=Outdoor ExposureSetting.PERSON_TO_PERSON=Person to person +ExposureSetting.OTHER_DIRECT_CONTACT=Other + ExposureSetting.MOSQUITO_BORNE=Mosquito-borne ExposureSetting.TICK_BORNE=Tick-borne ExposureSetting.DRINKING_WATER=Drinking water @@ -2981,6 +3007,9 @@ ExposureSubSetting.FORESTED_GRASSY_RURAL=Forested, grassy, or rural areas ExposureSubSetting.WILDLIFE_RESERVOIR_AREAS=Areas with wildlife reservoirs for ticks ExposureSubSetting.EATING_AT_HOME=Eating at home ExposureSubSetting.EATING_OUTSIDE=Eating outside +ExposureSubSetting.BLOOD_TRANSFUSION_RECIPIENT=Blood transfusion recepient +ExposureSubSetting.BONE_MARROW_TRANSPLANT_RECIPIENT=Bone marrow transplant recipient +ExposureSubSetting.TRAVELED_ABROAD=Traveled abroad ExposureSubSetting.UNKNOWN=Unknown ExposureSubSetting.OTHER=Other diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index d490292afa0..0a528270657 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -116,7 +116,7 @@ classificationPersonAged = Person aged classificationNotACase = Not a case Classification classificationProbable = Probable Classification classificationRulesFor = Classification Rules For -caseDefinitionForDisease = Case definition for disease +caseDefinitionForDisease = Case definition for classificationSymptomsAllOf = All symptoms classificationSymptomsAnyOf = Any symptom classificationSuspect = Possible Classification @@ -280,7 +280,6 @@ entityCampaign=Campaign entityCampaignData = Campaign Data entityCampaignDataForm=campaign data form entityCampaignFormData = Campaign form data -entityCampaignFormMeta = Campaign form meta entityCampaigns=Campaigns entityCase=Case entityCaseManagement = Case management @@ -349,10 +348,7 @@ entityUsers = Users entityVaccinations = Vaccinations entityVisits = Visits entityWeeklyReports = Weekly reports -entityOutbreaks = Outbreaks -entityCustomizableEnumValues = Customizable enum values entityCampaignFormMeta = Campaign form meta -entityCampaignFormData = Campaign form data entityAdverseEvent = Adverse event entityAdverseEvents = Adverse events entityAdverseEventInvestigation = Adverse event investigation @@ -843,6 +839,7 @@ headingExposureInvestigation = Exposure Investigation headingEpiDataSourceCaseContacts = Contacts with Source Case headingExposures = Exposures headingExposureDetails = Exposure Details +headingExposurePeriodConsider = Exposure period to consider headingEpiDataOtherInformation = Other information headingEpiConclusion = Conclusion headingClusterType = Cluster Type diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java index 70adc736fef..968878b6c60 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java @@ -81,6 +81,11 @@ public class EpiData extends AbstractDomainObject { private String otherDetails; + private YesNoUnknown airportWorker; + private YesNoUnknown healthcareProfessional; + private String placeOfInfection; + private String residenceAtOnset; + @Enumerated(EnumType.STRING) public YesNoUnknown getExposureDetailsKnown() { return exposureDetailsKnown; @@ -259,4 +264,41 @@ public String getOtherDetails() { public void setOtherDetails(String otherDetails) { this.otherDetails = otherDetails; } + + @Enumerated(EnumType.STRING) + public YesNoUnknown getAirportWorker() { + return airportWorker; + } + + public void setAirportWorker(YesNoUnknown airportWorker) { + this.airportWorker = airportWorker; + } + + @Enumerated(EnumType.STRING) + public YesNoUnknown getHealthcareProfessional() { + return healthcareProfessional; + } + + public void setHealthcareProfessional(YesNoUnknown healthcareProfessional) { + this.healthcareProfessional = healthcareProfessional; + } + + @Column(columnDefinition = "text") + public String getPlaceOfInfection() { + return placeOfInfection; + } + + public void setPlaceOfInfection(String placeOfInfection) { + this.placeOfInfection = placeOfInfection; + } + + @Column(columnDefinition = "text") + public String getResidenceAtOnset() { + return residenceAtOnset; + } + + public void setResidenceAtOnset(String residenceAtOnset) { + this.residenceAtOnset = residenceAtOnset; + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java index 2305c2de11e..fe4e2cf0439 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java @@ -131,7 +131,10 @@ public EpiData fillOrBuildEntity(EpiDataDto source, EpiData target, boolean chec target.setCountry(countryService.getByReferenceDto(source.getCountry())); target.setImportedCase(source.getImportedCase()); target.setOtherDetails(source.getOtherDetails()); - + target.setAirportWorker(source.getAirportWorker()); + target.setHealthcareProfessional(source.getHealthcareProfessional()); + target.setPlaceOfInfection(source.getPlaceOfInfection()); + target.setResidenceAtOnset(source.getResidenceAtOnset()); return target; } @@ -232,7 +235,10 @@ public Exposure fillOrBuildExposureEntity(ExposureDto source, Exposure target, b target.setSubSettings(source.getSubSettings() != null ? source.getSubSettings() : new HashSet<>()); target.setContactFactors(source.getContactFactors() != null ? source.getContactFactors() : new HashSet<>()); target.setProtectiveMeasures(source.getProtectiveMeasures() != null ? source.getProtectiveMeasures() : new HashSet<>()); - + target.setProphylaxisAdherence(source.getProphylaxisAdherence()); + target.setProphylaxisAdherenceDetails(source.getProphylaxisAdherenceDetails()); + target.setTravelPurpose(source.getTravelPurpose()); + target.setTravelPurposeDetails(source.getTravelPurposeDetails()); return target; } @@ -315,6 +321,10 @@ public static EpiDataDto toDto(EpiData epiData) { target.setCountry(CountryFacadeEjb.toReferenceDto(source.getCountry())); target.setImportedCase(source.getImportedCase()); target.setOtherDetails(source.getOtherDetails()); + target.setAirportWorker(source.getAirportWorker()); + target.setHealthcareProfessional(source.getHealthcareProfessional()); + target.setPlaceOfInfection(source.getPlaceOfInfection()); + target.setResidenceAtOnset(source.getResidenceAtOnset()); return target; } @@ -411,7 +421,10 @@ public static ExposureDto toExposureDto(Exposure source) { target.setSubSettings(new HashSet<>(source.getSubSettings())); target.setContactFactors(new HashSet<>(source.getContactFactors())); target.setProtectiveMeasures(new HashSet<>(source.getProtectiveMeasures())); - + target.setProphylaxisAdherence(source.getProphylaxisAdherence()); + target.setProphylaxisAdherenceDetails(source.getProphylaxisAdherenceDetails()); + target.setTravelPurpose(source.getTravelPurpose()); + target.setTravelPurposeDetails(source.getTravelPurposeDetails()); return target; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java index b27aa134efd..bf257543f27 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java @@ -52,8 +52,10 @@ import de.symeda.sormas.api.exposure.FomiteTransmissionLocation; import de.symeda.sormas.api.exposure.GatheringType; import de.symeda.sormas.api.exposure.HabitationType; +import de.symeda.sormas.api.exposure.ProphylaxisAdherence; import de.symeda.sormas.api.exposure.SwimmingLocation; import de.symeda.sormas.api.exposure.TravelAccommodation; +import de.symeda.sormas.api.exposure.TravelPurpose; import de.symeda.sormas.api.exposure.TypeOfAnimal; import de.symeda.sormas.api.exposure.TypeOfChildcareFacility; import de.symeda.sormas.api.exposure.WorkEnvironment; @@ -184,6 +186,11 @@ public class Exposure extends AbstractDomainObject { private AnimalCategory animalCategory; private String animalCategoryDetails; + private ProphylaxisAdherence prophylaxisAdherence; + private String prophylaxisAdherenceDetails; + private TravelPurpose travelPurpose; + private String travelPurposeDetails; + private FomiteTransmissionLocation fomiteTransmissionLocation; private Set subSettings = new HashSet<>(); @@ -940,4 +947,41 @@ public Set getProtectiveMeasures() { public void setProtectiveMeasures(Set protectiveMeasures) { this.protectiveMeasures = protectiveMeasures; } + + @Enumerated(EnumType.STRING) + public TravelPurpose getTravelPurpose() { + return travelPurpose; + } + + public void setTravelPurpose(TravelPurpose travelPurpose) { + this.travelPurpose = travelPurpose; + } + + @Column(length = CHARACTER_LIMIT_DEFAULT) + public String getTravelPurposeDetails() { + return travelPurposeDetails; + } + + public void setTravelPurposeDetails(String travelPurposeDetails) { + this.travelPurposeDetails = travelPurposeDetails; + } + + @Enumerated(EnumType.STRING) + public ProphylaxisAdherence getProphylaxisAdherence() { + return prophylaxisAdherence; + } + + public void setProphylaxisAdherence(ProphylaxisAdherence prophylaxisAdherence) { + this.prophylaxisAdherence = prophylaxisAdherence; + } + + @Column(length = CHARACTER_LIMIT_DEFAULT) + public String getProphylaxisAdherenceDetails() { + return prophylaxisAdherenceDetails; + } + + public void setProphylaxisAdherenceDetails(String prophylaxisAdherenceDetails) { + this.prophylaxisAdherenceDetails = prophylaxisAdherenceDetails; + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java index bed08d26289..8be2ba15a30 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessage.java @@ -49,6 +49,7 @@ import de.symeda.sormas.api.clinicalcourse.ComplianceWithTreatment; import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.disease.DiseaseVariantConverter; +import de.symeda.sormas.api.exposure.ModeOfTransmission; import de.symeda.sormas.api.externalmessage.ExternalMessageStatus; import de.symeda.sormas.api.externalmessage.ExternalMessageType; import de.symeda.sormas.api.person.PhoneNumberType; @@ -136,6 +137,8 @@ public class ExternalMessage extends AbstractDomainObject { public static final String RADIOGRAPHY_COMPATIBILITY = "radiographyCompatibility"; public static final String OTHER_DIAGNOSTIC_CRITERIA = "otherDiagnosticCriteria"; + public static final String AIRPORT_WORKER = "airportWorker"; + public static final String HEALTHCARE_PROFESSIONAL = "healthcareProfessional"; private ExternalMessageType type; private Disease disease; @@ -231,6 +234,14 @@ public class ExternalMessage extends AbstractDomainObject { private Boolean tuberculosisMdrXdrTuberculosis; private Boolean tuberculosisBeijingLineage; + // Malaria and Dengue changes + private YesNoUnknown malaria; + private Integer malariaInfectedYear; + private YesNoUnknown airportWorker; + private YesNoUnknown healthcareProfessional; + private ModeOfTransmission modeOfTransmission; + private String modeOfTransmissionType; + @Enumerated(EnumType.STRING) public ExternalMessageType getType() { return type; @@ -955,4 +966,57 @@ public Boolean getTuberculosisBeijingLineage() { public void setTuberculosisBeijingLineage(Boolean tuberculosisBeijingLineage) { this.tuberculosisBeijingLineage = tuberculosisBeijingLineage; } + + @Enumerated(EnumType.STRING) + public YesNoUnknown getMalaria() { + return malaria; + } + + public void setMalaria(YesNoUnknown malaria) { + this.malaria = malaria; + } + + public Integer getMalariaInfectedYear() { + return malariaInfectedYear; + } + + public void setMalariaInfectedYear(Integer malariaInfectedYear) { + this.malariaInfectedYear = malariaInfectedYear; + } + + @Enumerated(EnumType.STRING) + public YesNoUnknown getAirportWorker() { + return airportWorker; + } + + public void setAirportWorker(YesNoUnknown airportWorker) { + this.airportWorker = airportWorker; + } + + @Enumerated(EnumType.STRING) + public YesNoUnknown getHealthcareProfessional() { + return healthcareProfessional; + } + + public void setHealthcareProfessional(YesNoUnknown healthcareProfessional) { + this.healthcareProfessional = healthcareProfessional; + } + + @Enumerated(EnumType.STRING) + public ModeOfTransmission getModeOfTransmission() { + return modeOfTransmission; + } + + public void setModeOfTransmission(ModeOfTransmission modeOfTransmission) { + this.modeOfTransmission = modeOfTransmission; + } + + public String getModeOfTransmissionType() { + return modeOfTransmissionType; + } + + public void setModeOfTransmissionType(String modeOfTransmissionType) { + this.modeOfTransmissionType = modeOfTransmissionType; + } + } 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 b6cc4f4828b..3322272908f 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 @@ -255,7 +255,12 @@ ExternalMessage fillOrBuildEntity(@NotNull ExternalMessageDto source, ExternalMe target.setTuberculosisDirectlyObservedTreatment(source.getTuberculosisDirectlyObservedTreatment()); target.setTuberculosisMdrXdrTuberculosis(source.getTuberculosisMdrXdrTuberculosis()); target.setTuberculosisBeijingLineage(source.getTuberculosisBeijingLineage()); - + target.setMalaria(source.getMalaria()); + target.setMalariaInfectedYear(source.getMalariaInfectedYear()); + target.setAirportWorker(source.getAirportWorker()); + target.setHealthcareProfessional(source.getHealthcareProfessional()); + target.setModeOfTransmission(source.getModeOfTransmission()); + target.setModeOfTransmissionType(source.getModeOfTransmissionType()); return target; } @@ -477,6 +482,12 @@ public ExternalMessageDto toDto(ExternalMessage source) { target.setTuberculosisDirectlyObservedTreatment(source.getTuberculosisDirectlyObservedTreatment()); target.setTuberculosisMdrXdrTuberculosis(source.getTuberculosisMdrXdrTuberculosis()); target.setTuberculosisBeijingLineage(source.getTuberculosisBeijingLineage()); + target.setMalaria(source.getMalaria()); + target.setMalariaInfectedYear(source.getMalariaInfectedYear()); + target.setAirportWorker(source.getAirportWorker()); + target.setHealthcareProfessional(source.getHealthcareProfessional()); + target.setModeOfTransmission(source.getModeOfTransmission()); + target.setModeOfTransmissionType(source.getModeOfTransmissionType()); return target; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReport.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReport.java index e1394bbf0eb..bf1a75fb631 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReport.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReport.java @@ -44,6 +44,7 @@ import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.api.sample.RsvSubtype; import de.symeda.sormas.api.sample.SeroGroupSpecification; +import de.symeda.sormas.api.sample.Serotype; import de.symeda.sormas.api.sample.SerotypingMethod; import de.symeda.sormas.api.therapy.DrugSusceptibilityType; import de.symeda.sormas.backend.common.AbstractDomainObject; @@ -178,7 +179,8 @@ public class TestReport extends AbstractDomainObject { private String seroGroupSpecificationText; private SerotypingMethod seroTypingMethod; private String seroTypingMethodText; - private String serotype; + private Serotype serotype; + private String serotypeText; @Column(length = CHARACTER_LIMIT_DEFAULT) public String getTestLabName() { @@ -916,12 +918,21 @@ public void setSeroTypingMethodText(String seroTypingMethodText) { this.seroTypingMethodText = seroTypingMethodText; } - public String getSerotype() { + @Enumerated(EnumType.STRING) + public Serotype getSerotype() { return serotype; } - public void setSerotype(String serotype) { + public void setSerotype(Serotype serotype) { this.serotype = serotype; } + public String getSerotypeText() { + return serotypeText; + } + + public void setSerotypeText(String serotypeText) { + this.serotypeText = serotypeText; + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjb.java index 350e837c1fa..3bc445bfc88 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjb.java @@ -23,6 +23,7 @@ import de.symeda.sormas.api.externalmessage.labmessage.TestReportDto; import de.symeda.sormas.api.externalmessage.labmessage.TestReportFacade; +import de.symeda.sormas.api.sample.Serotype; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.backend.infrastructure.country.CountryFacadeEjb; import de.symeda.sormas.backend.infrastructure.country.CountryService; @@ -157,7 +158,12 @@ public static TestReportDto toDto(TestReport source) { target.setSeroGroupSpecificationText(source.getSeroGroupSpecificationText()); target.setSeroTypingMethod(source.getSeroTypingMethod()); target.setSeroTypingMethodText(source.getSeroTypingMethodText()); - target.setSerotype(source.getSerotype()); + if (source.getSerotypeText() != null && !source.getSerotypeText().trim().isEmpty()) { + target.setSerotype(Serotype.fromString(source.getSerotypeText())); + } else { + target.setSerotype(source.getSerotype()); + } + target.setSerotypeText(source.getSerotypeText()); return target; } @@ -252,7 +258,12 @@ public TestReport fillOrBuildEntity(@NotNull TestReportDto source, @NotNull Samp target.setSeroGroupSpecificationText(source.getSeroGroupSpecificationText()); target.setSeroTypingMethod(source.getSeroTypingMethod()); target.setSeroTypingMethodText(source.getSeroTypingMethodText()); - target.setSerotype(source.getSerotype()); + if (source.getSerotypeText() != null && !source.getSerotypeText().trim().isEmpty()) { + target.setSerotype(Serotype.fromString(source.getSerotypeText())); + } else { + target.setSerotype(source.getSerotype()); + } + target.setSerotypeText(source.getSerotypeText()); return target; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java index 4adb0957736..b8674f7a254 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java @@ -309,6 +309,7 @@ public class Symptoms extends AbstractDomainObject { private YesNoUnknown otherNeurolocalSymptom; private String otherNeurolocalSymptomText; private SymptomState disseminatedIntraVascularCoagulation; + private SymptomState fatalRisk; // when adding new fields make sure to extend toHumanString @@ -2447,4 +2448,14 @@ public SymptomState getDisseminatedIntraVascularCoagulation() { public void setDisseminatedIntraVascularCoagulation(SymptomState disseminatedIntraVascularCoagulation) { this.disseminatedIntraVascularCoagulation = disseminatedIntraVascularCoagulation; } + + @Enumerated(EnumType.STRING) + public SymptomState getFatalRisk() { + return fatalRisk; + } + + public void setFatalRisk(SymptomState fatalRisk) { + this.fatalRisk = fatalRisk; + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/SymptomsFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/SymptomsFacadeEjb.java index a29713a5705..42528bc99d8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/SymptomsFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/SymptomsFacadeEjb.java @@ -273,6 +273,7 @@ public Symptoms fillOrBuildEntity(SymptomsDto source, Symptoms target, boolean c target.setOtherNeurolocalSymptom(source.getOtherNeurolocalSymptom()); target.setOtherNeurolocalSymptomText(source.getOtherNeurolocalSymptomText()); target.setDisseminatedIntraVascularCoagulation(source.getDisseminatedIntraVascularCoagulation()); + target.setFatalRisk(source.getFatalRisk()); return target; } @@ -529,6 +530,7 @@ public static SymptomsDto toSymptomsDto(Symptoms symptoms) { target.setOtherNeurolocalSymptom(source.getOtherNeurolocalSymptom()); target.setOtherNeurolocalSymptomText(source.getOtherNeurolocalSymptomText()); target.setDisseminatedIntraVascularCoagulation(source.getDisseminatedIntraVascularCoagulation()); + target.setFatalRisk(source.getFatalRisk()); return target; } diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 145e21dbba8..9c1251e9dbf 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -15550,7 +15550,7 @@ alter table exposures_contactfactors add constraint exposures_contactfactors_pk DROP TRIGGER IF EXISTS delete_history_trigger ON exposures_contactfactors; alter table exposures_protectivemeasures drop constraint unq_exposures_protectivemeasures_0; -alter table exposures_protectivemeasures add constraint exposures_protectivemeasures_pk primary key (exposure_id, protectivemeasure); +alter table exposures_protectivemeasures add constraint exposures_protectivemeasures_pk primary key (exposure_id, protectivemeasure); DROP TRIGGER IF EXISTS delete_history_trigger ON exposures_protectivemeasures; INSERT INTO schema_version (version_number, comment) VALUES (617, '#13887 update keys and drop delete history triggers for new exposures tables'); @@ -15783,4 +15783,43 @@ WHERE config_key = 'MENU_SUBTITLE'; INSERT INTO schema_version (version_number, comment) VALUES (623, '#13552 - FIX menu regexes'); + +-- 22-04-2026 Malaria and Dengue Doctors declaration and lab messages changes #13838, 13837, 13835, 13836 +ALTER TABLE epidata ADD COLUMN airportworker varchar(255); +ALTER TABLE epidata ADD COLUMN healthcareprofessional varchar(255); +ALTER TABLE epidata ADD COLUMN placeofinfection varchar(255); +ALTER TABLE epidata ADD COLUMN residenceatonset varchar(255); + +ALTER TABLE exposures ADD COLUMN prophylaxisadherence varchar(255); +ALTER TABLE exposures ADD COLUMN prophylaxisadherencedetails varchar(512); +ALTER TABLE exposures ADD COLUMN travelpurpose varchar(255); +ALTER TABLE exposures ADD COLUMN travelpurposedetails varchar(512); + +ALTER TABLE symptoms ADD COLUMN fatalrisk varchar(255); +ALTER TABLE externalmessage ADD COLUMN malaria varchar(255); +ALTER TABLE externalmessage ADD COLUMN malariainfectedyear integer; +ALTER TABLE externalmessage ADD COLUMN airportworker varchar(255); +ALTER TABLE externalmessage ADD COLUMN healthcareprofessional varchar(255); +ALTER TABLE externalmessage ADD COLUMN modeoftransmission varchar(255); +ALTER TABLE externalmessage ADD column modeoftransmissiontype varchar(255); + +ALTER TABLE epidata_history ADD COLUMN airportworker varchar(255); +ALTER TABLE epidata_history ADD COLUMN healthcareprofessional varchar(255); +ALTER TABLE epidata_history ADD COLUMN placeofinfection varchar(255); +ALTER TABLE epidata_history ADD COLUMN residenceatonset varchar(255); + +ALTER TABLE exposures_history ADD COLUMN prophylaxisadherence varchar(255); +ALTER TABLE exposures_history ADD COLUMN prophylaxisadherencedetails varchar(512); +ALTER TABLE exposures_history ADD COLUMN travelpurpose varchar(255); +ALTER TABLE exposures_history ADD COLUMN travelpurposedetails varchar(512); + +ALTER TABLE symptoms_history ADD COLUMN fatalrisk character varying(255); + +ALTER TABLE externalmessage_history ADD COLUMN malaria varchar(255); +ALTER TABLE externalmessage_history ADD COLUMN malariainfectedyear integer; +ALTER TABLE externalmessage_history ADD COLUMN airportworker varchar(255); +ALTER TABLE externalmessage_history ADD COLUMN healthcareprofessional varchar(255); +ALTER TABLE externalmessage_history ADD COLUMN modeoftransmission varchar(255); +ALTER TABLE externalmessage_history ADD column modeoftransmissiontype varchar(255); +INSERT INTO schema_version (version_number, comment) VALUES (624, '#13838, #13837, #13835, #13836 - Malaria and Dengue Doctors declaration and lab messages changes'); -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** \ No newline at end of file diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjbMappingTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjbMappingTest.java index d954843edc9..2e1ef52a861 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjbMappingTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/labmessage/TestReportFacadeEjbMappingTest.java @@ -22,6 +22,7 @@ import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sample.PathogenTestType; import de.symeda.sormas.api.sample.SeroGroupSpecification; +import de.symeda.sormas.api.sample.Serotype; import de.symeda.sormas.api.sample.SerotypingMethod; import de.symeda.sormas.api.therapy.DrugSusceptibilityType; import de.symeda.sormas.api.utils.DataHelper; @@ -272,7 +273,8 @@ public void testToDto() { source.setSeroGroupSpecificationText("SeroGroup A"); source.setSeroTypingMethod(SerotypingMethod.MULTIPLEX_PCR); source.setSeroTypingMethodText("Multiplex PCR Method"); - source.setSerotype("Test serotype"); + source.setSerotype(Serotype.OTHER); + source.setSerotypeText("Other Serotype"); TestReportDto result = TestReportFacadeEjb.toDto(source); @@ -343,6 +345,7 @@ public void testToDto() { assertEquals(source.getSeroGroupSpecificationText(), result.getSeroGroupSpecificationText()); assertEquals(source.getSeroTypingMethod(), result.getSeroTypingMethod()); assertEquals(source.getSeroTypingMethodText(), result.getSeroTypingMethodText()); - + assertEquals(source.getSerotype(), result.getSerotype()); + assertEquals(source.getSerotypeText(), result.getSerotypeText()); } } 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 71151f7d6b0..800eb4215e9 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 @@ -40,6 +40,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; @@ -218,6 +220,7 @@ public class CaseDataForm extends AbstractEditForm { public static final String DIAGNOSIS_CRITERIA_HEADING_LOC = "diagnosisCriteriaHeadingLoc"; public static final String DIAGNOSIS_CRITERIA_SUBHEADING_LOC = "diagnosisCriteriaSubheadingLoc"; public static final String DIAGNOSIS_CRITERIA_LAB_TEST_PANEL_LOC = "diagnosisCriteriaLoc"; + private static final Pattern URL_PATTERN = Pattern.compile("((https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|])"); //@formatter:off private static final String MAIN_HTML_LAYOUT = @@ -249,7 +252,6 @@ public class CaseDataForm extends AbstractEditForm { fluidColumn(6, 0, locs( CaseDataDto.DISEASE_DETAILS, CaseDataDto.PLAGUE_TYPE, - CaseDataDto.DENGUE_FEVER_TYPE, CaseDataDto.RABIES_TYPE))) + fluidRowLocs(CaseDataDto.DISEASE_VARIANT, CaseDataDto.DISEASE_VARIANT_DETAILS) + loc(LOC_CUSTOMIZABLE_FIELDS_CASE_DATA_DISEASE) + @@ -980,9 +982,9 @@ protected void addFields() { + I18nProperties.getDescription(Descriptions.descGdpr)); CssStyles.style(additionalDetails, CssStyles.CAPTION_HIDDEN); - NullableOptionGroup pregnantField = addField(CaseDataDto.PREGNANT, NullableOptionGroup.class); + addField(CaseDataDto.PREGNANT, NullableOptionGroup.class); - NullableOptionGroup postpartumField = addField(CaseDataDto.POSTPARTUM, NullableOptionGroup.class); + addField(CaseDataDto.POSTPARTUM, NullableOptionGroup.class); Field trimesterField = addField(CaseDataDto.TRIMESTER, NullableOptionGroup.class); boolean isMale = Sex.MALE.equals(person.getSex()); if (!isMale) { @@ -991,11 +993,6 @@ protected void addFields() { trimesterField.setVisible(false); } - // Mutual exclusivity: Pregnancy and Postpartum - if (pregnantField != null && postpartumField != null) { - setupMutuallyExclusiveFields(pregnantField, postpartumField); - } - ComboBox vaccinationStatusField = addField(CaseDataDto.VACCINATION_STATUS, ComboBox.class); // Add field to display means of immunization details when status is OTHER @@ -1627,11 +1624,12 @@ private void getManualCaseDefinition() { Button caseDefinitionButton = ButtonHelper.createIconButton(Captions.info, VaadinIcons.INFO_CIRCLE, e -> { VerticalLayout classificationRulesLayout = new VerticalLayout(); classificationRulesLayout.setMargin(true); - Label suspectContent = new Label(); - suspectContent.setContentMode(ContentMode.HTML); - suspectContent.setWidth(100, Unit.PERCENTAGE); - suspectContent.setValue(caseDefinitionText); - classificationRulesLayout.addComponent(suspectContent); + String processedCaseDefinition = sanitizeAndLinkify(caseDefinitionText); + Label caseDefinitionLabel = new Label(); + caseDefinitionLabel.setContentMode(ContentMode.HTML); + caseDefinitionLabel.setWidth(100, Unit.PERCENTAGE); + caseDefinitionLabel.setValue(processedCaseDefinition); + classificationRulesLayout.addComponent(caseDefinitionLabel); Window popupWindow = VaadinUiUtil.showPopupWindow(classificationRulesLayout); popupWindow.addCloseListener(e1 -> popupWindow.close()); popupWindow.setWidth(860, Unit.PIXELS); @@ -1642,6 +1640,38 @@ private void getManualCaseDefinition() { getContent().addComponent(caseDefinitionButton, CLASSIFICATION_RULES_LOC); } + /** + * sanitizing the url + * + * @param text + * @return sanitized url + */ + private String sanitizeAndLinkify(String text) { + Matcher matcher = URL_PATTERN.matcher(text); + StringBuilder result = new StringBuilder(); + int last = 0; + + while (matcher.find()) { + result.append(escapeHtml(text.substring(last, matcher.start()))); + + String escapedUrl = escapeHtml(matcher.group(1)); + result.append("") + .append(escapedUrl) + .append(""); + + last = matcher.end(); + } + + result.append(escapeHtml(text.substring(last))); + return result.toString(); + } + + private static String escapeHtml(String value) { + return value.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """).replace("'", "'"); + } + private void hideJurisdictionFields() { getField(CaseDataDto.CASE_ORIGIN).setVisible(false); getContent().getComponent(RESPONSIBLE_JURISDICTION_HEADING_LOC).setVisible(false); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java index 2a576970810..a84ed1347e9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java @@ -322,8 +322,7 @@ protected void addFields() { malInfectedYearCB.addItems(DateHelper.getYearsToNow()); malInfectedYearCB.setItemCaptionMode(AbstractSelect.ItemCaptionMode.ID_TOSTRING); malariaInfectedYearLayout.addComponent(malInfectedYearCB, MALARIA_INFECTED_YEAR); - - FieldHelper.setVisibleWhen(getFieldGroup(), Arrays.asList(MALARIA_INFECTED_YEAR), MALARIA, Arrays.asList(YesNoUnknown.YES), true); + fieldVisibilityCheck(getField(MALARIA), malInfectedYearCB, lblInfectedYear); } } @@ -350,13 +349,8 @@ private void fieldVisibilityCheck(FieldGroup fieldGroup, List visibiliti * @param label */ private void fieldVisibilityCheck(NullableOptionGroup input, Field field, Label label) { - input.addValueChangeListener(event -> { - Set set = (Set) event.getProperty().getValue(); - boolean visible = set.contains(YesNoUnknown.YES) ? true : false; - field.setVisible(visible); - label.setVisible(visible); - field.clear(); - }); + input.addValueChangeListener(event -> updateFieldVisibility(input, field, label)); + updateFieldVisibility(input, field, label); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java index 48f3ad7b828..2c4d1f6d963 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java @@ -91,6 +91,7 @@ public class EpiDataForm extends AbstractEditForm { private static final long serialVersionUID = 1L; private static final String LOC_EXPOSURE_INVESTIGATION_HEADING = "locExposureInvestigationHeading"; + private static final String LOC_EXPOSURE_PERIOD_CONSIDER_HEADING = "locExposurePeriodConsiderHeading"; private static final String LOC_CONCLUSION_HEADING = "locConclusionHeading"; private static final String LOC_CLUSTER_TYPE_HEADING = "locClusterTypeHeading"; private static final String LOC_ACTIVITY_AS_CASE_INVESTIGATION_HEADING = "locActivityAsCaseInvestigationHeading"; @@ -105,10 +106,14 @@ public class EpiDataForm extends AbstractEditForm { fluidRowLocs(3, "EXPOSURE_START_DATE_LABEL", 3, "EXPOSURE_START_DATE_VALUE", 3, "EXPOSURE_END_DATE_LABEL", 3, "EXPOSURE_END_DATE_VALUE"); private static final String LOC_OTHER_INFORMATION_HEADING = "locOtherInformationHeading"; + private static final List CONCLUSION_ALLOWED_DISEASES = + Collections.unmodifiableList(Arrays.asList(Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS, Disease.MALARIA, Disease.DENGUE)); + //@formatter:off private static final String MAIN_HTML_LAYOUT = - loc(LOC_EXPOSURE_INVESTIGATION_HEADING) + + loc(LOC_EXPOSURE_PERIOD_CONSIDER_HEADING) + fluidRowLocs("EXP_DATES_LAYOUT") + + loc(LOC_EXPOSURE_INVESTIGATION_HEADING) + fluidRowLocs(6,EpiDataDto.CASE_IMPORTED_STATUS,6,"") + loc(LOC_EXP_PERIOD_HEADING) + loc(EpiDataDto.EXPOSURE_DETAILS_KNOWN) + @@ -119,6 +124,7 @@ public class EpiDataForm extends AbstractEditForm { fluidRowLocs(6, EpiDataDto.IMPORTED_CASE, 6, EpiDataDto.COUNTRY)+ fluidRowLocs(EpiDataDto.MODE_OF_TRANSMISSION, EpiDataDto.MODE_OF_TRANSMISSION_TYPE) + fluidRowLocs(EpiDataDto.INFECTION_SOURCE, EpiDataDto.INFECTION_SOURCE_TEXT) + + fluidRowLocs(EpiDataDto.PLACE_OF_INFECTION, EpiDataDto.RESIDENCE_AT_ONSET) + loc(LOC_ACTIVITY_AS_CASE_INVESTIGATION_HEADING) + loc(EpiDataDto.ACTIVITY_AS_CASE_DETAILS_KNOWN)+ loc(EpiDataDto.ACTIVITIES_AS_CASE) + @@ -128,6 +134,8 @@ public class EpiDataForm extends AbstractEditForm { locCss(VSPACE_TOP_3, LOC_EPI_DATA_FIELDS_HINT) + loc(EpiDataDto.HIGH_TRANSMISSION_RISK_AREA) + loc(EpiDataDto.LARGE_OUTBREAKS_AREA) + + loc(EpiDataDto.AIRPORT_WORKER) + + loc(EpiDataDto.HEALTHCARE_PROFESSIONAL) + loc(EpiDataDto.AREA_INFECTED_ANIMALS); private static final String SOURCE_CONTACTS_HTML_LAYOUT = @@ -144,6 +152,7 @@ public class EpiDataForm extends AbstractEditForm { private final transient Consumer sourceContactsToggleCallback; private final boolean isPseudonymized; private final Date symptomOnsetDate; + private final boolean caseFollowUpEnabled; private CustomizableFieldsGroup exposureInvestigationPanel; private CustomizableFieldsGroup activityAsCasePanel; @@ -171,6 +180,7 @@ public EpiDataForm( this.sourceContactsToggleCallback = sourceContactsToggleCallback; this.isPseudonymized = isPseudonymized; this.symptomOnsetDate = date; + this.caseFollowUpEnabled = disease != null && FacadeProvider.getDiseaseConfigurationFacade().hasFollowUp(disease); setCustomizableFieldsMetadata(customizableFieldsMetadata); setCustomizableFieldsValues(customizableFieldsValues); addFields(); @@ -242,6 +252,10 @@ protected void addFields() { country.addItems(countries); includeExposureDates(symptomOnsetDate, disease); + addField(EpiDataDto.AIRPORT_WORKER, NullableOptionGroup.class); + addField(EpiDataDto.HEALTHCARE_PROFESSIONAL, NullableOptionGroup.class); + addField(EpiDataDto.PLACE_OF_INFECTION); + addField(EpiDataDto.RESIDENCE_AT_ONSET); TextField clusterTypeTF = addField(EpiDataDto.CLUSTER_TYPE_TEXT); FieldHelper @@ -268,9 +282,7 @@ protected void addFields() { initializeVisibilitiesAndAllowedVisibilities(); initializeAccessAndAllowedAccesses(); - exposuresField.addValueChangeListener(e -> { - ogExposureDetailsKnown.setEnabled(CollectionUtils.isEmpty(exposuresField.getValue())); - }); + exposuresField.addValueChangeListener(e -> ogExposureDetailsKnown.setEnabled(CollectionUtils.isEmpty(exposuresField.getValue()))); TextArea additionalDetails = addField(EpiDataDto.OTHER_DETAILS, TextArea.class); additionalDetails.setRows(6); @@ -287,6 +299,9 @@ protected void addFields() { * @param disease */ private void includeExposureDates(Date symptomOnsetDate, Disease disease) { + // By default, hiding the exposure period to consider heading, + // it will be visible only when all the conditions are met to show the exposure start and end dates. + getContent().getComponent(LOC_EXPOSURE_PERIOD_CONSIDER_HEADING).setVisible(false); // if symptomOnsetDate is null, return; if (symptomOnsetDate == null) { return; @@ -325,6 +340,7 @@ private void includeExposureDates(Date symptomOnsetDate, Disease disease) { exposureDatesLayout.addComponent(exposureEndDateValue, "EXPOSURE_END_DATE_VALUE"); getContent().addComponent(exposureDatesLayout, "EXP_DATES_LAYOUT"); + getContent().getComponent(LOC_EXPOSURE_PERIOD_CONSIDER_HEADING).setVisible(true); } private void addActivityAsCaseFields() { @@ -373,11 +389,16 @@ private void addHeadingsAndInfoTexts() { new MultilineLabel(h3(I18nProperties.getString(Strings.headingClusterType)) + divsCss(VSPACE_3), ContentMode.HTML), LOC_CLUSTER_TYPE_HEADING); } + + getContent().addComponent( + new MultilineLabel(h3(I18nProperties.getString(Strings.headingExposurePeriodConsider)) + divsCss(VSPACE_3), ContentMode.HTML), + LOC_EXPOSURE_PERIOD_CONSIDER_HEADING); + // Conclusion heading should be visible for all countries Giardiasis & Cryptosporidiosis specific fields getContent().addComponent( new MultilineLabel(h3(I18nProperties.getString(Strings.headingEpiConclusion)) + divsCss(VSPACE_3), ContentMode.HTML), LOC_CONCLUSION_HEADING); - getContent().getComponent(LOC_CONCLUSION_HEADING).setVisible(Arrays.asList(Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS).contains(disease)); + getContent().getComponent(LOC_CONCLUSION_HEADING).setVisible(CONCLUSION_ALLOWED_DISEASES.contains(disease)); getContent().addComponent( new MultilineLabel( @@ -465,7 +486,14 @@ public Map> @Override protected String createHtmlLayout() { - String layout = parentClass == CaseDataDto.class ? MAIN_HTML_LAYOUT + SOURCE_CONTACTS_HTML_LAYOUT : MAIN_HTML_LAYOUT; + // Source contacts YESNOUnknown field should be visible only the diseases which are follow-up enabled, + // else normal layout without source contacts fields should be visible. + String layout; + if (parentClass == CaseDataDto.class && caseFollowUpEnabled) { + layout = MAIN_HTML_LAYOUT + SOURCE_CONTACTS_HTML_LAYOUT; + } else { + layout = MAIN_HTML_LAYOUT; + } return layout + OTHER_INFORMATION_HTML_LAYOUT; } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java index d799373d8a9..032da81001c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java @@ -65,6 +65,8 @@ import de.symeda.sormas.api.exposure.ExposureSetting; import de.symeda.sormas.api.exposure.ExposureSubSetting; import de.symeda.sormas.api.exposure.FomiteTransmissionLocation; +import de.symeda.sormas.api.exposure.ProphylaxisAdherence; +import de.symeda.sormas.api.exposure.TravelPurpose; import de.symeda.sormas.api.exposure.TypeOfAnimal; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -119,6 +121,10 @@ public class ExposureForm extends AbstractEditForm { ExposureDto.PROTECTIVE_MEASURES )) ) + + fluidRow(fluidColumn(4, 0, locs(ExposureDto.PROPHYLAXIS_ADHERENCE))) + + fluidRow(fluidColumn(4, 0, locs(ExposureDto.PROPHYLAXIS_ADHERENCE_DETAILS))) + + fluidRow(fluidColumn(4, 0, locs(ExposureDto.TRAVEL_PURPOSE))) + + fluidRow(fluidColumn(4, 0, locs(ExposureDto.TRAVEL_PURPOSE_DETAILS))) + fluidRow( fluidColumn(4, 0, locs( ExposureDto.EXPOSURE_SUB_SETTING_DETAILS, @@ -177,6 +183,10 @@ public class ExposureForm extends AbstractEditForm { private ComboBox typeOfAnimalField; private TextField animalCategoryDetailsField; private NullableOptionGroup fomiteTransmissionLocationField; + private ComboBox prophylaxisAdherenceField; + private ComboBox travelPurposeField; + private TextField prophylaxisAdherenceDetailsField; + private TextField travelPurposeDetailsField; private CustomizableFieldsGroup exposureDetailsPanel; private CustomizableFieldsGroup exposuresGeneralPanel; @@ -339,6 +349,13 @@ private void addBasicFields() { protectiveMeasureDetailsField = addField(exposureDetailsLayout, ExposureDto.PROTECTIVE_MEASURE_DETAILS, TextField.class); protectiveMeasureDetailsField.setVisible(false); + prophylaxisAdherenceField = addField(exposureDetailsLayout, ExposureDto.PROPHYLAXIS_ADHERENCE, ComboBox.class); + prophylaxisAdherenceField.setVisible(false); + prophylaxisAdherenceDetailsField = addField(exposureDetailsLayout, ExposureDto.PROPHYLAXIS_ADHERENCE_DETAILS, TextField.class); + travelPurposeField = addField(exposureDetailsLayout, ExposureDto.TRAVEL_PURPOSE, ComboBox.class); + travelPurposeField.setVisible(false); + travelPurposeDetailsField = addField(exposureDetailsLayout, ExposureDto.TRAVEL_PURPOSE_DETAILS, TextField.class); + categoryField.addValueChangeListener(e -> { ExposureCategory selectedCategory = (ExposureCategory) e.getProperty().getValue(); updateSettingFieldItems(selectedCategory); @@ -378,6 +395,8 @@ private void addBasicFields() { Set selectedSubSettings = (Set) e.getProperty().getValue(); boolean containsOther = selectedSubSettings != null && selectedSubSettings.contains(ExposureSubSetting.OTHER); subSettingsDetailsField.setVisible(containsOther); + boolean isProphylaxis = selectedSubSettings != null && selectedSubSettings.contains(ExposureSubSetting.TRAVELED_ABROAD); + setVisibleClear(isProphylaxis, ExposureDto.PROPHYLAXIS_ADHERENCE, ExposureDto.TRAVEL_PURPOSE); }); contactFactorsField.addValueChangeListener(e -> { @@ -462,7 +481,13 @@ private void setUpVisibilityDependencies() { locationForm.getFacilityTypeGroup(), Collections.singletonList(FacilityTypeGroup.WORKING_PLACE), true); - + FieldHelper.setVisibleWhen( + getFieldGroup(), + ExposureDto.PROPHYLAXIS_ADHERENCE_DETAILS, + ExposureDto.PROPHYLAXIS_ADHERENCE, + ProphylaxisAdherence.OTHER, + true); + FieldHelper.setVisibleWhen(getFieldGroup(), ExposureDto.TRAVEL_PURPOSE_DETAILS, ExposureDto.TRAVEL_PURPOSE, TravelPurpose.OTHER, true); conclusionHeading.setVisible(List.of(Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS).contains(disease)); locationForm.setFacilityFieldsVisible(getField(ExposureDto.TYPE_OF_PLACE).getValue() == TypeOfPlace.FACILITY, true); getField(ExposureDto.TYPE_OF_PLACE) @@ -595,6 +620,10 @@ public void setValue(ExposureDto newFieldValue) throws ReadOnlyException, Conver TypeOfAnimal typeOfAnimal = newFieldValue.getTypeOfAnimal(); String animalCategoryDetails = newFieldValue.getAnimalCategoryDetails(); FomiteTransmissionLocation fomiteTransmissionLocation = newFieldValue.getFomiteTransmissionLocation(); + ProphylaxisAdherence prophylaxisAdherence = newFieldValue.getProphylaxisAdherence(); + String prophylaxisAdherenceDetails = newFieldValue.getProphylaxisAdherenceDetails(); + TravelPurpose travelPurpose = newFieldValue.getTravelPurpose(); + String travelPurposeDetails = newFieldValue.getTravelPurposeDetails(); // Update field items (these methods clear the field values) updateSettingFieldItems(category); @@ -620,6 +649,35 @@ public void setValue(ExposureDto newFieldValue) throws ReadOnlyException, Conver subSettingsDetailsField.setValue(subSettingDetails); } + boolean hasTraveledAbroad = subSettings != null && subSettings.contains(ExposureSubSetting.TRAVELED_ABROAD); + prophylaxisAdherenceField.setVisible(hasTraveledAbroad); + travelPurposeField.setVisible(hasTraveledAbroad); + // If the person has traveled abroad, show the prophylaxis adherence and travel purpose fields + if (hasTraveledAbroad) { + if (prophylaxisAdherence != null) { + prophylaxisAdherenceField.setValue(prophylaxisAdherence); + } + prophylaxisAdherenceDetailsField.setVisible(prophylaxisAdherence == ProphylaxisAdherence.OTHER); + if (prophylaxisAdherenceDetails != null) { + prophylaxisAdherenceDetailsField.setValue(prophylaxisAdherenceDetails); + } + + if (travelPurpose != null) { + travelPurposeField.setValue(travelPurpose); + } + travelPurposeDetailsField.setVisible(travelPurpose == TravelPurpose.OTHER); + if (travelPurposeDetails != null) { + travelPurposeDetailsField.setValue(travelPurposeDetails); + } + } else { + prophylaxisAdherenceField.setValue(null); + prophylaxisAdherenceDetailsField.setValue(null); + prophylaxisAdherenceDetailsField.setVisible(false); + travelPurposeField.setValue(null); + travelPurposeDetailsField.setValue(null); + travelPurposeDetailsField.setVisible(false); + } + // Restore contactFactors field value and visibility if (contactFactors != null && !contactFactors.isEmpty()) { contactFactorsField.setValue(contactFactors); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java index 7d567398782..07340c150ed 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java @@ -49,12 +49,6 @@ public class PathogenTestListEntry extends SideComponentField { private final PathogenTestDto pathogenTest; - List seroGrpTests = Arrays.asList( - PathogenTestType.SEROGROUPING, - PathogenTestType.MULTILOCUS_SEQUENCE_TYPING, - PathogenTestType.SLIDE_AGGLUTINATION, - PathogenTestType.WHOLE_GENOME_SEQUENCING, - PathogenTestType.SEQUENCING); //@formatter:off public static final Map> VARIANT_MAP = Collections.unmodifiableMap(new HashMap<>() { { @@ -137,11 +131,43 @@ public PathogenTestListEntry(PathogenTestDto pathogenTest, boolean showTestResul } } - Object resultText = ""; PathogenTestType testType = pathogenTest.getTestType(); - if (seroGrpTests.contains(pathogenTest.getTestType())) { - resultText = pathogenTest.getSeroGroupSpecification() != null ? pathogenTest.getSeroGroupSpecification() : pathogenTest.getSerotype(); - } else if (pathogenTest.getTestedDisease() == Disease.TUBERCULOSIS && VARIANT_MAP.get(pathogenTest.getTestedDisease()).contains(testType)) { + Object resultText = getResultText(pathogenTest, testType); + + Label labelResult = new Label(DataHelper.toStringNullable(resultText)); + CssStyles.style(labelResult, CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE); + if (pathogenTest.getTestResult() == PathogenTestResultType.POSITIVE) { + CssStyles.style(labelResult, CssStyles.LABEL_CRITICAL); + } else { + CssStyles.style(labelResult, CssStyles.LABEL_WARNING); + } + addComponentToField(labelResult); + + if (pathogenTest.getTestedDisease() == Disease.TUBERCULOSIS) { + if (testType == PathogenTestType.PCR_RT_PCR) { + Label pcrRifampicinTextLabel = new Label( + I18nProperties.getPrefixCaption(PathogenTestDto.I18N_PREFIX, PathogenTestDto.RIFAMPICIN_RESISTANT) + ": " + StringUtils + .abbreviate((pathogenTest.getRifampicinResistant() != null ? pathogenTest.getRifampicinResistant().toString() : ""), 125)); + pcrRifampicinTextLabel.setWidthFull(); + addComponentToField(pcrRifampicinTextLabel); + + Label pcrIsoniazidTextLabel = new Label( + I18nProperties.getPrefixCaption(PathogenTestDto.I18N_PREFIX, PathogenTestDto.ISONIAZID_RESISTANT) + ": " + StringUtils + .abbreviate((pathogenTest.getIsoniazidResistant() != null ? pathogenTest.getIsoniazidResistant().toString() : ""), 125)); + pcrIsoniazidTextLabel.setWidthFull(); + addComponentToField(pcrIsoniazidTextLabel); + } else if (testType == PathogenTestType.ANTIBIOTIC_SUSCEPTIBILITY) { + labelResult.setVisible(false); + } + } + } + + private Object getResultText(PathogenTestDto pathogenTest, PathogenTestType testType) { + if (testType == null) { + return ""; + } + Object resultText = ""; + if (pathogenTest.getTestedDisease() == Disease.TUBERCULOSIS && VARIANT_MAP.get(pathogenTest.getTestedDisease()).contains(testType)) { if (testType == PathogenTestType.MICROSCOPY) { resultText = StringUtils.abbreviate((pathogenTest.getTestScale() != null ? pathogenTest.getTestScale().toString() : ""), 125); } else if (testType == PathogenTestType.BEIJINGGENOTYPING) { @@ -163,7 +189,7 @@ public PathogenTestListEntry(PathogenTestDto pathogenTest, boolean showTestResul resultText = StringUtils.abbreviate((pathogenTest.getSpecie() != null ? pathogenTest.getSpecie().toString() : ""), 125); } - } else if (pathogenTest.getTestedDisease() == Disease.DENGUE + } else if ((pathogenTest.getTestedDisease() == Disease.DENGUE || pathogenTest.getTestedDisease() == Disease.INVASIVE_PNEUMOCOCCAL_INFECTION) && VARIANT_MAP.get(pathogenTest.getTestedDisease()).stream().anyMatch(testType::equals)) { // handling other serotypes if (pathogenTest.getSerotype() == Serotype.OTHER) { @@ -175,33 +201,7 @@ public PathogenTestListEntry(PathogenTestDto pathogenTest, boolean showTestResul } else { resultText = pathogenTest.getTestResult(); } - - Label labelResult = new Label(DataHelper.toStringNullable(resultText)); - CssStyles.style(labelResult, CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE); - if (pathogenTest.getTestResult() == PathogenTestResultType.POSITIVE) { - CssStyles.style(labelResult, CssStyles.LABEL_CRITICAL); - } else { - CssStyles.style(labelResult, CssStyles.LABEL_WARNING); - } - addComponentToField(labelResult); - - if (pathogenTest.getTestedDisease() == Disease.TUBERCULOSIS) { - if (testType == PathogenTestType.PCR_RT_PCR) { - Label pcrRifampicinTextLabel = new Label( - I18nProperties.getPrefixCaption(PathogenTestDto.I18N_PREFIX, PathogenTestDto.RIFAMPICIN_RESISTANT) + ": " + StringUtils - .abbreviate((pathogenTest.getRifampicinResistant() != null ? pathogenTest.getRifampicinResistant().toString() : ""), 125)); - pcrRifampicinTextLabel.setWidthFull(); - addComponentToField(pcrRifampicinTextLabel); - - Label pcrIsoniazidTextLabel = new Label( - I18nProperties.getPrefixCaption(PathogenTestDto.I18N_PREFIX, PathogenTestDto.ISONIAZID_RESISTANT) + ": " + StringUtils - .abbreviate((pathogenTest.getIsoniazidResistant() != null ? pathogenTest.getIsoniazidResistant().toString() : ""), 125)); - pcrIsoniazidTextLabel.setWidthFull(); - addComponentToField(pcrIsoniazidTextLabel); - } else if (testType == PathogenTestType.ANTIBIOTIC_SUSCEPTIBILITY) { - labelResult.setVisible(false); - } - } + return resultText; } @Nullable diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/symptoms/SymptomsForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/symptoms/SymptomsForm.java index be4c51e3561..92a9c907029 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/symptoms/SymptomsForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/symptoms/SymptomsForm.java @@ -548,7 +548,8 @@ public String getFormattedHtmlMessage() { CEREBRAL_MALARIA, SCANT_HEMORRHAGE, OTHER_NEUROLOCAL_SYMPTOM, - OTHER_NEUROLOCAL_SYMPTOM_TEXT); + OTHER_NEUROLOCAL_SYMPTOM_TEXT, + FATAL_RISK); addField(SYMPTOMS_COMMENTS, TextField.class).setDescription( I18nProperties.getPrefixDescription(I18N_PREFIX, SYMPTOMS_COMMENTS, "") + "\n" + I18nProperties.getDescription(Descriptions.descGdpr)); @@ -877,7 +878,8 @@ public String getFormattedHtmlMessage() { METABOLIC_ACIDOSIS, DISSEMINATED_INTRA_VASCULAR_COAGULATION, CEREBRAL_MALARIA, - SCANT_HEMORRHAGE); + SCANT_HEMORRHAGE, + FATAL_RISK); // Set visibilities diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java index b771dd42186..a26fe0eaf56 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.vaadin.ui.Label; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.data.Item; import com.vaadin.v7.data.Validator; @@ -53,6 +54,7 @@ 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.utils.YesNoUnknown; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; import de.symeda.sormas.ui.clinicalcourse.HealthConditionsForm; @@ -750,4 +752,23 @@ protected void setupMutuallyExclusiveFields(NullableOptionGroup field1, Nullable } }); } + + /** + * To hide the field and its custom label when the input is set to NO or UNKNOWN. + * NullableOptionGroup input + * + * @param field + * input field + * @param label + * custom label + */ + protected void updateFieldVisibility(NullableOptionGroup input, Field field, Label label) { + boolean visible = YesNoUnknown.YES.equals(FieldHelper.getNullableSourceFieldValue(input)); + field.setVisible(visible); + label.setVisible(visible); + if (!visible) { + field.clear(); + } + } + }