From 24b5234ea4feb3fe711efc8673a551babf84975b Mon Sep 17 00:00:00 2001
From: Obinna Henry <55580796+obinna-h-n@users.noreply.github.com>
Date: Sat, 17 Feb 2024 18:33:34 +0100
Subject: [PATCH 1/5] #12634 - Started development of AEFI module
- #12728 - Added a new AEFI entity, related entities, dto's and enumerations
- #12772 - Added AEFI user rights
- #12767 - Added an AEFI directory for the web app
- #12769 - Added a create/edit form for AEFI in the web app
- #12976 - Added a basic AEFI dashboard
---
.../de/symeda/sormas/api/FacadeProvider.java | 10 +
.../AdverseEventState.java | 33 +
.../AdverseEventsDto.java | 186 ++++++
.../AefiAgeGroup.java | 35 +
.../AefiCriteria.java | 232 +++++++
.../AefiDashboardFilterDateType.java | 32 +
.../AefiDateType.java | 33 +
.../AefiDto.java | 614 ++++++++++++++++++
.../AefiFacade.java | 31 +
.../AefiHelper.java | 87 +++
.../AefiIndexDto.java | 277 ++++++++
.../AefiListCriteria.java | 48 ++
.../AefiListEntryDto.java | 97 +++
.../AefiOutcome.java | 36 +
.../AefiReferenceDto.java | 45 ++
.../AefiType.java | 41 ++
.../SeizureType.java | 32 +
.../SeriousAefiReason.java | 36 +
.../api/common/DeletableEntityType.java | 1 +
.../api/dashboard/AefiDashboardCriteria.java | 49 ++
.../AefiChartData.java | 58 ++
.../AefiChartSeries.java | 61 ++
.../AefiDashboardFacade.java | 44 ++
.../MapAefiDto.java | 78 +++
.../sormas/api/feature/FeatureType.java | 1 +
.../de/symeda/sormas/api/i18n/Captions.java | 106 +++
.../symeda/sormas/api/i18n/Descriptions.java | 3 +
.../de/symeda/sormas/api/i18n/Strings.java | 33 +
.../symeda/sormas/api/i18n/Validations.java | 3 +
.../de/symeda/sormas/api/user/UserRight.java | 13 +
.../sormas/api/user/UserRightGroup.java | 1 +
.../src/main/resources/captions.properties | 112 ++++
.../main/resources/descriptions.properties | 6 +-
sormas-api/src/main/resources/enum.properties | 52 ++
.../src/main/resources/strings.properties | 42 +-
.../src/main/resources/validations.properties | 3 +
.../AdverseEventsMapper.java | 82 +++
.../AefiFacadeEjb.java | 455 +++++++++++++
.../AefiJurisdictionPredicateValidator.java | 108 +++
.../AefiQueryContext.java | 45 ++
.../AefiService.java | 521 +++++++++++++++
.../entity/AdverseEvents.java | 179 +++++
.../entity/Aefi.java | 606 +++++++++++++++++
.../entity/AefiJoins.java | 162 +++++
.../AefiIndexDtoResultTransformer.java | 86 +++
.../AefiListEntryDtoResultTransformer.java | 60 ++
.../AefiDashboardFacadeEjb.java | 76 +++
.../AefiDashboardService.java | 515 +++++++++++++++
.../immunization/ImmunizationService.java | 21 +
.../main/resources/META-INF/persistence.xml | 3 +
.../symeda/sormas/ui/ControllerProvider.java | 7 +
.../java/de/symeda/sormas/ui/MainScreen.java | 24 +-
.../AbstractAefiView.java | 115 ++++
.../AefiController.java | 195 ++++++
.../AefiDataView.java | 128 ++++
.../AefiView.java | 208 ++++++
.../aefilink/AefiList.java | 89 +++
.../aefilink/AefiListComponent.java | 56 ++
.../aefilink/AefiListEntry.java | 79 +++
.../components/directory/AefiDataLayout.java | 42 ++
.../components/directory/AefiFilterForm.java | 420 ++++++++++++
.../directory/AefiFilterFormLayout.java | 53 ++
.../components/directory/AefiGrid.java | 132 ++++
...imarySuspectVaccinationSelectionField.java | 146 +++++
.../vaccines/AefiVaccinationsField.java | 200 ++++++
.../vaccines/AefiVaccinationsField_2.java | 198 ++++++
.../components/form/AdverseEventsForm.java | 149 +++++
.../components/form/AefiDataForm.java | 303 +++++++++
.../information/AefiImmunizationInfo.java | 109 ++++
.../information/AefiPersonInfo.java | 142 ++++
.../ui/dashboard/AbstractDashboardView.java | 8 +
.../ui/dashboard/DashboardController.java | 5 +
.../sormas/ui/dashboard/DashboardType.java | 3 +-
.../AefiDashboardDataProvider.java | 81 +++
.../AefiDashboardFilterLayout.java | 112 ++++
.../AefiDashboardView.java | 230 +++++++
.../AefiEpiCurveComponent.java | 97 +++
.../components/AefiByVaccineDoseChart.java | 158 +++++
.../components/AefiCountTilesComponent.java | 204 ++++++
.../components/AefiDashboardMapComponent.java | 161 +++++
.../AefiReactionsByGenderChart.java | 166 +++++
.../AefiTypeStatisticsComponent.java | 100 +++
.../AefiTypeStatisticsGroupComponent.java | 64 ++
.../ui/immunization/ImmunizationDataView.java | 20 +-
.../sormas/ui/utils/ArchiveHandlers.java | 6 +
.../sormas/ui/utils/ArchiveMessages.java | 17 +
.../de/symeda/sormas/ui/utils/CssStyles.java | 17 +
.../utils/SormasFieldGroupFieldFactory.java | 18 +-
.../webapp/VAADIN/themes/sormas/global.scss | 67 ++
89 files changed, 9812 insertions(+), 7 deletions(-)
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventState.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventsDto.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiAgeGroup.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiCriteria.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDashboardFilterDateType.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDateType.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDto.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiFacade.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiHelper.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiIndexDto.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListCriteria.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListEntryDto.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiOutcome.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiReferenceDto.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiType.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeizureType.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeriousAefiReason.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/dashboard/AefiDashboardCriteria.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/dashboard/adverseeventsfollowingimmunization/AefiChartData.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/dashboard/adverseeventsfollowingimmunization/AefiChartSeries.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/dashboard/adverseeventsfollowingimmunization/AefiDashboardFacade.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/dashboard/adverseeventsfollowingimmunization/MapAefiDto.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/AdverseEventsMapper.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/AefiFacadeEjb.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/AefiJurisdictionPredicateValidator.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/AefiQueryContext.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/AefiService.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/entity/AdverseEvents.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/entity/Aefi.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/entity/AefiJoins.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/transformers/AefiIndexDtoResultTransformer.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/adverseeventsfollowingimmunization/transformers/AefiListEntryDtoResultTransformer.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/adverseeventsfollowingimmunization/AefiDashboardFacadeEjb.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/adverseeventsfollowingimmunization/AefiDashboardService.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AbstractAefiView.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AefiController.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AefiDataView.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AefiView.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/aefilink/AefiList.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/aefilink/AefiListComponent.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/aefilink/AefiListEntry.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/directory/AefiDataLayout.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/directory/AefiFilterForm.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/directory/AefiFilterFormLayout.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/directory/AefiGrid.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/fields/vaccines/AefiPrimarySuspectVaccinationSelectionField.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/fields/vaccines/AefiVaccinationsField.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/fields/vaccines/AefiVaccinationsField_2.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/form/AdverseEventsForm.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/form/AefiDataForm.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/information/AefiImmunizationInfo.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/information/AefiPersonInfo.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/AefiDashboardDataProvider.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/AefiDashboardFilterLayout.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/AefiDashboardView.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/AefiEpiCurveComponent.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/components/AefiByVaccineDoseChart.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/components/AefiCountTilesComponent.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/components/AefiDashboardMapComponent.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/components/AefiReactionsByGenderChart.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/components/AefiTypeStatisticsComponent.java
create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/adverseeventsfollowingimmunization/components/AefiTypeStatisticsGroupComponent.java
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java
index e731a9dd8e0..f7570d1c269 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java
@@ -19,6 +19,7 @@
import javax.naming.NamingException;
import de.symeda.sormas.api.action.ActionFacade;
+import de.symeda.sormas.api.adverseeventsfollowingimmunization.AefiFacade;
import de.symeda.sormas.api.audit.AuditLoggerFacade;
import de.symeda.sormas.api.bagexport.BAGExportFacade;
import de.symeda.sormas.api.campaign.CampaignFacade;
@@ -38,6 +39,7 @@
import de.symeda.sormas.api.contact.ContactFacade;
import de.symeda.sormas.api.customizableenum.CustomizableEnumFacade;
import de.symeda.sormas.api.dashboard.DashboardFacade;
+import de.symeda.sormas.api.dashboard.adverseeventsfollowingimmunization.AefiDashboardFacade;
import de.symeda.sormas.api.dashboard.sample.SampleDashboardFacade;
import de.symeda.sormas.api.deletionconfiguration.DeletionConfigurationFacade;
import de.symeda.sormas.api.disease.DiseaseConfigurationFacade;
@@ -148,6 +150,10 @@ public static ImmunizationFacade getImmunizationFacade() {
return get().lookupEjbRemote(ImmunizationFacade.class);
}
+ public static AefiFacade getAefiFacade() {
+ return get().lookupEjbRemote(AefiFacade.class);
+ }
+
public static VaccinationFacade getVaccinationFacade() {
return get().lookupEjbRemote(VaccinationFacade.class);
}
@@ -320,6 +326,10 @@ public static SampleDashboardFacade getSampleDashboardFacade() {
return get().lookupEjbRemote(SampleDashboardFacade.class);
}
+ public static AefiDashboardFacade getAefiDashboardFacade() {
+ return get().lookupEjbRemote(AefiDashboardFacade.class);
+ }
+
public static DiseaseConfigurationFacade getDiseaseConfigurationFacade() {
return get().lookupEjbRemote(DiseaseConfigurationFacade.class);
}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventState.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventState.java
new file mode 100644
index 00000000000..73d64393393
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventState.java
@@ -0,0 +1,33 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public enum AdverseEventState {
+
+ YES,
+ NO,
+ UNKNOWN;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventsDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventsDto.java
new file mode 100644
index 00000000000..94551919c89
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AdverseEventsDto.java
@@ -0,0 +1,186 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.feature.FeatureType;
+import de.symeda.sormas.api.utils.DataHelper;
+import de.symeda.sormas.api.utils.DependingOnFeatureType;
+import de.symeda.sormas.api.utils.Order;
+import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto;
+
+@DependingOnFeatureType(featureType = {
+ FeatureType.IMMUNIZATION_MANAGEMENT,
+ FeatureType.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_MANAGEMENT })
+public class AdverseEventsDto extends PseudonymizableDto {
+
+ private static final long serialVersionUID = 8081578717541472008L;
+
+ public static final String I18N_PREFIX = "AdverseEvents";
+
+ public static final String SEVERE_LOCAL_REACTION = "severeLocalReaction";
+ public static final String SEVERE_LOCAL_REACTION_MORE_THAN_THREE_DAYS = "severeLocalReactionMoreThanThreeDays";
+ public static final String SEVERE_LOCAL_REACTION_BEYOND_NEAREST_JOINT = "severeLocalReactionBeyondNearestJoint";
+ public static final String SEIZURES = "seizures";
+ public static final String SEIZURE_TYPE = "seizureType";
+ public static final String ABSCESS = "abscess";
+ public static final String SEPSIS = "sepsis";
+ public static final String ENCEPHALOPATHY = "encephalopathy";
+ public static final String TOXIC_SHOCK_SYNDROME = "toxicShockSyndrome";
+ public static final String THROMBOCYTOPENIA = "thrombocytopenia";
+ public static final String ANAPHYLAXIS = "anaphylaxis";
+ public static final String FEVERISH_FEELING = "feverishFeeling";
+ public static final String OTHER_ADVERSE_EVENT_DETAILS = "otherAdverseEventDetails";
+
+ private AdverseEventState severeLocalReaction;
+ private boolean severeLocalReactionMoreThanThreeDays;
+ private boolean severeLocalReactionBeyondNearestJoint;
+ private AdverseEventState seizures;
+ private SeizureType seizureType;
+ private AdverseEventState abscess;
+ private AdverseEventState sepsis;
+ private AdverseEventState encephalopathy;
+ private AdverseEventState toxicShockSyndrome;
+ private AdverseEventState thrombocytopenia;
+ private AdverseEventState anaphylaxis;
+ private AdverseEventState feverishFeeling;
+ private String otherAdverseEventDetails;
+
+ public static AdverseEventsDto build() {
+ AdverseEventsDto adverseEvents = new AdverseEventsDto();
+ adverseEvents.setUuid(DataHelper.createUuid());
+ return adverseEvents;
+ }
+
+ @Order(1)
+ public AdverseEventState getSevereLocalReaction() {
+ return severeLocalReaction;
+ }
+
+ public void setSevereLocalReaction(AdverseEventState severeLocalReaction) {
+ this.severeLocalReaction = severeLocalReaction;
+ }
+
+ @Order(2)
+ public boolean isSevereLocalReactionMoreThanThreeDays() {
+ return severeLocalReactionMoreThanThreeDays;
+ }
+
+ public void setSevereLocalReactionMoreThanThreeDays(boolean severeLocalReactionMoreThanThreeDays) {
+ this.severeLocalReactionMoreThanThreeDays = severeLocalReactionMoreThanThreeDays;
+ }
+
+ @Order(3)
+ public boolean isSevereLocalReactionBeyondNearestJoint() {
+ return severeLocalReactionBeyondNearestJoint;
+ }
+
+ public void setSevereLocalReactionBeyondNearestJoint(boolean severeLocalReactionBeyondNearestJoint) {
+ this.severeLocalReactionBeyondNearestJoint = severeLocalReactionBeyondNearestJoint;
+ }
+
+ @Order(4)
+ public AdverseEventState getSeizures() {
+ return seizures;
+ }
+
+ public void setSeizures(AdverseEventState seizures) {
+ this.seizures = seizures;
+ }
+
+ @Order(5)
+ public SeizureType getSeizureType() {
+ return seizureType;
+ }
+
+ public void setSeizureType(SeizureType seizureType) {
+ this.seizureType = seizureType;
+ }
+
+ @Order(6)
+ public AdverseEventState getAbscess() {
+ return abscess;
+ }
+
+ public void setAbscess(AdverseEventState abscess) {
+ this.abscess = abscess;
+ }
+
+ @Order(7)
+ public AdverseEventState getSepsis() {
+ return sepsis;
+ }
+
+ public void setSepsis(AdverseEventState sepsis) {
+ this.sepsis = sepsis;
+ }
+
+ @Order(7)
+ public AdverseEventState getEncephalopathy() {
+ return encephalopathy;
+ }
+
+ public void setEncephalopathy(AdverseEventState encephalopathy) {
+ this.encephalopathy = encephalopathy;
+ }
+
+ @Order(8)
+ public AdverseEventState getToxicShockSyndrome() {
+ return toxicShockSyndrome;
+ }
+
+ public void setToxicShockSyndrome(AdverseEventState toxicShockSyndrome) {
+ this.toxicShockSyndrome = toxicShockSyndrome;
+ }
+
+ @Order(9)
+ public AdverseEventState getThrombocytopenia() {
+ return thrombocytopenia;
+ }
+
+ public void setThrombocytopenia(AdverseEventState thrombocytopenia) {
+ this.thrombocytopenia = thrombocytopenia;
+ }
+
+ @Order(10)
+ public AdverseEventState getAnaphylaxis() {
+ return anaphylaxis;
+ }
+
+ public void setAnaphylaxis(AdverseEventState anaphylaxis) {
+ this.anaphylaxis = anaphylaxis;
+ }
+
+ @Order(11)
+ public AdverseEventState getFeverishFeeling() {
+ return feverishFeeling;
+ }
+
+ public void setFeverishFeeling(AdverseEventState feverishFeeling) {
+ this.feverishFeeling = feverishFeeling;
+ }
+
+ @Order(12)
+ public String getOtherAdverseEventDetails() {
+ return otherAdverseEventDetails;
+ }
+
+ public void setOtherAdverseEventDetails(String otherAdverseEventDetails) {
+ this.otherAdverseEventDetails = otherAdverseEventDetails;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiAgeGroup.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiAgeGroup.java
new file mode 100644
index 00000000000..4e57132ea70
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiAgeGroup.java
@@ -0,0 +1,35 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public enum AefiAgeGroup {
+
+ ZERO_TO_ONE,
+ ONE_TO_FIVE,
+ FIVE_TO_EIGHTEEN,
+ EIGHTEEN_TO_SIXTY,
+ SIXY_AND_ABOVE;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiCriteria.java
new file mode 100644
index 00000000000..742df524387
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiCriteria.java
@@ -0,0 +1,232 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import de.symeda.sormas.api.Disease;
+import de.symeda.sormas.api.EntityRelevanceStatus;
+import de.symeda.sormas.api.caze.Vaccine;
+import de.symeda.sormas.api.caze.VaccineManufacturer;
+import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto;
+import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto;
+import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto;
+import de.symeda.sormas.api.infrastructure.facility.FacilityType;
+import de.symeda.sormas.api.infrastructure.facility.FacilityTypeGroup;
+import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto;
+import de.symeda.sormas.api.utils.DateFilterOption;
+import de.symeda.sormas.api.utils.criteria.BaseCriteria;
+
+public class AefiCriteria extends BaseCriteria implements Serializable {
+
+ public static final String I18N_PREFIX = "AefiCriteria";
+
+ public static final String DISEASE = "disease";
+ public static final String NAME_ADDRESS_PHONE_EMAIL_LIKE = "nameAddressPhoneEmailLike";
+ public static final String AEFI_TYPE = "aefiType";
+ public static final String OUTCOME = "outcome";
+ public static final String VACCINE_NAME = "vaccineName";
+ public static final String VACCINE_MANUFACTURER = "vaccineManufacturer";
+ public static final String REGION = "region";
+ public static final String DISTRICT = "district";
+ public static final String COMMUNITY = "community";
+ public static final String FACILITY_TYPE_GROUP = "facilityTypeGroup";
+ public static final String FACILITY_TYPE = "facilityType";
+ public static final String HEALTH_FACILITY = "healthFacility";
+ public static final String DATE_FILTER_OPTION = "dateFilterOption";
+ public static final String AEFI_DATE_TYPE = "aefiDateType";
+ public static final String FROM_DATE = "fromDate";
+ public static final String TO_DATE = "toDate";
+ public static final String RELEVANCE_STATUS = "relevanceStatus";
+
+ private Disease disease;
+ private String nameAddressPhoneEmailLike;
+ private AefiType aefiType;
+ private AefiOutcome outcome;
+ private Vaccine vaccineName;
+ private VaccineManufacturer vaccineManufacturer;
+ private RegionReferenceDto region;
+ private DistrictReferenceDto district;
+ private CommunityReferenceDto community;
+ private FacilityTypeGroup facilityTypeGroup;
+ private FacilityType facilityType;
+ private FacilityReferenceDto healthFacility;
+ private DateFilterOption dateFilterOption = DateFilterOption.DATE;
+ private AefiDateType aefiDateType;
+ private Date fromDate;
+ private Date toDate;
+ private EntityRelevanceStatus relevanceStatus;
+
+ public Disease getDisease() {
+ return disease;
+ }
+
+ public void setDisease(Disease disease) {
+ this.disease = disease;
+ }
+
+ public String getNameAddressPhoneEmailLike() {
+ return nameAddressPhoneEmailLike;
+ }
+
+ public void setNameAddressPhoneEmailLike(String nameAddressPhoneEmailLike) {
+ this.nameAddressPhoneEmailLike = nameAddressPhoneEmailLike;
+ }
+
+ public AefiType getAefiType() {
+ return aefiType;
+ }
+
+ public void setAefiType(AefiType aefiType) {
+ this.aefiType = aefiType;
+ }
+
+ public AefiOutcome getOutcome() {
+ return outcome;
+ }
+
+ public void setOutcome(AefiOutcome outcome) {
+ this.outcome = outcome;
+ }
+
+ public Vaccine getVaccineName() {
+ return vaccineName;
+ }
+
+ public void setVaccineName(Vaccine vaccineName) {
+ this.vaccineName = vaccineName;
+ }
+
+ public VaccineManufacturer getVaccineManufacturer() {
+ return vaccineManufacturer;
+ }
+
+ public void setVaccineManufacturer(VaccineManufacturer vaccineManufacturer) {
+ this.vaccineManufacturer = vaccineManufacturer;
+ }
+
+ public RegionReferenceDto getRegion() {
+ return region;
+ }
+
+ public void setRegion(RegionReferenceDto region) {
+ this.region = region;
+ }
+
+ public DistrictReferenceDto getDistrict() {
+ return district;
+ }
+
+ public void setDistrict(DistrictReferenceDto district) {
+ this.district = district;
+ }
+
+ public CommunityReferenceDto getCommunity() {
+ return community;
+ }
+
+ public void setCommunity(CommunityReferenceDto community) {
+ this.community = community;
+ }
+
+ public FacilityTypeGroup getFacilityTypeGroup() {
+ return facilityTypeGroup;
+ }
+
+ public void setFacilityTypeGroup(FacilityTypeGroup facilityTypeGroup) {
+ this.facilityTypeGroup = facilityTypeGroup;
+ }
+
+ public FacilityType getFacilityType() {
+ return facilityType;
+ }
+
+ public void setFacilityType(FacilityType facilityType) {
+ this.facilityType = facilityType;
+ }
+
+ public FacilityReferenceDto getHealthFacility() {
+ return healthFacility;
+ }
+
+ public void setHealthFacility(FacilityReferenceDto healthFacility) {
+ this.healthFacility = healthFacility;
+ }
+
+ public DateFilterOption getDateFilterOption() {
+ return dateFilterOption;
+ }
+
+ public void setDateFilterOption(DateFilterOption dateFilterOption) {
+ this.dateFilterOption = dateFilterOption;
+ }
+
+ public AefiDateType getAefiDateType() {
+ return aefiDateType;
+ }
+
+ public void setAefiDateType(AefiDateType aefiDateType) {
+ this.aefiDateType = aefiDateType;
+ }
+
+ public Date getFromDate() {
+ return fromDate;
+ }
+
+ public void setFromDate(Date fromDate) {
+ this.fromDate = fromDate;
+ }
+
+ public Date getToDate() {
+ return toDate;
+ }
+
+ public void setToDate(Date toDate) {
+ this.toDate = toDate;
+ }
+
+ public EntityRelevanceStatus getRelevanceStatus() {
+ return relevanceStatus;
+ }
+
+ public void setRelevanceStatus(EntityRelevanceStatus relevanceStatus) {
+ this.relevanceStatus = relevanceStatus;
+ }
+
+ public AefiCriteria disease(Disease disease) {
+ this.disease = disease;
+ return this;
+ }
+
+ public AefiCriteria region(RegionReferenceDto region) {
+ this.region = region;
+ return this;
+ }
+
+ public AefiCriteria district(DistrictReferenceDto district) {
+ this.district = district;
+ return this;
+ }
+
+ public AefiCriteria aefiType(AefiType aefiType) {
+ this.aefiType = aefiType;
+ return this;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDashboardFilterDateType.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDashboardFilterDateType.java
new file mode 100644
index 00000000000..984641a06e5
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDashboardFilterDateType.java
@@ -0,0 +1,32 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public enum AefiDashboardFilterDateType {
+
+ REPORT_DATE,
+ START_DATE;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDateType.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDateType.java
new file mode 100644
index 00000000000..9eef385ce9c
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDateType.java
@@ -0,0 +1,33 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public enum AefiDateType {
+
+ REPORT_DATE,
+ START_DATE,
+ VACCINATION_DATE;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDto.java
new file mode 100644
index 00000000000..7d32221109d
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiDto.java
@@ -0,0 +1,614 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import de.symeda.sormas.api.caze.Trimester;
+import de.symeda.sormas.api.common.DeletionReason;
+import de.symeda.sormas.api.feature.FeatureType;
+import de.symeda.sormas.api.i18n.Validations;
+import de.symeda.sormas.api.immunization.ImmunizationReferenceDto;
+import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto;
+import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto;
+import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto;
+import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto;
+import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto;
+import de.symeda.sormas.api.location.LocationDto;
+import de.symeda.sormas.api.person.PersonReferenceDto;
+import de.symeda.sormas.api.user.UserReferenceDto;
+import de.symeda.sormas.api.utils.DataHelper;
+import de.symeda.sormas.api.utils.DependingOnFeatureType;
+import de.symeda.sormas.api.utils.FieldConstraints;
+import de.symeda.sormas.api.utils.YesNoUnknown;
+import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto;
+import de.symeda.sormas.api.vaccination.VaccinationDto;
+
+@DependingOnFeatureType(featureType = {
+ FeatureType.IMMUNIZATION_MANAGEMENT,
+ FeatureType.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_MANAGEMENT })
+public class AefiDto extends PseudonymizableDto {
+
+ private static final long serialVersionUID = 5023410664970514090L;
+
+ public static final long APPROXIMATE_JSON_SIZE_IN_BYTES = 25455;
+
+ public static final String I18N_PREFIX = "Aefi";
+
+ public static final String IMMUNIZATION = "immunization";
+ public static final String ADDRESS = "address";
+ public static final String VACCINATIONS = "vaccinations";
+ public static final String PRIMARY_SUSPECT_VACCINE = "primarySuspectVaccine";
+ public static final String ADVERSE_EVENTS = "adverseEvents";
+ public static final String PERSON = "person";
+ public static final String REPORT_DATE = "reportDate";
+ public static final String REPORTING_USER = "reportingUser";
+ public static final String EXTERNAL_ID = "externalId";
+ public static final String RESPONSIBLE_REGION = "responsibleRegion";
+ public static final String RESPONSIBLE_DISTRICT = "responsibleDistrict";
+ public static final String RESPONSIBLE_COMMUNITY = "responsibleCommunity";
+ public static final String COUNTRY = "country";
+ public static final String REPORTING_ID_NUMBER = "reportingIdNumber";
+ public static final String PHONE_NUMBER = "phoneNumber";
+ public static final String PREGNANT = "pregnant";
+ public static final String TRIMESTER = "trimester";
+ public static final String LACTATING = "lactating";
+ public static final String ONSET_AGE_YEARS = "onsetAgeYears";
+ public static final String ONSET_AGE_MONTHS = "onsetAgeMonths";
+ public static final String ONSET_AGE_DAYS = "onsetAgeDays";
+ public static final String AGE_GROUP = "ageGroup";
+ public static final String HEALTH_FACILITY = "healthFacility";
+ public static final String HEALTH_FACILITY_DETAILS = "healthFacilityDetails";
+ public static final String REPORTER_NAME = "reporterName";
+ public static final String REPORTER_INSTITUTION = "reporterInstitution";
+ public static final String REPORTER_DESIGNATION = "reporterDesignation";
+ public static final String REPORTER_DEPARTMENT = "reporterDepartment";
+ public static final String REPORTER_ADDRESS = "reporterAddress";
+ public static final String REPORTER_PHONE = "reporterPhone";
+ public static final String REPORTER_EMAIL = "reporterEmail";
+ public static final String TODAYS_DATE = "todaysDate";
+ public static final String START_DATE_TIME = "startDateTime";
+ public static final String AEFI_DESCRIPTION = "aefiDescription";
+ public static final String SERIOUS = "serious";
+ public static final String SERIOUS_REASON = "seriousReason";
+ public static final String SERIOUS_REASON_DETAILS = "seriousReasonDetails";
+ public static final String OUTCOME = "outcome";
+ public static final String DEATH_DATE = "deathDate";
+ public static final String AUTOPSY_DONE = "autopsyDone";
+ public static final String PAST_MEDICAL_HISTORY = "pastMedicalHistory";
+ public static final String INVESTIGATION_NEEDED = "investigationNeeded";
+ public static final String INVESTIGATION_PLANNED_DATE = "investigationPlannedDate";
+ public static final String RECEIVED_AT_NATIONAL_LEVEL_DATE = "receivedAtNationalLevelDate";
+ public static final String WORLD_WIDE_ID = "worldwideId";
+ public static final String NATIONAL_LEVEL_COMMENT = "nationalLevelComment";
+ public static final String DELETION_REASON = "deletionReason";
+ public static final String OTHER_DELETION_REASON = "otherDeletionReason";
+
+ @NotNull(message = Validations.validImmunization)
+ private ImmunizationReferenceDto immunization;
+ private PersonReferenceDto person;
+ private LocationDto address;
+ @NotEmpty(message = Validations.aefiWithoutSuspectVaccine)
+ private List vaccinations = new ArrayList<>();
+ @NotNull(message = Validations.aefiWithoutPrimarySuspectVaccine)
+ private VaccinationDto primarySuspectVaccine;
+ @NotNull(message = Validations.aefiWithoutAdverseEvents)
+ private AdverseEventsDto adverseEvents;
+ @NotNull(message = Validations.validReportDateTime)
+ private Date reportDate;
+ private UserReferenceDto reportingUser;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String externalId;
+ private RegionReferenceDto responsibleRegion;
+ private DistrictReferenceDto responsibleDistrict;
+ private CommunityReferenceDto responsibleCommunity;
+ private CountryReferenceDto country;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong)
+ private String reportingIdNumber;
+ private String phoneNumber;
+ private YesNoUnknown pregnant;
+ private Trimester trimester;
+ private YesNoUnknown lactating;
+ private Integer onsetAgeYears;
+ private Integer onsetAgeMonths;
+ private Integer onsetAgeDays;
+ private AefiAgeGroup ageGroup;
+ private FacilityReferenceDto healthFacility;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong)
+ private String healthFacilityDetails;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String reporterName;
+ private FacilityReferenceDto reporterInstitution;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String reporterDesignation;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String reporterDepartment;
+ private LocationDto reporterAddress;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String reporterPhone;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String reporterEmail;
+ private Date todaysDate;
+ private Date startDateTime;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong)
+ private String aefiDescription;
+ private YesNoUnknown serious;
+ private SeriousAefiReason seriousReason;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String seriousReasonDetails;
+ private AefiOutcome outcome;
+ private Date deathDate;
+ private YesNoUnknown autopsyDone;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong)
+ private String pastMedicalHistory;
+ private YesNoUnknown investigationNeeded;
+ private Date investigationPlannedDate;
+ private Date receivedAtNationalLevelDate;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
+ private String worldwideId;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong)
+ private String nationalLevelComment;
+ private boolean archived;
+ private boolean deleted;
+ private DeletionReason deletionReason;
+ @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong)
+ private String otherDeletionReason;
+
+ public static AefiDto build(UserReferenceDto user) {
+
+ final AefiDto aefiDto = new AefiDto();
+ aefiDto.setUuid(DataHelper.createUuid());
+ aefiDto.setReportingUser(user);
+ aefiDto.setReportDate(new Date());
+ aefiDto.setAdverseEvents(AdverseEventsDto.build());
+
+ return aefiDto;
+ }
+
+ public static AefiDto build(ImmunizationReferenceDto immunization) {
+
+ final AefiDto aefiDto = new AefiDto();
+ aefiDto.setUuid(DataHelper.createUuid());
+ aefiDto.setImmunization(immunization);
+ aefiDto.setReportDate(new Date());
+ aefiDto.setAdverseEvents(AdverseEventsDto.build());
+
+ return aefiDto;
+ }
+
+ public static AefiDto build(AefiReferenceDto aefiReferenceDto) {
+
+ final AefiDto aefiDto = new AefiDto();
+ aefiDto.setUuid(aefiReferenceDto.getUuid());
+ aefiDto.setReportDate(new Date());
+ aefiDto.setAdverseEvents(AdverseEventsDto.build());
+
+ return aefiDto;
+ }
+
+ public AefiReferenceDto toReference() {
+ return new AefiReferenceDto(getUuid(), getPerson().getCaption(), getExternalId());
+ }
+
+ public ImmunizationReferenceDto getImmunization() {
+ return immunization;
+ }
+
+ public void setImmunization(ImmunizationReferenceDto immunization) {
+ this.immunization = immunization;
+ }
+
+ public PersonReferenceDto getPerson() {
+ return person;
+ }
+
+ public void setPerson(PersonReferenceDto person) {
+ this.person = person;
+ }
+
+ public LocationDto getAddress() {
+ return address;
+ }
+
+ public void setAddress(LocationDto address) {
+ this.address = address;
+ }
+
+ public List getVaccinations() {
+ return vaccinations;
+ }
+
+ public void setVaccinations(List vaccinations) {
+ this.vaccinations = vaccinations;
+ }
+
+ public AdverseEventsDto getAdverseEvents() {
+ return adverseEvents;
+ }
+
+ public VaccinationDto getPrimarySuspectVaccine() {
+ return primarySuspectVaccine;
+ }
+
+ public void setPrimarySuspectVaccine(VaccinationDto primarySuspectVaccine) {
+ this.primarySuspectVaccine = primarySuspectVaccine;
+ }
+
+ public void setAdverseEvents(AdverseEventsDto adverseEvents) {
+ this.adverseEvents = adverseEvents;
+ }
+
+ public Date getReportDate() {
+ return reportDate;
+ }
+
+ public void setReportDate(Date reportDate) {
+ this.reportDate = reportDate;
+ }
+
+ public UserReferenceDto getReportingUser() {
+ return reportingUser;
+ }
+
+ public void setReportingUser(UserReferenceDto reportingUser) {
+ this.reportingUser = reportingUser;
+ }
+
+ public String getExternalId() {
+ return externalId;
+ }
+
+ public void setExternalId(String externalId) {
+ this.externalId = externalId;
+ }
+
+ public RegionReferenceDto getResponsibleRegion() {
+ return responsibleRegion;
+ }
+
+ public void setResponsibleRegion(RegionReferenceDto responsibleRegion) {
+ this.responsibleRegion = responsibleRegion;
+ }
+
+ public DistrictReferenceDto getResponsibleDistrict() {
+ return responsibleDistrict;
+ }
+
+ public void setResponsibleDistrict(DistrictReferenceDto responsibleDistrict) {
+ this.responsibleDistrict = responsibleDistrict;
+ }
+
+ public CommunityReferenceDto getResponsibleCommunity() {
+ return responsibleCommunity;
+ }
+
+ public void setResponsibleCommunity(CommunityReferenceDto responsibleCommunity) {
+ this.responsibleCommunity = responsibleCommunity;
+ }
+
+ public CountryReferenceDto getCountry() {
+ return country;
+ }
+
+ public void setCountry(CountryReferenceDto country) {
+ this.country = country;
+ }
+
+ public String getReportingIdNumber() {
+ return reportingIdNumber;
+ }
+
+ public void setReportingIdNumber(String reportingIdNumber) {
+ this.reportingIdNumber = reportingIdNumber;
+ }
+
+ public String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ public YesNoUnknown getPregnant() {
+ return pregnant;
+ }
+
+ public void setPregnant(YesNoUnknown pregnant) {
+ this.pregnant = pregnant;
+ }
+
+ public Trimester getTrimester() {
+ return trimester;
+ }
+
+ public void setTrimester(Trimester trimester) {
+ this.trimester = trimester;
+ }
+
+ public YesNoUnknown getLactating() {
+ return lactating;
+ }
+
+ public void setLactating(YesNoUnknown lactating) {
+ this.lactating = lactating;
+ }
+
+ public Integer getOnsetAgeYears() {
+ return onsetAgeYears;
+ }
+
+ public void setOnsetAgeYears(Integer onsetAgeYears) {
+ this.onsetAgeYears = onsetAgeYears;
+ }
+
+ public Integer getOnsetAgeMonths() {
+ return onsetAgeMonths;
+ }
+
+ public void setOnsetAgeMonths(Integer onsetAgeMonths) {
+ this.onsetAgeMonths = onsetAgeMonths;
+ }
+
+ public Integer getOnsetAgeDays() {
+ return onsetAgeDays;
+ }
+
+ public void setOnsetAgeDays(Integer onsetAgeDays) {
+ this.onsetAgeDays = onsetAgeDays;
+ }
+
+ public AefiAgeGroup getAgeGroup() {
+ return ageGroup;
+ }
+
+ public void setAgeGroup(AefiAgeGroup ageGroup) {
+ this.ageGroup = ageGroup;
+ }
+
+ public FacilityReferenceDto getHealthFacility() {
+ return healthFacility;
+ }
+
+ public void setHealthFacility(FacilityReferenceDto healthFacility) {
+ this.healthFacility = healthFacility;
+ }
+
+ public String getHealthFacilityDetails() {
+ return healthFacilityDetails;
+ }
+
+ public void setHealthFacilityDetails(String healthFacilityDetails) {
+ this.healthFacilityDetails = healthFacilityDetails;
+ }
+
+ public String getReporterName() {
+ return reporterName;
+ }
+
+ public void setReporterName(String reporterName) {
+ this.reporterName = reporterName;
+ }
+
+ public FacilityReferenceDto getReporterInstitution() {
+ return reporterInstitution;
+ }
+
+ public void setReporterInstitution(FacilityReferenceDto reporterInstitution) {
+ this.reporterInstitution = reporterInstitution;
+ }
+
+ public String getReporterDesignation() {
+ return reporterDesignation;
+ }
+
+ public void setReporterDesignation(String reporterDesignation) {
+ this.reporterDesignation = reporterDesignation;
+ }
+
+ public String getReporterDepartment() {
+ return reporterDepartment;
+ }
+
+ public void setReporterDepartment(String reporterDepartment) {
+ this.reporterDepartment = reporterDepartment;
+ }
+
+ public LocationDto getReporterAddress() {
+ return reporterAddress;
+ }
+
+ public void setReporterAddress(LocationDto reporterAddress) {
+ this.reporterAddress = reporterAddress;
+ }
+
+ public String getReporterPhone() {
+ return reporterPhone;
+ }
+
+ public void setReporterPhone(String reporterPhone) {
+ this.reporterPhone = reporterPhone;
+ }
+
+ public String getReporterEmail() {
+ return reporterEmail;
+ }
+
+ public void setReporterEmail(String reporterEmail) {
+ this.reporterEmail = reporterEmail;
+ }
+
+ public Date getTodaysDate() {
+ return todaysDate;
+ }
+
+ public void setTodaysDate(Date todaysDate) {
+ this.todaysDate = todaysDate;
+ }
+
+ public Date getStartDateTime() {
+ return startDateTime;
+ }
+
+ public void setStartDateTime(Date startDateTime) {
+ this.startDateTime = startDateTime;
+ }
+
+ public String getAefiDescription() {
+ return aefiDescription;
+ }
+
+ public void setAefiDescription(String aefiDescription) {
+ this.aefiDescription = aefiDescription;
+ }
+
+ public YesNoUnknown getSerious() {
+ return serious;
+ }
+
+ public void setSerious(YesNoUnknown serious) {
+ this.serious = serious;
+ }
+
+ public SeriousAefiReason getSeriousReason() {
+ return seriousReason;
+ }
+
+ public void setSeriousReason(SeriousAefiReason seriousReason) {
+ this.seriousReason = seriousReason;
+ }
+
+ public String getSeriousReasonDetails() {
+ return seriousReasonDetails;
+ }
+
+ public void setSeriousReasonDetails(String seriousReasonDetails) {
+ this.seriousReasonDetails = seriousReasonDetails;
+ }
+
+ public AefiOutcome getOutcome() {
+ return outcome;
+ }
+
+ public void setOutcome(AefiOutcome outcome) {
+ this.outcome = outcome;
+ }
+
+ public Date getDeathDate() {
+ return deathDate;
+ }
+
+ public void setDeathDate(Date deathDate) {
+ this.deathDate = deathDate;
+ }
+
+ public YesNoUnknown getAutopsyDone() {
+ return autopsyDone;
+ }
+
+ public void setAutopsyDone(YesNoUnknown autopsyDone) {
+ this.autopsyDone = autopsyDone;
+ }
+
+ public String getPastMedicalHistory() {
+ return pastMedicalHistory;
+ }
+
+ public void setPastMedicalHistory(String pastMedicalHistory) {
+ this.pastMedicalHistory = pastMedicalHistory;
+ }
+
+ public YesNoUnknown getInvestigationNeeded() {
+ return investigationNeeded;
+ }
+
+ public void setInvestigationNeeded(YesNoUnknown investigationNeeded) {
+ this.investigationNeeded = investigationNeeded;
+ }
+
+ public Date getInvestigationPlannedDate() {
+ return investigationPlannedDate;
+ }
+
+ public void setInvestigationPlannedDate(Date investigationPlannedDate) {
+ this.investigationPlannedDate = investigationPlannedDate;
+ }
+
+ public Date getReceivedAtNationalLevelDate() {
+ return receivedAtNationalLevelDate;
+ }
+
+ public void setReceivedAtNationalLevelDate(Date receivedAtNationalLevelDate) {
+ this.receivedAtNationalLevelDate = receivedAtNationalLevelDate;
+ }
+
+ public String getWorldwideId() {
+ return worldwideId;
+ }
+
+ public void setWorldwideId(String worldwideId) {
+ this.worldwideId = worldwideId;
+ }
+
+ public String getNationalLevelComment() {
+ return nationalLevelComment;
+ }
+
+ public void setNationalLevelComment(String nationalLevelComment) {
+ this.nationalLevelComment = nationalLevelComment;
+ }
+
+ public boolean isArchived() {
+ return archived;
+ }
+
+ public void setArchived(boolean archived) {
+ this.archived = archived;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
+ public DeletionReason getDeletionReason() {
+ return deletionReason;
+ }
+
+ public void setDeletionReason(DeletionReason deletionReason) {
+ this.deletionReason = deletionReason;
+ }
+
+ public String getOtherDeletionReason() {
+ return otherDeletionReason;
+ }
+
+ public void setOtherDeletionReason(String otherDeletionReason) {
+ this.otherDeletionReason = otherDeletionReason;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiFacade.java
new file mode 100644
index 00000000000..4267d27a9b5
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiFacade.java
@@ -0,0 +1,31 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+
+import de.symeda.sormas.api.CoreFacade;
+
+@Remote
+public interface AefiFacade extends CoreFacade {
+
+ List getEntriesList(AefiListCriteria criteria, Integer first, Integer max);
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiHelper.java
new file mode 100644
index 00000000000..815c46365dc
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiHelper.java
@@ -0,0 +1,87 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public final class AefiHelper {
+
+ private AefiHelper() {
+
+ }
+
+ public static String buildAdverseEventsString(
+ AdverseEventState severeLocalReaction,
+ boolean severeLocalReactionMoreThanThreeDays,
+ boolean severeLocalReactionBeyondNearestJoint,
+ AdverseEventState seizures,
+ SeizureType seizureType,
+ AdverseEventState abscess,
+ AdverseEventState sepsis,
+ AdverseEventState encephalopathy,
+ AdverseEventState toxicShockSyndrome,
+ AdverseEventState thrombocytopenia,
+ AdverseEventState anaphylaxis,
+ AdverseEventState feverishFeeling,
+ String otherAdverseEventDetails) {
+
+ List adverseEventsList = new ArrayList<>();
+
+ if (severeLocalReaction == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.SEVERE_LOCAL_REACTION));
+ }
+
+ if (seizures == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.SEIZURES));
+ }
+
+ if (abscess == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.ABSCESS));
+ }
+
+ if (sepsis == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.SEPSIS));
+ }
+
+ if (encephalopathy == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.ENCEPHALOPATHY));
+ }
+
+ if (toxicShockSyndrome == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.TOXIC_SHOCK_SYNDROME));
+ }
+
+ if (thrombocytopenia == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.THROMBOCYTOPENIA));
+ }
+
+ if (anaphylaxis == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.ANAPHYLAXIS));
+ }
+
+ if (feverishFeeling == AdverseEventState.YES) {
+ adverseEventsList.add(I18nProperties.getPrefixCaption(AdverseEventsDto.I18N_PREFIX, AdverseEventsDto.FEVERISH_FEELING));
+ }
+
+ return String.join(", ", adverseEventsList);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiIndexDto.java
new file mode 100644
index 00000000000..e389093fc00
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiIndexDto.java
@@ -0,0 +1,277 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import de.symeda.sormas.api.Disease;
+import de.symeda.sormas.api.caze.AgeAndBirthDateDto;
+import de.symeda.sormas.api.caze.Vaccine;
+import de.symeda.sormas.api.common.DeletionReason;
+import de.symeda.sormas.api.person.Sex;
+import de.symeda.sormas.api.utils.PersonalData;
+import de.symeda.sormas.api.utils.SensitiveData;
+import de.symeda.sormas.api.utils.YesNoUnknown;
+import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto;
+
+public class AefiIndexDto extends PseudonymizableIndexDto implements Serializable, Cloneable {
+
+ public static final String I18N_PREFIX = "AefiIndex";
+
+ public static final String UUID = "uuid";
+ public static final String IMMUNIZATION_UUID = "immunizationUuid";
+ public static final String PERSON_UUID = "personUuid";
+ public static final String PERSON_FIRST_NAME = "personFirstName";
+ public static final String PERSON_LAST_NAME = "personLastName";
+ public static final String REPORT_DATE = "reportDate";
+ public static final String DISEASE = "disease";
+ public static final String AGE_AND_BIRTH_DATE = "ageAndBirthDate";
+ public static final String SEX = "sex";
+ public static final String REGION = "region";
+ public static final String DISTRICT = "district";
+ public static final String SERIOUS = "serious";
+ public static final String PRIMARY_VACCINE_NAME = "primaryVaccine";
+ public static final String OUTCOME = "outcome";
+ public static final String VACCINATION_DATE = "vaccinationDate";
+ public static final String START_DATE_TIME = "startDateTime";
+ public static final String ADVERSE_EVENTS = "adverseEvents";
+
+ private String immunizationUuid;
+ private String personUuid;
+ @PersonalData
+ @SensitiveData
+ private String personFirstName;
+ @PersonalData
+ @SensitiveData
+ private String personLastName;
+ private Date reportDate;
+ private Disease disease;
+ private AgeAndBirthDateDto ageAndBirthDate;
+ private Sex sex;
+ private String region;
+ private String district;
+ private YesNoUnknown serious;
+ private Vaccine primaryVaccine;
+ private AefiOutcome outcome;
+ private Date vaccinationDate;
+ private Date startDateTime;
+ private String adverseEvents;
+ private DeletionReason deletionReason;
+ private String otherDeletionReason;
+ private boolean isInJurisdiction;
+
+ public AefiIndexDto(
+ String uuid,
+ String immunizationUuid,
+ String personUuid,
+ String personFirstName,
+ String personLastName,
+ Disease disease,
+ AgeAndBirthDateDto ageAndBirthDate,
+ Sex sex,
+ String region,
+ String district,
+ YesNoUnknown serious,
+ Vaccine primaryVaccine,
+ AefiOutcome outcome,
+ Date vaccinationDate,
+ Date reportDate,
+ Date startDateTime,
+ String adverseEvents,
+ DeletionReason deletionReason,
+ String otherDeletionReason,
+ boolean isInJurisdiction) {
+
+ super(uuid);
+ this.immunizationUuid = immunizationUuid;
+ this.personUuid = personUuid;
+ this.personFirstName = personFirstName;
+ this.personLastName = personLastName;
+ this.disease = disease;
+ this.ageAndBirthDate = ageAndBirthDate;
+ this.sex = sex;
+ this.region = region;
+ this.district = district;
+ this.serious = serious;
+ this.primaryVaccine = primaryVaccine;
+ this.outcome = outcome;
+ this.vaccinationDate = vaccinationDate;
+ this.reportDate = reportDate;
+ this.startDateTime = startDateTime;
+ this.adverseEvents = adverseEvents;
+ this.deletionReason = deletionReason;
+ this.otherDeletionReason = otherDeletionReason;
+ this.isInJurisdiction = isInJurisdiction;
+ }
+
+ public String getImmunizationUuid() {
+ return immunizationUuid;
+ }
+
+ public void setImmunizationUuid(String immunizationUuid) {
+ this.immunizationUuid = immunizationUuid;
+ }
+
+ public String getPersonUuid() {
+ return personUuid;
+ }
+
+ public void setPersonUuid(String personUuid) {
+ this.personUuid = personUuid;
+ }
+
+ public String getPersonFirstName() {
+ return personFirstName;
+ }
+
+ public void setPersonFirstName(String personFirstName) {
+ this.personFirstName = personFirstName;
+ }
+
+ public String getPersonLastName() {
+ return personLastName;
+ }
+
+ public void setPersonLastName(String personLastName) {
+ this.personLastName = personLastName;
+ }
+
+ public Date getReportDate() {
+ return reportDate;
+ }
+
+ public void setReportDate(Date reportDate) {
+ this.reportDate = reportDate;
+ }
+
+ public Disease getDisease() {
+ return disease;
+ }
+
+ public void setDisease(Disease disease) {
+ this.disease = disease;
+ }
+
+ public AgeAndBirthDateDto getAgeAndBirthDate() {
+ return ageAndBirthDate;
+ }
+
+ public void setAgeAndBirthDate(AgeAndBirthDateDto ageAndBirthDate) {
+ this.ageAndBirthDate = ageAndBirthDate;
+ }
+
+ public Sex getSex() {
+ return sex;
+ }
+
+ public void setSex(Sex sex) {
+ this.sex = sex;
+ }
+
+ public String getRegion() {
+ return region;
+ }
+
+ public void setRegion(String region) {
+ this.region = region;
+ }
+
+ public String getDistrict() {
+ return district;
+ }
+
+ public void setDistrict(String district) {
+ this.district = district;
+ }
+
+ public YesNoUnknown getSerious() {
+ return serious;
+ }
+
+ public void setSerious(YesNoUnknown serious) {
+ this.serious = serious;
+ }
+
+ public Vaccine getPrimaryVaccine() {
+ return primaryVaccine;
+ }
+
+ public void setPrimaryVaccine(Vaccine primaryVaccine) {
+ this.primaryVaccine = primaryVaccine;
+ }
+
+ public AefiOutcome getOutcome() {
+ return outcome;
+ }
+
+ public void setOutcome(AefiOutcome outcome) {
+ this.outcome = outcome;
+ }
+
+ public Date getVaccinationDate() {
+ return vaccinationDate;
+ }
+
+ public void setVaccinationDate(Date vaccinationDate) {
+ this.vaccinationDate = vaccinationDate;
+ }
+
+ public Date getStartDateTime() {
+ return startDateTime;
+ }
+
+ public void setStartDateTime(Date startDateTime) {
+ this.startDateTime = startDateTime;
+ }
+
+ public String getAdverseEvents() {
+ return adverseEvents;
+ }
+
+ public void setAdverseEvents(String adverseEvents) {
+ this.adverseEvents = adverseEvents;
+ }
+
+ public DeletionReason getDeletionReason() {
+ return deletionReason;
+ }
+
+ public void setDeletionReason(DeletionReason deletionReason) {
+ this.deletionReason = deletionReason;
+ }
+
+ public String getOtherDeletionReason() {
+ return otherDeletionReason;
+ }
+
+ public void setOtherDeletionReason(String otherDeletionReason) {
+ this.otherDeletionReason = otherDeletionReason;
+ }
+
+ @Override
+ public boolean isInJurisdiction() {
+ return isInJurisdiction;
+ }
+
+ @Override
+ public void setInJurisdiction(boolean inJurisdiction) {
+ isInJurisdiction = inJurisdiction;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListCriteria.java
new file mode 100644
index 00000000000..80ae6536c0a
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListCriteria.java
@@ -0,0 +1,48 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.immunization.ImmunizationReferenceDto;
+import de.symeda.sormas.api.utils.criteria.BaseCriteria;
+
+public class AefiListCriteria extends BaseCriteria {
+
+ private final ImmunizationReferenceDto immunizationReferenceDto;
+
+ public static class Builder {
+
+ private final ImmunizationReferenceDto immunizationReferenceDto;
+
+ public Builder(ImmunizationReferenceDto immunizationReferenceDto) {
+ this.immunizationReferenceDto = immunizationReferenceDto;
+ }
+
+ public AefiListCriteria build() {
+ return new AefiListCriteria(this);
+ }
+ }
+
+ private AefiListCriteria(Builder builder) {
+ this.immunizationReferenceDto = builder.immunizationReferenceDto;
+ }
+
+ public ImmunizationReferenceDto getImmunization() {
+ return immunizationReferenceDto;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListEntryDto.java
new file mode 100644
index 00000000000..706e97da2b2
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiListEntryDto.java
@@ -0,0 +1,97 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import de.symeda.sormas.api.caze.Vaccine;
+import de.symeda.sormas.api.utils.YesNoUnknown;
+import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto;
+
+public class AefiListEntryDto extends PseudonymizableIndexDto implements Serializable, Cloneable {
+
+ public static final String I18N_PREFIX = "Aefi";
+
+ public static final String UUID = "uuid";
+ public static final String SERIOUS = "serious";
+ public static final String PRIMARY_VACCINE_NAME = "primaryVaccineName";
+ public static final String PRIMARY_VACCINE_DOSE = "primaryVaccineDose";
+ public static final String PRIMARY_VACCINE_VACCINATION_DATE = "primaryVaccineVaccinationDate";
+ private String ADVERSE_EVENTS = "adverseEvents";
+
+ private YesNoUnknown serious;
+ private Vaccine primaryVaccineName;
+ private String primaryVaccineDose;
+ private Date primaryVaccineVaccinationDate;
+ private String adverseEvents;
+
+ public AefiListEntryDto(
+ String uuid,
+ YesNoUnknown serious,
+ Vaccine primaryVaccineName,
+ String primaryVaccineDose,
+ Date primaryVaccineVaccinationDate,
+ String adverseEvents) {
+
+ super(uuid);
+ this.serious = serious;
+ this.primaryVaccineName = primaryVaccineName;
+ this.primaryVaccineDose = primaryVaccineDose;
+ this.primaryVaccineVaccinationDate = primaryVaccineVaccinationDate;
+ this.adverseEvents = adverseEvents;
+ }
+
+ public YesNoUnknown getSerious() {
+ return serious;
+ }
+
+ public void setSerious(YesNoUnknown serious) {
+ this.serious = serious;
+ }
+
+ public Vaccine getPrimaryVaccineName() {
+ return primaryVaccineName;
+ }
+
+ public void setPrimaryVaccineName(Vaccine primaryVaccineName) {
+ this.primaryVaccineName = primaryVaccineName;
+ }
+
+ public String getPrimaryVaccineDose() {
+ return primaryVaccineDose;
+ }
+
+ public void setPrimaryVaccineDose(String primaryVaccineDose) {
+ this.primaryVaccineDose = primaryVaccineDose;
+ }
+
+ public Date getPrimaryVaccineVaccinationDate() {
+ return primaryVaccineVaccinationDate;
+ }
+
+ public void setPrimaryVaccineVaccinationDate(Date primaryVaccineVaccinationDate) {
+ this.primaryVaccineVaccinationDate = primaryVaccineVaccinationDate;
+ }
+
+ public String getAdverseEvents() {
+ return adverseEvents;
+ }
+
+ public void setAdverseEvents(String adverseEvents) {
+ this.adverseEvents = adverseEvents;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiOutcome.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiOutcome.java
new file mode 100644
index 00000000000..20d22beacbe
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiOutcome.java
@@ -0,0 +1,36 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public enum AefiOutcome {
+
+ RECOVERING,
+ RECOVERED,
+ RECOVERED_WITH_SEQUELAE,
+ NOT_RECOVERED,
+ UNKNOWN,
+ DIED;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiReferenceDto.java
new file mode 100644
index 00000000000..51acac53ec1
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiReferenceDto.java
@@ -0,0 +1,45 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.ReferenceDto;
+import de.symeda.sormas.api.feature.FeatureType;
+import de.symeda.sormas.api.utils.DependingOnFeatureType;
+
+@DependingOnFeatureType(featureType = FeatureType.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_MANAGEMENT)
+public class AefiReferenceDto extends ReferenceDto {
+
+ private String externalId;
+
+ public AefiReferenceDto() {
+ }
+
+ public AefiReferenceDto(String uuid, String caption, String externalId) {
+ super(uuid, caption);
+ this.externalId = externalId;
+ }
+
+ public String getExternalId() {
+ return externalId;
+ }
+
+ public void setExternalId(String externalId) {
+ this.externalId = externalId;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiType.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiType.java
new file mode 100644
index 00000000000..952eb1bc1cd
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/AefiType.java
@@ -0,0 +1,41 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+import de.symeda.sormas.api.utils.YesNoUnknown;
+
+public enum AefiType {
+
+ SERIOUS,
+ NON_SERIOUS;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+
+ public static String toString(YesNoUnknown serious) {
+ if (serious == YesNoUnknown.YES) {
+ return AefiType.SERIOUS.toString();
+ } else {
+ return AefiType.NON_SERIOUS.toString();
+ }
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeizureType.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeizureType.java
new file mode 100644
index 00000000000..d5abb2d27ce
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeizureType.java
@@ -0,0 +1,32 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public enum SeizureType {
+
+ FEBRILE,
+ AFEBRILE;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeriousAefiReason.java b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeriousAefiReason.java
new file mode 100644
index 00000000000..17156c90bbd
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/adverseeventsfollowingimmunization/SeriousAefiReason.java
@@ -0,0 +1,36 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.adverseeventsfollowingimmunization;
+
+import de.symeda.sormas.api.i18n.I18nProperties;
+
+public enum SeriousAefiReason {
+
+ DEATH,
+ LIFE_THREATENING,
+ DISABILITY,
+ HOSPITALIZATION,
+ CONGENITAL_ANOMALY,
+ OTHER;
+
+ @Override
+ public String toString() {
+ return I18nProperties.getEnumCaption(this);
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/common/DeletableEntityType.java b/sormas-api/src/main/java/de/symeda/sormas/api/common/DeletableEntityType.java
index 0d01e715da0..0e3a694ec31 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/common/DeletableEntityType.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/common/DeletableEntityType.java
@@ -23,6 +23,7 @@ public enum DeletableEntityType {
EVENT,
EVENT_PARTICIPANT,
IMMUNIZATION,
+ ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION,
TRAVEL_ENTRY,
CAMPAIGN,
SAMPLE,
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/AefiDashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/AefiDashboardCriteria.java
new file mode 100644
index 00000000000..cf245b5a25a
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/AefiDashboardCriteria.java
@@ -0,0 +1,49 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.dashboard;
+
+import de.symeda.sormas.api.adverseeventsfollowingimmunization.AefiDashboardFilterDateType;
+import de.symeda.sormas.api.adverseeventsfollowingimmunization.AefiType;
+
+public class AefiDashboardCriteria extends BaseDashboardCriteria {
+
+ private AefiDashboardFilterDateType aefiDashboardFilterDateType;
+ private AefiType aefiType;
+
+ public AefiDashboardCriteria() {
+ super(AefiDashboardCriteria.class);
+ }
+
+ public AefiDashboardFilterDateType getAefiDashboardFilterDateType() {
+ return aefiDashboardFilterDateType;
+ }
+
+ public AefiType getAefiType() {
+ return aefiType;
+ }
+
+ public AefiDashboardCriteria aefiDashboardDateType(AefiDashboardFilterDateType aefiDashboardFilterDateType) {
+ this.aefiDashboardFilterDateType = aefiDashboardFilterDateType;
+
+ return self;
+ }
+
+ public AefiDashboardCriteria aefiType(AefiType aefiType) {
+ this.aefiType = aefiType;
+
+ return self;
+ }
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/adverseeventsfollowingimmunization/AefiChartData.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/adverseeventsfollowingimmunization/AefiChartData.java
new file mode 100644
index 00000000000..0ba1d2093bc
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/adverseeventsfollowingimmunization/AefiChartData.java
@@ -0,0 +1,58 @@
+/*
+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
+ * Copyright © 2016-2024 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.symeda.sormas.api.dashboard.adverseeventsfollowingimmunization;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class AefiChartData implements Serializable {
+
+ private static final long serialVersionUID = 3538219674050390425L;
+
+ private List