diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java index 7824dbb0fb1..f67335eac29 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditFragment.java @@ -26,9 +26,7 @@ import java.util.Optional; import android.webkit.WebView; - import androidx.fragment.app.FragmentActivity; - import de.symeda.sormas.api.CountryHelper; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; @@ -55,6 +53,7 @@ import de.symeda.sormas.api.event.TypeOfPlace; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityTypeGroup; +import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.YesNoUnknown; @@ -213,6 +212,12 @@ private void setUpFieldVisibilities(final FragmentCaseEditLayoutBinding contentB } contentBinding.caseDataDiseaseVariant.setVisibility(DataUtils.emptyOrWithOneNullItem(diseaseVariantList) ? GONE : VISIBLE); + + if (record.getPerson() != null && Sex.MALE.equals(record.getPerson().getSex())) { + contentBinding.caseDataPregnant.setVisibility(GONE); + contentBinding.caseDataPostpartum.setVisibility(GONE); + contentBinding.caseDataTrimester.setVisibility(GONE); + } } private void updateCaseConfirmationBasis(FragmentCaseEditLayoutBinding contentBinding) { diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java index 4bd14c8f7d8..f0307fcf18c 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadFragment.java @@ -21,7 +21,6 @@ import android.os.Bundle; import android.view.View; import android.webkit.WebView; - import de.symeda.sormas.api.CountryHelper; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; @@ -30,6 +29,7 @@ import de.symeda.sormas.api.caze.CaseOrigin; import de.symeda.sormas.api.event.TypeOfPlace; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; +import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; @@ -133,6 +133,12 @@ private void setUpFieldVisibilities(FragmentCaseReadLayoutBinding contentBinding if (isVisibleAllowed(CaseDataDto.class, contentBinding.caseDataDiseaseVariant)) { contentBinding.caseDataDiseaseVariant.setVisibility(record.getDiseaseVariant() != null ? VISIBLE : GONE); } + + if (record.getPerson() != null && Sex.MALE.equals(record.getPerson().getSex())) { + contentBinding.caseDataPregnant.setVisibility(GONE); + contentBinding.caseDataPostpartum.setVisibility(GONE); + contentBinding.caseDataTrimester.setVisibility(GONE); + } } private void updateCaseConfirmationFields(FragmentCaseReadLayoutBinding contentBinding) { @@ -208,7 +214,7 @@ public void onAfterLayoutBinding(FragmentCaseReadLayoutBinding contentBinding) { contentBinding.caseDataClassifiedBy.setValue(getResources().getString(R.string.system)); } - if(!isFieldAccessible(CaseDataDto.class, contentBinding.caseDataHealthFacility)){ + if (!isFieldAccessible(CaseDataDto.class, contentBinding.caseDataHealthFacility)) { FieldVisibilityAndAccessHelper.setFieldInaccessibleValue(contentBinding.facilityOrHome); FieldVisibilityAndAccessHelper.setFieldInaccessibleValue(contentBinding.facilityTypeGroup); } else if (record.getHealthFacility() == null) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java index d25ccca05e1..25bbca979f3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java @@ -39,6 +39,7 @@ import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -116,6 +117,7 @@ import de.symeda.sormas.api.infrastructure.facility.FacilityTypeGroup; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.sample.PathogenTestDto; import de.symeda.sormas.api.sample.SampleDto; import de.symeda.sormas.api.symptoms.SymptomsDto; @@ -286,7 +288,7 @@ public class CaseDataForm extends AbstractEditForm { fluidRowLocs(CaseDataDto.FOLLOW_UP_STATUS_CHANGE_DATE, CaseDataDto.FOLLOW_UP_STATUS_CHANGE_USER) + fluidRowLocs(CaseDataDto.FOLLOW_UP_UNTIL, EXPECTED_FOLLOW_UP_UNTIL_DATE_LOC, CaseDataDto.OVERWRITE_FOLLOW_UP_UNTIL) + fluidRowLocs(CaseDataDto.FOLLOW_UP_COMMENT); - + private static final String PAPER_FORM_DATES_AND_HEALTH_CONDITIONS_HTML_LAYOUT = fluidRowLocs(6, CaseDataDto.SURVEILLANCE_OFFICER) + loc(PAPER_FORM_DATES_LOC) + @@ -971,8 +973,13 @@ protected void addFields() { NullableOptionGroup pregnantField = addField(CaseDataDto.PREGNANT, NullableOptionGroup.class); NullableOptionGroup postpartumField = addField(CaseDataDto.POSTPARTUM, NullableOptionGroup.class); - addField(CaseDataDto.TRIMESTER, NullableOptionGroup.class); - FieldHelper.setVisibleWhen(getFieldGroup(), CaseDataDto.TRIMESTER, CaseDataDto.PREGNANT, Arrays.asList(YesNoUnknown.YES), true); + Field trimesterField = addField(CaseDataDto.TRIMESTER, NullableOptionGroup.class); + boolean isMale = Sex.MALE.equals(person.getSex()); + if (!isMale) { + FieldHelper.setVisibleWhen(getFieldGroup(), CaseDataDto.TRIMESTER, CaseDataDto.PREGNANT, Arrays.asList(YesNoUnknown.YES), true); + } else { + trimesterField.setVisible(false); + } // Mutual exclusivity: Pregnancy and Postpartum if (pregnantField != null && postpartumField != null) { @@ -1500,10 +1507,11 @@ public String getFormattedHtmlMessage() { } }); + + boolean isNotMale = Objects.isNull(person.getSex()) || !Sex.MALE.equals(person.getSex()); + setVisible(!isLuxTuberculosisDisease() && isNotMale, CaseDataDto.POSTPARTUM, CaseDataDto.PREGNANT, CaseDataDto.TRIMESTER); setVisible( !isLuxTuberculosisDisease(), - CaseDataDto.POSTPARTUM, - CaseDataDto.PREGNANT, CaseDataDto.SURVEILLANCE_OFFICER, CaseDataDto.CLINICIAN_NAME, CaseDataDto.CLINICIAN_PHONE, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationController.java index cc0e77fedfd..16afb7d61ad 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationController.java @@ -30,10 +30,13 @@ import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.immunization.ImmunizationDto; import de.symeda.sormas.api.immunization.ImmunizationReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.PersonReferenceDto; +import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.api.vaccination.VaccinationDto; @@ -89,7 +92,8 @@ public CommitDiscardWrapperComponent getVaccinationCreateCo UiFieldAccessCheckers fieldAccessCheckers, boolean doSave, Consumer commitCallback) { - VaccinationEditForm form = new VaccinationEditForm(true, disease, fieldAccessCheckers); + Sex personSex = getPersonSex(person, immunization); + VaccinationEditForm form = new VaccinationEditForm(true, disease, personSex, fieldAccessCheckers); VaccinationDto vaccination = VaccinationDto.build(UiUtil.getUserReference()); if (immunization != null) { vaccination.setImmunization(immunization); @@ -127,7 +131,8 @@ public void edit( boolean isEditAllowed, boolean isDeleteAllowed) { - VaccinationEditForm form = new VaccinationEditForm(true, disease, fieldAccessCheckers); + Sex personSex = getPersonSexFromVaccination(vaccination); + VaccinationEditForm form = new VaccinationEditForm(true, disease, personSex, fieldAccessCheckers); form.setValue(vaccination); boolean isEditOrDeleteAllowed = isEditAllowed || isDeleteAllowed; @@ -187,6 +192,37 @@ public static void updateVaccinationStatus(CaseDataDto caseDataDto) { getCaseFacade().updateVaccinationStatus(caseDataDto.toReference(), null); } + private Sex getPersonSex(PersonReferenceDto person, ImmunizationReferenceDto immunization) { + if (person != null) { + PersonDto personDto = FacadeProvider.getPersonFacade().getByUuid(person.getUuid()); + if (personDto != null) { + return personDto.getSex(); + } + } else if (immunization != null) { + ImmunizationDto immunizationDto = FacadeProvider.getImmunizationFacade().getByUuid(immunization.getUuid()); + if (immunizationDto != null && immunizationDto.getPerson() != null) { + PersonDto personDto = FacadeProvider.getPersonFacade().getByUuid(immunizationDto.getPerson().getUuid()); + if (personDto != null) { + return personDto.getSex(); + } + } + } + return null; + } + + private Sex getPersonSexFromVaccination(VaccinationDto vaccination) { + if (vaccination != null && vaccination.getImmunization() != null) { + ImmunizationDto immunization = FacadeProvider.getImmunizationFacade().getByUuid(vaccination.getImmunization().getUuid()); + if (immunization != null && immunization.getPerson() != null) { + PersonDto person = FacadeProvider.getPersonFacade().getByUuid(immunization.getPerson().getUuid()); + if (person != null) { + return person.getSex(); + } + } + } + return null; + } + public CommitDiscardWrapperComponent getVaccinationEditComponent( VaccinationDto vaccination, Disease disease, @@ -197,7 +233,8 @@ public CommitDiscardWrapperComponent getVaccinationEditComp boolean isDeleteAllowed) { boolean isEditOrDeleteAllowed = isEditAllowed || isDeleteAllowed; - VaccinationEditForm form = new VaccinationEditForm(true, disease, fieldAccessCheckers); + Sex personSex = getPersonSexFromVaccination(vaccination); + VaccinationEditForm form = new VaccinationEditForm(true, disease, personSex, fieldAccessCheckers); form.setValue(vaccination); final CommitDiscardWrapperComponent editComponent = diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java index 3d19090402c..a6c70131c37 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/vaccination/VaccinationEditForm.java @@ -21,12 +21,15 @@ import java.util.Collections; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.v7.ui.Field; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.Vaccine; import de.symeda.sormas.api.caze.VaccineManufacturer; +import de.symeda.sormas.api.person.Sex; import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; @@ -35,7 +38,6 @@ import de.symeda.sormas.ui.utils.AbstractEditForm; import de.symeda.sormas.ui.utils.FieldHelper; import de.symeda.sormas.ui.utils.UserField; -import org.apache.commons.lang3.StringUtils; public class VaccinationEditForm extends AbstractEditForm { @@ -50,7 +52,9 @@ public class VaccinationEditForm extends AbstractEditForm { + fluidRowLocs(VaccinationDto.PREGNANT, VaccinationDto.TRIMESTER) + fluidRowLocs(VaccinationDto.HEALTH_CONDITIONS); - public VaccinationEditForm(boolean create, Disease disease, UiFieldAccessCheckers fieldAccessCheckers) { + private final Sex personSex; + + public VaccinationEditForm(boolean create, Disease disease, Sex personSex, UiFieldAccessCheckers fieldAccessCheckers) { super( VaccinationDto.class, VaccinationDto.I18N_PREFIX, @@ -60,6 +64,8 @@ public VaccinationEditForm(boolean create, Disease disease, UiFieldAccessChecker .andWithFeatureType(FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations()), fieldAccessCheckers); + this.personSex = personSex; + setWidth(800, Unit.PIXELS); if (create) { @@ -119,13 +125,18 @@ protected void addFields() { Collections.singletonList(VaccineManufacturer.OTHER), true); - addField(VaccinationDto.PREGNANT); - addField(VaccinationDto.TRIMESTER); + Field pregnantField = addField(VaccinationDto.PREGNANT); + Field trimesterField = addField(VaccinationDto.TRIMESTER); addField(VaccinationDto.HEALTH_CONDITIONS, HealthConditionsForm.class).setCaption(null); initializeVisibilitiesAndAllowedVisibilities(); - if (isVisibleAllowed(VaccinationDto.PREGNANT)) { + boolean isMale = Sex.MALE.equals(this.personSex); + + if (isMale) { + pregnantField.setVisible(false); + trimesterField.setVisible(false); + } else if (isVisibleAllowed(VaccinationDto.PREGNANT)) { FieldHelper.setVisibleWhen( getFieldGroup(), VaccinationDto.TRIMESTER,