Skip to content

#13542 - Updated RSV Immunization #13576

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2008,6 +2008,7 @@ public interface Captions {
String Immunization_immunizationManagementStatus = "Immunization.immunizationManagementStatus";
String Immunization_immunizationPeriod = "Immunization.immunizationPeriod";
String Immunization_immunizationStatus = "Immunization.immunizationStatus";
String Immunization_injectionFacility = "Immunization.injectionFacility";
String Immunization_lastInfectionDate = "Immunization.lastInfectionDate";
String Immunization_lastVaccinationDate = "Immunization.lastVaccinationDate";
String Immunization_lastVaccineType = "Immunization.lastVaccineType";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ public class ImmunizationDto extends SormasToSormasShareableDto implements IsImm
public static final String VACCINATIONS = "vaccinations";
public static final String DELETION_REASON = "deletionReason";
public static final String OTHER_DELETION_REASON = "otherDeletionReason";
public static final String INJECTION_FACILITY = "injectionFacility";

@Outbreaks
@NotNull(message = Validations.validDisease)
Expand All @@ -111,6 +112,7 @@ public class ImmunizationDto extends SormasToSormasShareableDto implements IsImm
@Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong)
@SensitiveData
private String meansOfImmunizationDetails;
private InjectionFacility injectionFacility;
private ImmunizationManagementStatus immunizationManagementStatus;
@S2SIgnoreProperty(configProperty = SormasToSormasConfig.SORMAS2SORMAS_IGNORE_EXTERNAL_ID)
@Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong)
Expand Down Expand Up @@ -414,6 +416,14 @@ public void setMeansOfImmunizationDetails(String meansOfImmunizationDetails) {
this.meansOfImmunizationDetails = meansOfImmunizationDetails;
}

public InjectionFacility getInjectionFacility() {
return injectionFacility;
}

public void setInjectionFacility(InjectionFacility injectionFacility) {
this.injectionFacility = injectionFacility;
}

public CountryReferenceDto getCountry() {
return country;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/

package de.symeda.sormas.api.immunization;

import de.symeda.sormas.api.i18n.I18nProperties;

public enum InjectionFacility {

MATERNITY_WARD,
PAEDIATRIC_PRACTICE,
HOSPITAL;

@Override
public String toString() {
return I18nProperties.getEnumCaption(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,13 @@ public enum MeansOfImmunization {
VACCINATION,
RECOVERY,
VACCINATION_RECOVERY,
MATERNAL_VACCINATION,
MONOCLONAL_ANTIBODY,
OTHER;

public static boolean isVaccination(MeansOfImmunization meansOfImmunization) {
return meansOfImmunization == VACCINATION || meansOfImmunization == VACCINATION_RECOVERY;
return meansOfImmunization == VACCINATION || meansOfImmunization == VACCINATION_RECOVERY
|| meansOfImmunization == MATERNAL_VACCINATION || meansOfImmunization == MONOCLONAL_ANTIBODY;
}

public static boolean isRecovery(MeansOfImmunization meansOfImmunization) {
Expand Down
1 change: 1 addition & 0 deletions sormas-api/src/main/resources/captions.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2295,6 +2295,7 @@ Immunization.healthFacilityDetails=Facility name & description
Immunization.healthFacilityDepartment=Department
Immunization.meansOfImmunization=Means of immunization
Immunization.meansOfImmunizationDetails=Means of immunization details
Immunization.injectionFacility=Injection facility
Immunization.overwriteImmunizationManagementStatus=Overwrite immunization management status
Immunization.immunizationManagementStatus=Management status
Immunization.immunizationStatus=Immunization status
Expand Down
7 changes: 7 additions & 0 deletions sormas-api/src/main/resources/enum.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2378,8 +2378,15 @@ ImmunizationManagementStatus.CANCELED = Canceled
MeansOfImmunization.VACCINATION = Vaccination
MeansOfImmunization.RECOVERY = Recovery
MeansOfImmunization.VACCINATION_RECOVERY = Vaccination/Recovery
MeansOfImmunization.MATERNAL_VACCINATION = Maternal vaccination
MeansOfImmunization.MONOCLONAL_ANTIBODY = Monoclonal antibody
MeansOfImmunization.OTHER = Other

#InjectionFacility
InjectionFacility.MATERNITY_WARD = Maternity ward
InjectionFacility.PAEDIATRIC_PRACTICE = Paediatric practice
InjectionFacility.HOSPITAL = Hospital

#EnumColumn
EnumColumn.TYPE = Type
EnumColumn.VALUE = Value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ public ImmunizationDto toDto(Immunization entity) {
dto.setImmunizationStatus(entity.getImmunizationStatus());
dto.setMeansOfImmunization(entity.getMeansOfImmunization());
dto.setMeansOfImmunizationDetails(entity.getMeansOfImmunizationDetails());
dto.setInjectionFacility(entity.getInjectionFacility());
dto.setImmunizationManagementStatus(entity.getImmunizationManagementStatus());
dto.setExternalId(entity.getExternalId());
dto.setResponsibleRegion(RegionFacadeEjb.toReferenceDto(entity.getResponsibleRegion()));
Expand Down Expand Up @@ -564,6 +565,7 @@ protected Immunization fillOrBuildEntity(
}
target.setMeansOfImmunization(source.getMeansOfImmunization());
target.setMeansOfImmunizationDetails(source.getMeansOfImmunizationDetails());
target.setInjectionFacility(source.getInjectionFacility());
if (source.getImmunizationManagementStatus() != null) {
target.setImmunizationManagementStatus(source.getImmunizationManagementStatus());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import de.symeda.sormas.api.immunization.ImmunizationManagementStatus;
import de.symeda.sormas.api.immunization.ImmunizationStatus;
import de.symeda.sormas.api.immunization.MeansOfImmunization;
import de.symeda.sormas.api.immunization.InjectionFacility;
import de.symeda.sormas.api.infrastructure.facility.FacilityType;
import de.symeda.sormas.api.utils.YesNoUnknown;
import de.symeda.sormas.backend.caze.Case;
Expand Down Expand Up @@ -50,6 +51,7 @@ public class BaseImmunization extends CoreAdo implements SormasToSormasShareable
private ImmunizationStatus immunizationStatus;
private MeansOfImmunization meansOfImmunization;
private String meansOfImmunizationDetails;
private InjectionFacility injectionFacility;
private ImmunizationManagementStatus immunizationManagementStatus;
private String externalId;

Expand Down Expand Up @@ -351,6 +353,15 @@ public void setMeansOfImmunizationDetails(String meansOfImmunizationDetails) {
this.meansOfImmunizationDetails = meansOfImmunizationDetails;
}

@Enumerated(EnumType.STRING)
public InjectionFacility getInjectionFacility() {
return injectionFacility;
}

public void setInjectionFacility(InjectionFacility injectionFacility) {
this.injectionFacility = injectionFacility;
}

@ManyToOne(fetch = FetchType.LAZY)
public Country getCountry() {
return country;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class Immunization extends BaseImmunization implements IsImmunization {
public static final String REPORTING_USER = "reportingUser";
public static final String IMMUNIZATION_STATUS = "immunizationStatus";
public static final String MEANS_OF_IMMUNIZATION = "meansOfImmunization";
public static final String INJECTION_FACILITY = "injectionFacility";
public static final String IMMUNIZATION_MANAGEMENT_STATUS = "immunizationManagementStatus";
public static final String EXTERNAL_ID = "externalId";
public static final String RESPONSIBLE_REGION = "responsibleRegion";
Expand Down
8 changes: 8 additions & 0 deletions sormas-backend/src/main/resources/sql/sormas_schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -14558,4 +14558,12 @@ ALTER TABLE person_history ADD COLUMN IF NOT EXISTS multipleBirth varchar(255);

INSERT INTO schema_version (version_number, comment) VALUES (587, 'RSV - Enhancements to the Person form #13539');


-- 2025-08-07 - RSV - Update Immunization #13542

ALTER TABLE immunization ADD COLUMN IF NOT EXISTS injectionFacility varchar(255);
ALTER TABLE immunization_history ADD COLUMN IF NOT EXISTS injectionFacility varchar(255);

INSERT INTO schema_version (version_number, comment) VALUES (588, 'RSV - Update Immunization #13542');

-- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. ***
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import static de.symeda.sormas.ui.utils.LayoutUtil.fluidRow;
import static de.symeda.sormas.ui.utils.LayoutUtil.fluidRowLocs;

import java.util.Arrays;
import java.util.Collections;

import com.vaadin.ui.Label;
Expand Down Expand Up @@ -88,6 +89,7 @@ public class ImmunizationCreationForm extends AbstractEditForm<ImmunizationDto>
+ fluidRowLocs(ImmunizationDto.VALID_FROM, ImmunizationDto.VALID_UNTIL)
+ fluidRowLocs(VACCINATION_HEADING_LOC)
+ fluidRow(fluidColumnLoc(6, 0, ImmunizationDto.NUMBER_OF_DOSES))
+ fluidRowLocs(ImmunizationDto.INJECTION_FACILITY)
+ fluidRowLocs(ImmunizationDto.PERSON);
//@formatter:on

Expand Down Expand Up @@ -191,6 +193,15 @@ protected void addFields() {
numberOfDosesField.addValidator(new NumberValidator(I18nProperties.getValidationError(Validations.vaccineDosesFormat), 1, 10, false));
numberOfDosesField.setVisible(false);

ComboBox injectionFacilityField = addField(ImmunizationDto.INJECTION_FACILITY, ComboBox.class);
// Set conditional visibility for RSV cases only
FieldHelper.setVisibleWhen(
getFieldGroup(),
ImmunizationDto.INJECTION_FACILITY,
ImmunizationDto.DISEASE,
Arrays.asList(Disease.RESPIRATORY_SYNCYTIAL_VIRUS),
true);

personCreateForm = new PersonCreateForm(false, true, false);
personCreateForm.setWidth(100, Unit.PERCENTAGE);
personCreateForm.setValue(new PersonDto());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ public class ImmunizationDataForm extends AbstractEditForm<ImmunizationDto> {
+ fluidRowLocs(VACCINATION_HEADING_LOC)
+ fluidRowLocs(ImmunizationDto.NUMBER_OF_DOSES, ImmunizationDto.NUMBER_OF_DOSES_DETAILS)
+ fluidRowLocs(ImmunizationDto.VACCINATIONS)
+ fluidRowLocs(ImmunizationDto.INJECTION_FACILITY)
+ fluidRowLocs(RECOVERY_HEADING_LOC)
+ fluidRowLocs(ImmunizationDto.POSITIVE_TEST_RESULT_DATE, ImmunizationDto.RECOVERY_DATE, LINK_IMMUNIZATION_TO_CASE_BTN_LOC)
+ fluidRow(fluidColumnLoc(6, 0, ImmunizationDto.COUNTRY))
Expand Down Expand Up @@ -254,6 +255,15 @@ protected void addFields() {
false);
cbDisease.addValueChangeListener(e -> vaccinationsField.setDisease((Disease) cbDisease.getValue()));

ComboBox injectionFacilityField = addField(ImmunizationDto.INJECTION_FACILITY, ComboBox.class);
// Set conditional visibility for RSV cases only
FieldHelper.setVisibleWhen(
getFieldGroup(),
ImmunizationDto.INJECTION_FACILITY,
ImmunizationDto.DISEASE,
Arrays.asList(Disease.RESPIRATORY_SYNCYTIAL_VIRUS),
true);

Label recoveryHeadingLabel = new Label(I18nProperties.getString(Strings.headingRecovery));
recoveryHeadingLabel.addStyleName(H3);
getContent().addComponent(recoveryHeadingLabel, RECOVERY_HEADING_LOC);
Expand Down
Loading