Skip to content

Commit b757fb9

Browse files
cazacmarinMarinSergiuPacurariu
authored
Feature #13205 add information about legal guardian (#13255)
* Customizable enums creation form - save returns an error #13221 * Add information about legal guardian for "minor / incapacitated" to person entity #13205 * #13205 - Add information about legal guardian for "minor / incapacitated" to person entity * Add information about legal guardian for "minor / incapacitated" to person entity #13205 * Reverting on Sergiu sugestions. As only captions.properties needs to be affected and all others needs to be translated from this file. * Fixed 2 issues and 1 rename found by Sergiu. 1. onEmancipatedChange in place of updateIsEmancipatedCheckBox, 2. currently: if a Legal guardian is added and then the user checks "Emancipated" the legal guardian remains in the UI and later on saved in database. -> how it should work: the "Legal guardian's name" should be removed once the "Emancipated" checkbox is checked". 3. when the person is less than 1 year old the emancipated checkbox is still shown * canBeEmancipated change * another adjustments. * Fixed: There is the following unwanted behavior ocurring: In a person is set to be emancipated. Then the age goes in the adult range. The emancipated checkbox disappears but the incapacitated checkbox should be shown unchecked. The incapacitated checkbox could be needed in the future even if the person is an adult. + rename of a variable. * isEmancipatedVisible - 2nd place. * fixing merge sormas_schema.sql * Replaced one additonal method with another. Fixed the scenario where isIncapacitated is not more shown for interval where Emancipated checkbox is shown. * Rearranging fields and another minor fixes * #13205 - Add information about legal guardian for "minor / incapacitated" to person entity - fix hasGuardian not checked when refresh Person edit page --------- Co-authored-by: Marin <marin@bend.md> Co-authored-by: SergiuPacurariu <sergiu.pacurariu@she.ro>
1 parent e28777d commit b757fb9

File tree

10 files changed

+193
-4
lines changed

10 files changed

+193
-4
lines changed

sormas-api/src/main/java/de/symeda/sormas/api/ConfigFacade.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,8 @@ public interface ConfigFacade {
163163
boolean isAnyCaseClassificationCalculationEnabled();
164164

165165
Integer getNegaiveCovidTestsMaxAgeDays();
166+
167+
long getMinimumEmancipatedAge();
168+
169+
long getMinimumAdultAge();
166170
}

sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2220,12 +2220,15 @@ public interface Captions {
22202220
String Person_educationDetails = "Person.educationDetails";
22212221
String Person_educationType = "Person.educationType";
22222222
String Person_emailAddress = "Person.emailAddress";
2223+
String Person_emancipated = "Person.emancipated";
22232224
String Person_externalId = "Person.externalId";
22242225
String Person_externalToken = "Person.externalToken";
22252226
String Person_fathersName = "Person.fathersName";
22262227
String Person_generalPractitionerDetails = "Person.generalPractitionerDetails";
22272228
String Person_gestationAgeAtBirth = "Person.gestationAgeAtBirth";
22282229
String Person_hasCovidApp = "Person.hasCovidApp";
2230+
String Person_hasGuardian = "Person.hasGuardian";
2231+
String Person_incapacitated = "Person.incapacitated";
22292232
String Person_internalToken = "Person.internalToken";
22302233
String Person_lastDisease = "Person.lastDisease";
22312234
String Person_matchingCase = "Person.matchingCase";

sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ public class PersonDto extends PseudonymizableDto implements IsPerson {
128128
public static final String BIRTH_COUNTRY = "birthCountry";
129129
public static final String CITIZENSHIP = "citizenship";
130130
public static final String ADDITIONAL_DETAILS = "additionalDetails";
131+
public static final String IS_EMANCIPATED = "emancipated";
132+
public static final String IS_INCAPACITATED = "incapacitated";
131133
private static final long serialVersionUID = -8558187171374254398L;
132134

133135
// Fields are declared in the order they should appear in the import template
@@ -377,6 +379,9 @@ public class PersonDto extends PseudonymizableDto implements IsPerson {
377379
@Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong)
378380
private String additionalDetails;
379381

382+
private boolean emancipated;
383+
private boolean incapacitated;
384+
380385
@SuppressWarnings("serial")
381386
public static class SeveralNonPrimaryContactDetailsException extends RuntimeException {
382387

@@ -1031,6 +1036,22 @@ public void setAdditionalDetails(String additionalDetails) {
10311036
this.additionalDetails = additionalDetails;
10321037
}
10331038

1039+
public boolean isEmancipated() {
1040+
return emancipated;
1041+
}
1042+
1043+
public void setEmancipated(boolean emancipated) {
1044+
this.emancipated = emancipated;
1045+
}
1046+
1047+
public boolean isIncapacitated() {
1048+
return incapacitated;
1049+
}
1050+
1051+
public void setIncapacitated(boolean incapacitated) {
1052+
this.incapacitated = incapacitated;
1053+
}
1054+
10341055
@Override
10351056
public String buildCaption() {
10361057
return buildCaption(firstName, lastName);

sormas-api/src/main/resources/captions.properties

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1873,7 +1873,7 @@ Person.districtName=District
18731873
Person.educationType=Education
18741874
Person.educationDetails=Details
18751875
Person.fathersName=Father's name
1876-
Person.namesOfGuardians=Names of guardians
1876+
Person.namesOfGuardians=Legal guardian's name
18771877
Person.gestationAgeAtBirth=Gestation age at birth (weeks)
18781878
Person.lastDisease=Last disease
18791879
Person.matchingCase=Matching case
@@ -1916,6 +1916,9 @@ Person.otherSalutation=Other salutation
19161916
Person.birthName=Birth name
19171917
Person.birthCountry=Country of birth
19181918
Person.citizenship=Citizenship
1919+
Person.hasGuardian=Person has a legal guardian (i.e. in case of minors or incapacitated persons)
1920+
Person.incapacitated=Incapacitated (i.e. person will have a legal guardian after 18)
1921+
Person.emancipated=Emancipated (i.e. person is under 18 and does not have a guardian by law)
19191922
personContactDetailOwner=Owner
19201923
personContactDetailOwnerName=Owner name
19211924
personContactDetailThisPerson=This person

sormas-backend/src/main/java/de/symeda/sormas/backend/common/ConfigFacadeEjb.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,15 @@ public class ConfigFacadeEjb implements ConfigFacade {
186186
private static final String DOCUMENT_UPLOAD_SIZE_LIMIT_MB = "documentUploadSizeLimitMb";
187187
public static final int DEFAULT_DOCUMENT_UPLOAD_SIZE_LIMIT_MB = 20;
188188
public static final String IMPORT_FILE_SIZE_LIMIT_MB = "importFileSizeLimitMb";
189-
public static final int DEFAULT_IMPOR_FILE_SIZE_LIMIT_MB = 20;
189+
public static final int DEFAULT_IMPORT_FILE_SIZE_LIMIT_MB = 20;
190190
public static final String NEGATIVE_COVID_TESTS_MAX_AGE_DAYS = "negativeCovidTestsMaxAgeDays";
191191

192+
public static final String MINIMUM_EMANCIPATED_AGE = "minimumEmancipatedAge";
193+
public static final int DEFAULT_MINIMUM_EMANCIPATED_AGE = 14;
194+
195+
public static final String MINIMUM_ADULT_AGE = "minimumAdultAge";
196+
public static final int DEFAULT_MINIMUM_ADULT_AGE = 18;
197+
192198
private final Logger logger = LoggerFactory.getLogger(getClass());
193199

194200
@Resource(lookup = "sormas/Properties")
@@ -826,7 +832,7 @@ public long getDocumentUploadSizeLimitMb() {
826832

827833
@Override
828834
public long getImportFileSizeLimitMb() {
829-
return getLong(IMPORT_FILE_SIZE_LIMIT_MB, DEFAULT_IMPOR_FILE_SIZE_LIMIT_MB);
835+
return getLong(IMPORT_FILE_SIZE_LIMIT_MB, DEFAULT_IMPORT_FILE_SIZE_LIMIT_MB);
830836
}
831837

832838
@Override
@@ -844,6 +850,16 @@ public Integer getNegaiveCovidTestsMaxAgeDays() {
844850
return parseProperty(NEGATIVE_COVID_TESTS_MAX_AGE_DAYS, null, Integer::parseInt);
845851
}
846852

853+
@Override
854+
public long getMinimumEmancipatedAge() {
855+
return getLong(MINIMUM_EMANCIPATED_AGE, DEFAULT_MINIMUM_EMANCIPATED_AGE);
856+
}
857+
858+
@Override
859+
public long getMinimumAdultAge() {
860+
return getLong(MINIMUM_ADULT_AGE, DEFAULT_MINIMUM_ADULT_AGE);
861+
}
862+
847863
@LocalBean
848864
@Stateless
849865
public static class ConfigFacadeEjbLocal extends ConfigFacadeEjb {

sormas-backend/src/main/java/de/symeda/sormas/backend/person/Person.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ public class Person extends AbstractDomainObject implements IsPerson, HasExterna
142142
public static final String IMMUNIZATIONS = "immunizations";
143143
public static final String ADDITIONAL_DETAILS = "additionalDetails";
144144
public static final String TRAVEL_ENTRIES = "travelEntries";
145+
public static final String IS_INCAPACITATED = "isIncapacitated";
146+
public static final String IS_EMANCIPATED = "emancipated";
145147

146148
private String firstName;
147149
private String lastName;
@@ -211,6 +213,9 @@ public class Person extends AbstractDomainObject implements IsPerson, HasExterna
211213
private Country citizenship;
212214
private String additionalDetails;
213215

216+
private boolean isIncapacitated;
217+
private boolean emancipated;
218+
214219
private List<Case> cases = new ArrayList<>();
215220
private List<Contact> contacts = new ArrayList<>();
216221
private List<EventParticipant> eventParticipants = new ArrayList<>();
@@ -660,6 +665,24 @@ public void setHasCovidApp(boolean hasCovidApp) {
660665
this.hasCovidApp = hasCovidApp;
661666
}
662667

668+
@Column
669+
public boolean isIncapacitated() {
670+
return isIncapacitated;
671+
}
672+
673+
public void setIncapacitated(boolean incapacitated) {
674+
isIncapacitated = incapacitated;
675+
}
676+
677+
@Column
678+
public boolean isEmancipated() {
679+
return emancipated;
680+
}
681+
682+
public void setEmancipated(boolean emancipated) {
683+
this.emancipated = emancipated;
684+
}
685+
663686
@Column
664687
public boolean isCovidCodeDelivered() {
665688
return covidCodeDelivered;

sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,8 @@ public static PersonDto toPersonDto(Person source) {
10301030
target.setBirthCountry(CountryFacadeEjb.toReferenceDto(source.getBirthCountry()));
10311031
target.setCitizenship(CountryFacadeEjb.toReferenceDto(source.getCitizenship()));
10321032
target.setAdditionalDetails(source.getAdditionalDetails());
1033+
target.setIncapacitated(source.isIncapacitated());
1034+
target.setEmancipated(source.isEmancipated());
10331035

10341036
return target;
10351037
}
@@ -1799,6 +1801,8 @@ public Person fillOrBuildEntity(@NotNull PersonDto source, Person target, boolea
17991801
target.setBirthCountry(countryService.getByReferenceDto(source.getBirthCountry()));
18001802
target.setCitizenship(countryService.getByReferenceDto(source.getCitizenship()));
18011803
target.setAdditionalDetails(source.getAdditionalDetails());
1804+
target.setIncapacitated(source.isIncapacitated());
1805+
target.setEmancipated(source.isEmancipated());
18021806

18031807
return target;
18041808
}

sormas-backend/src/main/resources/sql/sormas_schema.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13810,3 +13810,11 @@ INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'SURVEY_TOK
1381013810

1381113811
INSERT INTO schema_version (version_number, comment) VALUES (557, 'Create Survey Tokens data structure #13250');
1381213812
-- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. ***
13813+
13814+
-- 2025-01-10 Add information about legal guardian for "minor / incapacitated" to person entity #13205
13815+
ALTER TABLE person ADD column incapacitated boolean default false;
13816+
ALTER TABLE person ADD column emancipated boolean default false;
13817+
ALTER TABLE person_history ADD COLUMN incapacitated boolean default false;
13818+
ALTER TABLE person_history ADD COLUMN emancipated boolean default false;
13819+
13820+
INSERT INTO schema_version (version_number, comment) VALUES (558, 'Add information about legal guardian for "minor / incapacitated" to person entity #13205');

sormas-base/setup/sormas.properties

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,3 +426,11 @@ app.url=
426426
# A list of allowed file types to be uploaded
427427
# Default: .pdf,.txt,.doc,.docx,.odt,.xls,.xlsx,.ods,.ppt,.pptx,.odp,.jpg,.jpeg,.png,.gif,.msg,.html
428428
#allowed.file.extensions=.pdf,.txt,.doc,.docx,.odt,.xls,.xlsx,.ods,.ppt,.pptx,.odp,.jpg,.jpeg,.png,.gif,.msg,.html
429+
430+
# Minimum emancipated age
431+
# Default: 14 Years
432+
#minimumEmancipatedAge = 14
433+
434+
# Minimum adult age
435+
# Default: 18 Years
436+
#minimumAdultAge = 18

sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonEditForm.java

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static de.symeda.sormas.ui.utils.CssStyles.H3;
1919
import static de.symeda.sormas.ui.utils.CssStyles.LABEL_WHITE_SPACE_NORMAL;
20+
import static de.symeda.sormas.ui.utils.CssStyles.LAYOUT_COL_HIDE_INVSIBLE;
2021
import static de.symeda.sormas.ui.utils.CssStyles.VSPACE_3;
2122
import static de.symeda.sormas.ui.utils.LayoutUtil.divsCss;
2223
import static de.symeda.sormas.ui.utils.LayoutUtil.fluidColumnLocCss;
@@ -36,6 +37,8 @@
3637
import java.util.concurrent.atomic.AtomicBoolean;
3738
import java.util.stream.Collectors;
3839

40+
import com.vaadin.v7.ui.CheckBox;
41+
import de.symeda.sormas.ui.utils.LayoutUtil;
3942
import org.apache.commons.lang3.StringUtils;
4043

4144
import com.vaadin.shared.ui.ErrorLevel;
@@ -110,6 +113,7 @@ public class PersonEditForm extends AbstractEditForm<PersonDto> {
110113
private static final String EXTERNAL_TOKEN_WARNING_LOC = "externalTokenWarningLoc";
111114
private static final String NATIONAL_HEALTH_ID_WARNING_LABEL = "nationalHealthIdWarningLoc";
112115
private static final String GENERAL_COMMENT_LOC = "generalCommentLoc";
116+
public static final String HAS_GUARDIAN = "hasGuardian";
113117
//@formatter:off
114118
private static final String HTML_LAYOUT =
115119
loc(PERSON_INFORMATION_HEADING_LOC) +
@@ -165,6 +169,11 @@ public class PersonEditForm extends AbstractEditForm<PersonDto> {
165169
fluidRowLocs(PersonDto.BIRTH_NAME, "") +
166170
fluidRowLocs(PersonDto.NICKNAME, PersonDto.MOTHERS_MAIDEN_NAME) +
167171
fluidRowLocs(PersonDto.MOTHERS_NAME, PersonDto.FATHERS_NAME) +
172+
LayoutUtil.fluidRowLocs(PersonDto.IS_EMANCIPATED) +
173+
LayoutUtil.fluidRowLocs(PersonDto.IS_INCAPACITATED) +
174+
LayoutUtil.fluidRowLocs(HAS_GUARDIAN) +
175+
LayoutUtil.fluidRow(
176+
LayoutUtil.fluidColumnLocCss(LAYOUT_COL_HIDE_INVSIBLE, 6, 0, PersonDto.NAMES_OF_GUARDIANS)) +
168177
fluidRowLocs(PersonDto.NAMES_OF_GUARDIANS) +
169178
fluidRowLocs(PersonDto.BIRTH_COUNTRY, PersonDto.CITIZENSHIP) +
170179
fluidRowLocs(PersonDto.PERSON_CONTACT_DETAILS)) +
@@ -189,6 +198,12 @@ public class PersonEditForm extends AbstractEditForm<PersonDto> {
189198
private PresentConditionChangeListener presentConditionChangeListener;
190199
private SormasTextField nationalHealthIdField;
191200
private Window warningSimilarPersons;
201+
private CheckBox isEmancipated;
202+
private CheckBox isIncapacitated;
203+
private CheckBox hasGuardian;
204+
private TextField nameOfGuardians;
205+
private long minimumAdultAge;
206+
private long minimumEmancipatedAge;
192207
//@formatter:on
193208

194209
public PersonEditForm(
@@ -291,7 +306,7 @@ protected void addFields() {
291306
addField(PersonDto.NICKNAME, TextField.class);
292307
addField(PersonDto.MOTHERS_MAIDEN_NAME, TextField.class);
293308
addFields(PersonDto.MOTHERS_NAME, PersonDto.FATHERS_NAME);
294-
addFields(PersonDto.NAMES_OF_GUARDIANS);
309+
nameOfGuardians = addField(PersonDto.NAMES_OF_GUARDIANS, TextField.class);
295310
ComboBox presentCondition = addField(PersonDto.PRESENT_CONDITION, ComboBox.class);
296311
birthDateDay = addField(PersonDto.BIRTH_DATE_DD, ComboBox.class);
297312
// @TODO: Done for nullselection Bug, fixed in Vaadin 7.7.3
@@ -504,6 +519,7 @@ protected void addFields() {
504519
addFieldListeners(PersonDto.BIRTH_DATE_YYYY, e -> {
505520
updateApproximateAge();
506521
updateReadyOnlyApproximateAge();
522+
updateIsIncapacitatedCheckBox(false);
507523
});
508524

509525
addFieldListeners(PersonDto.DEATH_DATE, e -> updateApproximateAge());
@@ -631,6 +647,89 @@ protected void addFields() {
631647
I18nProperties.getPrefixDescription(PersonDto.I18N_PREFIX, PersonDto.ADDITIONAL_DETAILS, "") + "\n"
632648
+ I18nProperties.getDescription(Descriptions.descGdpr));
633649
CssStyles.style(additionalDetails, CssStyles.CAPTION_HIDDEN);
650+
651+
hasGuardian = addCustomField(HAS_GUARDIAN, Boolean.class, CheckBox.class);
652+
653+
isIncapacitated = addField(PersonDto.IS_INCAPACITATED, CheckBox.class);
654+
isIncapacitated.addValueChangeListener(e -> updateIsIncapacitatedCheckBox(true));
655+
656+
isEmancipated = addField(PersonDto.IS_EMANCIPATED, CheckBox.class);
657+
isEmancipated.addValueChangeListener(e -> onEmancipatedChange());
658+
hasGuardian.setEnabled(false);
659+
minimumAdultAge = FacadeProvider.getConfigFacade().getMinimumAdultAge();//2 places
660+
minimumEmancipatedAge = FacadeProvider.getConfigFacade().getMinimumEmancipatedAge();
661+
}
662+
663+
private int getApproximateAgeInYears() {
664+
Date birthDate = calcBirthDateValue();
665+
if (birthDate != null) {
666+
Pair<Integer, ApproximateAgeType> pair =
667+
ApproximateAgeHelper.getApproximateAge(birthDate, (Date) getFieldGroup().getField(PersonDto.DEATH_DATE).getValue());
668+
if ((pair.getElement0() != null) && (pair.getElement1() == ApproximateAgeType.YEARS)) {
669+
return pair.getElement0();
670+
}
671+
}
672+
return -1;
673+
}
674+
675+
private void onEmancipatedChange() {
676+
boolean isEmancipatedChecked = (isEmancipated != null) && (isEmancipated.getValue());
677+
hasGuardian.setValue(!isEmancipatedChecked);
678+
if(isEmancipatedChecked) {
679+
nameOfGuardians.setValue("");
680+
}
681+
updateHasGuardianCheckBox();
682+
}
683+
684+
private void updateIsIncapacitatedCheckBox(boolean isInitialized) {
685+
boolean isIncapacitatedChecked = (isIncapacitated == null) || (isIncapacitated.getValue());
686+
int approximateAge = getApproximateAgeInYears();
687+
boolean canBeEmancipated;
688+
if(approximateAge == -1) {
689+
canBeEmancipated = false;
690+
} else {
691+
canBeEmancipated = approximateAge >= minimumEmancipatedAge && approximateAge < minimumAdultAge;
692+
}
693+
isEmancipated.setVisible(!isIncapacitatedChecked && canBeEmancipated);
694+
hasGuardian.setValue(isIncapacitatedChecked || approximateAge < minimumAdultAge);
695+
if(getApproximateAgeInYears() < minimumAdultAge) {
696+
nameOfGuardians.setValue(getValue().getNamesOfGuardians());
697+
}
698+
updateHasGuardianCheckBox();
699+
hardResetNameOfGuardians(isInitialized);
700+
}
701+
702+
private void hardResetNameOfGuardians(boolean isInitialized) {
703+
boolean isIncapacitatedChecked = (isIncapacitated != null) && (isIncapacitated.getValue());
704+
if (getApproximateAgeInYears() != -1 && getApproximateAgeInYears() >= minimumAdultAge && !isIncapacitatedChecked && isInitialized) {
705+
nameOfGuardians.setValue("");
706+
}
707+
}
708+
709+
private void updateHasGuardianCheckBox() {
710+
boolean isIncapacitatedChecked = (isIncapacitated != null) && (isIncapacitated.getValue());
711+
boolean isEmancipatedChecked = (isEmancipated != null) && (isEmancipated.getValue());
712+
if((getApproximateAgeInYears() >= minimumAdultAge || (getApproximateAgeInYears() < minimumEmancipatedAge) && isEmancipatedChecked)) {
713+
isEmancipatedChecked = false;
714+
isEmancipated.setValue(Boolean.FALSE);
715+
isIncapacitated.setVisible(true);
716+
}
717+
if(isEmancipatedChecked){
718+
hasGuardian.setVisible(false);
719+
nameOfGuardians.setVisible(false);
720+
isIncapacitated.setVisible(false);
721+
return;
722+
} else {
723+
isIncapacitated.setVisible(true);
724+
hasGuardian.setValue(Boolean.TRUE);
725+
}
726+
Date birthDate = calcBirthDateValue();
727+
boolean isChildOrUnknownDate = getApproximateAgeInYears() < minimumAdultAge;
728+
nameOfGuardians.setVisible(isChildOrUnknownDate || isIncapacitatedChecked);
729+
hasGuardian.setVisible(isChildOrUnknownDate || isIncapacitatedChecked);
730+
if((birthDate == null) || isChildOrUnknownDate ){
731+
hasGuardian.setValue(Boolean.TRUE);
732+
}
634733
}
635734

636735
@Override

0 commit comments

Comments
 (0)